Most job search tools help you find jobs. They don’t help with the other half of being laid off: the state wants proof, every week, that you looked. This one does both, in one plan.
I’m running my own search through it after leaving DIN (Consensys), where I was Head of AI and Marketing. The sample plan on the homepage is mine, Senior AI Solutions Architect, Denver, end to end.
Try it: open the planner with your own resume, or see the full sample plan without uploading anything. It is free.
The Problem
A job search after a layoff comes with two jobs, and they pull against each other.
- No structure. Open job boards give you infinite options and no schedule. Without a list of who to target and in what order, the search drifts into refreshing LinkedIn.
- Compliance busywork. State unemployment systems like Colorado’s MyUI+, California’s EDD and New York’s DOL require verifiable work-search activities every week, up to 5 in Colorado. Most people reconstruct them on Sunday night: what did I apply to, which statutory category does it fall under, what evidence do I keep.
So every step in the plan is already a loggable activity. Doing the search and documenting it become the same act.
What It Does
Give it a resume (PDF upload, pasted text, or a profile link), a location, and optionally a job description. It generates:
- 30 target employers in three tiers. 10 market anchors (long hiring cycles, high bar), 10 high-growth scale-ups, and 10 specialized, high-conversion shops like consultancies and integrators that hire faster. Each gets a careers-page link, a department to aim at, a match score, a fit rationale, and a cold-outreach hook. Thirty is deliberate: enough to fill six months, few enough to research properly, instead of spraying hundreds of generic applications.
- A 26-week plan with 5 activities a week. Monday through Friday, one of each statutory category: a job application, a job listing review, direct outreach, a state job-matching system search (e.g. ConnectingColorado), and a skills workshop or certification step. Every activity carries a date, contact type, outcome and the evidence to keep.
- A Sunday claim slip. The week’s 5 activities in one panel, formatted for Colorado CDLE MyUI+, with a copy button per activity and one that copies all 5.
- JD gap analysis. Matched keywords, missing ATS keywords, rewritten resume bullets, and a playbook for the objections a recruiter is likely to raise.
- Outreach scripts per company: a cold InMail, a warm second-degree ask, and a 7-day follow-up.
- An application board (Identified, Applied, Interviewing, Offer) stored only in your browser’s localStorage.
You leave with files you own: a multi-tab Excel workbook, two CSVs (targets and claim log), and a print layout for a paper binder. Enter an email and it saves the plan to a permanent link that lasts 90 days, and emails you that link so it is there on the Sunday you need it. The site follows your system’s light or dark setting, with a toggle to switch.
The plan is a schedule of real activities to go and do. It never pre-fills claim entries, and the page says so.
How It Is Built
A Vite + React SPA on Cloudflare Pages talks to one Cloudflare Worker. The Worker validates every request with Zod, rate-limits per IP in Cloudflare KV, and calls Gemini through Google AI Studio with a structured JSON prompt. The browser assembles the Excel file itself with SheetJS, so the spreadsheet never round-trips through the server.
Surviving free-tier capacity errors. Gemini’s free tier returns 503s under load, and a plan that fails after a long wait sends people away. The Worker walks a fallback chain: gemini-2.5-flash-lite with up to 3 attempts and exponential backoff, then gemini-flash-latest, gemini-3.5-flash-lite, gemini-3.5-flash and gemini-2.5-flash with one attempt each. A capacity error on one model moves straight to the next instead of retrying into the same wall.
Privacy by default. Resumes are processed in memory for the length of one generation and are not written to disk or a database. They do go to Google’s Gemini API for inference, which is the one place they leave. The application board never leaves the browser at all. Saving is opt-in: the generated plan and your email go to Cloudflare KV with a 90-day expiry, and nothing is saved unless you ask. The link email has fixed text and goes out at most 3 times a day to any one address, so the form cannot be used to spam someone.
Counting usage without tracking people. To learn whether the plan actually gets used, the site counts anonymous events in Workers Analytics Engine: plans generated, saved and reopened, claim slips copied, files downloaded. No event carries an email, an IP address or anything you typed, and a test fails if one ever does. The number that matters most is saved plans reopened a day or more later, because the plan is meant to be worked every week.
Paid, then free. This started as a paid generator with a Stripe purchase chain and per-purchase entitlements. When the Supabase project behind the entitlements was paused, I switched checkout off rather than leave a button that could take money and deliver nothing. Generation is now free and rate-limited instead. The Stripe webhook code still exists, dormant.
Stack
| Tool | Role |
|---|---|
| React 19 + TypeScript + Vite + React Router 7 | Frontend SPA, prerendered route shells for crawlers |
| Tailwind v4 + OKLCH tokens | Styling, matched to the wanessalabs.com design system |
| Cloudflare Pages | Hosting |
| Cloudflare Worker + Zod | API: generation, save, permalink lookup, usage events |
| Cloudflare KV | Per-IP rate limits, saved plans (90-day TTL) |
| Gemini via Google AI Studio | Plan generation, JSON mode, 6-model fallback chain |
| SheetJS | In-browser Excel assembly |
| Resend | Emails each saved plan’s link |
| Workers Analytics Engine | Anonymous usage counts, no personal data |
| Supabase | Optional subscriber list |
| Vitest | 69 API tests, 26 web tests |





