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
- Deepens
- Launch announcement
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' } })
{
"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"
}
}
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,removedwith the moderators’ reason, orpending.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.
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.
| Step | Verb | Returns | Price | Approval |
|---|---|---|---|---|
| 1. Compile the launch kit | Content.compile | Each site’s fields filled and checked, the missing ones listed | About 0.16¢ | Runs on its own |
| 2. Write three titles, the first comment and the posts | Content.draft | Three Show HN titles on the formulas below, the first comment, the Reddit post, the X thread and the LinkedIn post | About 7.2¢ | Runs on its own |
| 3. Make the launch images | File.generate | Four images at each site’s sizes | About 4.8¢ | Runs on its own |
| 4. You post on Hacker News, Reddit and Product Hunt | Post.publish | Your Show HN, your Reddit post and your Product Hunt launch, each live at its slot | Free | You do this step |
| 5. Post on LinkedIn and X | Post.publish | The LinkedIn post and the X thread, through your own accounts | Free | Goes out on its own |
| 6. Read new comments every 10 minutes | Keyword.search | Each new comment on each post for 24 hours | About 82¢ | Runs on its own |
| 7. Brief you on each comment within 10 minutes | Content.draft | For 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 claim | About 12¢ | Runs on its own |
| 8. You write and post each reply | Conversation.answer | Your reply under each comment, in your words | Free | You do this step |
| 9. Answer comments on LinkedIn and X | Conversation.answer | An answer to each LinkedIn and X comment, from your pages and offer | About 2¢ | Runs on its own |
| 10. Read the day’s numbers | Metric.query | Points, comments, visits and signups per site at hour 24 | Free | Runs 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 runs | What it says |
|---|---|
| Hacker News title | Show 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 posts | Hacker 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 comment | You 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 replies | Your 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 hours | The 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
| When | Then |
|---|---|
| A site’s moderators remove a post | It 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 hours | Your 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 answer | The 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 site | No 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
| Ask | Compiles 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 |
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: 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
| Fact | Value |
|---|---|
| Guide | Post.launch |
| Guide approval | ask |
| 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. 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. |
| Trigger | on.Content.compiled((kit, |
| Retry | Three times with backoff, then the next route; the same idempotency key never charges, sends or posts twice |
| Idempotency key | leaseline-post-launch-1 |
| Lookups | A 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
| Step | Function | Doer | Checker | Assurance | Inputs |
|---|---|---|---|---|---|
| 1. Compile the launch kit | code | Code | Code checks each result against its declared type | measured | $0.offer, |
| 2. Write three titles, the first comment and the posts | agentic | The Marketing lead agent | Adversarial review by a second model: Pass, or the cut claims; nothing claims what the offer cannot | graded | $1.missing, |
| 3. Make the launch images | code | Code | Code reads the result back from where it landed | measured | $1.sizes |
| 4. You post on Hacker News, Reddit and Product Hunt | human | You | Code reads each post’s URL back from the site and records it live with its time | attested | $2, |
| 5. Post on LinkedIn and X | code | Code | Code reads each post back from the account and records its id | measured | $2, |
| 6. Read new comments every 10 minutes | code | Code | Code checks each result against its declared type | measured | $4.urls, |
| 7. Brief you on each comment within 10 minutes | agentic | The Marketing lead agent | Adversarial review by a second model: Pass, or the unsourced fact cut with the reason | graded | $6.comments, |
| 8. You write and post each reply | human | You | Code reads each reply back under its comment and records the minutes from comment to reply | attested | $7.briefs |
| 9. Answer comments on LinkedIn and X | agentic | The Marketing lead agent | A second model checks each answer against your pages before it posts, and code reads it back | graded | $6.comments, |
| 10. Read the day’s numbers | code | Code | Code checks each result against its declared type | measured | $4, |
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
| Kind | What it touches |
|---|---|
| Systems | Analytics and experiments, Media, sites and content, Social |
| Nouns | Content, Action, File, Post, Keyword, Conversation, Metric |
| Events | Content.drafted, Action.evaluated, File.generated, Post.published, Conversation.answered, Metric.queried |
Reference
Inputs, outputs, its Event and its errors
| Name | Type | Default | Meaning |
|---|---|---|---|
offer | Offer | Required | The offer you are launching. |
at | string | the Launch kit’s slot | When the first post goes up. Product Hunt days run from 12:01 PT. |
venues | VenueId[] | ['product-hunt', | The sites to post on. |
briefWithin | string | '10m' | How fast each comment gets its fact brief during the first 24 hours. |
handles | string[] | ['product-hunt: | 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. |
maxCost | number | 6.00 | The 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).