Chapter eight · The distillation
Forty-seven days, 214 prompts, nine crashes, one launch - compressed into twelve rules, six prompt templates, one checklist, and the words you need. This page is meant to be stolen from.
Part one
Never ask for an app. Ask for a spec, argue about it, then build against it. The spec is the app’s memory; without it every session starts from amnesia and drifts toward the average of the internet.
One paragraph, your words, no AI. Every feature must trace its ancestry to it. If you can’t write the promise, you don’t have an idea yet - you have a vibe, and vibes don’t compile.
The default model is a cheerleader. Prompt for hostility first: ten brutal questions, one at a time. The cheapest pivot in existence is an eleven-minute interrogation on day one.
Frequency, data shape, findability, wallet check, neglect gap, witness access - six rows, five minimum. You need one lead user you can watch with your own eyes. Proximity is the moat.
Thinnest end-to-end version on a real device in week one. It proves the data model, kills the blank-page terror, and converts the project from conjuring to improving.
Write the aesthetic constitution, then encode it as design tokens in one file, then generate UI. Constraints are what stop forty screens from looking like forty different apps.
One feature per prompt, named files, named tokens, explicit blast radius (“do not touch any other file”). The failure rate doesn’t drop - the failure cost does. That’s the whole trick.
The AI’s summary of what it built is marketing. The rendered UI, the crash log, and the on-device thumb test are the truth. Critique what matters (“the date is stealing the cone’s job”), not adjectives.
Every working state, every time, immediately. 164 commits in 18 days. When an agent detonates a file at 23:40 - and it will - a fresh commit turns catastrophe into a shrug.
If one problem survives 40 minutes of iterating, stop prompting patches and ask “what assumption is wrong?” You’re negotiating with a bad architecture. Refactor prompts fix what patch prompts can’t.
Three abandoned approaches in one chat = contaminated context. The model keeps smelling the old plan. Fresh session, paste spec, one-line goal, clean slate. Seven times in 18 days. Zero regrets.
Standing instructions change output: “no force unwraps, honest empty states, every failable path handled.” Crash rate fell to zero within three builds of adding that line. Quality is a promptable property - but only if you prompt it.
Part two
These are the actual shapes from the ledger, lightly generalised. Replace the brackets. Copy buttons included, because of course.
❯ I want to build [app]: [one-sentence description]. Before any code, interrogate the idea. Ask the 10 hardest questions a sceptical indie app veteran would ask. One at a time. Be brutal. If there's a fatal flaw, find it tonight.
❯ You are a senior [platform] product engineer and my co-author. Draft a two-page PRD for [app]. Hard constraints: · buildable by one person + AI in [N] weeks of evenings · every feature must serve this promise: "[your promise]" · include an explicit "Not in v1" section - killing scope is the point · propose the data model: entities, fields, relationships · flag where the frameworks are likely to fight us, with reasoning
❯ Before any screens, write the design brief with me. References: [2–3 apps whose qualities you admire + the user's physical world]. Define: (1) three adjectives the UI must never betray, (2) max 5 colour tokens, (3) type scale, system fonts only, (4) spacing scale, (5) one signature detail that makes it unmistakably [app].
❯ [SPEC.md pasted] Tonight: [one feature, one line]. [Precise description: which file, which tokens, which states]. Constraints: no force unwraps; every failable path renders an honest empty state; do not touch any other file. Show me the diff before writing.
❯ Bug report. Read everything before proposing anything. EXPECTED: [one sentence] ACTUAL: [one sentence, no adjectives] REPRO: [numbered steps, smallest failing case] EVIDENCE: [full crash log / slow-mo observation / exact file] CONTEXT: [device, OS, last 3 commits] Rules: rank your top 3 hypotheses, state what evidence distinguishes them, write no fix until I confirm which one we're testing.
❯ We've spent [N] rounds patching [problem]. Stop patching. Assume the architecture is wrong, not the implementation. (1) List the assumptions the current structure makes. (2) Identify which one reality violates. (3) Propose the smallest refactor that removes the assumption. No code yet - structure first.
Part three
Run this before you call anything “done”:
Part four
Steering an AI well is mostly knowing what things are called:
| Walking skeleton | Thinnest end-to-end version that runs on device. |
| Re-anchor | Pasting the spec + one-line goal at session start. |
| Context poisoning | Old abandoned approaches lingering in chat, biasing new answers. Cure: fresh session. |
| Blast radius | The files a prompt is allowed to touch. State it every time. |
| Hostile fixture | Test data designed to be mean: empty, huge, weird, offline. |
| 40-minute rule | Stuck 40 min → stop patching, interrogate architecture. |
| Prompt ledger | Your running log of significant prompts + outcomes. Unglamorous, indispensable. |
| Niche test | Frequency · data shape · findability · wallet · neglect · witness. |
Coda
Vibe coding didn’t remove the craft from building software. It moved it - from typing syntax to holding intent. Taste, structure, stubbornness. Pick a niche you can touch, write the promise by hand, and open the terminal tonight.