Docs · page 03 of 09
Compose: writing a post that sounds like you
Compose is where a post gets written, grounded, edited and polished. This page walks the surface top to bottom, says what each path costs, and names the checks that run whether you ask for them or not.
The Compose surface
Compose opens on a tab strip: one open post per tab. Opening a post from the Content Calendar adds a tab instead of replacing what you were editing (Ctrl/Cmd-click Edit in Compose to open it in a background tab), and the + button (New post) starts a blank one. A tab is labelled by its title — or the theme it was generated from — then by its opening words, then New post.
Below that, the left rail holds the inputs, the first two collapsed so they do not eat the screen:
- Theme — optional; a topic in a few words. Collapsed by default, and opened automatically when it already holds a value (a reopened draft) or when a trending chip fills it.
- 💡 Trending topics — click a chip to use one — up to 16 daily suggestions, cached server-side. The refresh control (
↻) re-pulls; if the Theme box has text at that moment, it overrides your saved interests for that pull. Clicking a chip does two things: it fills Theme, and it then replaces whatever is in Seed the Idea with an ~800-character seed paragraph written for that trend. Anything you had pasted there is gone, so click chips before you paste, not after. Both the chip expansion and the↻refresh are model calls metered against your daily generation cap — these two controls are not free. - Pull a post or video by URL — one box for a LinkedIn post, a YouTube video or a TikTok video. What the URL is decides which pull runs, so a YouTube link never reaches the post scraper. Both go through the DraftADay extension; the server cannot read either source itself. The status line starts at
Checking for the DraftADay extension…and then settles onExtension ready — paste a LinkedIn post, YouTube video or TikTok video URL and press Pull.orInstall/enable the DraftADay extension (and reload this page) to pull by URL. You can still paste a post's text below. - Seed the Idea · or improve a post — a plain textarea, with Preview · how the source reads beside it so the pasted post renders the way LinkedIn shows it.
- Images (optional — attach your own) — 📋 Paste image (⌘V / Ctrl+V), 📎 Choose file…, or drag one onto the drop zone. Attached images land in this post's pool with a thumbnail.
- Seed from a harvested post — search every harvested post by author or text (tick
.* regexfor POSIX), sort by Recent or Top engagement, filter to ★ Sent to draft, and Load 50 more (N of M). - Your experience bank (true stories the AI may use) — collapsed. This is where you add and enable entries with + Add experience or ✨ Auto-generate from my posts. Every first-person anecdote in a generated post comes from here and nowhere else, so an empty bank means a post with no story in it.
- Render media this run — Images / Carousel / Video, plus Watermark video and its position, opacity and span. Prompts are always written; these decide what actually gets rendered. Sticky per browser.
- CTA — which call to action closes the post. Rotate (recommended) lets the server pick the library CTA used least recently; you can also pin one, or choose No CTA on this post.
The editor column has two modes, ▶ Preview and ✎ Edit. The mode is remembered per tab, so switching tabs mid-write never drops you into a preview you have to dismiss. A post whose body is longer than 40 characters opens in Preview; an empty one opens in Edit.
Three ways to start, and what each costs
Generate package stays disabled until there is a seed — a Theme, seed text, or a picked harvested post. Its tooltip says so: Enter a Theme, seed text, or pick a harvested post first.
To write from a topic: type a Theme and press Generate package.
To beat a post you admire: paste it into Seed the Idea (or Pull it), then press Generate package. What Generate does with it comes from Settings → Improve a post → Mode: Off — treat a pasted post as loose inspiration, Same topic, my sharper take (same_topic), or My topic, their craft (their_craft). Note that any improve mode turns the judge loop off: improving one specific post is a single faithful pass, so ticking High-quality judge loop changes nothing while a source post and a mode are both in play.
To say someone else's points in your own words: press ✍️ Make it mine (light edit · $0). That is minimal_edit — always a single pass, never the judge tournament, and it queues on the subscription path rather than calling the paid API. It is text only: images and video on the post are pinned untouched. It needs the post in Seed the Idea (a picked harvested post does not count); without one it stops with Paste the post you want to adapt into “Seed the Idea” (or Pull one by URL) first. On success: Queued — your subscription will adapt this post (text only, media untouched). $0 API. It appears on your Content Calendar when the queue runs.
To carry a pulled post across untouched: 📋 Copy as-is (no edit · $0). No model call at all. The body goes into Post text and any trailing hashtag block into Hashtags. If the text in the box is still exactly what the pull put there, it also carries the people and pages the post tagged into Tag people or pages — resolved through the extension, one background tab and roughly two to five seconds each — and prefills First comment with Original: <url> by <author>. Pasted a post by hand instead? Then you get the text and the hashtags only. Pulled media is already in your pool either way. Without a source it says Pull a post by URL (or paste one into “Seed the Idea”) first — Copy as-is copies what is there, it does not write anything.
Good to know — seed text is capped at 8,000 characters on the server. Anything past that is silently dropped before the model sees it, so trim a long source yourself rather than trusting the tail to survive.
Generate: single pass or the judged loop
Leave High-quality judge loop (slower, multiple model passes) unticked and Generate runs three steps: Reading your feed → Writing the post package → Saving your draft.
Tick it — with no improve mode in play — and the stepper shows the full pipeline, streamed as NDJSON and lit up stage by stage:
- Three drafts, three angles, written together — contrarian, pattern, one number. Independent calls, run in parallel.
- Editor pass: scoring every draft, with measured checks — each draft is first run through a $0 deterministic check, and that evidence goes to the editor with the drafts.
- The editor scores seven dimensions 0–10:
fold_hook,specificity,point_of_view,human_register,comment_pull,one_idea,regional_grounding. The weighted total is computed in code, not by the model (default weights 20/20/15/15/15/10/5). The editor's own holistic pick wins only if it sits within 0.25 of the arithmetic leader. - Full package from the winning draft — the winner plus the editor's revision notes and any measured defects.
- Final check of the post that ships (only if something needs fixing) — one bounded corrective pass for objective defects, keeping whichever version has fewer.
The rotating CTA is stamped last, after the polish pass, so a corrective round trip can never duplicate the closing line.
If the run is refused you will see Set your Anthropic API key in Settings to generate posts. (501) or Daily generation budget reached. Try again tomorrow or raise the cap. (402). A beta workspace that has spent its allowance gets beta limit reached — this beta account includes 5 post generations and you've used all of them. Message Mustafa to top up. Failed runs never burn an allowance.
What the writer is actually shown
Every generation, judged or not, assembles the same grounding stack before the first token:
- Feed digest — your top 60 harvested posts by score.
- Voice samples — your own published posts, tenant-scoped; empty until the extension has harvested them.
- Voice fingerprint — measured targets from your own corpus (needs at least 5 posts of 300+ characters, else it emits nothing).
- Sameness memory — the openings and closings of your last 8 posts, with one instruction: do not run these moves again. Drafts count, not just published posts.
- Experience bank — up to 5 enabled entries, rotated. First-person anecdotes come only from here.
- Traction block — measured favour/avoid signals and empirical best times, plus judge weights recalibrated from your real engagement once there are enough outcomes.
- Craft exemplars, the viral-post corpus, and the CTA chosen in the rail (Rotate picks the one used least recently).
Voice settings
To set who the AI writes as: Settings → Voice. The fields are Name (120 chars), Identity / headline (400), Audience (900), Content pillars (one per line) (up to 5, 300 each), Employer (confidentiality rule) (80) and Sign-off (DMs) (60). Blank fields fall back to the workspace base. 🎙️ Derive from my posts rebuilds the measured card; without captured posts it answers no harvested own posts yet — run "Harvest MY posts" in the extension first.
Good to know — only the flagship workspace keeps the shipped persona as its base. Every other workspace starts neutral, and an unidentified context resolves neutral too, so a blank field can never back-fill another account's name, employer, audience or pillars.
The deterministic gates, and what a "defect" means
Three $0 checks run on every generated post. None of them calls a model.
Hard defects — em dashes, an external link in the body, machine phrases (delve, game-changer, tapestry…), rhetorical tics, or more than 3 hashtags in the body.
Measured shape gate — hedging the post's own claims, percentages spelled out as words instead of digits, length past the ceiling (1,800 characters, or your own measured maximum if it is higher), a closing question that runs well past this account's median close (more than 24 words, or the median plus eight, whichever is larger), and a close gated behind "If you have…".
Plain-reading gate — units a stranger cannot picture (pull requests, sprints, tickets), coined field adjectives, the reader being asked to do arithmetic, acronyms introduced without being explained, and the measured number ceiling: your median figure count plus two, floor 6, or 8 without a corpus.
One asymmetry is deliberate. "This post has no hard figure anywhere" is raised at the revise stage only, where the digest, the experience bank and the grounding are all still in front of the model and a real number is available to reach for. It is never raised at the final polish, because a pass told to change nothing else would answer it by inventing one.
Separately, ten additive traits are scored. A live advisory row under Post text shows N/10 traits carried with chips for what is missing (text of 120+ characters, debounced). The trait gate only ever blocks a machine save of a brand-new post — This draft misses N trait(s) that every post has to carry. Fix and resubmit, or resend with force:true. Your own edits in Compose go through a different endpoint and are never blocked.
Editing the package
A sticky Jump nav sits at the top of the editor: Hooks · Post · Hashtags · Best time · Images · Carousel · Media.
Hooks (your opener — Hook 1 & Hook 2) sit above the body. Edit a hook inline and press Use ▸ to make it the post's first line — it replaces the whole opening paragraph and the preview refreshes immediately.
Post text, Hashtags, Tag people or pages, Best time to post and First comment follow. Best time renders as a clickable pill; hover it to read the model's reasoning (Why this time: …), and the 📅 / ⬇ buttons add it to Google Calendar or download an .ics. Post text, Hashtags and First comment each carry a 📋 Copy button; the other sections do not.
Good to know — a real @mention needs the person's URN, which only the logged-in extension can read. Company pages publish as real, clickable tags on every post type; LinkedIn only links a person tag for your own account, so other people publish as their name in the text.
The fold preview and the linters
The Scroll-stop preview is a live LinkedIn card that folds exactly where "…see more" cuts you off: 210 characters or the third line break, whichever comes first. Click …see more to expand it.
Under it, a counter reads N before the fold · total/limit, where the limit is the tightest one among the destinations that still follow the source — LinkedIn 3,000, Facebook 63,206, Instagram 2,200, TikTok 2,200. A brand that has its own body is checked against its own platform instead, so it never caps the source. It turns red with — over limit! when you pass it, or adds (all visible) when nothing is hidden. Weak-hook hints appear as needed under a Hook hints: label: Opens with “I” — lead with the reader or the stakes, not yourself. · Opens with a question only — pair it with a concrete claim or number. · No number or specific name in the hook — add a concrete detail.
🧹 Humanize turns em dashes into commas or full stops, strips filler and swaps AI-tell words for plain ones, reporting Humanized (light pass) — Undo available; ↶ Undo puts back the one step it keeps. ⚑ Flag AI highlights AI-sounding sentences without changing anything, and toggles to ⚑ Hide flags. All three are pure client-side and cost nothing.
The $0 paths
🌙 Generate free (overnight · $0) queues the request instead of calling the paid API; a Claude Code session on the subscription drains the queue, drafts each item and saves it to your calendar. Without a seed it refuses with Add a theme or paste a post first.; on success you get Queued for a free overnight draft — it will appear on your calendar, no API cost. The panel under the button shows what is being written right now and how long it has left, and if the queue is writing the post you have open, a banner says so.
Queue for Autopilot hands the theme to the overnight Autopilot run, written on the Batch API and placed on a slot the next day. It needs a Theme — seed text alone is refused with Type a theme first — that is what Autopilot will write about. — and it only runs if Autopilot is armed: Settings → Overnight Autopilot → Autopilot on is off until you tick it, and an unarmed workspace's queued themes simply wait.
Good to know — the free drain runs against the owner's workspace with the Studio token. A queued item in another workspace is stored, and stays stored, until someone drains it. The paid Generate package is the one path that always completes by itself.
Saving and edit rights
Save draft writes the open package; Compose also autosaves about two seconds after typing stops — a plain save, no AI and no cost. 📅 Schedule… and 🔗 Publish now sit beside it.
A post stays editable while its status is draft, scheduled, failed or manual — right up to the moment the scheduler claims the row. Once it is publishing or published, Compose locks the editor itself: Post text goes read-only and Save draft, 📅 Schedule… and 🔗 Publish now are disabled (✋ Post by hand… stays live on purpose). Should a save reach the server anyway, it answers 409 post is not editable (draft/failed/manual only). Compose says so once, then offers the way forward:
This post is published, so it can no longer be edited. Click “Copy to a new draft” above to work from a copy — it brings the text and the media with it.
📄 Copy to a new draft appears on exactly those posts, duplicates the package and the media, and opens the copy in place. A published post has no Edit in Compose button in the Calendar list — open it from the Calendar's preview dialog, whose ✎ Edit in Compose works on any status and drops you straight into Edit mode.