wanessalabs standalone production

Job Search Workbook

A free planner that turns a resume and a location into a 26-week job search: 30 tiered target employers and 5 claim-ready activities every week.

React 19TypeScriptViteReact Router 7Tailwind v4Cloudflare PagesCloudflare WorkersCloudflare KVZodGemini (Google AI Studio)SheetJSResendWorkers Analytics EngineSupabase
Upload a resume, paste it, or point at a profile link. Or skip all of it and open the sample plan.
Upload a resume, paste it, or point at a profile link. Or skip all of it and open the sample plan.
30 target employers in three tiers, each with a match score, a fit rationale and a cold-outreach hook.
30 target employers in three tiers, each with a match score, a fit rationale and a cold-outreach hook.
26 weeks of activities, each laid out in the fields a state work-search log asks for.
26 weeks of activities, each laid out in the fields a state work-search log asks for.
The Sunday claim slip: all 5 activities for the week, copyable one at a time or all at once.
The Sunday claim slip: all 5 activities for the week, copyable one at a time or all at once.
Keyword gap analysis against the target role, with the terms an ATS filter will look for.
Keyword gap analysis against the target role, with the terms an ATS filter will look for.
A private application board. It lives in your browser and never touches the server.
A private application board. It lives in your browser and never touches the server.

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.

  1. 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.
  2. 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:

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

ToolRole
React 19 + TypeScript + Vite + React Router 7Frontend SPA, prerendered route shells for crawlers
Tailwind v4 + OKLCH tokensStyling, matched to the wanessalabs.com design system
Cloudflare PagesHosting
Cloudflare Worker + ZodAPI: generation, save, permalink lookup, usage events
Cloudflare KVPer-IP rate limits, saved plans (90-day TTL)
Gemini via Google AI StudioPlan generation, JSON mode, 6-model fallback chain
SheetJSIn-browser Excel assembly
ResendEmails each saved plan’s link
Workers Analytics EngineAnonymous usage counts, no personal data
SupabaseOptional subscriber list
Vitest69 API tests, 26 web tests