Project: Hire Bridge
What is it?
A personal job search platform: build your profile once, let it find and score matching positions, then manage every application through to offer — with AI-generated CVs, cover letters, and interview prep along the way.
The dashboard
All career details are added to the profile section
Create as many research topics as you'd like
Keep track of each application's status
Overview of job listings found
Overview of LLM costs
Backstory
Near the end of my internship at Capgemini, a job search became my priority. Managing applications in a spreadsheet and manually rewriting a CV for every role felt like exactly the kind of data-driven problem that could be automated.
Thus Hire Bridge came to life. A Celery worker runs independently to search job boards via Serper, scrape full listings via Apify, deduplicate by SHA-256 fingerprint, score each position against my profile with Gemini, and persist the results — all cancellable mid-run. The kanban board lets me track each position through stages with notes, contacts, and deadlines per entry. And because a tailored application matters, the system generates a role-specific CV, cover letter, and interview Q&A from my master profile using an LLM.
The project also doubles as a showcase: it touches async data pipelines, task queues, REST APIs, LLM integration, and a typed full-stack architecture — all areas relevant to a Data & AI Engineering job search.
Technical details
Stack
- Python — FastAPI + SQLAlchemy 2.0 (async)
- Next.js 14 App Router (TypeScript)
- PostgreSQL — Alembic migrations, JSONB for flexible fields, cascade deletes, timezone-aware timestamps
- Redis + Celery — background task queue
- Docker / Docker Compose — fully containerized
Pipeline
- Celery worker runs independently: Serper search → Apify scrape → SHA-256 dedup → Gemini scoring → DB save
- Cancellable mid-run; up to 30 positions saved per search with fit % and rationale
- Gemini 2.5 Flash for generation (CV, cover letter, interview Q&A); Flash-Lite for structured JSON (scoring, title expansion)
- Per-call LLM cost logged to Postgres and surfaced in the Costs view
Auth & data
- JWT (HS256, 7-day expiry) + bcrypt; all routes fully isolated per user
- JSONB columns for flexible profile and position fields
- Cascade deletes; timezone-aware timestamps throughout
Frontend
- Typed api() wrapper over all backend endpoints
- Dark-mode Tailwind with semantic design tokens
- localStorage persistence for UI state (tracker filters, sort preferences)
- Live polling while search jobs are in progress