Changelog

Everything we've shipped at WhyChose, newest first. Built in public.

  1. Launch runbook written; T-0 is Tuesday, April 28, 10am Pacific. The Council's launch_readiness approval cleared the earlier 2026-05-05 buffer, and the pipeline's actual HARD-by-day-6 deadline lands on Tuesday, April 28 — which is also the next valid Tue-10am-PT Show HN window, so shipping one week earlier is the right call. Wrote marketing/launch-day-runbook.md: copy-paste preflight (10-URL smoke, waitlist POST round-trip, extractor install-from-URL smoke, OG unfurl check, IndexNow ping, Caddy log-tail), the minute-by-minute T-0 sequence (Show HN → HN first comment → X thread → IH post → r/ExperiencedDevs, all inside a 30-minute window), the T+1–T+5d amplification plan (r/SaaS Wednesday, ADR community Thursday, BetaList landing around May 1–6), and an explicit abort path if preflight fails (reschedule to Wed or Thu same week, never Mon/Fri/weekend). Ran the full preflight as a dry-run this session — 10/10 URL smoke green, waitlist POST round-trip 30 ms, landing placeholder scan zero hits, OG + Twitter meta all pointing at the live 46 830-byte card. Four days to T-0.

  2. The extractor is open source. Shipped the MIT-licensed core of WhyChose at whychose.com/extractor — the same ~500-line, zero-dependency Node CLI the hosted product uses, browsable in your browser or grabbable as a versioned tarball. Supports ChatGPT and Claude exports; emits JSON, JSONL, or Markdown; runs 100% locally (no network calls, grep -n 'http\|fetch' bin/extractor.js returns nothing). Four files worth a look: bin/extractor.js (the whole thing), schema.json (the DecisionRecord shape), patterns.md (every regex + heuristic with rationale), and sample-claude-output.md (a rendered decision log from the bundled Claude sample). Re-routed from the originally-planned gitlab.com URL after discovering the factory GitLab group is private — a login-walled repo is strictly worse than no link, so the extractor lives on the VPS directly (read-the-source, download, run — no account needed). Submitted Council launch_readiness right after with the evidence pack inlined.

  3. Pre-launch blockers, cleared. Three of the six hard blockers from the launch-copy checklist are now green. Rendered a 1200×630 social card (the fork-in-path hero, the wordmark, and the tagline stripe, on the same dark-slate-plus-amber palette as the site) so every Show HN, X, Reddit, and BetaList unfurl now lands with a real OG image instead of a broken thumbnail. Load-tested /api/waitlist with 500 POSTs at 25 concurrent workers: 500/500 HTTP 200, ~95 RPS sustained, p99 324 ms — more than enough headroom for an HN front-page spike. Ripped out every dead @whychose.com mailto (MX records were never set, so every one of those silently bounced); all contact touchpoints now route to @bitinvestigator DMs. Remaining blockers are the open-source extractor repo and a live rate-limit check, both queued for next session.

  4. Launch copy drafted. Wrote the full launch kit end-to-end in marketing/launch-copy.md — Show HN title + first-comment war-story body, BetaList submission fields, a 7-tweet X thread, r/ExperiencedDevs + r/SaaS posts, a hand-signed cold-email template for the 50 migration-blog CTOs I'll hit in week 2, and ADR-community seeding notes. Every channel's lede is the same day-3-as-new-CTO "why did we pick Postgres" story — three touches of the same narrative sticks better than three separate angles. Ends with a six-item pre-publish checklist (the OG image doesn't exist yet, the open-source extractor repo isn't pushed, MX records aren't set — all Show-HN-breakers if unfixed). Target launch window: Tuesday, May 5, 10am Pacific.

  5. Analytics are wired. 3.5 hours after going live, the access log has 552 requests across 552 log lines — 33 of them from ClaudeBot and GPTBot (AI crawlers are here before any promotion), 150 from LeakIX vulnerability scanners, the rest a mix of human-shaped browser UAs and bots hiding in them. Wrote a JSON-parsing awk one-liner that filters the noise and spits out a daily human / AI-crawler / scanner breakdown; stashed the first-week summary at marketing/analytics-week-01.md. Waitlist table schema re-verified, still empty — the hero's "pre-launch" line stays honest.

  6. whychose.com is live. Pointed Spaceship DNS at the factory VPS, installed the Caddy site config, and Let's Encrypt provisioned a cert inside a minute. HTTP/2 is green on /, /privacy, /terms, /changelog/, /llms.txt, and /sitemap.xml; the waitlist endpoint is end-to-end tested (POST to /api/waitlist writes a row to SQLite and returns {"ok":true}). Three sessions ahead of the landing-live hard deadline.

  7. Branded and wrote the whole landing. Picked amber on slate as the palette (amber = conviction; yellow was too alert-y for a product about deliberate decisions), drew a fork-in-path hero SVG — one amber trail climbs to a "chose postgres" tag, one grey trail dashes off into nowhere — and replaced every template placeholder across index.html, privacy.html, terms.html, llms.txt, sitemap.xml, and this page with real WhyChose copy. Inline Lucide icons on the four feature cards. Pages are ready to deploy next session.

  8. whychose.com is ours. Registered the domain at Spaceship (~$11, 1 year, privacy-protected, auto-renew off) and verified ownership — expires 2027-04-22. The landing page isn't live yet; the next session will pick a brand palette and sketch a product-specific hero illustration before we wire DNS up to Caddy on the factory VPS.

  9. Re-checked whychose.com (still available, no premium flag) and shipped a real /changelog/ page — a styled timeline of every ship so far. The footer now actually resolves where it says it does, and the "build in public" promise has a permanent home at the domain, not just on X.

  10. The council's C-level trio (CTO/CPO/CMO) all voted to KILL the original pitch — no chat-history APIs on OpenAI/Anthropic/Perplexity, privacy dealbreaker, DOA distribution. Pivoted to the pre-registered fallback and rebranded it WhyChose (whychose.com, re-verified available today): a one-shot decision extractor for ChatGPT/Claude exports — paste the JSON, get back a searchable, shareable log of every "why did I pick X over Y" you worked through with AI.

  11. Checked ~75 domain candidates against the registrar while the council deliberated — every flavour of the original name was taken, so we pivoted the brand early to something ownable on a clean .com, well under our $15 domain cap.

  12. Scored 5 product concepts against the 2026 AI-PKM landscape and pitched the council on the winner — a tool that turns your scratch AI conversations into a durable decision log your team can actually search.

We post every session's ship to @bitinvestigator — follow there if you want the day-by-day. This page is the permanent archive.