Oannes DM-Shareability Re-engineering — Design
Date: 2026-06-27
Status: Approved (brainstorming → spec)
Project: Oannes Content Engine (oannes-engine/)
Goal
Retune content generation so every post is built to be forwarded in a DM — Instagram’s top ranking signal for reaching non-followers is sends-per-reach (confirmed in the 2026-06-27 deep research, from Mosseri Jan 2025), ranked above likes, with watch time the other dominant factor. Our content currently gives a viewer no reason to forward it, which maps directly to our near-zero IG reach. This is roadmap item #1 (highest-confidence lever).
Two mechanisms: (a) forwardable hooks — lead with the most “you have to see this” angle of the claim; (b) explicit direct share-CTAs — Joshua chose the blunt approach: tell the viewer to send/tag.
Scope
Content-generation prompt + render tweak only. No new modules. The reel video itself does not change; the reel’s share-CTA lives in its caption (the feed text on IG/FB/YT). Carousels get an on-slide share treatment because that’s where it’s expected and cheap.
Out of scope (YAGNI): a spoken/on-screen share-CTA inside the reel video — it would break the existing VO↔caption timing for marginal gain. Caption-level CTA is sufficient for reels until there’s evidence otherwise.
Changes
1. src/script/reelscript.ts — buildReelPrompt
- Hook instruction: lead with the single most forwardable angle of the claim — the shocking, specific “you have to see this” detail — as the curiosity gap, not a generic opener.
- Caption instruction: end with a direct share CTA that names a person to send it to (e.g. “Send this to someone who swears it’s swamp gas 👇” / “Tag the skeptic who needs this”), replacing the current “ends with a question.”
- Attribution rule unchanged (the IP/credibility shield).
2. src/script/carouselscript.ts — buildCarouselPrompt + CarouselScript
- Same forwardable-hook instruction.
- Caption ends with a direct share CTA.
- New field
shareCta: stringonCarouselScript— a claim-specific share line the model generates (e.g. “Send this to someone who thinks it’s all weather balloons”). Required (zod.min(1)). slidesFromScriptpassesshareCtaonto the finalctaslide as itstext.
3. src/render/Carousel.tsx — cta slide branch
- Render the generated share line (
text) large (e.g. “SEND THIS TO A SKEPTIC”) with@oannescodesmaller underneath — so the last thing a swiper sees is a direct prompt to forward. (Currently hardcodes “FOLLOW FOR MORE / @oannescode”.)
Components touched
| File | Change |
|---|---|
src/script/reelscript.ts |
prompt: forwardable hook + share-CTA caption |
src/script/carouselscript.ts |
prompt + shareCta field + slidesFromScript wiring |
src/render/Carousel.tsx |
cta slide renders the share line |
| tests | assert the new prompt instructions + shareCta on the CTA slide |
Error handling
shareCta is required in the carousel schema — a malformed model response fails zod parse,
which generateDaily‘s existing try/catch treats as a carousel-build failure (reel still
publishes). No new failure modes.
Testing (TDD, tsc-gated via npm test)
reelscript.ts:buildReelPromptasserts the forwardable-hook + direct-share-CTA language.carouselscript.ts: prompt asserts the same;parseCarouselScriptaccepts/validatesshareCta;slidesFromScriptputsshareCtaon thectaslide’stext.- Existing scriptwriter/carousel tests updated for the new field.
- Follow existing vitest patterns.
Success criteria
Generated reels and carousels consistently (a) open with a forwardable hook and (b) end with a direct “send/tag” CTA; the carousel’s last slide shows the share line. Whether this actually lifts IG sends-per-reach is measured downstream via the existing metrics loop (we already track per-platform stickiness; IG reach climbing off ~0 is the signal to watch over ~2 weeks).
Out of scope (later roadmap items, not this spec)
- Per-post variety / voice rotation (roadmap #2).
- TikTok account-type / trending-audio decision (roadmap #3).