Structural · built under pressure
Career Forge
The job-search system I needed the week I lost my job.
Live on the web and free to use. Paid checkout is closed until fulfillment is proven
Verified 2026-07-20 · 4 sources
- The site is live and serving
- HTTP 200 from career-forge-lite.vercel.app, checked 2026-07-20
- Paid checkout is closed in production
- GET /api/commerce-health returns canSellSafely:false; POST /api/checkout returns 503 fulfillment_not_ready; /pricing renders no buy control and no stripe.com link (checked 2026-07-20)
- Released build
- origin/main b1be8b2, tagged v0.10.0-beta.1
- Fulfillment could fail silently after payment, and was closed because of it
- Audit 2026-07-20: live checkout returned a Payment Link and never learned the outcome. Brake merged as career-forge-lite#28 (3c66a77) and deployed; production health now names STRIPE_WEBHOOK_SECRET, RESEND_API_KEY and LICENSE_EMAIL_FROM as missing
The human problem
When my DraftKings role ended I had the same problem everyone in that seat has: a hundred scattered applications, no feedback, and advice too generic to act on. The job search is the highest-stakes project most people ever run, and almost nobody runs it as a project.
The thesis
A résumé tool that invents experience is worse than no tool. The useful thing is not generation — it's organizing evidence you already have into something a stranger can evaluate in six seconds.
Where it actually stands
- Live at career-forge-lite.vercel.app. A stranger can walk in, build a dossier, generate role-specific drafts, and export a real DOCX and ZIP without talking to me.
- Released to production on July 19, 2026 (v0.10.0-beta.1) after a readiness sprint: early-win bullets and a lighter first-run profile.
- The generation engine is deterministic. There is no model writing your history — every claim traces to something you entered.
- Paid checkout is closed, deliberately. An audit on July 20 found the fulfillment path behind the $49 link ran entirely in the buyer's browser: close the tab on the way back from Stripe and the license was never issued, with nothing recording it. The brake is deployed — the pricing page shows a contact CTA and the checkout endpoint refuses. It reopens only when the whole journey has been demonstrated end to end, not when the right environment variables exist.
Decisions and tradeoffs
Deterministic engine, no LLM in the résumé path.
A hallucinated job title on a résumé is not a bug you can apologize for later. Giving up fluency to guarantee zero fabrication was the easiest trade I've made.
Made the first-run profile shorter, not smarter.
People were abandoning at a wall of empty textareas. Nine of them are now optional and collapsed. Completion beats completeness.
Kept everything client-side — no accounts, no server-side career data.
It's the right call for privacy and it's the reason I know almost nothing about how the product is actually used. I traded my own visibility for the user's, on purpose, and I'd make the trade again while admitting what it costs me.
Closed checkout rather than leaving a warning next to a live buy button.
The audit found a paying customer could get nothing and leave no trace. A checkout that refuses to open is a bad day; one that charges and delivers nothing is a refund, an apology, and someone's trust. "No database" was the right call for career data and I carried it one step too far, into the one place that needed a record.
Made reopening depend on a demonstrated journey, not on configuration.
My first fix checked that six environment variables contained text and called it ready. That is the same mistake in a smaller font — presence isn't proof. Checkout now reopens only after the full path has actually run.
What building it taught me
I built this for myself first, so every feature aimed at someone already motivated, and the hardest problems turned out to be the first ninety seconds rather than the output quality. The sharper lesson came later: I shipped a working payment button and never once asked what happens if the customer's browser doesn't come back.
What isn't true yet
- I cannot tell you whether anyone has ever paid. There is no order database by design, so the only system that knows is Stripe, and I have not reconciled it. Treat “paying customers” as unestablished in both directions.
- Worse: before July 20 I could not have told you whether a payment failed to deliver either. Nothing logged it.
- Durable fulfillment state isn't provisioned yet, so checkout stays closed until it is.
- I have collected zero beta feedback. It saves to the tester's own browser and never reaches me — a design decision I did not think through.
- No confirmed job outcome. Nobody has told me this got them hired.
- Lane suggestions still come from a fixed library, so an operations résumé gets tech-pivot lanes it didn't ask for. Known defect, not yet fixed.
