Back to Projects
SaaS AI

Shortlistable - AI CV Tailoring Platform

Shortlistable is a full-stack web platform for job seekers who want to move from a generic resume to an application-ready CV faster. Users import a PDF or DOCX, create a structured base CV, paste a job description, receive an AI match analysis, trigger asynchronous parsing/rewrite/export jobs, and download a polished version for recruiters and ATS systems.

Next.js 16 React 19 TypeScript FastAPI Python 3.12 PostgreSQL Supabase Redis RQ Docker Nginx Stripe OpenAI/Ollama Playwright

# Homepage Preview

Shortlistable homepage showing the AI-powered CV tailoring workflow

Problem

Job seekers often rewrite CVs manually for each application, but they do not know which keywords, experience bullets, or evidence gaps matter most. That creates slow application cycles and generic resumes that can be ignored by ATS filters or recruiters.

Solution

Shortlistable centralizes the flow: import or build a base CV, analyze the target role, surface missing keywords and weak evidence, enqueue long-running parsing/rewrite/export work through Redis/RQ, then guide the user toward a cleaner, role-specific CV without losing the original profile.

# Full Stack & Infrastructure

Frontend & Product

Next.js 16 App Router React 19 TypeScript Tailwind CSS 4 next-intl next-themes Radix UI Lucide React Framer Motion Tiptap editor React Hook Form Zod Sonner Vercel Analytics Responsive marketing pages SEO sitemap

Backend & API

Python 3.12 FastAPI Uvicorn Pydantic v2 Pydantic Settings SQLAlchemy 2 psycopg2 python-jose FastAPI middleware CORS Auth middleware Rate limit middleware Health routes REST API routers

AI & Documents

OpenAI SDK Ollama fallback LLM factory CV parser Job-fit recommendation service ATS scoring ATS verification Section enrichment Prompt injection checks PII hashing pdfminer.six python-docx PyMuPDF ODF parsing Pandas OpenPyXL

Workers & Queue

Redis RQ Queue ai Queue pdf worker-ai worker-pdf SpawnWorker on macOS SimpleWorker on Windows Retry/backoff intervals Result TTL Failure TTL Worker heartbeat SSE job stream Job result endpoint RQ Dashboard RedisInsight

Data & Storage

PostgreSQL Supabase Auth Supabase client Supabase service role Supabase Storage CV_FILES bucket CV_PHOTOS bucket CV_PREVIEWS bucket CV_TEMPLATES bucket User profiles CV versions Job analyses Billing catalog Subscription state

Infrastructure & Ops

Vercel web hosting Docker Docker Compose Production Compose stack Nginx reverse proxy Basic auth for admin tools uv lockfile python:3.12-slim Playwright Chromium install Redis appendonly persistence Environment-based config Shell/PowerShell launchers Structured logging Rotating log files

Integrations

Stripe subscriptions Stripe checkout Stripe billing catalog Stripe webhooks OpenAI API Ollama local models Supabase password recovery Supabase signup confirmation Next.js API proxy Browser auth session Remotion SEO video generation

# Technical Challenges

Parsing heterogeneous resumes while preserving enough structure for editing and export.

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.

Moving expensive document parsing, OpenAI/Ollama calls, ATS scoring, section enrichment, and Playwright PDF rendering into queue-backed workers so the UI remains responsive.

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.

# System Architecture

The production system is split between `matchcv_web` and `matchcv_backend`. The web app is a Next.js 16/React 19 client deployed on Vercel; it owns the product UI, localized SEO pages, Supabase browser session handling, API proxy routes, and SSE job-stream consumption. The backend is a Python 3.12 FastAPI service behind Nginx, with auth/rate-limit middleware, SQLAlchemy repositories, Supabase Auth/Storage integration, Stripe billing routes and webhook handlers, and AI/document services. Long-running work is handled by Redis + RQ: requests enqueue jobs into the `ai` or `pdf` queues, `worker-ai` processes CV parsing, ATS scoring, job-fit recommendations, and section enrichment, while `worker-pdf` runs Playwright/Chromium PDF rendering. Job status is exposed through `/api/jobs/{id}`, `/stream`, and `/result`, with retries, TTLs, worker heartbeat checks, rq-dashboard, and RedisInsight for queue operations.

Key Features

  • PDF/DOCX resume import and structured CV builder
  • Job description analysis with match scoring
  • ATS keyword gap detection and rewrite suggestions
  • AI-assisted tailoring with user validation before export
  • Redis/RQ queues with dedicated AI and PDF workers
  • Server-sent job status updates for long-running processing
  • Export-ready CV workflow and subscription access
Client Layer
Browser
Vercel CDN
Next.js 16 Web
API Proxy + SSE
Backend Core
Nginx Proxy
FastAPI / Uvicorn
Auth Middleware
Rate Limit
CV + ATS Routes
Stripe Webhooks
Queue + Workers
Redis + RQ
Queue ai
worker-ai
Queue pdf
worker-pdf
Retry + TTL
Heartbeat
PostgreSQL
Supabase Auth
Supabase Storage
OpenAI / Ollama
Stripe Billing
Playwright PDF
RQ Dashboard
RedisInsight
Logs / Config
Figure 1.0: Shortlistable - AI CV Tailoring Platform High-Level Architecture

# User Flow & Journey

Import CV

Step 01

User uploads a PDF/DOCX resume or starts from an empty structured CV.

Target Role

Step 02

User pastes a job description; backend extracts requirements, keywords, and soft-skill signals.

Queue Processing

Step 03

FastAPI enqueues AI or PDF jobs in Redis/RQ; the web app follows progress through SSE.

AI Match Analysis

Step 04

worker-ai compares the CV against the role, computes a match score, and highlights missing evidence.

Tailor & Validate

Step 05

User reviews AI rewrite suggestions before applying them to headline, skills, and experience bullets.

Export

Step 06

worker-pdf renders the final CV with Playwright/Chromium and returns an export-ready PDF.

Flow Analysis

From an existing resume to a tailored, export-ready application.

Discuss this Project
← Back to Projects Contact Me →