Diamond Stone Platform: Social Channels and Publishing
Date: 2026-11-11. Revision 1. Status: draft for owner review. Builds on docs/MODULES.md
section 4 ("Channels: change it once, publish everywhere"), which lists what each
platform officially allows. Screens: the "Social channels" section of
docs/ui-shell-mockup.html. Diagrams: docs/system-flows.html and docs/user-flows.html.
1. The answer in one paragraph
Both. Posting is automated, and it is done by a separate service. This app is the one place where people write, approve, schedule and see results. A separate channel service (the connector being built with Antigravity) is the part that actually talks to Instagram, Facebook, LinkedIn, Google and the rest. The two are joined through our own server. Staff never open the channel service and never log in to each platform to post; they also never need a third-party scheduling tool.
| This platform | The channel service | |
|---|---|---|
| What it is | The staff app and its server | A separate service with one connector per platform |
| Who uses it | Marketing, sales, the owner | Nobody directly. Only our server calls it |
| Holds | The content, the approval, the schedule, the results, the conversations | The platform sign-ins and each platform's rules for sending |
| Decides | What is said, where, when, and who approved it | Nothing. It sends exactly what it was given, or reports why it could not |
| If it is down | Posts wait in the queue and show "waiting"; by-hand tasks are offered | — |
Why separate: each platform changes its rules, sizes and sign-in often. Keeping that in one replaceable service means the app does not change when Instagram does. Why not an outside scheduling product: the posts are made from the catalogue, the projects and the answers that already live here, and the enquiries they bring must land in the same inbox with the same customer record.
2. What is automatic and what is not
| Step | Automatic | A person |
|---|---|---|
| Noticing there is something worth posting (a stone published, a project approved, a new answer, a delivery with consent to show) | Yes: a draft is created | |
| Writing the caption | A draft from a language model, checked against the brand's voice rules (Jev does not write; see docs/AI.md) |
Edits and owns the words |
| Making a version for each channel: length, picture shape, link, tags | Yes | Can adjust one channel's version |
| Checking: picture rights and consent in date, no forbidden words, no price, no supplier or quarry name, Arabic reviewed, right picture shape | Yes; a failed check blocks the post | Fixes what failed |
| Approving | Yes, always by default (a setting can allow named templates through without it; see section 8) | |
| Choosing the time | Suggested from past results | Can change it |
| Publishing at that time, on each channel | Yes | |
| Retrying a failure on one channel | Yes | Reconnects a channel when asked |
| Channels with no official way to post | A task with the text and picture ready | Posts by hand and ticks it done |
| Collecting results | Yes, daily | |
| Comments, direct messages and reviews | Arrive in the Inbox | Replies; nothing is auto-replied in public |
| Linking a post to the enquiries and orders it brought | Yes, through a tracked link |
Never automatic: replying to a comment or review; posting anything a person has not approved (unless the owner switched that on for a template); following, liking, or messaging people who did not contact us first.
3. What gets posted
Each kind starts from a record that already exists, so nothing is written twice.
| Kind | Starts from | What it shows |
|---|---|---|
| A stone | The stone record | Slab photographs, name, origin, finishes; a link to its page |
| New slabs in | An inspection or receipt, with photos marked "may be shown" | The actual slabs, dated |
| A project | A project with the client's consent | The finished space, the stones used, a line from the client |
| An answer | An answer page | The question and the two-line answer; a link |
| How we match | Photographs from inspection, layout or loading, marked "may be shown" | Selecting, matching, laying out, loading. Never rejects or refused counts |
| Company news | Written directly | A fair, a new market, a holiday closing |
| Reviews | A customer's rating with permission | Their words |
Rules from the brand (docs/BRAND.md): never lead with price; no hollow luxury words; no
emoji or exclamation marks; origin shown as "Oman", never a quarry or supplier; no
project photograph the company cannot claim; people in photographs only with consent.
How much. One marketing person can sustain about ten posts a month alongside the website. The calendar is sized to that; it warns when a week is empty and when a channel has had nothing for a month.
4. Channels
From docs/MODULES.md section 4, by how they are reached.
| Group | Channels | How |
|---|---|---|
| Automatic, first | Website; Google Business Profile posts; Instagram; Facebook Page; WhatsApp Business catalogue | Official interfaces. Meta (Instagram, Facebook, WhatsApp) is one application and one review |
| Automatic, when approved | LinkedIn company page; YouTube; Pinterest | Each needs the platform's approval, which can be refused or slow. Applied for early; posted by hand until granted |
| By hand, with the task prepared | WhatsApp Status and Channels; TikTok if used; marketplace listings; map listings | No official way to post for a business of this kind, or not worth the cost |
| Not used | X | Paid per post; low value for this trade |
Nothing is ever posted through an automated browser or an unofficial gateway. Those break the platforms' terms and put the accounts, and the company's WhatsApp number, at risk.
Each channel has a card in the app with a light: connected, needs reconnecting, waiting for the platform's approval, by hand. Platform sign-ins expire (Meta's about every 60 days unless refreshed); the app warns a week before and the administrator reconnects with two taps.
5. The screens
All drawn in the sketch under "Social channels".
| Screen | Question | Shows first | Action |
|---|---|---|---|
| Post | What are we saying? | The picture; the caption; the record it came from; language | Where this goes |
| Where this goes | How will it look on each? | A preview card per channel in that channel's shape, each with a tick or what is wrong | Send to approve |
| Calendar | What is going out, and when? | A month with picture thumbnails on their days; gaps marked | Open a day |
| Channels | Is everything connected? | A card per channel with its light and last post | Reconnect |
| Results | Is it working? | Reach, clicks and enquiries per post as bars; the post that brought the most enquiries first | Open the enquiries |
| Approval (in the owner's Approvals list) | Should this go out? | The post as it will appear, and the checks passed | Approve |
| By-hand task | What do I do? | The text to copy, the picture to save, the link to the right place | Done |
Comments, messages and reviews are not a separate screen: they are conversations in the Inbox, marked with the channel's icon, against the customer when the person is known.
6. How the two systems talk
Drawn as "Posting to social channels" and "A comment or review comes back" in
docs/system-flows.html.
Our server asks the channel service to publish by sending one job per channel: the channel; the text and pictures exactly as approved; a fingerprint of that content; who approved it and when; the time to publish; and a one-time key so the same job can never be sent twice.
The channel service answers with a status for each job: accepted; live, with the link to the post; failed, with a plain reason; needs reconnecting.
The channel service tells our server when something comes in: a comment, a direct message, a review, a change in a job's status, daily figures for each post.
Our server can ask it what each channel currently allows (lengths, picture shapes, whether it is connected), so the checks in the app always match the platform.
Rules of the join
- The phone app never calls the channel service. Only our server does, and only our server holds its key.
- The channel service is not reachable from the public internet, has no built-in default keys, and cannot approve anything. (The earlier version of it was public, used default keys and could approve its own posts;
docs/PLAN.md, risks.) - It publishes only content whose fingerprint matches an approval. If the text is changed after approval, the approval no longer applies.
- One switch in the app stops all publishing at once; another stops one channel.
- A failure on one channel never holds back the others.
- If the channel service is replaced one day by an outside product, only this join changes; the app, the content and the history stay.
7. Measuring
| Measure | From |
|---|---|
| Reach, views, clicks, saves per post and per channel | The platforms, through the channel service, daily |
| Enquiries and sample orders that came from each post | The tracked link on the post; kept on the enquiry as its first source |
| Orders that followed | The app |
| Followers by channel over time | The platforms |
| Reply time to comments and messages | The Inbox timers |
| Posts per month against the plan; channels gone quiet | The calendar |
The figure that matters is enquiries and orders by post, not likes. The Results screen leads with it.
8. Settings
Under Settings → Messages and channels. Each has a default.
| Setting | Default | Choices |
|---|---|---|
| Posts need approval | Always | Always; not for named templates (for example "new slabs in"); never |
| Who approves | The owner | The owner; a named person. Never the author |
| A draft is created when | A stone, project or answer is published | Each kind on or off; also for new slabs, deliveries with consent |
| Languages | English and Arabic as separate posts | English only; both in one post; separate |
| Quiet days | Fridays; public holidays | Chosen days |
| Suggested time | From past results | Fixed times; from results |
| Tracked links | On | On; off |
| Stop all publishing | Off | On; off, per channel too |
| By-hand tasks go to | Marketing | A named person |
| Ask for a public review after a delivery | Off | On; off. When on, every customer is asked whatever they rated. Asking only happy customers, or rewarding a review, breaks Google's rules |
9. Risks
| Risk | Guard |
|---|---|
| A platform refuses or delays access (LinkedIn, Meta review, Google Business Profile) | Apply at the start; post by hand meanwhile; never depend on one channel |
| An account restricted for breaking terms | Official interfaces only; no automated browser; no bought followers; no mass messaging |
| A sign-in expires and posts silently fail | A light per channel; a warning a week before; failures shown on the post and in the Halo |
| A post goes out with a mistake | Approval; checks; a "take down" action that removes it on every channel that allows it |
| A photograph used without the right or consent | The picture carries its rights and consent with an end date; the check blocks it |
| The same content looks pasted across channels | A version per channel in that channel's shape and length |
| AI-written captions sound generic | A suggestion only; the brand's forbidden words are checked; a person edits |
| The channel service is the weak point | Not public; no default keys; only our server calls it; a stop switch |
| WhatsApp number put at risk by broadcasts | Messages only to people who opted in, through approved templates; Status and Channels by hand |
10. Build stages
| Stage | Content |
|---|---|
| With the website (stage 2) | Post, Where this goes, Calendar, Channels, approval, by-hand tasks; website and Google Business Profile automatic; applications sent to Meta and LinkedIn |
| Next | Instagram and Facebook automatic once Meta approves; comments and messages into the Inbox; Results |
| Later | LinkedIn, YouTube, Pinterest as each is approved; drafts from deliveries and new slabs; suggested times |
11. Decisions
- ~~Confirm the split.~~ Confirmed by the owner on 11 November 2026: the channel service stays a separate build (Antigravity), and this app is the only place staff work.
- Whether any kind of post may go out without approval.
- Arabic and English as separate posts, or together.
- Which channels matter most. The plan assumes Instagram, LinkedIn and Google Business Profile for specifiers, with Facebook because it comes with Instagram.
- Whether to ask customers for public reviews after delivery.
Marketing plan (added 11 November 2026)
Which channels come first, how often, and what each post is for are set in
docs/MARKETING.md section 7. LinkedIn and Instagram come after WhatsApp, the website
and visits. Each post leads to a stone or a project page, never to Home.