Job Search Ecosystem

Tailor your resume.
Track what matters.

Two Next.js apps that hand off to each other. Paste a job description, get a tailored resume and a keyword score, then track the application with a Kanban board. No retyping.

resume-tailor · api
$ POST /api/tailor --provider openai
// one streaming call, multiple outputs
{
  "parsed": {
    "company": "Stripe",
    "role": "Senior Frontend Engineer",
    "salary": "$180k – $220k"
  },
  "keywords": {
    "score": 84,
    "missing": ["GraphQL", "WebSockets"]
  },
  "tailoredResume": "..."
}
✓ JWT generated → redirecting to Job Tracker
$ 

How it works

01
📄

Paste a job description

Drop any JD into Resume Tailor, no account needed. Parse company, role, location, and salary in one go.

resume-tailor
02

AI scores and tailors

OpenAI (default) or Anthropic API scores your resume against keywords and generates a tailored version. Stream live results with a keyword match score.

openai / anthropic
03
🗂

Track it in Job Tracker

Click "Save to Job Tracker", then a signed JWT deep link pre-fills your Job Application Tracker with company, role, salary, and keyword score. No retyping.

job-tracker

Two apps, one workflow.

Each tool is independently useful. Together, they cover the full job search funnel.

Resume Tailor

Resume Tailor

Paste a JD. Get a tailored resume in seconds.

  • Parses company, role, location, and salary from any JD
  • Scores keyword alignment between JD and your resume
  • One LLM call streams parsed JSON + tailored resume
  • Stateless so no login required, no friction to start
  • Hands data to Job Tracker via signed JWT deep link
Next.js 15 Tailwind CSS OpenAI / Anthropic TypeScript Vercel
Launch Resume Tailor
Job Application Tracker

Job Tracker

Every application. Every status. One board.

  • Kanban board with drag-and-drop status columns
  • Dashboard analytics with response rates, stage breakdown
  • Per-application contacts, notes, and email templates
  • Daily reminder emails via cron job
  • Resume Tailor pre-fills applications with keyword data and tailored resume
Next.js 15 Auth.js v5 PostgreSQL Prisma Vercel
Launch Job Tracker

Deliberate tradeoffs, not defaults.

Every decision in Rouse was made for a reason. Here are the three that shaped the system most.

01

One LLM call, three outputs

All parsing, scoring, and tailoring happens in a single LLM call with a tagged output format. The client splits on the closing tag, parses the JSON immediately, then streams the generated resume text. Eliminates cascading latency, reduces cost, and simplifies error handling.

"Chaining three separate calls would have tripled the latency and cost. One shot, one failure point, faster response."
02

Signed JWT deep link, not server-to-server push

Resume Tailor hands off to Job Tracker by encoding parsed metadata in a 5-minute JWT, signing it with a shared secret, and deep-linking the user to Job Tracker with the token as a query param. No auth infrastructure, no service-to-service secrets, no added complexity. The user's browser carries the payload.

"Server-to-server would mean shared secrets across deployments,Resume Tailor breaking if Job Tracker is down, and silent failures. A deep link is auditable, testable, and fails gracefully."
03

Stateless entry point, authenticated tracker

Resume Tailor has no database, no login, and no auth. It's a public tool, just paste and go. Job Tracker owns all the persistence and identity. This separation keeps Resume Tailor lean and lets Job Tracker's data model scale cleanly. Auth only where value is stored, not where computation lives.

"Putting auth onResume Tailor would solve a problem that doesn't exist yet. We optimized for the user's first interaction, not for problems we might have later."