← Nisarg GurjarMCEmail me
LIVE · SLACK BOT

Caption Studio. Two scroll-stopping captions, zero invented facts.

Status
Live in the company Slack
Client
M4U Events marketing team
Stack
Next.js · Vercel · Claude (multimodal) · Slack API
Scale
36 tests · 15 eval fixtures · 2 must-pass gates
Year
2026
0 invented facts allowedthe eval gate that ships every change
Diagram of the Caption Studio evaluation pipeline: fifteen fixtures run through the generator into two must-pass gates, an invented-fact firewall and cultural-term preservation, with either failure blocking the release.
Diagram: the eval gate. Fifteen fixtures run on every change; either gate failing blocks the release.
The problem

The marketing team writes captions the way most people do: a rough draft, then twenty minutes second-guessing the hook. And AI “help” usually makes it worse, because models happily invent venue names, dates, and details. A wrong fact in a client’s wedding post is not a typo, it’s an incident.

What I shipped
  • ◆Drop a draft in Slack (photo optional; the model reads the image too), get two complete variants back, each built on a different scroll-stopping hook.
  • ◆One-tap refinement. Shorter · For TikTok · More emotional · Bolder hook, or just reply in the thread in plain words.
  • ◆The factual firewall. The model must list which facts from the draft it used; using a fact that wasn’t there fails the gate. Free to reinvent wording, never reality.
  • ◆Cultural-term preservation. Baraat, sangeet, haldi and the rest are never “translated away.” A second must-pass gate enforces it.
  • ◆Stateless by design. Conversation state is reconstructed from the Slack thread itself; no database to drift.
How it works
Draft → variants → refine, all in the thread
  1. 1@mention the bot with a rough caption (and the photo, if you like)
  2. 2Claude reads both and writes two hook-first variants
  3. 3Every variant passes the factual firewall before posting
  4. 4Tap a refine button or reply in words; the thread is the memory
The hard part
The eval fixtures are the product. Fifteen scenarios (Hinglish drafts, romanized Punjabi, fact-heavy posts, clickbait traps, sparse one-liners) and two gates that must pass 100% before any prompt change ships. The firewall works because it’s structural: the model has to show its receipts (a factsUsed list), and the gate checks them against the source.
Proof
  • ✓36 unit tests, no network required.
  • ✓Both eval gates held on the live launch post.
  • ✓Runs @mention-only, with a kill switch. Boring, safe operations.
rough draft + venue photo
Variant A · hook-first Variant B · story-first
✓ factual firewall passed · refine buttons below
Where it stands

Live in the company workspace. The team keeps the voice; the bot supplies the hook, and it never posts anywhere itself. Humans copy what they like.

I set the gates a caption must pass before it can reach a feed. Claude Code built the bot, and Claude writes the captions. How I work →

Run an events business? I built Ajna for you.

AI automation for wedding & event vendors. Quotes in minutes instead of days, with a human always in the loop.

Visit ajnadesk.com