jandresgarcia.dev
Rev. 2026.09

How EApply tailors a CV to a job post with a multi-model LLM pipeline, a deterministic ATS scoring engine and an output validator that invents nothing.

AN-01

EApply Tailors a CV to a job post with an LLM, without inventing a single fact.

Closed beta · eapply.jandresgarcia.dev ↗

Video 1. EApply, product overview · 0:30

60 → 91

ATS fit on a real run. Every figure in the CV untouched.

How it works

  1. CV + job post

Engineering notes

  • Shows an honest ceiling, the best score reachable without inventing experience, instead of a fake 100.
  • Multi-model by design: a fast model extracts, a quality model writes, a vision model reads scans and judge models grade the output.
  • Production controls: per-model rate limits, a daily AI budget, and every call traced with its cost.

LLM pipelineMulti-model routingLLM-as-judge evalsGuardrails

Next.js · Fastify · Postgres · BullMQ · Redis · Typst · OpenTelemetry

How a run works

  1. You paste a job post and drop in a CV.
  2. The API validates the input, checks credits, queues the job and opens a live SSE stream.
  3. A separate worker process picks the job up from the queue.
  4. Extraction, with a vision model for scanned PDFs. Every model call goes through the router, rate limits and a daily budget.
  5. A fast model extracts the job skills, and each one is graded by how much proof the CV has.
  6. The quality model rewrites the CV using only proven skills.
  7. The output validator rejects any lost skill or unsupported claim. A regression triggers the fallback.
  8. The score you see is computed by a deterministic engine, never trusted from the model.
  9. Typst renders the new PDF, and the run is stored.
  10. Each stage streamed to the browser live, about 40 seconds end to end. Judge models then grade the result in the background.

System components

ComponentWhat it does
Web appNext.js 16 · React 19Deterministic codeUpload, live progress, results and history. Streams every pipeline status over SSE, with replay if the connection drops.
APIFastify · SSEDeterministic codeValidates the PDF and job post, checks credits, queues the job and opens the live stream.
Job queueBullMQ · RedisDeterministic codeSeparate worker processes with a dead-letter queue, plus queues for quality reports, exports and reminders.
Cost & rate limitsDaily budget · TPM/RPMDeterministic codeAdmission control per model with priority lanes and 429 cooldowns. A daily AI budget stops spend before it runs away.
ParseText + vision OCRAI model callHybrid extraction: text first, a vision model as OCR fallback for scanned CVs, then an LLM builds a canonical CV.
Skill evidenceGraded by proofAI model callAn LLM extracts the job skills; each one is graded strong, attenuated or excluded by how much proof the CV really has.
LLM rewriteRewrites, invents nothingAI model callThe quality model rewrites the CV using only proven skills. Structured output escalates from the fast to the quality tier on repair.
Output validatorHonesty · skill preservationDeterministic codeDeterministic checks reject lost skills and unsupported claims before anything is scored. A regression over 5 points triggers the fallback and refunds the credit.
Scoring engineDeterministic ATS scoreDeterministic codeThe model proposes a score, but the number shown comes from a deterministic scoring engine, plus the honest ceiling.
Model routerFast · Quality · Vision · JudgeAI model callEach step asks for a tier, not a model. The writer provider is swappable by config without touching the pipeline.
Quality judgesLLM-as-judge · claim checkAI model callAsync lenses score each result (recruiter scan, ATS, interview odds) and an entailment check verifies every claim. Nightly evals in CI.
Skill embeddingsVector skill matchingPlannedNext wave: local embeddings to match skills by meaning instead of by name. Planned, not built yet.
Render serviceFastAPI · TypstDeterministic codeA Python microservice turns the result into a PDF in one of five templates.
Postgres · S3Runs · history · filesDataPostgres via Drizzle for runs, credits and the job tracker; S3-compatible storage with signed download tokens.
ObservabilityOpenTelemetryDeterministic codeTraces with tokens and cost on every model call, plus structured logs and budget alerts.

Availability

Open to senior AI Engineer and Fullstack roles, and to AI product builds for founders.