Upload a resume, paste a job description — get an AI-optimized version grounded in your real experience.
Tailr is an AI-powered resume optimization platform. Unlike traditional resume generators, Tailr never fabricates experience — every optimization is grounded in the user's existing resume via RAG (Retrieval-Augmented Generation).
Core flow:
- Upload a resume (PDF/DOCX/TXT) → LlamaExtract extracts structured JSON
- Paste a job description → LlamaExtract extracts structured requirements
- Section-by-section embeddings → semantic search in Qdrant Cloud
- Retrieve context → LLM optimizes each section
- Display the optimized result
flowchart TD
A["Resume File<br/>(PDF / DOCX / TXT)"] --> B["LlamaExtract<br/>(Structured JSON)"]
B --> C["Section Embeddings<br/>(Qdrant Cloud)"]
B --> D["Job Description<br/>(LlamaExtract)"]
C --> E["Semantic Retrieval"]
D --> E
E --> F["Gemini 2.5 Flash LLM<br/>(LangGraph Workflow)"]
F --> G["Optimized Resume Output"]
- AI-Powered Extraction — LlamaExtract converts PDF/DOCX/TXT into structured JSON (experience, education, skills, projects, certifications, achievements)
- Section-by-Section Embeddings — Each section (summary, skills, experience, etc.) is independently embedded for precise retrieval
- Semantic RAG — Qdrant Cloud vector search retrieves the most relevant sections for the target job
- Multi-Agent Workflow — LangGraph orchestrates JD analysis, resume analysis, planning, rewriting, and optimization
- Streaming Results — Frontend receives real-time SSE events as the workflow progresses
- Data Management — View, use, or delete previously extracted resumes and job descriptions
- JWT Authentication — Secure user accounts with bcrypt password hashing
- Clean Architecture — Domain-driven design with repository pattern and dependency injection
- Next.js 16 (App Router)
- React 19
- TypeScript (strict mode)
- Tailwind CSS v4
- React Query v5
- Zustand
- ShadCN UI
- Python 3.13
- FastAPI
- SQLAlchemy 2.x (async)
- Alembic
- Pydantic v2
- LangChain
- LangGraph
- Google Gemini 2.5 Flash (LLM)
- Google Gemini Embeddings (
models/gemini-embedding-001, 3072 dims) - LlamaExtract (structured data extraction from files)
- Qdrant Cloud (vector database)
- PostgreSQL 17 (relational data)
- Qdrant Cloud (vector embeddings)
- Redis (caching — optional)
- Python 3.13+
- Node.js 22+
- PostgreSQL 17
- Qdrant Cloud account
- Google Gemini API key
- LlamaExtract API key
cd apps/backend
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtCreate .env in apps/backend:
DATABASE_URL=postgresql+asyncpg://postgres:admin@localhost:5432/tailr
GEMINI_API_KEY=your_key_here
LLAMAEXTRACT_API_TOKEN=your_token_here
QDRANT_URL=https://your-instance.eu-west-1-0.aws.cloud.qdrant.io
QDRANT_API_KEY=your_key_here
JWT_SECRET_KEY=your_secretRun migrations:
alembic upgrade headStart the server:
uvicorn api.main:app --reloadcd apps/frontend
npm install
npm run devapps/
├── backend/
│ ├── api/
│ │ ├── routes/ # FastAPI route handlers
│ │ └── main.py # App entrypoint
│ ├── application/ # Use cases / service layer
│ ├── domain/ # Business entities & repository interfaces
│ ├── infrastructure/
│ │ ├── database/ # SQLAlchemy models & session
│ │ ├── llamaindex/ # LlamaExtract + Qdrant vector store
│ │ └── repositories/ # SQLAlchemy repository implementations
│ ├── workflows/ # LangGraph workflow nodes & graph
│ └── alembic/ # Database migrations
└── frontend/
├── app/ # Next.js App Router pages
├── components/ # React components
└── lib/ # Zustand stores & utilities
| Module | Status |
|---|---|
| User Auth (JWT) | ✅ Complete |
| Resume Upload & Extract | ✅ Complete |
| JD Upload & Extract | ✅ Complete |
| Qdrant Indexing | ✅ Complete |
| Semantic Retrieval | ✅ Complete |
| LangGraph Workflow | ✅ Complete |
| SSE Streaming | ✅ Complete |
| Data Management | ✅ Complete |
| Guardrails | ⏳ Planned |
| ATS Scoring | ⏳ Planned |
| PDF Generation | ⏳ Planned |
MIT
Built with FastAPI, Next.js, LangGraph, Gemini, Qdrant Cloud, and LlamaExtract.