Repo-aware launches: how to make 'launch this' actually mean 'launch this'

Most launch-helper tools generate the same generic 'New AI startup launches!' post for every project. Repo-aware launches use git log, README, routes, and changed files as grounding — so the output references the actual product.

If you’ve used a launch-helper tool, you’ve seen the symptom. You ship something, ask the tool to “draft a launch post,” and it returns three confident-but-empty paragraphs about your “innovative AI-powered solution.” It works for any product because it knows nothing about yours.

The fix isn’t a better prompt. It’s grounding.

What grounding does

When a coding agent (Cursor, Claude Code, Codex, Lovable, Bolt, OpenClaw, Hermes, Base44) calls chiefmo_launch_product, it should pass repoContext — a structured snapshot of the repo it’s about to launch from:

chiefmo_launch_product({
  productUrl: "https://acmebatch.example.com",
  goal: "Get our first 100 paying users",
  channels: ["linkedin", "x", "product_hunt", "email", "landing_hero"],
  repoContext: {
    repoUrl: "https://github.com/acme/batch",
    whatChanged: "Shipped scheduled posts (Sun → all week) + per-account quotas",
    recentCommits: [
      { sha: "9f1a2b3", message: "feat(scheduler): persistent cron + per-account caps" },
      { sha: "c4d5e6f", message: "ui(schedule): drag-to-reorder + preview" },
      { sha: "1a2b3c4", message: "billing(stripe): metered usage on quota overrun" }
    ],
    changedFiles: ["app/scheduler.ts", "components/ScheduleDialog.tsx", "lib/billing/quota.ts"],
    routes: ["/", "/dashboard", "/schedule", "/pricing"],
    targetCustomer: "Solo creators who want to batch a week's posts on Sunday",
    launchGoal: "First 100 paying users in 30 days"
  }
})

Each field shapes a different part of the output:

  • whatChanged — anchors the angle. The model writes “scheduled posts is now Pro” instead of “AcmeBatch is launching.”
  • recentCommits — drives the technical credibility paragraph in the LinkedIn post and the changelog-style first comment on Product Hunt.
  • changedFiles — tells the model which subsystems actually shipped. Stops it from inventing features.
  • routes — lets the landing-hero brief reference real URLs (“see the schedule preview at /schedule”) instead of generic CTAs.
  • targetCustomer — collapses the audience to a real persona. Founder voice, not corporate voice.
  • launchGoal — picks the channel mix. “First 100 users” → LinkedIn + X + Product Hunt + email. “Recruit engineers” → LinkedIn + landing only, no Product Hunt.

What “launch this” should trigger

Inside Cursor / Claude Desktop / Codex / Lovable / Bolt, after building something, the user usually says one of these:

  • “launch this”
  • “get users”
  • “market this”
  • “announce this”
  • “post this”

These are the trigger phrases the agent should map to chiefmo_launch_product. ChiefLab’s llms.txt and tools/list descriptions both include the literal phrases so BM25 tool-pickers route correctly.

The direct HTTPS version

curl -X POST https://api.chieflab.io/api/mcp \
  -H "Authorization: Bearer $CHIEFLAB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc":"2.0",
    "id":1,
    "method":"tools/call",
    "params":{
      "name":"chiefmo_launch_product",
      "arguments":{
        "productUrl":"https://acmebatch.example.com",
        "goal":"Get our first 100 paying users",
        "repoContext":{
          "whatChanged":"Shipped scheduled posts (Sun -> all week) + per-account quotas",
          "recentCommits":[{"sha":"9f1a2b3","message":"feat(scheduler): persistent cron + per-account caps"}],
          "changedFiles":["app/scheduler.ts","components/ScheduleDialog.tsx"],
          "routes":["/","/dashboard","/schedule","/pricing"]
        }
      }
    }
  }'

The hosted MCP endpoint and npm CLI are live. Run npx -y @chieflab/cli launch-here --intent "launch this" — ONE command. The CLI detects the runtime, attaches ChiefLab if needed (mint workspace + write MCP config + plant repo), gathers repoContext, fires chieflab_get_users_after_build over HTTPS, and renders the launch room in the same chat turn.

What the launch pack looks like

The response shape (truncated) — pulled from a real run; full versions live at https://chieflab.io/examples:

{
  "launchId": "run_acmebatch_001",
  "intent": "launch_product",
  "launchPack": {
    "positioning": { "assetId": "...", "body": "AcmeBatch is the Sunday-night batch scheduler for solo creators..." },
    "launchAngle": { "assetId": "...", "body": "Founder-led, Sunday-night ritual angle..." },
    "channels": {
      "linkedin": { "body": "Hook: 'I spent every Sunday night batching posts...'" },
      "x":        { "body": "Thread of 5 tweets. T1: hook (Sunday-night ritual)..." },
      "product_hunt": { "body": "Tagline: 'Schedule a week of posts on Sunday night.'..." },
      "email":    { "body": "Subject: 'AcmeBatch is live — your Sunday-night batch scheduler.'..." },
      "landing_hero": { "body": "Hero headline: 'Schedule a week of posts on Sunday.'..." }
    }
  },
  "publishActions": [...],
  "reviewUrl": "https://chieflab.io/runs/run_acmebatch_001?token=...",
  "trackingPlan": { "metricsTrackedAfter": "24h", "nextRunTool": "chiefmo_measure_launch_results" }
}

The default outputMode: "context" returns drafting briefs — your agent’s LLM renders each body into final copy. ChiefLab’s per-launch token cost stays near $0 because the writing happens in the caller’s LLM, where the user already pays for tokens.

What grounding is worth in concrete terms

A repo-aware run is allowed to say things like:

“drag-to-reorder schedule preview”

A URL-only run can’t, because it doesn’t know the UI. A generic launch tool will write:

“powerful new scheduling features”

Same word count, opposite information density.

The closed loop after launch

After chiefmo_launch_product returns, the agent surfaces the signed reviewUrl. The user opens it in any browser (no login — HMAC, 7-day TTL), sees the rendered launch pack, approves or rejects per channel.

Approved actions get fired by their executorTool:

  • chiefmo_publish_approved_post → Zernio (LinkedIn / X / Threads / IG / FB / Bluesky / TikTok)
  • chiefmo_send_approved_email → Resend

24h later, chiefmo_measure_launch_results({ runId }) pulls Zernio engagement + GA4 traffic + Search Console queries and returns a next-iteration brief. The loop closes.

Try it

Add ChiefLab to Cursor (one click) → · All install paths → · Examples →

← all posts