Skip to content

pbathuri/ResumeForge

Repository files navigation

ResumeForge

Local-first, ATS-aware resume builder with a full visual editor, industry-curated templates, LaTeX PDF generation, a job tracker, and an explainable rewrite pipeline powered by a pluggable LLM (local Ollama, AWS Bedrock, or a built-in mock).



Beta → resumeforge-web.vercel.app


TL;DR

Most resume AIs are black boxes that rewrite your CV into something you don't recognise. ResumeForge runs the rewrite locally through Ollama, shows you every edit with justification, compiles a real LaTeX PDF, and scores you against the ATS platforms (Workday / Greenhouse / Lever / Taleo / iCIMS / SmartRecruiters / BambooHR) the employer is actually using.


Architecture

flowchart LR
    U[Resume +<br/>Job Description] --> W[Next.js 14<br/>App Router]
    W -->|SSE stream| A[FastAPI<br/>/api/v1/runs]
    A --> P[Parser<br/>+ Scoring]
    A --> L[LangGraph<br/>rewrite pipeline]
    L --> O[LLM provider<br/>Ollama · Bedrock · mock]
    A --> T[tectonic<br/>LaTeX → PDF]
    A -.->|optional| R[Redis +<br/>Celery]
    A --> S[(SQLite / Postgres)]
    T --> ART[Artifacts<br/>PDF · TEX · ZIP]
Loading

Everything the model does is observable: you see the plan, the per-section diff, and the compiled PDF in real time over SSE.


What's built

Frontend - Next.js 14 App Router

Route Status Description
/ ✅ live Marketing - animated background, hero input, industry filter, template showcase, ATS badges
/new ✅ live Core builder - paste/upload resume, pick template, select industry + colour, run analysis
/transferring ✅ live Animated progress screen while backend analyses
/editor ✅ live Full visual resume editor - drag-and-drop sections, real-time preview, export
/templates ✅ live Gallery - filter by industry, ATS score, layout
/tracker ✅ live Job Tracker - Kanban board (saved → applied → interview → offer), reminders, per-job match score
/checker ✅ live Resume Checker - multi-criteria audit + keyword match report
/cover-letter ✅ live Truthful, JD-aware cover-letter generation
/import ✅ live Import a PDF/DOCX resume or pasted LinkedIn profile into the editor
/dashboard ✅ live Run history, fit scores, artifact downloads + quick links
/fit-analyzer ✅ live JD ↔ resume alignment scorer (overall + per-dimension + keyword match)
/pricing ✅ live Pricing tiers
/admin/deployment ✅ live Health dashboard - API, LLM provider, Ollama, LaTeX, filesystem, call stats

UI Components

  • AnimatedBackground - 4-layer canvas: Gemini hero image → animated mesh gradient → 80-particle canvas (proximity lines, 40 fps) → parallax ghost resume cards (framer-motion mouse tracking).
  • IndustryFilterBar - 10 industry pills · role typeahead · ATS platform dropdown · experience slider · strict-ATS toggle.
  • TemplatePicker - Visual grid with CSS mockup previews · colour swatches · ATS score badges · industry filtering.
  • ResumeHeroInput - Dual-pane textarea (resume + JD) · drag-and-drop file upload (.pdf / .docx / .txt / .md).
  • VisualEditor - Drag-and-drop sections, inline editing, print/export.

Backend - FastAPI

Endpoint Status Purpose
GET /api/v1/health Basic health + dependency checks
POST /api/v1/runs/analyze Sync parse + score against JD
POST /api/v1/runs/{id}/render LaTeX → PDF via tectonic, returns artifact URLs
GET /api/v1/runs/{id}/artifacts/{aid}/download Stream PDF / TEX / ZIP bytes
GET /api/v1/runs/{id}/stream SSE - async LangGraph rewrite pipeline
POST /api/v1/assistant/chat Redis-backed chat history
GET /api/v1/settings User preferences
GET/POST /api/v1/jobs Job Tracker board + CRUD (Teal-style Kanban)
POST /api/v1/jobs/{id}/move Move a card between stages
POST /api/v1/jobs/match-score Live resume↔JD match score (LLM-free, fast)
POST /api/v1/checker/analyze Resume Checker — Rezi/Jobscan-style audit + keyword match
POST /api/v1/assistant/cover-letter Truthful, JD-aware cover letter
POST /api/v1/import/resume · /import/linkedin Import PDF/DOCX or pasted LinkedIn profile
POST /api/v1/export/docx Editable, ATS-safe Word export
GET /api/v1/health/llm LLM provider + call observability

LLM provider: all model calls route through a factory — set LLM_PROVIDER to ollama (local, default), groq (hosted, free, OpenAI-compatible — great for cloud demos), bedrock (AWS Converse; any Nova/Claude/Llama via BEDROCK_MODEL_ID), or mock (deterministic, no keys). With LLM_FALLBACK_TO_MOCK=true a provider error degrades to mock instead of failing. See docs/CREDENTIALS.md.

LaTeX templates (all ATS-annotated)

Key UI ID ATS score For
ats_classic_single_column forge-classic 99% Maximum ATS compatibility
modern_minimal_single_column forge-minimal 97% Typography-first
technical_compact forge-tech 96% Skills-first, dense - engineers
academic_cv forge-research 95% Publications / education prominent
consulting_clean forge-classic variant 94% Consulting bullet depth
executive_bold forge-executive 92% Large header, ruled separators
two_column_split forge-two-column 88% Experience left + skills sidebar
creative_sidebar forge-creative 74% Design / UX / marketing

Monorepo

apps/
  api/                 FastAPI - parsers, scoring, LLM, LaTeX, runs, assistant, auth, SSE
    app/api/routes/    health, settings, prompts, runs, assistant, auth, streaming,
                       jobs, checker, export, imports
    app/core/          config, database (SQLite default / Postgres)
    app/schemas/       Pydantic contracts
    app/services/      run_service, llm_factory + llm_base, ollama/bedrock/mock providers,
                       cover_letter, resume_checker, docx_export, job_service, tracing,
                       redis, session, celery, langgraph, evaluator, s3, sse
    evals/             regression-gated eval harness (relevance / discrimination / grounding)
    tests/             pytest + fakeredis async fixtures
  web/                 Next.js 14 App Router + server proxy → backend
    app/(marketing)/   Landing
    app/(main)/        Shell - /new · /editor · /templates · /tracker · /checker ·
                       /cover-letter · /import · /dashboard · /settings
    lib/templates.ts   8 templates × 10 industries × 6 colour schemes + ATS metadata
  extension/           MV3 Chrome extension - 1-click JD capture into the tracker
packages/
  shared-types/        Zod schemas + TS contracts
  prompt-library/      YAML prompt packs with inheritance
  latex-templates/     8 × .tex.j2 Jinja2
  scoring-engine/      Synonym ontology maps
docs/                  All project docs live here:
  ARCHITECTURE.md        End-to-end workflows + file map
  BEDROCK_SETUP.md · CREDENTIALS.md · EVAL_HARNESS.md · DEPLOYMENT.md · VERCEL_DEPLOYMENT.md
  LOCAL_SETUP.md · TESTING.md · PROMPT_LIBRARY.md · GEMINI_IMAGE_PROMPTS.md
  aws-architecture.md
Dockerfile.api         Python + tectonic (pinned v0.15.0 musl-static)
Dockerfile.web         Next.js production image
docker-compose.yml     Redis + Ollama + API + Celery worker + optional web
render.yaml            Render Blueprint (API + 5 GB disk)
.github/workflows/     CI - backend pytest + eval gate, web typecheck + build

Quick start

# Run the stack locally
docker compose up
# → API on :8000, Ollama on :11434, Web on :3000

Or piece-by-piece:

# API
cd apps/api && pip install -r requirements.txt && uvicorn app.main:app --reload

# Web (npm workspaces — install from the repo root)
npm install && npm run dev -w apps/web

You need: Python 3.11+, Node 20+, and Docker (for tectonic). For the LLM, pick a provider via LLM_PROVIDER: ollama (local, default), bedrock (AWS — see docs/BEDROCK_SETUP.md), or mock (deterministic, needs no keys or model — handy for CI and quick demos). Required keys per provider are listed in docs/CREDENTIALS.md.

Deploy

  • Backend → Render: push, then create a Blueprint from render.yaml (Docker image bundles tectonic for real PDF). Comes up on LLM_PROVIDER=mock with zero secrets.
  • Frontend → Vercel: deploy apps/web (Root Directory apps/web) and set NEXT_PUBLIC_API_BASE_URL to the backend URL.

Roadmap

  • Job Tracker (Teal-style Kanban) with stages, reminders, notes, and per-job match score
  • Live ATS match score in the visual editor (updates as you edit)
  • AWS Bedrock LLM provider (Converse API) + mock provider, alongside local Ollama
  • Cover-letter generation (truthful, JD-aware) — API + UI
  • Browser extension: 1-click JD capture from job boards into the tracker (apps/extension)
  • Resume import (PDF/DOCX) + simulated LinkedIn import → visual editor
  • Eval harness (regression-gated) + LLM call tracing + graceful degradation
  • Resume Checker (Rezi/Jobscan-style multi-criteria audit + keyword report)
  • Editable DOCX export (ATS-safe single column)
  • GitHub Actions CI (backend pytest + eval gate, web typecheck + build)
  • Fit-analyzer: JD ↔ resume alignment scorer (overall + per-dimension + keyword match)
  • Admin deployment health-check dashboard (/admin/deployment)
  • Improve data-science / academic scoring discrimination (see docs/EVAL_HARNESS.md)
  • AWS CDK stack (VPC, ECS Fargate + ALB, S3, ElastiCache Redis, Bedrock IAM) + deploy.sh

Part of @pbathuri's project portfolio · Local-first AI, explainable by default.