← all builds
● live18 commits, June 3-5, 2026

Career That Lasts: shipping a live AI career app with Claude Code

I shipped a live AI career-planning app by pairing with Claude Code. Here is the actual commit log.

careerthatlasts.com

## the problem

I run a marketing agency, not a software shop. I wanted proof that I could take a product from idea to a live, working app without hiring a developer or duct-taping no-code tools together. Not a demo on localhost. A real thing with a domain, real API calls, and a deploy pipeline.

The idea itself came from the same anxiety everyone has right now: AI is reshaping job demand and most of the advice out there is listicles. Nobody hands you a tool that looks at your actual role, scores your exposure, and gives you a concrete plan. I wanted to build that tool, and I wanted the AI behind it to be real, not a hardcoded quiz pretending to think.

The constraint was me. I am not a traditional developer. If this worked, it would only be because pairing with Claude Code genuinely covers the gap between knowing what you want and knowing how to build it.

## what I built

Career That Lasts is an AI-aware career planning app, live at careerthatlasts.com. A visitor lands on one promise: find your next job before AI changes your current one. The free career scan takes a couple of minutes, needs no account, and produces a 0 to 100 automation-exposure score with a task-by-task breakdown. From there the app recommends adjacent career paths ranked by fit and AI-resilience, builds a 30/60/90-day skill roadmap, rewrites your resume and LinkedIn profile for the pivot, matches you against live job listings, and tracks applications on a drag-and-drop Kanban board. There is also an admin area for managing the catalog of paths, skills, and courses, plus a shareable scorecard so people can post their scan results.

Under the hood it is a Next.js 16 App Router app in TypeScript. The AI features call the real Claude API through server routes. Every AI function forces a single tool call so Claude returns guaranteed-shape JSON, stable instructions sit in a cached system prompt, and if the API call fails for any reason the app falls back to a deterministic heuristic engine so users always get a result. Job listings come from a live jobs API, cached hourly, with a seed-data fallback. Billing is fully scaffolded with Stripe Payment Links behind a NEXT_PUBLIC_BILLING_ENABLED feature flag, which is currently off. Everything is free during early access.

It started life as FutureProof Jobs and was rebranded to Career That Lasts 32 minutes into the repo history. The GitHub repo still carries the old name, which I am fine with. The commit log is the receipt.

## how Claude was actually used

  1. 01

    Planning before code

    Before the first line of app code, I had Claude Code write the plan: a product brief, sitemap, database schema, component architecture, and an implementation plan. Those five documents live in the repo's docs folder and the build followed them. Writing the plan as files in the repo, not in a chat window, meant every later session could re-read the intent instead of relying on my memory of it.

  2. 02

    Building the entire MVP in one stretch

    The first commit is the whole product: 109 files and roughly 19,700 lines covering the risk scan, career path recommendations, job matching, the 30/60/90 roadmap, resume and LinkedIn optimizers, the Kanban tracker, admin, and demo auth. I described features and reviewed what Claude produced; Claude wrote the code. It shipped with a deterministic mock AI engine behind a clean seam so the app was fully usable before any API key existed.

  3. 03

    The 32-minute rebrand

    I decided FutureProof Jobs was the wrong name and asked Claude Code to rebrand to Career That Lasts. It renamed the product across the name, logo, page titles, docs, and user-facing deliverables in a single commit, 32 minutes after the initial commit. Doing a full rename by hand across a codebase that size is the kind of tedium that usually makes people keep a bad name.

  4. 04

    Wiring real Claude behind the mock

    I asked Claude Code to replace the mock AI engine with real Claude API calls for the risk scan, resume optimizer, LinkedIn optimizer, and roadmap. It built server-only routes so the API key never reaches the browser, and used a forced tool call pattern so the model must return JSON matching an exact schema instead of free text I would have to parse. Every function keeps the heuristic engine as a fallback, so a failed API call degrades gracefully instead of erroring.

  5. 05

    Real job listings, on the second try

    The first integration used the Remotive API for live job listings. Within half an hour of real use it was clearly wrong for this product: the listings skewed heavily tech, and this app is for everyone whose job AI might change. I had Claude swap the feed to Jobicy for cross-industry variety, then add an env-gated Adzuna source for local, all-industry listings, with honest labeling of remote-only results in the meantime.

  6. 06

    Debugging match quality

    Job match scores looked off, so I dug in with Claude and found the skill extractor was only scanning the first 1,400 characters of each job description. Claude rewrote it to scan the full description and blended the fit scoring so matches stopped rewarding keyword stuffing near the top of a posting. This was found by eyeballing real results, not by tests.

  7. 07

    Deploying and babysitting Vercel

    The app deploys to Vercel from the GitHub repo. The commit log shows the honest version of this: three separate empty commits exist purely to re-trigger Vercel deploys that did not pick up pushes on their own. Claude Code handled the git mechanics each time, but the deploy pipeline needed more nudging than any tutorial admits.

  8. 08

    Turning billing off, on purpose

    Stripe Payment Links were wired into the pricing page early. Then I made the call to launch free: Claude put all paid features behind a NEXT_PUBLIC_BILLING_ENABLED flag, defaulting to off, so the whole app is free during early access and paid plans can be turned back on with one environment variable. Two days later I had Claude add a shareable scorecard for the free scan so results could spread on their own.

## stack

Claude CodeClaude API (@anthropic-ai/sdk)Next.js 16 (App Router)React 19TypeScriptTailwind CSS v3Radix UI (shadcn-pattern components)ZustandReact Hook Form + Zodjose + bcryptjs (demo auth)@dnd-kit (Kanban drag and drop)Jobicy API (live job listings)Adzuna API (optional, env-gated)Supabase (scaffolded production path)Stripe Payment Links (dormant, feature-flagged)VercelGitHub

## results (the verifiable kind)

  • Live and reachable at careerthatlasts.com and future-proof-jobs.vercel.app, serving the free career scan with no account required.
  • 18 commits in the GitHub repo (HumbearMedia/FutureProof-Jobs) across June 3-5, 2026, from MVP to shareable scorecard; the initial commit alone contains 109 files and roughly 19,700 lines.
  • Real Claude API integration in production code: server routes for the risk scan, resume optimizer, LinkedIn optimizer, and roadmap, each with forced-tool JSON output and a deterministic heuristic fallback.
  • Live job listings via the Jobicy API, cached hourly with a seed-data fallback, plus an optional Adzuna source behind environment keys.
  • Billing is built but off: paid plans sit behind the NEXT_PUBLIC_BILLING_ENABLED flag with Stripe Payment Links dormant, so the entire app is free during early access.
  • The footer disclaimer ships on the live site: AI-risk scores are educational estimates, not predictions or guarantees about any individual job.

## what I learned

  • My first job-board API was the wrong one and I did not find out until real listings rendered. Remotive returned tech-heavy results for a product aimed at everyone, and I burned a morning swapping to Jobicy and adding an Adzuna option. Third-party data sources are the part of an AI app most likely to fail, and no amount of planning docs caught it.
  • Forcing Claude to respond through a tool call with a strict schema beats asking nicely for JSON. The API routes never have to parse free text, and the shape is guaranteed before the UI sees it.
  • Build the mock first. Shipping a deterministic fake AI engine behind the same interface as the real one meant the app worked end to end before I spent a cent on API calls, and it now doubles as the fallback when the real API hiccups.
  • Vercel deploys did not reliably trigger on push. The repo has three empty commits that exist only to kick the pipeline. Not a disaster, but it is friction nobody warns you about.
  • Rebrand early or never. Because Claude Code could rename the product across the entire codebase in one pass, changing the name 32 minutes in cost almost nothing. The same decision a month later would have been a project.

$ 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 →