Development projects

RÉSUMER

An AI résumé builder: keep your career in one profile, paste a job post, get one tailored, ATS-readable PDF page.

2026 · Product design + full-stack
Recorded on the live site. The demo profile and company are fictional; generation was simulated in the browser.16:9 · 28.9 s · silent

01 The problem

You’re qualified. The screening software never finds out.

  1. AIt reads for words.Applicant-tracking software reads a résumé for the job post’s own vocabulary. Good work described in other words doesn’t register.
  2. BOne résumé can’t match every post.A generic résumé tells the right story in the wrong words, and the match is lost before a person ever reads it.
  3. CRewriting it each time is busywork.Retuning every bullet for every application is copy-editing, not career-building. So most people don’t.

02 The rewrite

Same story, in their words.

Your profile holds the facts once. For each job post, Résumer retells them in the post’s language, so the software finds what was always there.

Northwind Labs

Senior Backend Engineer (Platform)

  • Build and operate Python / FastAPI1 microservices2
  • Scale PostgreSQL3 and Redis4 caching
  • Own observability: tracing, SLOs, p99 latency5

Fictional demo post

Before · generic

Responsible for writing backend services and maintaining databases for the platform team.

After · tailored to Northwind

Architected FastAPI1 microservices2 processing 45K req/s, cutting p99 latency5 by 38% with Redis4 caching.

Underlined: the job post’s own words, found in your story.

03 The pipeline

Eleven steps from job post to PDF.

Generation runs as a LangGraph state graph: eleven nodes, one job each, passing a single state forward. The rail is drawn to scale with the progress numbers the guest result page reports.

  1. 10Analyzing job post
  2. 18Selecting content
  3. 26Writing summary & skills
  4. 34Writing experience
  5. 42Writing projects
  6. 50Writing extracurriculars
  7. 58Assembling résumé
  8. 68Rendering PDF
  9. 76Fixing layout issues
  10. 84Optimizing fit
  11. 95Saving files

04 One page, by search

The type size is the only thing allowed to bend.

The template is Personal Classic: Computer Modern serif, one column, 10 mm margins. WeasyPrint renders it from HTML and CSS on the backend. Résumer then binary-searches the font size, and the largest size that still fits on one A4 page wins.

10.95 pt · 1120 px of 1123
fits on one page

And no orphans.

The renderer checks every bullet. If one wraps to two lines and the last line fills less than 75% of the width, it’s an orphan. An LLM pass rewrites it longer to fill the line, or trims it back to one.

75%
Under 75% · orphan
75%
Rewritten to fill
75%
Trimmed to one line

05 Where it runs

Three ways in, one engine.

Guest

No login.

Five free résumés a day. The draft lives on your device, not on a server.

Try as guest ↗

Signed in

A profile that remembers.

Google or GitHub login. Your profile memory and generation history stay with the account, and every PDF is stored in Cloudflare R2.

Open the app ↗

ChatGPT

An official MCP server.

ChatGPT can check readiness, generate, edit sections, detect orphans and render, all from the chat.

  • check_readiness
  • generate_resume
  • edit_resume_section
  • detect_orphans
  • render_resume
  • download_resume

06 Stack

Frontend
Next.js 16 · React 19 · Tailwind CSS v4 · shadcn/ui · NextAuth v5
API
FastAPI · Pydantic v2 · SQLAlchemy · Alembic
Generation
LangGraph · LangChain · Gemini / Gemma
Rendering
WeasyPrint · Jinja2
Infra
PostgreSQL · Cloudflare R2 · Docker · Vercel + Railway

Product design and full-stack build by Aryan Singh, 2026.