Nobody enjoys rewriting a resume for the fortieth time. Every posting wants slightly different keywords, a slightly different emphasis, a cover letter that sounds like you actually researched the company instead of pasting the same three paragraphs again. Applicant Tracking Systems reward that tailoring and punish you for skipping it, which is how job hunting turned into a part-time job of its own.
That annoyance is the entire reason Career Agent exists. It started life as a SaaS idea — the usual plan, a hosted product, a subscription, a landing page with a pricing table. I built the whole pipeline first and, somewhere along the way, realized the more useful thing to release was the tool itself, not a subscription to it. So it's out now as free, self-hosted, open-source software, MIT licensed, running on infrastructure you control.

What it actually does
You give it a job posting, either pasted in directly or as a URL, and it runs a full pipeline in the background while you keep working:
- Scrapes and parses the job description if you only gave it a link.
- Extracts structured details from the posting — title, company, salary, hiring contact — using Gemini.
- Researches the company through a self-hosted SearXNG instance, pulling headquarters info and mission/values statements.
- Synthesizes all of that into a company dossier.
- Generates a resume and cover letter tailored specifically to that posting, following a fairly strict style guide baked into the prompt: STAR-method bullet points, no invented skills, no filler adjectives, no AI-cliché phrases.
- Scores the result against the job description and hands back an ATS match percentage plus a keyword breakdown.
- Converts everything to properly formatted
.docxfiles via Pandoc, using your own reference template for styling.
Every job you submit is tracked as a background job with live progress, so you can queue up ten postings and go do something else while the pipeline works through them.

The part I actually care about: privacy
Sending your name, address, phone number, and work history to a cloud model for every single application is not something I was comfortable shipping without a safeguard. So before anything from your persona touches Gemini, Career Agent swaps every piece of personally identifiable information for a placeholder token, sends the anonymized version out for generation, and only re-inserts your real details locally once the response comes back. The model never sees your actual contact information — it works entirely from placeholders it never has to resolve.
Why give it away
The honest answer is that a SaaS version of this needed multi-tenant billing, an auth system, rate limiting per customer, all the plumbing that has nothing to do with whether the tool is actually useful. It was done already, but I asked myself "is this what I really want?". And the answer was "no". I never wanted to profit out ofthe need to fight the job market of today, and I know it works. Using it I landed several interviews, including the job I accepted early this year. But back to SaaS vs FOSS, none of that infrastructure makes the resume better. Stripping it out and replacing it with a docker-compose up felt like the more honest use of the time I'd already put in, and it means anyone can run it without trusting a third party with their career history in the first place.
Under the hood
The stack is deliberately boring and easy to self-host:
- Backend: Python 3.11 / Flask, with a thread-pool job manager that persists state to MySQL so in-flight jobs survive a restart.
- AI: Google Gemini for extraction, research synthesis, and document generation — with an optional path to run everything through a local Ollama model instead, if you'd rather not touch a cloud API at all.
- Search: SearXNG for company research, so even the "Google it" step stays privacy-respecting.
- Documents: Pandoc for Markdown-to-DOCX conversion, with post-processing for margins and alignment so the output doesn't look like a Markdown export.
- Database: MySQL 8, for users, personas, job history, and a lightweight internal log of every function call and API request.
The whole thing comes up with a single command:
git clone https://github.com/fernandocbhorta/Career-Agent.git
cd Career-Agent
cp .env.example .env # add your Gemini API key
docker-compose up -d --build
Flask, MySQL, and SearXNG all start together, and the app is live on localhost:5000.
Try it
The source, the Docker setup, and the full README are up now at github.com/fernandocbhorta/Career-Agent. It's MIT licensed, so fork it, self-host it, change the prompts to match your own writing style, or send a pull request if you improve on it. If it saves you even one evening of resume-wrangling, it's done its job.






