Skip to content
$ ash_
All work

Job Hunt

~20,000 lines of TypeScript across 24 pages

An AI-powered job application tracker — drag-and-drop Kanban pipeline, seven Claude-powered features, multi-user access control and a DOCX export engine.

Problem

Job hunting in 2026 is still weirdly manual. You paste the same resume into fifty applications, write cover letters that sound like everyone else's, and track everything in a spreadsheet that falls apart by week two. The process punishes people who apply thoughtfully and rewards people who apply at volume. I wanted to change that equation.

My Contribution

I designed and built the entire platform — product decisions, architecture, implementation, and prompt engineering:

  • Built the tracker itself in TypeScript, roughly 20,000 lines across 24 pages, with a drag-and-drop Kanban pipeline, table view, soft delete and restore, funnel analytics, stale-application alerts and weekly goal tracking
  • Wired up the Anthropic Claude API for 7 features: tailored resume generation, cover letters, job description analysis, interview preparation, outreach messages, skills-gap insights and offer comparison — plus job import that parses pasted postings into structured records
  • Set up multi-user access with Clerk authentication, Svix-verified webhooks, role-based permissions, admin approval workflows, audit logging and Resend email notifications across 11 Mongoose models
  • Added USD-metered AI usage tracking with monthly budgets, per-user admin overrides and plan limits enforced in both the UI and the server actions
  • Wrote a DOCX export engine with three-tier template priority (user, admin, fallback), style-preserving run formatting and slot-fill caching for fast re-exports

Architecture

Next.js 16 App Router with TypeScript end-to-end, MongoDB via Mongoose for the data layer, and Vercel for deployment. Clerk handles identity; Svix-verified webhooks keep the local user records in sync with it, so a Clerk-side change can't silently drift from what the app believes.

Server actions carry the write path, which is where plan limits and budget checks are enforced — the UI mirrors those limits, but the server is the boundary that actually holds. AI calls run against the Anthropic Claude API with per-user USD metering in front of them, so cost is a first-class product constraint rather than a surprise at the end of the month.

The DOCX export engine was the most interesting piece to build. Templates resolve through three tiers — a user's own template, then an admin default, then a built-in fallback — and slot filling preserves the run-level formatting of the source document, so exported resumes keep their styling instead of collapsing into plain text. Filled slots are cached, which makes re-exporting after a small edit near-instant.

Outcomes

The core loop works end to end: import a posting, analyse it, generate tailored documents, export them, and track the application through the pipeline. The multi-user layer means it isn't just a single-player tool — admin approval, role-based permissions and audit logging are all in place. Usage metering keeps AI spend visible per user rather than aggregated into one opaque bill.

Learnings

AI output quality is the hardest problem, not the AI integration itself. The difference between "it works" and "it's actually useful" lives entirely in the prompt. The second lesson was cost: once every feature calls a model, metering and budgets stop being nice-to-haves and become part of the product design.