Skip to content

Get started

Four pieces. Only the first is required.

Everything runs in three containers on your machine. The first build takes several minutes because it installs TeX Live and downloads the pinned embedding model; after that, it is one command.

Apache-2.0
No account
≈1¢ per application
127.0.0.1 only

The shape of it

What a complete setup looks like

1

The stack

required

One docker compose up -d. Three containers, all on localhost. The first build takes a few minutes because it installs TeX Live and downloads the embedding model.

2

One API key

optional

Paste it into .env or Settings → Models. OpenAI or Gemini. Either one alone is a complete setup, and each maps to a profile we measured.

3

MCP for your assistant

optional

One script registers Claude Code for you and prints ready-to-paste config for Claude Desktop and ChatGPT desktop / Codex CLI.

4

The browser extension

optional

chrome://extensions → Developer mode → Load unpacked → the repo's extension/ folder. No ID to copy, nothing to configure.

Step 1

Clone and start the stack

Then open http://localhost:3000.

bash
git clone https://github.com/seinun-ai/maestro-career-studio.git
cd maestro-career-studio
cp .env.example .env

# Recommended: open .env and paste an OPENAI_API_KEY (or GEMINI_API_KEY).
# The deterministic core runs without one. The AI lanes want one.

docker compose up -d --build

You will need

Docker Desktop

Or Docker Engine with Compose v2.

About 4 GB of disk

Backend ~1.9 GB (it carries a minimal TeX Live, Typst and the embedding model), frontend ~1.6 GB, PostgreSQL ~0.4 GB.

One API key, recommended

OpenAI or Gemini. Without one you still get the deterministic core, and over MCP your assistant supplies the model.

On first boot, Docker will:

Launches PostgreSQL on host port 55432, chosen to dodge any Postgres you already run

Runs database migrations via Alembic

Seeds demonstration base resumes, compiles initial PDF previews, and seeds the default AI prompts

Serves the UI on 127.0.0.1:3000 and the API on 127.0.0.1:8001

Step 2

Bring one API key

OpenAI or Gemini — either one alone is a complete setup. The parts that make Maestro CS fastest day to day run on it: in-app tailoring, the extension's tailor-on-the-go and AI form filling, cover letters and screening answers, KB consolidation, and chat.

≈1¢

per tailored application

Capture the posting, score it, close the gaps, tailor, render the PDF, and write the cover letter and screening answers. All of it.


My whole search so far has cost under $2 in tokens. Hosted tools charge $15–75 a month.

OperationInput tokensOutput tokensCost
JD extraction~3k~1.5k~¼¢
Gap enrichment~7k~3k~½¢
Tailoring pass~11k~0.6k~¼¢
Cover letter + screening answers~8k~0.9k~¼¢
Career KB consolidation, per resume (one-time)~7k~1.5k~⅓¢
Capture → tailored resume → full apply package≈1.3¢

Priced against GPT-5.6 Luna at $0.20 per million input tokens and $1.20 per million output. Multiply it out yourself — that is the point of showing the split.

Choose your models

Two setups we measured. Both work well.

Any OpenAI-compatible model can be configured. These are simply the two we benchmarked on real postings with every call traced, one per API key, so you can start from a known-good setup instead of guessing. The Fast tier turned out to decide almost everything — how much of a posting gets extracted, how honest your base score is, and most of the waiting — while the Smart tier barely moved the result.

OpenAI

depth

about a penny

per application

Every tier set to

gpt-5.6-luna

The one key you need

One OpenAI key

JD requirements captured

The most complete extraction we measured

Capture + tailor feels like

~40 seconds

Hallucinated skills

none measured

Gemini

speed

under 3¢

Gemini promo pricing doubles Jan 2027

Every tier set to

gemini-3.7-flash

The one key you need

One Gemini key

JD requirements captured

About ¾ of that, strongest on named tools

Capture + tailor feels like

~10 seconds

Hallucinated skills

none measured


A fresh install ships with the OpenAI one already set, because honest scoring starts at extraction: a fast model that misses requirements inflates your fit score, in our tests by about nine points. Neither is a tier above the other, and switching is three dropdowns in Settings → Models. Mixing tiers across providers works too; it just bought us nothing these two don't already give you.

No key yet?

What runs with no key at all

Two honest tiers: the deterministic core always works, and over MCP your assistant supplies the model itself.

Works immediately, no key

Deterministic ATS scoring across every base resume

Gap diagnostics, health reports, full manual tailoring

The raw LaTeX and Typst editors, and PDF compilation

Application tracking and analytics

Degrades or defers cleanly

Career KB seeding defers and retries on a later boot

Automatic JD field extraction falls back to manual entry

Cover letters, Q&A, guided gap resolution and chat ask for a key first

Steps 3 & 4

Attach your assistant, and your browser

Both are optional, and both take about a minute.

MCP for your assistant

bash
./scripts/setup-mcp.sh

Claude Code · Registered automatically

Claude Desktop · Prints a block for claude_desktop_config.json

ChatGPT desktop / Codex CLI · Prints a block for ~/.codex/config.toml

Claude Desktop and the ChatGPT desktop app / Codex CLI get a ready-to-paste block instead, every path already filled in. Those two you paste yourself, because both config files are shared with your other MCP servers and the script won't edit them behind your back. Add --profile hunt for a scoped profile, or --print-only to change nothing and just see the config. Restart Claude Desktop with Cmd+Q after pasting. Closing the window isn't enough.

Or skip the pasting. Hand the --print-only output to Claude Code or the Codex CLI and ask it to merge the server into your config — it knows where those files live. The prompt to use

What agents can do with it

The browser extension

1

Open chrome://extensions

2

Turn on Developer mode

3

Load unpacked → the repo's extension/ folder

No ID to copy, nothing to configure. The extension pins its identity, so the backend already allowlists it out of the box.

Before you file a bug

Read the known issues first

This project is early and the repo says so plainly. KNOWN_ISSUES.md is the map: what is solid, what is rough, what is a deliberate limitation rather than a defect, and the specific gaps worth picking up. Several things in there look like bugs and are recorded decisions.

Contribution fast-path: docs fixes, resume and cover-letter templates, and extension job-board adapters go straight to PR — no issue needed. Features and architecture changes: open an issue first. Every PR gets a human first response within 48 hours.

Questions

Common ones, answered

Recommended, yes. The parts that make Maestro fastest day to day run on it: in-app tailoring, the extension's tailor-on-the-go and form filling, cover letters and screening answers, KB consolidation, chat. One key, OpenAI or Gemini, is a complete setup. Without one you still get the deterministic core, and if you drive it over MCP your assistant supplies the model.

About a penny per tailored application on the default profile, under 3¢ on the fast one. Measured with Langfuse on real postings at list prices. My whole search so far has cost under $2 in tokens. The software is Apache-2.0: no account, no subscription, no tier.

No. Three containers on your machine, bound to 127.0.0.1. The only outbound traffic goes to whichever LLM provider you configure, and your key goes to exactly that endpoint. It lives in your .env or your local database, and the API never echoes it back out.

You can point it at any OpenAI-compatible endpoint, including Ollama, LM Studio and vLLM. We won't claim it works, because we haven't validated a local model end to end. Long tailoring prompts, strict JSON and streaming tool calls are where small models struggle. The deterministic core never calls a model at all, so that half is genuinely offline today.

It's our score: deterministic, versioned, reproducible. It doesn't predict what an employer's ATS shows them, and no consumer tool can. One caveat worth knowing: recency is part of the score and it is measured against today, so the same document can score slightly differently months apart as its work ages. Everything else holds still. Use it to compare your own drafts and to catch parsing and coverage problems — chasing 100 gets you a keyword-stuffed resume that modern screens flag.

It carries an application to the point of submission and stops. Filling and submitting happen only inside a live agent session you're running, with consent recorded one turn before the click and a daily cap you set. Nothing is submitted from the web app, and a submit click that can't be verified ends there rather than being retried.

Yes, that's the point of the template layer. Start from a bundled LaTeX or Typst design, adapt one you found, or write your own in the editor. Validation compiles a sample PDF and runs a parse gate, so a design that would break an ATS parser never ships.

English resumes and job descriptions, with full support for accented Latin characters (Zürich, José, Nestlé, São Paulo). Non-Latin scripts are refused at ingest rather than scored misleadingly at zero coverage.

Early, and the repo says so. The fresh-clone compose boot especially. KNOWN_ISSUES.md lists what's solid, what's rough and what's a deliberate limitation: the tracker doesn't paginate server-side, scores aren't re-derived when a base resume changes, and autofill isn't first-try-clean on every ATS. If something breaks, a clear bug report is the most useful thing you can send.

It's early. I'd rather hear about it.

I built this because I needed it, and I use it every day. It also has the rough edges of software with one user, especially that first boot from a fresh clone. If something breaks, tell me. A clear bug report is a contribution and right now it's the most useful kind. Pull requests welcome too.

Ajey Dhayashanker Loganathan

Career tooling should be infrastructure, not a rental.

Clone it, run it, keep everything it produces. Nothing here was built to make leaving hard.

Apache-2.0 · no account · no subscription · your data stays on your disk