Skip to main content
All projects
Automation & AI
/projects/lumacv

LumaCV: AI Resume Intelligence

  • 30 min -> <60 sec automation
  • Multi-LLM failover (Gemini, Claude, Llama)
  • Deterministic LaTeX PDF pipeline
  • Real-time JD skill gap analysis
project.lumacv.local
LumaCV: AI Resume Intelligence project screenshot

Problem: Resume tailoring is a manual, error-prone process that often fails ATS screening due to poor keyword alignment and inconsistent formatting.

Solution: Built an AI-first resume intelligence platform using multi-LLM orchestration to parse resumes, analyze job descriptions, and generate tailored, ATS-optimized resumes with deterministic LaTeX rendering.

Impact: Reduced resume tailoring time from ~30 minutes to under 60 seconds while ensuring consistent formatting, improved keyword coverage, and higher ATS compatibility.

Overview

LumaCV is a full-stack AI system designed to automate resume tailoring at scale. It combines LLM-based parsing, semantic job description analysis, and deterministic LaTeX rendering to produce production-grade resumes with minimal user input. The system is built with reliability in mind, incorporating model failover, rate limiting, and state persistence.

Before / after

Resume Tailoring

Before: Manual rewriting + keyword guessing

After: Automated semantic alignment with JD

Formatting

Before: Inconsistent Word/Docs formatting

After: Deterministic LaTeX-generated PDFs

Time to Output

Before: 20-30 minutes

After: <60 seconds

Stack

Next.js App Router with Server Actions
Multi-provider LLM orchestration via OpenRouter
Supabase Auth and session management
Zustand for persistent client state
Upstash-based rate limiting and request control
Remote LaTeX compilation service

Decisions

Key trade-offs and design calls that shaped the final delivery.

External LaTeX service over local compilation

Context: Vercel Hobby tier can't fit LaTeX engines due to size constraints

Decision: Offload PDF compilation to external REST API to stay on free tier without sacrificing output quality

Multi-LLM failover

Context: Single provider downtime blocks users and creates bad experience

Decision: OpenRouter routing with automatic fallback across 4 providers (GPT-4o Mini, Llama, Gemini, Claude)

Client-side PDF parsing

Context: Serverless functions have payload limits and adding file upload handling increases complexity

Decision: Use pdfjs-dist in browser to extract text before sending to APIs, keeping server routes lightweight

Architecture

The primary system boundaries, runtime pieces, and how the project was structured in production.

Next.js 14 App Router + Zustand

Resume Builder Client

Multi-step wizard (Upload PDF + JD → Edit Details → AI Processing → Preview + Score) with persistent client state.

Gemini + OpenRouter

AI Orchestration Layer

Multi-provider failover across GPT-4o Mini, Llama 3.3, Gemini Flash, and Claude 3.5 so degraded vendors don't block resume generation.

External LaTeX API

PDF Compilation

Serverless-compatible PDF rendering—Vercel Hobby tier can't fit LaTeX engines, so compilation is offloaded to external REST API.

Mermaid source. Paste into mermaid.live to visualize the diagram.

flowchart LR
  subgraph Input
    U[User Resume / JD]
  end
  subgraph AI
    P[LLM Parser]
    A[JD Analyzer]
    T[Tailoring Engine]
  end
  subgraph Infra
    S[(Supabase Auth)]
    Z[Zustand State]
    R[Rate Limiter]
  end
  subgraph Output
    L[LaTeX Engine]
    PDF[Final Resume]
  end
  U --> P --> A --> T
  T --> L --> PDF
  S <--> T
  Z <--> U
  R --> T

Pipeline

How changes moved from development through validation and deployment.

1

Build

Vercel

Auto-deploy from GitHub, Next.js detected and optimized

2

Rate Limiting

Upstash Redis

Prevent API abuse on LLM endpoints with Redis-backed rate limiting

3

Deploy

Vercel Edge

maxDuration: 60 for LLM routes, Edge runtime for scoring endpoints

Incidents

Operational failures, rehearsals, or recovery moments that changed how the system was run.

Vercel 10s function timeout on large resumes

P2

Resolution: Increased maxDuration to 60s and implemented client-side PDF parsing to reduce payload size

Lesson: Serverless timeouts are hard limits—offload heavy work to client or external services

LaTeX compiler rendering inconsistencies

P3

Resolution: Standardized on single external LaTeX service with deterministic templates

Lesson: Browser PDF generation is inconsistent—deterministic LaTeX pipelines ensure predictable output

Live editing box performance issues

P3

Resolution: Debounced input handling and virtualized large text areas for smooth real-time preview

Lesson: Live preview features need debouncing and virtualization to handle large documents smoothly