Project: OpenDoors
What is it?
- Import a CV and get a structured career profile you can edit and polish with AI
- Research runs search LinkedIn and Indeed, skip duplicates and score each role against your profile, with the reasons
- A tracker board and per-position pages for notes, contacts, follow-ups and documents
- Tailored CVs, cover letters and interview prep, exported as PDF or Markdown
- Chats that know your profile and the job, plus one that has read the user manual
The dashboard, with the best-fitting roles up front
Build your career profile once, then improve it with AI
Each research run shows every step, from search to saved positions
Saved positions with fit scores, filters and AI summaries
A position's details, with a fit score that explains itself
The tracker board, from found to offer
The profile chat can generate a CV and export it as PDF
The Learn page, with a chat that has read the manual
Backstory
In March '26 a job search became my priority. Keeping applications in a spreadsheet and rewriting my CV for every role felt like exactly the kind of problem worth automating, so I started building. The first commit landed on 17 March, and within a week it could already build a profile, search job boards, score the results and generate a tailored CV.
It started as Hire Bridge, a tool just for me. Over the following weeks it grew into a real product and got a new name, OpenDoors: Google sign-in, credits with Stripe checkout, onboarding, a Learn page, and a calmer redesign. 40 beta testers used it in their own job searches, and their feedback shaped most of what got built.
Under the hood it was also a place to show what careful AI development looks like in a real product: background workers for every slow AI task, per-call cost tracking, observability and alerts, and an end-to-end test suite that mocks every model and external API.
In October '26 OpenDoors was sunset. The site stays online as a test system: anyone can sign up and try it, and accounts are wiped every night.
Technical details
Stack
- Python — FastAPI + SQLAlchemy 2.0 (async)
- Next.js 14 App Router (TypeScript), Tailwind
- PostgreSQL with pgvector, Alembic migrations
- Redis + Celery, Caddy as reverse proxy
- Docker Compose on a GCP VM
Workers
- Three Celery workers with their own images and queues: research, LLM and PDF
- The API only creates a job and hands it off; the frontend polls until it's done
- Research pipeline: title expansion → Serper search → Apify scrape → dedup → fit scoring, level detection and summaries → save
- PDF rendering with WeasyPrint
AI
- Pydantic AI on Gemini 3.1, switchable to Anthropic Claude
- Chat agents with tools that can read and update the profile and start document generation
- Remembers career preferences across chats
- RAG over the user manual with pgvector for the Learn chat
- Every LLM call logged with its cost, shown in the app as credits
Product & operations
- Google OAuth and JWT auth, Stripe credits and promo codes
- Prometheus, Loki and Grafana with alerting, plus Telegram notifications for failures
- User event tracking with its own Grafana dashboard
- Integration, worker and Playwright E2E tests, with every LLM and external API mocked