BagWork
AI resume tailoring: paste a job link, get a keyword-matched resume PDF
Project Overview
BagWork (bagwork.ai) tailors a resume to a specific job posting, and has 750+ users. Users build a library of experiences, projects, and skills once. For each application they paste a job link, and BagWork scrapes the posting, extracts the keywords that matter, picks the most relevant library entries, rewrites bullets toward the job description, and renders a PDF with live keyword readiness feedback.
It also tracks each application through a pipeline (Applied, OA, Phone Screen, Onsite, Offer) and keeps every tailored resume attached to the job it was made for.
bagwork.ai

The public landing page.
Tailoring Pipeline
One job link starts a streamed (server-sent events) pipeline: verify the posting, extract keywords from the job description with GPT-4o-mini, score every library entry by text-embedding-3-small cosine similarity to the job description, select the top experiences and projects, then batch-rewrite bullets toward the job with GPT-4.1-mini, which LLM evals showed matched GPT-4.1 at about 1/5 the cost.
Each step reports progress to the client. From the result, users can drop into a line-by-line editor with a per-section entry picker sorted by score.
From job link to tailored resume
The library: every experience, project, and skill is entered once.
Line editor

Each AI rewrite shows as a diff and waits for Accept or Reject, next to the live PDF preview and keyword score. Product screenshots use BagWork's sample profile.
Keyword Readiness
Keyword readiness measures how much of the job description the resume actually covers. Matching runs against a cached set of skill embeddings, so semantically equivalent terms count, and the score updates live as bullets change.
PDF Rendering
Resumes were first generated as LaTeX and compiled by a hosted LaTeX service. In June 2026 I moved compilation to a self-hosted Typst microservice (Docker on EC2): it takes the resume as JSON, runs it through Typst templates, caches the output, and returns the PDF. New templates ship without redeploying the app.
Request flow
Drawn from the BagWork and bagwork-typst-compiler repos.
Application tracker
Every application with its status and keyword match score.
Stack
Next.js 16 App Router, React 19, and TypeScript on AWS Amplify; PostgreSQL 16 on AWS RDS through Prisma; S3 for stored PDFs; Supabase Auth; Stripe billing.
The idea started as resume-agent (June 2025): put in a job description, get a tailored resume.
