Modern AI resume builder for fast, role-matched resumes.
Build your profile once. Paste a job description. Generate clean, ATS-aware PDFs that feel tailored instead of templated.
Live App / Features / Stack / Run Locally
Resumer is already deployed at resumer.aryansingh.space.
Profile data + target job
|
v
AI resume generation pipeline
|
v
Template-aware resume content
|
v
Rendered PDF + saved history
Most resume tools either make you manually fight layout or produce generic AI text. Resumer keeps your real career material structured, then uses a job description to generate sharper first drafts with practical PDF output.
| Feature | Description |
|---|---|
| Profile memory | Save reusable education, experience, projects, skills, links, and extracurriculars. |
| Job-aware generation | Paste a job description and generate content around role signals. |
| Template constraints | Resume templates define supported sections and content splits. |
| PDF export | Backend renders final documents with Jinja2, CSS, and WeasyPrint. |
| Generation history | Track previous resumes, status, logs, artifacts, and downloads. |
| Auth | GitHub and Google login through NextAuth. |
| Object storage | Generated artifacts are stored through S3-compatible Cloudflare R2. |
| Docker deploy | Frontend and backend ship as containerized services. |
| Layer | Tools |
|---|---|
| Frontend | Next.js 16, React 19, TypeScript, Tailwind CSS v4, shadcn/ui |
| Forms and state | react-hook-form, Zod, TanStack Query |
| Auth | NextAuth.js v5, JWT sessions |
| Backend | FastAPI, Pydantic v2, SQLAlchemy async, Alembic |
| AI pipeline | LangGraph, LangChain, Google Gemini / Gemma API |
| Rendering | Jinja2 templates, WeasyPrint PDF renderer |
| Database | PostgreSQL |
| Storage | Cloudflare R2 or any S3-compatible bucket |
| Deployment | Docker, Railway, custom domain |
Browser
|
| Next.js app
v
Frontend container
|
| /api/backend proxy + JWT auth
v
FastAPI backend container
|
| async SQLAlchemy
v
PostgreSQL
FastAPI backend
|
| generation pipeline
v
LangGraph + LLM
|
| render artifacts
v
WeasyPrint + Cloudflare R2
Resumer-v2/
|-- frontend/
| |-- app/ # Next.js app router pages and API routes
| |-- components/ # Navigation, auth modal, profile forms, UI pieces
| |-- lib/ # Auth, JWT, shared utilities
| |-- Dockerfile # Frontend container
| `-- package.json # pnpm scripts and dependencies
|-- backend/
| |-- src/api/ # Profile, generation, system endpoints
| |-- src/core/ # Config, auth, DB, storage, executor
| |-- src/models/ # SQLAlchemy models
| |-- src/pipeline/ # LangGraph generation flow
| |-- src/schemas/ # Pydantic schemas
| |-- templates/ # Resume templates and manifests
| |-- Dockerfile # Backend container
| `-- pyproject.toml # uv Python project config
|-- docker-compose.yml # Local Docker orchestration
|-- PLAN.md # Product and architecture notes
`-- .github/workflows/ # GitHub workflow checks
| Tool | Version |
|---|---|
| Node.js | 20+ |
| pnpm | Latest stable |
| Python | 3.12+ |
| uv | Latest stable |
| PostgreSQL | Any recent version |
| Docker | Optional, recommended |
Copy sample environment files:
cp frontend/.env.example frontend/.env
cp backend/.env.example backend/.envSet these core values:
NEXTAUTH_SECRET=use-the-same-secret-as-backend
JWT_SECRET=use-the-same-secret-as-frontend
DATABASE_URL=postgresql+psycopg://user:pass@localhost/resumer
GOOGLE_API_KEY=your-google-api-keyFrontend also needs OAuth credentials if you want login locally:
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=cd frontend
pnpm install
pnpm devOpen http://localhost:3000.
cd backend
uv sync
uv run alembic upgrade head
uv run python main.pyBackend runs on http://localhost:8000.
Run full stack locally:
docker compose up --build| Service | Local URL |
|---|---|
| Frontend | http://localhost:3000 |
| Backend | http://localhost:48000 |
Current production deployment uses Railway + Docker with the live domain at resumer.aryansingh.space.
| Service | Deployment role |
|---|---|
| Frontend container | Serves Next.js production app. |
| Backend container | Serves FastAPI API and generation pipeline. |
| PostgreSQL | Stores users, profiles, generations, logs, and artifact metadata. |
| Cloudflare R2 | Stores generated PDFs and related files. |
| Custom domain | Points public traffic to the deployed Railway service. |
| Variable | Used by | Purpose |
|---|---|---|
NEXTAUTH_SECRET |
Frontend | Signs NextAuth JWTs. |
NEXTAUTH_URL |
Frontend | Public app URL. |
NEXT_PUBLIC_API_URL |
Frontend | Public backend URL for browser calls. |
BACKEND_INTERNAL_URL |
Frontend | Internal service URL for Docker/Railway networking. |
DATABASE_URL |
Backend | PostgreSQL connection string. |
JWT_SECRET |
Backend | Verifies frontend auth tokens. |
GOOGLE_API_KEY |
Backend | LLM API key for generation. |
FRONTEND_URL |
Backend | CORS origin. |
R2_ENDPOINT_URL |
Backend | Cloudflare R2 endpoint. |
R2_ACCESS_KEY_ID |
Backend | R2 access key. |
R2_SECRET_ACCESS_KEY |
Backend | R2 secret key. |
R2_BUCKET_NAME |
Backend | Artifact bucket name. |
RESEND_API_KEY |
Backend | Optional completion email delivery. |
| Endpoint | Purpose |
|---|---|
GET /profile |
Fetch or initialize profile. |
PUT /profile |
Update base profile data. |
GET /profile/projects |
List saved projects. |
GET /profile/experiences |
List saved experiences. |
POST /generate |
Start a resume generation run. |
GET /generate |
List generation history. |
GET /generate/{gen_id} |
Fetch generation status. |
GET /generate/{gen_id}/logs |
Poll generation logs. |
Resumer uses a sharp editorial look rather than generic SaaS polish: warm background, heavy typography, high-contrast cards, minimal chrome, and direct product language. The UI keeps attention on one loop: profile, job, generated resume.
Production deployed and actively evolving. Main next improvements are richer templates, better generation observability, and smoother onboarding for first-time profiles.
Distributed under the MIT License. See LICENSE for details.