Project: OpenDoors

Role: Author

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