Skip to content

Launch day

You launch on Hacker News, Reddit and Product Hunt with a fact brief for each comment; your agent posts on LinkedIn and X.

Kind
Agent task
Price
$1.08 per launch
Your time
140 minutes
Approval
You do a step
Post.launch
You, to your agent

Launch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first.

curl -X POST "https://api.sb/leaseline.app/posts/launch?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"goal":"Launch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first.","budget":{"amount":5,"currency":"USD"}}'
npx startup-builder do Post.launch --try --data '{"goal":"Launch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first.","budget":{"amount":5,"currency":"USD"}}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Post.launch({ goal: 'Launch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first.', budget: { amount: 5, currency: 'USD' } })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Post.launch({ goal: 'Launch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first.', budget: { amount: 5, currency: 'USD' } })
Response
{
  "mode": "try",
  "stored": false,
  "estimate": "About $1.08 a launch",
  "sample": {
    "venue": "Hacker News",
    "points": "64",
    "comments": "38",
    "visits": "1,480",
    "signups": "61",
    "median brief": "6 minutes",
    "median reply": "14 minutes"
  }
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

What you get

  • 1 launch · You launch on Hacker News, Reddit and Product Hunt with a fact brief for each comment; your agent posts on LinkedIn and X. · Post
  • posts[] · Each site’s post: URL and state, live, removed with the moderators’ reason, or pending.
  • briefs · Comments briefed, the median minutes from a comment to its brief, and the median minutes to your reply.
  • readout[] · Per site at hour 24: points, comments, visits and signups, read from your own Analytics.

Connect once: Product Hunt, Hacker News, Reddit, LinkedIn, X account, Google Analytics. How long: Waits 24 hours from the first post.

Trigger

It runs once, at the slot the Launch kit set.

TypeScript
on.Content.compiled((kit, $) => kit.kind === 'launch-kit' && $.Post.launch({ offer: kit.offer, at: kit.calendar[0].at }))

Steps

Your agent does these steps, one row per step; each step’s check is part of its row and its price.

StepVerbReturnsPriceApproval
1. Compile the launch kitContent.compileEach site’s fields filled and checked, the missing ones listedAbout 0.16¢Runs on its own
2. Write three titles, the first comment and the postsContent.draftThree Show HN titles on the formulas below, the first comment, the Reddit post, the X thread and the LinkedIn postAbout 7.2¢Runs on its own
3. Make the launch imagesFile.generateFour images at each site’s sizesAbout 4.8¢Runs on its own
4. You post on Hacker News, Reddit and Product HuntPost.publishYour Show HN, your Reddit post and your Product Hunt launch, each live at its slotFreeYou do this step
5. Post on LinkedIn and XPost.publishThe LinkedIn post and the X thread, through your own accountsFreeGoes out on its own
6. Read new comments every 10 minutesKeyword.searchEach new comment on each post for 24 hoursAbout 82¢Runs on its own
7. Brief you on each comment within 10 minutesContent.draftFor each Hacker News, Reddit and Product Hunt comment: what it asks, the facts from your pages that answer it with their links, and what not to claimAbout 12¢Runs on its own
8. You write and post each replyConversation.answerYour reply under each comment, in your wordsFreeYou do this step
9. Answer comments on LinkedIn and XConversation.answerAn answer to each LinkedIn and X comment, from your pages and offerAbout 2¢Runs on its own
10. Read the day’s numbersMetric.queryPoints, comments, visits and signups per site at hour 24FreeRuns on its own

Calls: Content.compile, then Content.draft, then File.generate, then Post.publish, then Keyword.search, then Content.draft, then Conversation.answer, then Metric.query.

About $1.08 a launch, each time it runs, capped at $6.00.

How it runsWhat it says
Hacker News titleShow HN, then the name once, then what it does for whom, under 80 characters: “Show HN: Leaseline – rent and renewal tracking for 20 to 400 units”. The other two formulas are the job without the pain (“Show HN: Rent ledgers without the spreadsheet”) and the reason you built it (“Show HN: I built a rent ledger after reconciling 300 units by hand”). No superlative, no exclamation mark, no emoji.
When it postsHacker News on a weekday, 7 to 9 am Pacific, so the post meets the US morning on the new page. Product Hunt at 12:01 am Pacific the same day, since its day runs Pacific midnight to midnight. Reddit after 9 am Eastern, in the one subreddit that takes launch posts.
The first commentYou post it within a minute of the Show HN: who you are, the problem you had in one sentence, what the product does today, what it costs and what is free, and the one thing you want feedback on. It links nothing but the product.
Your repliesYour agent briefs you on each comment within 10 minutes: the question, the facts from your pages with their links, and what not to claim. You write the reply in your own words and post it. Nobody is ever asked to upvote.
Under 5 points after 2 hoursThe Show HN has left the new page, so stop sending people to it, and never delete or resubmit it that day. Email hn@ycombinator.com once to ask for the second-chance pool. If it stays unseen, repost once after 3 days with the formula you did not use. Reddit and Product Hunt carry the day meanwhile.

Example: give it a goal

Launch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first.

The plan it shows runs 10 steps, priced before it spends anything; Run it above shows the result it returns.

When something fails

Each failure, and what happens next
WhenThen
A site’s moderators remove a postIt is recorded removed with their stated reason and never reposted that day; the grade counts that site as posted on time.
Your Show HN has under 5 points after 2 hoursYour agent tells you, stops pointing anyone at it, and drafts the one email to the moderators and the repost title for 3 days later.
A comment asks something your pages cannot answerThe brief says so and holds the claim; you answer from what you know, and the agent adds the gap to your pages list.
You call it twice for the same offer and siteNo site gets two launch posts: it is idempotent per offer and site.

Each step retries three times, then falls through to the next route; one item's failure lands in skipped with its reason, never failing the call. Before a step would cross maxCost it stops and returns what it has, with a resume link. Each step's idempotency key is the call's key plus the step and the item: leaseline-post-launch-1-<step>-<item>.

How it is graded

A second model checks every claim in each post and brief against your offer and pages; code times each brief from its comment and reads each post back from its site. It passes when every post is live at its slot, every Hacker News, Reddit and Product Hunt comment had a fact brief within 10 minutes, and no brief or post states a fact your pages lack. A miss is free: you pay nothing for it.

Change it

AskCompiles to
Only Product Hunt and Hacker News, and brief me every 5 minutes for the first 4 hours.Post.launch
Email my waitlist when the Product Hunt post goes up.Message.broadcast
List the product in 40 directories the week after.Post.submit
TypeScript
import { $, workflow } from 'startup-builder'

export default workflow({
  name: 'post-launch',
  verb: 'Post.launch',
  input: { offer: 'string', at: 'string', venues: 'string[]' },
  maxCost: 6,
  grade: { evaluator: 'claims against the Offer and Pages; briefs within 10 minutes', passWhen: 'every post live, every comment briefed', remedy: 'free' },
  // you post and reply on Hacker News, Reddit and Product Hunt yourself: those two steps are human, done by the founder
  execute: async (ctx, { offer, at, venues = ['product-hunt', 'hacker-news', 'reddit', 'linkedin', 'x'] }) => {
    const kit = await ctx.step('kit', () => $.Content.compile({ kind: 'launch-kit', offer, venues }))
    const posts = await ctx.step('write', () => $.Content.draft({ kind: 'launch-posts', from: kit, fill: kit.missing, titles: 3, maxCost: 0.1 }))
    await ctx.sleep({ until: at })
    const yours = await ctx.task('post', { to: 'founder', posts: posts.filter((p) => ['hacker-news', 'reddit', 'product-hunt'].includes(p.venue)) })
    const ours = await ctx.step('post', () => $.Post.publish({ posts: posts.filter((p) => ['linkedin', 'x'].includes(p.venue)).map((p) => p.$id) }))
    for (let i = 0; i < 144; i++) {                                                   // every 10 minutes for 24 hours
      const comments = await ctx.step(`read:${i}`, () => $.Keyword.search({ threads: [...yours, ...ours].map((p) => p.url), since: '10m', maxCost: 0.01 }))
      for (const c of comments.new) {
        if (['linkedin', 'x'].includes(c.venue)) await ctx.step(`answer:${c.id}`, () => $.Conversation.answer({ to: c, from: 'offer', maxCost: 0.005 }))
        else await ctx.step(`brief:${c.id}`, () => $.Content.draft({ kind: 'reply-brief', for: c, from: 'offer', to: 'founder', within: '10m', maxCost: 0.005 }))
      }
      await ctx.sleep('10m')
    }
    return ctx.step('readout', () => $.Metric.query({ metrics: ['points', 'comments', 'visits', 'signups'], by: 'venue', since: at }))
  },
})

Extend it with extends: 'Post.launch' and base(), or compose your own from these steps.

Works with

Plays that order it: Launch sites, Launch week, Deposits before you build.

It serves Earn first links, and runs in Launch and search. It deepens Launch announcement.

For agents

For agents: the guide, its approvals, retries and lookups
FactValue
GuidePost.launch
Guide approvalask
GoalLaunch Leaseline on Product Hunt and Hacker News next Tuesday and brief me on every comment for a day, spend up to $5, and show me the plan first. It may change counts, the order of steps, soft filters and the route a read takes, and it stops early when the goal is met. It never relaxes your words, raises its own budget, answers its own approval, calls a Play or acts outside your standing approval.
Triggeron.Content.compiled((kit, $) => kit.kind === 'launch-kit' && $.Post.launch({ offer: kit.offer, at: kit.calendar[0].at }))
RetryThree times with backoff, then the next route; the same idempotency key never charges, sends or posts twice
Idempotency keyleaseline-post-launch-1
LookupsA find: input asks unless exactly one record fits
Step
1. Compile the launch kit
2. Write three titles, the first comment and the posts
3. Make the launch images
4. You post on Hacker News, Reddit and Product Hunt Action class publish
5. Post on LinkedIn and X Action class publish
6. Read new comments every 10 minutes
7. Brief you on each comment within 10 minutes
8. You write and post each reply
9. Answer comments on LinkedIn and X
10. Read the day’s numbers

The amounts live once, on the hub (approvals).

Who does each step, and how it is checked
StepFunctionDoerCheckerAssuranceInputs
1. Compile the launch kitcodeCodeCode checks each result against its declared typemeasured$0.offer, $0.venues
2. Write three titles, the first comment and the postsagenticThe Marketing lead agentAdversarial review by a second model: Pass, or the cut claims; nothing claims what the offer cannotgraded$1.missing, offer
3. Make the launch imagescodeCodeCode reads the result back from where it landedmeasured$1.sizes
4. You post on Hacker News, Reddit and Product HunthumanYouCode reads each post’s URL back from the site and records it live with its timeattested$2, $3, $0.at
5. Post on LinkedIn and XcodeCodeCode reads each post back from the account and records its idmeasured$2, $0.at
6. Read new comments every 10 minutescodeCodeCode checks each result against its declared typemeasured$4.urls, $5.urls
7. Brief you on each comment within 10 minutesagenticThe Marketing lead agentAdversarial review by a second model: Pass, or the unsourced fact cut with the reasongraded$6.comments, offer
8. You write and post each replyhumanYouCode reads each reply back under its comment and records the minutes from comment to replyattested$7.briefs
9. Answer comments on LinkedIn and XagenticThe Marketing lead agentA second model checks each answer against your pages before it posts, and code reads it backgraded$6.comments, offer
10. Read the day’s numberscodeCodeCode checks each result against its declared typemeasured$4, $5

The doer is never the checker, and the weakest assurance on the path is the whole call’s.

Under the hood

Under the hood: the Systems, Nouns and Events it touches
KindWhat it touches
SystemsAnalytics and experiments, Media, sites and content, Social
NounsContent, Action, File, Post, Keyword, Conversation, Metric
EventsContent.drafted, Action.evaluated, File.generated, Post.published, Conversation.answered, Metric.queried

Reference

Inputs, outputs, its Event and its errors
NameTypeDefaultMeaning
offerOfferRequiredThe offer you are launching.
atstringthe Launch kit’s slotWhen the first post goes up. Product Hunt days run from 12:01 PT.
venuesVenueId[]['product-hunt', 'hacker-news', 'reddit', 'linkedin', 'x']The sites to post on.
briefWithinstring'10m'How fast each comment gets its fact brief during the first 24 hours.
handlesstring[]['product-hunt:founder', 'hacker-news:founder', 'reddit:founder', 'linkedin:founder', 'x:founder']The accounts the posts go out from. On Hacker News, Reddit and Product Hunt you post and reply yourself; your agent posts only on LinkedIn and X.
maxCostnumber6.00The most this call spends each time it runs, in USD. It stops before a step would cross it and returns what it has, with a resume link.

Emits Post.launched. Refuses with max-cost before it spends, and with the Data calls and Accounts groups (refusals).

Contents