← all playbooks

Shipping an MVP with Claude Code

This is the exact process I used to build Career That Lasts, an AI career-planning app that is live at careerthatlasts.com. Git shows 18 commits: 17 in one overnight session and one follow-up two nights later. The short version: cut scope to demo mode, scaffold with the official generator, run a tight loop with Claude Code, deploy to Vercel immediately, and keep monetization behind a feature flag so shipping never waits on a business model.

One long overnight session for the core (first commit 2:09am, last commit that morning 7:54am), plus a follow-up evening. Call it a weekend with sleep.8 steps
Claude CodeNext.js (create-next-app)TypeScriptTailwind CSSAnthropic API (@anthropic-ai/sdk)VercelGitHubStripe Payment LinksJobicy API

## the process

  1. 1

    Write the idea in one sentence, then cut scope to demo mode

    Career That Lasts started as one sentence: help people see how exposed their job is to AI and what to do about it. Before any code, I split every feature into two buckets: works with zero external services, or needs a real API or database. Auth got a demo implementation with signed cookies, the job data got a seed catalog, and the AI features got deterministic heuristics. The rule was that the MVP has to run on a fresh clone with no env vars, with clean seams where the real services drop in later.

  2. 2

    Scaffold with create-next-app, not from scratch

    I scaffolded with create-next-app: Next.js App Router, TypeScript, Tailwind. Do not let Claude hand-roll project structure the official generator already solves. Then I told Claude Code the conventions once, up front: shadcn-pattern components on Radix primitives, Zustand for client persistence, React Hook Form plus Zod for forms. Naming the stack early saves you from re-litigating it every session.

  3. 3

    Run the loop: plan, implement, verify in the preview

    Every feature followed the same loop. Describe the feature and the data shape, let Claude Code propose a plan, correct the plan, then let it build. Then open localhost and actually click through the feature before moving to the next one. I did not skim diffs and assume things worked, because twice they did not (see step 6). The risk scan, career paths, roadmap, resume optimizer, LinkedIn optimizer, Kanban tracker, and admin screens all came out of this one loop.

  4. 4

    Deploy to Vercel before it feels ready

    The first commit landed at 2:09am and the app was deploying to Vercel within the hour. Once it is live you stop iterating against your imagination and start iterating against a URL you can send to people. My git log contains commits that exist purely to re-trigger a Vercel deploy, and that is fine. Push, look at the live thing, fix what is actually wrong with it.

  5. 5

    Swap mock AI for real Claude behind a clean seam

    The AI features ran on deterministic heuristics first, behind one service interface. Swapping in real Claude was a single server-only module: each feature forces one tool call so the model returns guaranteed-shape JSON instead of prose I would have to parse. Stable instructions live in a cached system prompt, the model name is an env var, and any failure (missing key, network, bad shape) falls back to the heuristics. The app always returns a result, which means the demo never dies in front of someone.

  6. 6

    Wire real data and expect to correct Claude

    Real job listings took three corrections in one morning, and the commit log shows all of them. The first search Claude built returned results but was not actually querying the live source with the user's keywords; the fix commit is literally titled 'Make job search actually query the source'. Skill matching silently read only the first 1400 characters of each job description, so match scores were off until I made it scan the full text. The first jobs API skewed too tech-heavy, so I swapped providers about forty minutes later. None of this is a Claude failure story; it is the reason step 3 says click through everything.

  7. 7

    Keep billing behind a feature flag

    Stripe Payment Links are wired into the pricing page, but a single env var (NEXT_PUBLIC_BILLING_ENABLED) keeps them off. With the flag off, every feature is free, the pricing page says so honestly, and the buy buttons fall back to signup. Turning monetization on later is an environment change in Vercel, not a code change. This is how you ship before you are ready to charge without ripping pricing out of the codebase.

  8. 8

    Rebrand at the end of the night, not the start

    The project began as FutureProof Jobs and became Career That Lasts about thirty minutes after the first commit, in one rename pass covering the name, logo, titles, and docs. The GitHub repo is still called FutureProof-Jobs and the Vercel URL still says future-proof-jobs, and none of that matters because careerthatlasts.com points at the same deployment. With Claude Code a rebrand is a cheap, systematic rename pass. Do not burn your first hours on naming; buy the domain once the thing exists.

## hard-won tips

  • !Make Claude Code write commit messages that say what actually changed. 'Scan full job description for skills (was only first 1400 chars)' is a build log entry I can publish; 'fix bug' is not.
  • !Fallbacks beat error states. Because every AI route falls back to deterministic heuristics, the app works with no API key at all, which makes demos and local setup painless.
  • !Do not be precious about the git history. Mine has empty re-trigger-deploy commits and a provider swap forty minutes after the first integration. Shipped beats tidy.
  • !Single env-var switches (billing on or off, model name, jobs source) let one codebase run in several honest states without branches or rewrites.
  • !Legal note for the page footer: this site is independent. Claude is a trademark of Anthropic, PBC. godofclaude.com is not affiliated with or endorsed by Anthropic.

$ follow --the-build

Watch it happen, don't take my word for it

Every build on this site gets documented as it happens — the prompts, the dead ends, the results. No course at the end of this funnel. There is no funnel.

follow on x →