{"_id":"@allenwu06/loopkit","name":"@allenwu06/loopkit","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@allenwu06/loopkit","version":"0.1.0","description":"Scaffolds the post-ship distribution loop from your own repo — generates a landing page, launch-post drafts, a submission checklist, a payments scaffold, and a traction tracker as deterministic file transforms. Does the boilerplate only; no LLM, no networ","type":"module","license":"MIT","private":false,"bin":{"loopkit":"bin/loopkit.js"},"engines":{"node":">=20"},"scripts":{"test":"vitest run","test:watch":"vitest","loopkit":"node bin/loopkit.js"},"keywords":["indie-hackers","solo-dev","launch","show-hn","distribution","landing-page","changelog","traction","cli","bootstrapping"],"devDependencies":{"vitest":"^2.1.9"},"_id":"@allenwu06/loopkit@0.1.0","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-AG/c7mQ0h2KUVUV01MAwOMaKZq4JbvstCoFJJMgF5aXu1fWWojlcLfWddQtIc0/YQyzLfyVcyUrKyAbuXdppUw==","shasum":"9729a9b438b73d1ac08748a30f6d11bda61b7627","tarball":"https://registry.npmjs.org/@allenwu06/loopkit/-/loopkit-0.1.0.tgz","fileCount":10,"unpackedSize":71340,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDAZy7dpCMbcSkwdBY09Eas7d6jxGn/rmBQPrwlEqiEIAIhAI/IVBJRphTvMrD6w+Z1SFucmXx0n+4mmq4R3/2EASTB"}]},"_npmUser":{"name":"allenwu06","email":"allenwu@umich.edu"},"directories":{},"maintainers":[{"name":"allenwu06","email":"allenwu@umich.edu"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loopkit_0.1.0_1779208100219_0.5771557116701105"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T16:28:20.108Z","0.1.0":"2026-05-19T16:28:20.376Z","modified":"2026-05-19T16:28:20.563Z"},"maintainers":[{"name":"allenwu06","email":"allenwu@umich.edu"}],"description":"Scaffolds the post-ship distribution loop from your own repo — generates a landing page, launch-post drafts, a submission checklist, a payments scaffold, and a traction tracker as deterministic file transforms. Does the boilerplate only; no LLM, no networ","keywords":["indie-hackers","solo-dev","launch","show-hn","distribution","landing-page","changelog","traction","cli","bootstrapping"],"license":"MIT","readme":"# loopkit\n\n**You shipped the thing. This does the boring, repetitive launch paperwork —\nand only that.**\n\nYou just shipped a first version of a product (an MVP — a \"minimum viable\nproduct\", the smallest thing worth releasing). Now you have to find users, and\nmost of that time goes to rebuilding the same checklist from memory every\ntime: *what goes in a \"Show HN\" post (the Hacker News launch post) again?\nwhere does the landing-page copy come from? how do I wire up a payment\nprocessor without it tangling into my code? am I actually growing?*\n\n`loopkit` does that mechanical busywork — and **nothing else** — by\ntransforming **your own repo's files** the same way every time:\n\n```bash\nnpx @allenwu06/loopkit landing      # a real static landing page from your README\nnpx @allenwu06/loopkit launch       # Show HN / forum / changelog post DRAFTS\nnpx @allenwu06/loopkit checklist    # the distribution + payments wiring checklist\nnpx @allenwu06/loopkit track        # a plaintext, local-only traction log\n```\n\nNo LLM. No network. No telemetry. No account. Zero runtime dependencies. MIT.\n\n---\n\n## What loopkit does NOT do — by design, and this is the whole point\n\nRead this first. It is the reason this tool exists and the reason to trust it.\n\n- **It does not do taste.** It will not tell you if your value prop is any\n  good, if your name is bad, or if the thing is worth launching.\n- **It does not do distribution judgment.** It will not pick your channel,\n  your timing, your audience, or your community. Those decisions *are* the\n  hard part and no tool can do them for you. loopkit just stops you\n  forgetting the steps.\n- **It does not post anything, ever.** It writes DRAFT files to your disk.\n  *You* read them, cut what isn't true yet, add your voice, and *you* hit\n  submit. There is no posting code in this repo and there never will be.\n- **It does not write a single claim of its own.** Every word in every\n  generated artifact is either copied from your own README/CHANGELOG or is a\n  loud `[loopkit: FILL THIS IN — …]` placeholder. If your repo doesn't\n  substantiate a claim, loopkit will not invent one. It would rather emit an\n  ugly placeholder than a plausible lie.\n- **It contains zero payment code.** `loopkit checklist` generates a payments\n  *integration scaffold* — documentation, the wiring steps, and `TODO(you)`\n  markers. It imports no payment SDK, handles no key, processes no money. You\n  wire that yourself, with your processor's own SDK, behind your own keys.\n- **It is not growth magic.** There is no AI, no autopilot, no \"we'll get you\n  users\". A tool that claimed that would be lying, and you should not star\n  it.\n\n> loopkit is the *boilerplate-removal* of the distribution loop, not the\n> distribution. The 80% that is mechanical (scaffolding, checklists,\n> templates, restating your own words, tracking numbers you recorded) it\n> does completely. The 20% that is taste, judgment, voice, and the actual\n> clicking of \"post\" — it deliberately leaves to you, loudly. Every\n> generated file says this about itself, on its own.\n\nThese guarantees are not just prose: they are **statically asserted by the\ntest suite** across the entire shipped tree (`test/no-network.test.js`,\n`test/gen-checklist.test.js`). No network module is imported, no `fetch`\nexists, no payment SDK is present, no LLM is wired. The honesty is the moat.\n\n---\n\n## The four commands\n\n### `loopkit landing`\n\nGenerates one **static, dependency-free `index.html`** from your\n`README.md` + `package.json`:\n\n- Title and tagline from your `package.json` `name`/`description` (or your\n  README's `#` title and intro).\n- Install snippet lifted **verbatim** from the first fenced code block under\n  an Install/Usage heading.\n- \"Why / Features / How it works / Limitations\" sections, each the first\n  paragraph of the matching README section, **verbatim** (markdown stripped\n  to text — never paraphrased).\n- A GitHub button only if `package.json` has a `repository`.\n\nThe file has **no JavaScript, no webfont request, no CDN, no tracker, no\nbuild step**. `scp` it to any static host and it works. loopkit does not\ndeploy it — deployment is yours.\n\n```bash\nnpx @allenwu06/loopkit landing                     # → ./loopkit-out/index.html\nnpx @allenwu06/loopkit landing --repo . --stdout   # print it instead\n```\n\nMissing a tagline or install snippet? You get a visible\n`[loopkit: FILL THIS IN — …]` in the page (you'll see it in the browser\ntab), never a fabricated sentence.\n\n### `loopkit launch`\n\nGenerates **three launch-post DRAFTS** from your `README.md` + `CHANGELOG.md`:\n\n| file | what it is |\n|------|------------|\n| `show-hn.draft.md` | A Show HN title (with a length check against HN's 80-char limit) + a first-comment draft built from your tagline, your README feature bullets, and your own \"what it does NOT do\" section. The personal *why you built this* and *your ask* are left as explicit placeholders — loopkit cannot and will not write your story. |\n| `forum-post.draft.md` | A generic subreddit / Lobsters / forum post. loopkit will not choose the community — wrong-community posting is the fastest way to get flagged, and that is a judgment call. |\n| `changelog-announcement.draft.md` | A short + a long announcement built **only** from the top real release in your `CHANGELOG.md`. No changelog → it says so and emits a placeholder; it does not invent a release. |\n\nEvery draft opens with a DRAFT banner, is numbered `DRAFT n/3`, and restates\n**only** what your repo already says. loopkit adds no adjective you didn't\nwrite. It never posts.\n\n```bash\nnpx @allenwu06/loopkit launch          # → ./loopkit-out/launch/*.draft.md\n```\n\n### `loopkit checklist`\n\nEmits the mechanical distribution + monetization checklist a solo shipper\notherwise rebuilds from memory every time:\n\n- `DISTRIBUTION-CHECKLIST.md` — the literal submission steps for Show HN\n  (linking the official rules), Product Hunt, Reddit/Lobsters, owned\n  channels, and a Merchant-of-Record monetization section. Every item is an\n  **unchecked** box for a thing only *you* can do — loopkit checks nothing\n  off and cannot.\n- `payments/INTEGRATION.md` — a Merchant-of-Record (Paddle / Lemon Squeezy /\n  Polar) **integration scaffold**: the wiring steps, where keys go (env\n  vars, never committed — loopkit will not hold a key), the webhook *shape*\n  and its failure modes, and `TODO(you)` where your code goes. **It contains\n  no runnable payment code, no SDK import, no endpoint.** A generic \"just\n  works\" payment handler would be a security liability — signature\n  verification must be *your* code, written on purpose.\n\n```bash\nnpx @allenwu06/loopkit checklist       # → ./loopkit-out/{DISTRIBUTION-CHECKLIST.md,payments/INTEGRATION.md}\n```\n\n### `loopkit track`\n\nA **plaintext, local-only, git-friendly** traction log. You record the\nnumbers you observed; loopkit computes deltas and a summary. That is the\nentire feature.\n\n```bash\nnpx @allenwu06/loopkit track add stars 12 \"morning after Show HN\"\nnpx @allenwu06/loopkit track add stars 47 \"HN front page\"\nnpx @allenwu06/loopkit track\n# stars  47  [+35 total since 2026-03-01]  last step +35 (since …)\n```\n\nThe store is a tab-separated file you keep in your own git — readable,\ndiff-able, no lock-in. **loopkit never fetches a number for you** (it cannot\n— there is no network client). A tracker that auto-scraped your star count\nwould be both the \"magic\" this tool refuses and a telemetry surface. This\nstays a notebook, on purpose. No phone-home, no account, no analytics.\n\n---\n\n## Install / run\n\nRequires Node ≥ 20. Zero runtime dependencies.\n\n```bash\nnpx @allenwu06/loopkit help\n# or, from a clone:\nnode bin/loopkit.js help\n```\n\nCommon flags: `--repo DIR` (default: cwd), `--out DIR`, `--stdout`,\n`--version`.\n\n## How it stays honest (the design)\n\nEverything downstream is a **pure function** of one normalized model\n(`src/repo-read.js`), which is itself a pure function of your\n`package.json` / `README.md` / `CHANGELOG.md`. There is no clock or RNG\ninside a generator, so the same repo produces **byte-identical** output every\ntime (asserted by the determinism tests). The only nondeterministic thing in\nthe whole tool is the timestamp `loopkit track` records — a local clock read,\nisolated to the CLI boundary, never a network call.\n\nWhen an input is genuinely absent, loopkit emits a deliberately ugly\n`[loopkit: FILL THIS IN — …]` placeholder rather than a fabrication. That\nplaceholder is impossible to mistake for real copy and impossible to ship by\naccident — which is the point.\n\n## Honest limitations\n\n- It reads `package.json`, `README.md`, and `CHANGELOG.md`. It does not parse\n  `pyproject.toml`, `Cargo.toml`, `go.mod`, etc. yet — if your repo is not\n  Node-ish you get the README-driven half (still useful) and placeholders for\n  the package metadata. (PRs / issues welcome — see below.)\n- The landing page is intentionally plain (system fonts, no JS). It is a\n  *correct, deployable scaffold*, not a designed site. Design is taste;\n  loopkit does not do taste.\n- It restates your README/CHANGELOG. If those are thin, the drafts are thin —\n  honestly thin, with placeholders, which is the correct signal that the\n  *input* needs work before you launch. loopkit will not paper over a thin\n  README with invented enthusiasm.\n- The checklist encodes today's platform conventions (Show HN, PH, etc.).\n  Those platforms change; the checklist is a strong default, not a substitute\n  for reading each platform's current rules (which it tells you to do).\n- It is single-purpose on purpose. It will not become a CRM, an email tool,\n  an analytics dashboard, or an \"AI growth assistant\". Those either need\n  taste/judgment or a network/account, and both are out of scope by design.\n\n## Feedback\n\nMisfires and \"this scaffold was wrong/misleading\" reports are the single most\nvaluable input — see [`FEEDBACK.md`](FEEDBACK.md). The zero-friction path:\nopen an issue and add the **`loopkit-feedback`** label. Whatever you write is\nread **exactly as written** — not summarized, not paraphrased.\n\n## License\n\nMIT — see [`LICENSE`](LICENSE).\n","readmeFilename":"README.md","_rev":"1-8c82c08c0a9b7989cc98d325a8a4ef2e"}