AI Resume Studio & Job Matching
Shortlistable helps candidates show how their actual experience fits a specific role. They can create a CV from a template or import an existing document, reconstruct its layout, edit content and presentation, and compare it with a job description. The analysis connects role requirements to evidence in the CV and proposes changes candidates can review before applying. I conceived the matching logic and document-reconstruction architecture, and built the resume studio, export pipeline and commercial access with dedicated background processing.
Candidates face two kinds of rework: rebuilding an existing CV in a new editor and rewriting it for each role. A keyword checklist alone cannot explain whether their experience supports a requirement, and generated wording can distort facts or damage the document's presentation.
Shortlistable connects document reconstruction with an editable resume studio and role-specific analysis. It examines alignment, supporting evidence and CV quality, then offers concrete, reviewable changes to existing content. Candidates refine the wording and layout before exporting, while import, matching, AI enrichment and PDF rendering run in dedicated background queues.
Import a PDF or DOCX and recover structured content. Reconstruct a document's columns, typography and visual elements, then review its editable preview.
Create a CV from a template or edit an imported one. Work with repeatable experience and education sections, rich text, colors, margins and a live document preview.
Compare your CV with a job description. Review requirement-level matches, supporting experience, missing evidence and quality issues to identify what needs attention.
Review concrete rewrites for existing CV content and choose which changes to apply. Fact-preservation checks help retain named skills and experience details.
Manage CVs and versions, refine your document for another role, and preview the final result before downloading a PDF.
Track import, analysis and export progress while working in the editor. Account settings bring subscription access and usage credits into the same product.
Parsing heterogeneous resumes while preserving enough structure for editing and export.
Reconstructing typography, columns, geometry and visual assets while binding extracted content to editable CV sections.
Keeping AI suggestions truthful: the system must improve wording and evidence without inventing skills or experience.
Balancing ATS optimization with human readability so the final CV does not become keyword-stuffed.
Isolating document import, AI analysis, section enrichment and Chromium rendering in separate queues to prevent one slow workload from delaying all users.
Designing retries, TTLs, worker heartbeats, SSE job streams, and failure states for background work that depends on external AI and document services.
Designing a workflow that feels fast for repeated applications while still giving users control over every generated change.
Shortlistable deploys the Next.js studio on managed hosting and a separate FastAPI backend behind Nginx on a Docker Compose host. A private bridge network connects the API, Redis and four Python RQ consumers: cv_import, ai, job_fit and pdf. Managed identity, PostgreSQL and object storage sit outside that network. Workers call an inference service or render with Playwright/Chromium, then persist results and documents. The Next.js proxy relays API requests and SSE job status; a payment service delivers billing webhooks to the public API origin.
Managed web hosting serves the web application. A separate Docker Compose host runs the API and RQ workers; authentication, PostgreSQL and files use managed data services.
Next.js proxy routes forward authenticated requests and job streams to FastAPI. PostgreSQL is hosted outside the application container network.
Redis uses append-only persistence; CVs and commercial state live in PostgreSQL, and documents in object storage. Certificate renewal and a reloader maintain the origin TLS certificates.
The web application, backend containers and managed services are separate deployment boundaries. Operational dashboards are kept outside the public application surface.
| From | To | Protocol / responsibility | Flow |
|---|---|---|---|
| Candidate browser | Next.js application | HTTPS | Request / response |
| Next.js application | Identity service | Auth / JWT | Request / response |
| Next.js application | Nginx | HTTPS · API + SSE | Request / response |
| Certificate services | Nginx | TLS files / reload | Control / operations |
| Nginx | FastAPI / Uvicorn | HTTP · private upstream | Request / response |
| FastAPI / Uvicorn | Redis / RQ | Enqueue / job status | Queued work |
| Redis / RQ | Python RQ workers | RQ dispatch | Queued work |
| FastAPI / Uvicorn | PostgreSQL | SQL / TLS | Persistent data |
| FastAPI / Uvicorn | Object storage | Storage API | Persistent data |
| Python RQ workers | Object storage | Read inputs / store artifacts | Persistent data |
| Python RQ workers | PostgreSQL | Persist CV / analysis results | Persistent data |
| Python RQ workers | AI inference service | HTTPS · inference | Request / response |
| FastAPI / Uvicorn | Payment service | Billing API | Request / response |
| Payment service | Nginx | Signed webhooks | Events / callbacks |
Four RQ queues isolate document import, AI enrichment, role matching and Chromium rendering. Status returns through the API and the Next.js SSE proxy.
The four worker processes start the same Python application with a distinct queue name. Import, matching and rendering can be provisioned independently.
A long-running task does not hold an editing request open. The browser follows job status over SSE and retrieves the result after completion.
Redis owns queue execution state. PostgreSQL and object storage retain CV versions, analysis results and exported documents beyond the job's result TTL.
| From | To | Protocol / responsibility | Flow |
|---|---|---|---|
| Next.js studio | FastAPI jobs API | Authenticated request | Request / response |
| FastAPI jobs API | Next.js studio | SSE status / result | Events / callbacks |
| FastAPI jobs API | Redis / RQ | Enqueue + read status | Queued work |
| Redis / RQ | worker-cv-import | cv_import | Queued work |
| Redis / RQ | worker-ai | ai | Queued work |
| Redis / RQ | worker-job-fit | job_fit | Queued work |
| Redis / RQ | worker-pdf | Queued work | |
| PYTHON BACKEND · INDEPENDENT RQ CONSUMERS | PostgreSQL + Storage | Persist results and artifacts | Persistent data |
| worker-ai | AI inference service | Inference | Request / response |
| worker-job-fit | AI inference service | Semantic analysis | Request / response |
Import, role matching, enrichment and rendering use dedicated queues so they can be processed independently.
Document extraction and layout reconstruction are separate concerns, joined by semantic bindings and a reviewable preview.
The editor consumes job status through SSE and fetches the completed result rather than blocking on a long HTTP request.
Upload a PDF/DOCX, reconstruct its layout or start with a template.
User pastes a job description; backend extracts requirements, keywords, and soft-skill signals.
Compare the CV with the role and review missing evidence and suggested improvements.
User reviews AI rewrite suggestions before applying them to headline, skills, and experience bullets.
Preview the finished document and download the tailored CV as a PDF.