Repository navigation
Releases: seinun-ai/maestro-career-studio
Release list
v0.11.1
The Companion is going into the Chrome Web Store, and the store gives it an
extension ID of its own. Maestro only talks to the Companion IDs it knows, so
a store install would have opened to "Maestro is not reachable" with Maestro
running. This release teaches Maestro the store ID. The Companion you loaded
unpacked keeps working as it is.
Breaking changes
None.
Changed
- Maestro now also accepts the Chrome Web Store build of the Companion,
bppkeipififkepldkogmfpkkhoakgndl, next to the unpacked one,
pjmfonfapjdabkoicnelpflpjojdjgan. Each is one exact ID; any other
extension is still refused. If you setMAESTRO_CS_EXTENSION_IDSyourself,
that list replaces the default, so add the store ID to it to use the store
build. - The README leads with what your AI assistant can do with Maestro
(extract, maintain, hunt, apply), shows costs in dollars (about $0.01 an
application on the OpenAI default), and its hero animation uses the site's
Figtree captions.
v0.11.0
The Companion used to fill one page and wait for you to click through the rest. Turn on full
automation and the Job step now has an Apply button that takes one job through its whole
application in the tab you are on: it fills a page, clicks Next, fills the next, and stops on the
review page. Submit is still your click, at every setting. One job at a time for now, and a Queue
view for several is still ahead.
A job's page used to have five tabs, and finding out where a job stood meant opening them one by
one. Now it has four numbered steps, Job, Resume and gaps, Tailored resume and Apply,
and each one says in a line what is done and what comes next. The Jobs list does the same for every
row with a Next step column. Every job is scored the moment you save it, and a job holds one
application, so trying another resume replaces the draft instead of quietly starting a second one.
Less hunting, more applying.
Apply also signs in, or makes an account, on the application sites it knows, with the job-site
login you saved, and when a page does something it has no rule for, a stronger model takes one look
before the run gives up. When the confirmation shows after your Submit, the job is marked applied for
you. And the Companion's fill log is now off until you turn it on.
Breaking changes
PUT /api/settings/autofill-optionstakes{"answer_level": …}now. The old
{"low_stakes": …}body is refused with a 422. The Settings page and the Job Search Brief already
use the new field.- Veteran status is one Yes/No question now. Profile › Autofill asks "Are you a veteran?" with
Yes, No and "I don't wish to answer". Your old "Veteran" answer reads as Yes. The old "Not a
protected veteran" answer is gone: it was true of a veteran who is not protected, so it cannot
answer this question. It reads as unanswered, Profile asks you again, and until you do the
Companion leaves veteran questions on a form for you. A No answers every "I am not a protected
veteran" option. A Yes never picks a protected class for you. If your second copy has not been
updated, it reads a synced Yes or No as "I don't wish to answer", so update the always-on copy at
the same time as your laptop. - A job holds one application.
POST /api/applications/from-base(and MCPtailor_application,
which goes through it) and tailoring a gap analysis now reuse the job's newest application whatever
its base resume: the application takes the new base and draft, keeps its status, applied date,
notes, referral and answers, and its PDF is removed as stale. Neither creates a second application for
another base any more. A job that already holds two keeps both; the newest takes the new base. - The job header's Details menu is gone. Applied on, the tracking link, Referral, Notes and Delete
application are under Application details on the job page's Apply step.
Added
- Think when stuck: a stronger model looks before a run gives up. A run used to stop the moment a page did something it had no rule for.
A Next refused over a name no field carries, a question nobody saved an answer for, a page it did not recognise. Every live check found one
more, and every fix was one more rule. Now the Companion asks a model to look at the page once first. Submit is still your click.- When it runs. Before a run parks on page errors it could not map, open questions, an unknown page, no change after Next, a loop or a
tab on another site, with full automation On, Think when stuck On (Settings › AI & models › Form filling, default On) and Stop after each
step Off. Once per page, up to three rounds, about a minute. Never on a CAPTCHA, an email code, an account on a site it does not know, a
review page or a page that asks about submitting. - What it sees and does. A snapshot of the page with no answer in it: the questions, whether each is filled, the options, the buttons, the
errors. It picks one to three actions from a fixed list (fill, answer from a saved answer, write a short answer, choose an option, retry a field
another way, redo a field the run filled, close a popup, press Next, follow the application's tab, ask you). The Companion carries them out with the code
it already has and looks again. The model never types a value: what is written comes from your profile, history and resume under the same rules
as any answer. Work authorization, sponsorship, salary, EEO, background history, signatures, licences and any fact you never gave are left to you.
It never presses Submit and presses Next only on the button the page reader names. - What you see. A live line while it works ("Thinking: …"), one sentence if it sorted the page out ("Sorted it out: answered 2 questions and moved
on."), or the park card, which says what it asks of you or what it tried and how each attempt went ("It tried How Did You Hear About Us? a second way; it didn't
take."). What it wrote or chose is listed under Check before you submit as answered for you. - Reasoning model (Settings › AI & models). Any model in the list; unset, it is the strong model of your provider (Claude Sonnet 5.5, GPT-6.1 Sol), or
your smart model for other providers. Claude Haiku 5.5 and GPT-6 Luna are listed as cheaper choices. - Fill log. With the fill log on, each step is recorded as a run of its own: the model, time, its note, each action and outcome (a written answer as
its length) and the page snapshot it saw.scripts/eval_reason.pyreplays those snapshots against other models and prints the valid and ask-you rates,
latency, tokens and a cost estimate.scripts/fill_trace.py lastprints the rounds. - Backend.
POST /api/autofill/reason(the Companion's origin only; every reply is checked in code against the snapshot's ids, the protected list
and failed actions before the extension sees it). Settingsthink_when_stuck(GET/PUT /api/settings/companion-apply) andreasoning_model.
- When it runs. Before a run parks on page errors it could not map, open questions, an unknown page, no change after Next, a loop or a
- Apply on the Companion's Job step (needs full automation On). It saves the job, settles the
resume (it never replaces a tailored draft or an open tailoring session), queues the job as your
yes, then drives the tab from the job's apply link to the review page. It never clicks Submit and
it presses Next only when the button reads like Next. A page with any Submit wording, a dialog
asking about submitting, a CAPTCHA, an email code, an account on a site it does not know or a job
board's own apply button stops the run and the panel says why. You fix it in the page and press
Resume. - Add job beside Apply. On a job page you have not saved yet, the Job step shows Add job
next to Apply: it saves the job and scores your resumes, then stops on the ranked list without
tailoring, queueing or running anything. - Your answers are remembered. Whatever you type into a field while a run waits for you is saved
to your profile when you press Resume, with an Undo. A written answer that names the job's company
or city is kept for that job only: the same question at another job adds its own answer instead of
replacing it, and Settings has Use for every job to drop the limit. - Marked applied after your Submit. When the confirmation page shows, the panel marks the job
applied after 8 seconds unless you press Undo. This is recorded as the Companion seeing your
Submit, on its own consent channel (companion), and clicks nothing. It only believes a
confirmation on the application's own site, straight after its pages. Anywhere else, Mark
applied stays yours to press, and Done on the review card ends the run without marking it. - Sign-in with your saved job-site login, on known application sites only (Workday, Greenhouse,
Lever, Ashby, iCIMS and a few more), in the page's top frame. Anywhere else the run waits for you.
The password never reaches an AI model, a trace or a log, and a failed sign-in is never retried. - Screening answers, a three-level setting under Profile › Autofill that replaces
"Answer low-stakes questions for me": Careful, Balanced (the default) and
Confident. Work authorization, salary, demographic, criminal-history and clearance
questions, signatures and claims your history does not support are outside every level. Agents
read the level in the Job Search Brief (applying.answer_level). - A job remembers the employer's apply link (
apply_url) when you save it from a page that shows
one, and the run opens that link instead of the job board. - The form-filling agent has more to try. It never fills a hidden "leave this blank" trap field,
leaves optional fields it has no answer for empty and lists them, fills a list such as Skills one
item at a time and checks each one landed, can search with a word of its own, gets a short
technique note for each kind of widget, and waits for a page to stop redrawing before it types. - It learns from your fix. When you fix a field by hand while a run waits, the Companion notes
which gestures you used (never what you typed) and tries them first on that site next time. With
Keep a fill log on, fields it could not work join a private, value-free list that ranks what to
teach it next. Clear data removes that list too. - Two new switches for Apply, under Settings › AI & models › Form filling. Choose the base
resume for me (on by default) lets Apply pick the resume only when one clearly wins: its match
score reaches Auto-apply's floor and leads the next by Auto-apply's margin. If it is close, Apply
stops and asks. Off, nothing is picked until you pick. Stop after each step (off by default)
turns Apply into three presses, Save job, Tailor resume (or Make PDF) and Start
filling, and your yes to queueing the job moves to the last one. - **A live checklist while Apply gets ready...
v0.10.1
Updating to 0.10.0 could leave the web app showing pages from the version you
just left: no styles, and a banner saying the update hadn't finished. This
release clears that leftover cache every time Maestro starts.
Breaking changes
None.
Fixed
- After
maestro update, the web app no longer serves the previous version's
pages. Next.js keeps a page cache inside the installed app, and an update left
the old one behind, so pages pointed at scripts and a stylesheet that no longer
existed.maestro runnow clears that cache before the web app starts, so
updating to 0.10.1 also repairs a 0.10.0 install that shows an unstyled page. - A page opened before an update now says so. The banner reads "Maestro CS
was updated. Reload this page to use the new version." with a Reload button,
instead of saying the update didn't finish. Any other version mismatch still
points at How to update.
v0.10.0
Until now Maestro spoke two AI dialects, OpenAI and Gemini, so a Claude key
could only watch from the side. This release adds Claude, talking to Anthropic
directly, and OpenRouter, with zero data retention switched on for you. A Claude
key alone now runs the whole app, the Assistant included. Your chats are saved in
a format that belongs to no single provider, so you can change models halfway
through a conversation and it still remembers what was said.
Two smaller things you will notice. Every finished resume now also lands in your
Documents folder, one folder per job, so there is no more digging through a data
folder to find it. And the Companion has a new look, one clear next step at a
time, and it no longer drops dropdowns when its tab is in the background.
Breaking changes
- A built-in Gemini model now always goes to Google, even with a Custom AI
server set. Before, the Assistant sent a role set togemini-3.5-flash-lite
orgemini-3.7-flashto the custom server; now it uses your Gemini key, or
says that no Gemini key is set. With a custom server and a Gemini key, any
gemini-*Assistant model also goes to Google. If you serve a local model
under one of those names, give it an id that is not in the built-in list
(for examplegemini-local): ids Maestro does not list still go to your
server.
Added
- A resumes folder in your Documents. Your finished resume used to sit in a data
folder you had to dig for, so now every resume PDF, and every cover letter PDF, also
lands in your Documents folder, one folder per job. The copy happens after each render
and after a job arrives from your second copy, and every start copies the resume PDFs
you already have, with their cover letters, skipping the ones already there. Folders are namedCompany – Job title (date)under
Documents/Maestro Career Studio/Applicationsand keep their name if you edit the
title later. Maestro only writes there: it never reads a copy back or deletes anything,
a re-render replaces the file with the same name, and a copy you delete or rename
stays that way until that resume changes or you click Show in Finder. Show in Finder (Show in File
Explorer on Windows) on the PDF card and in the tailored-resume studio opens the folder, and
Settings › Tailoring › Resumes folder switches it off, picks another folder (Choose…
opens your system's folder dialog) and shows the last problem. It is on with the
maestrocommand, and not on the Docker route or on the second copy that stays on.
MCPrender_pdfon an application now returnscopy_path. - Claude as an AI provider. Add a Claude API key in Settings › AI & models
(orANTHROPIC_API_KEYin.env/maestro.env). Claude Haiku 5.5, Sonnet 5.5
and Opus 5.5 are listed in the model pickers, and Find Claude models lists
the rest; no role switches to Claude on its own. Calls go to Anthropic's own API
through the officialanthropicSDK, not its OpenAI-compatible endpoint. The
Assistant caches its long system prompt and tool list between turns, and when a
Claude safety check declines a request on Opus 5.5 or Sonnet 5.5, Anthropic
retries it on another Claude model. - OpenRouter as an AI provider. Add an OpenRouter key in Settings › AI &
models (orOPENROUTER_API_KEY). Every request asks OpenRouter to use only
providers that keep no data and collect none, and this cannot be turned off.
Find OpenRouter models lists only models with such a provider. OpenRouter
itself may keep what you send; PRIVACY.md says what goes where. - Switch providers mid-conversation. Assistant messages are saved in a
provider-neutral form. A chat started on one provider continues on another,
and each provider's private reasoning data is sent back only to that provider. - Settings › AI & models warns when a role's model belongs to a provider with no
key saved ("Fast model uses OpenAI, but no OpenAI key is saved"). - Key checks for Claude (
sk-ant-) and OpenRouter (sk-or-) keys, and a warning
when a Claude or OpenRouter key is pasted into the OpenAI field. backend/scripts/live_provider_check.py, a manual check that runs the app's
own one-shot, tool-calling and provider-switch paths against real keys.
Changed
- The Companion has a new look. A progress bar shows where you are in the
four steps, the step you're on is one "Next" card, finished steps shrink to a
line with a tick, and Refresh and Open are icon buttons. Nothing it does has
changed. - The Companion fills forms in background tabs. A tab you switch away from,
or a window covered by another app, used to slow every field down and drop
dropdowns. Chrome slows timers in hidden tabs, and the fill now waits in a way
Chrome doesn't slow. - Gemini in the Assistant uses Gemini's own API instead of Google's
OpenAI-compatible endpoint, and keeps Gemini 3's thought signatures between
tool calls. - The pinned resume and selections for an Assistant message are saved with that
message instead of being rebuilt on every later turn. - The setup checklist's AI key step, and the Career KB's first-start seeding,
count a key for any of the four providers or a Custom AI server. - Test next to a model runs the same streaming, tool-calling request the
Assistant makes, for every provider. - New dependency:
anthropic(1.13 or later, which bringshttpx2). The Docker
lock also gainspsutil, which 0.9.0 added to the package but not the lock. maestro.env,.env.exampleanddocker-compose.ymllistANTHROPIC_API_KEY
andOPENROUTER_API_KEY. Like the other keys, a key saved in the app wins over
one from the environment.- A database migration adds
parts,providerandmodeltochat_messages
and fillspartsfrom every existing message when the backend starts. The old
tool_callsandtool_call_idcolumns stay for one more release.
Fixed
- GPT-5.4, GPT-5.5 and GPT-6 models (including
openai/…ids on OpenRouter) can
call tools in the Assistant: Maestro now sendsreasoning_effort: "none"for
them, which OpenAI requires on Chat Completions. Before, only GPT-5.6 got it. - Gemini 3 Assistant turns that need two tool steps in a row no longer lose the
thought signature Google requires on the second request. - A Claude account with no API credit reads "your account is out of credit"
instead of "The AI model didn't answer (error 400)", and the model test does
not record it as a failed model.
v0.9.0
This release is about getting Maestro out of its box. AI agents now reach it by
URL instead of reaching into a container, and the whole app installs with two
commands and no Docker at all. If you already run the Docker version,
maestro import-docker brings your data across in one go.
Breaking changes
- Claude Code and Codex plugins now connect to
http://localhost:8001/mcp
instead of runningdocker exec. They need v0.9.0 images: earlier images
have no/mcpendpoint. If you changedBACKEND_HOST_PORT, use Settings ›
Connected agents › Connect an agent app instead of the plugin. - Pre-rename environment variables are now ignored silently:
CAREER_STUDIO_EXTENSION_IDS,CAREER_STUDIO_MCP_PROFILE,
CAREER_STUDIO_MCP_CLIENT,CAREER_STUDIO_PDF_DIR,
CAREER_STUDIO_UPLOAD_DIRandRESUME_TAILOR_PDF_DIR.
Use theMAESTRO_CS_*names. Leaving these set without their replacements
means an unpacked Companion id loses API write access, the MCP profile falls back
tofull, and PDFs/uploads go to the default folders. - Nothing in the uv install work needs an action from a Docker install. The
Docker images,docker-compose.yml,.env, ports andscripts/update.shwork as
before (the Changed list below says what moved inside the images).
Added
- Career history imports PowerPoint decks (.pptx), including speaker notes.
maestro import-docker CHECKOUTmoves a Docker install's data into the uv
install, once: the database (with stored file locations rewritten), resumes,
applications, knowledge-base files, settings, the sync key and the settings in
its.envthat Maestro understands. It reads the Docker folder and changes
nothing in it, saves a snapshot of the uv database first, and puts back the
database, sync key, settings andmaestro.envif anything fails.--dry-runshows the plan. Seedocs/UPDATING.md.- A Docker-free install with uv, and the
maestrocommand.
uv tool install --python 3.12 maestro-career-studioinstalls Maestro (published
to PyPI on every release tag, with the web app and Node inside the package) on
macOS, Linux and Windows x64.maestro start,stop,restart,status,
logs,open,update,backup,migrate,check,autostart on|off|status,
connectandmcprun it from one per-user folder with one settings file,
maestro.env.maestro updatesaves a verified snapshot of your data before it
changes anything and prints the changelog's breaking changes first. See the
README,docs/GETTING_STARTED.mdanddocs/UPDATING.md. maestro connectadds Maestro to Claude Desktop (waiting until you quit it,
because it rewrites its settings while running), Claude Code, Codex, Cursor and
VS Code.maestro mcpis the stdio bridge it points Claude Desktop at; on a uv
install the connect card's Claude Desktop row shows the command instead of the
bundle download.- CI builds the wheel, installs it with uv on macOS, Ubuntu and Windows, smoke-tests
it, and upgrade-tests one version to the next (docs/RELEASING.mdhas the
one-time PyPI setup). - HTTP MCP inside the backend at
/mcp, withfull,hunt,apply,
explore,templatesandcareertool profiles on the same port and
Host/Origin boundary as REST. - Connect an agent app on Settings › Connected agents: choose a Tool set,
copy a command or URL, open a client install link or download the Claude Desktop bundle. - Companion options page to set the backend and app addresses and test the connection.
- Copy setup prompt on Settings › Connected agents › Second copy, and a
guide for running an always-on bot (docs/always-on-bot.md). The button
copies a setup prompt for a fresh always-on copy. It fills in the laptop's
published address and the version this backend is running, and it never
includes the sync key or a pairing code. start.sh --unpauseclears a maintenance pause and exits without
starting the backend, so the watchdog can start Maestro.sync.shexits 3
when a round is still running after its wait; check later with
sync.sh --now.
Changed
- The app calls its score the match score (it was labelled ATS score).
- README rewritten: shorter top screen, the uv install leads the Quickstart; the manual moved to
docs/USING_MAESTRO.mdanddocs/SETUP_REFERENCE.md. - The backend's Python distribution is renamed
maestro-career-studio-backend
tomaestro-career-studio(it is the PyPI name). The setup scripts uninstall the
old name; nothing to do.pyproject.tomlis also the PyPI version. - The frontend image runs
node server.jsfrom Next's standalone output
instead ofnext start, with image optimization off (nothing uses it) and no
sharp.npm startdoes the same outside Docker. Same ports, same behavior. - Any venv that installs the backend now also pulls Node 24 through
nodejs-wheel-binaries(about 200 MB installed): the native always-on scripts,
the stdio MCP server, andpip install -e backendfor development. /health/memoryand the sync file reads work on Windows. On Windows, a sync file
read no longer refuses a symlink at open (there is noO_NOFOLLOW); the
regular-file check and the packer's symlink check still apply.- The Claude Code command on the connect card and in the docs is
claude mcp add --scope user …, so Maestro shows up in every folder, not only
the one you ran it in. PRIVACY.mdnames the scoring model's first download (Hugging Face) and the
maestrocommand's PyPI and changelog requests; both are only made when you run
them or on first start. Contributors: CI installs now also download
nodejs-wheel-binaries(about 60 MB);requirements.lockleaves it out.- The Claude Desktop
.mcpbbundle is a Node stdio-to-HTTP bridge.
Reinstall it if you used the older Docker-based bundle. Claude needs no
Docker or Python on its side; the bundle supports macOS, Windows and Linux.
Claude Code and Codex plugins connect by URL. mcpis now a core dependency. The[mcp]extra remains as an empty
compatibility alias for existing install commands.- The Codex plugin asks before consequential tools, including consent,
submission, login and upload hand-offs, restores, health-gate waivers,
KB approval and sync, in addition to Maestro's own consent gates. - Langfuse tracing is an optional
tracingextra. Docker and native installs still
include it; a source/dev install gets it withpip install -e ".[tracing]"from
backend/. - Backend image copies files with the app user's ownership and excludes tests
and every backend script exceptscripts/sync_key.py, the Docker sync-key
tool; dev tools (pytest, ruff) are no longer installed in it. mako moves off
the yanked 1.4.0 to 1.4.3, and the image shrinks from about 1.88 GB to 1.72 GB. - The web build ships only the Monaco editor files the JSON and LaTeX editors
load, cuttingfrontend/public/monacofrom about 25 MB to 11 MB.
Deprecated
scripts/setup-mcp.shand the host stdio venv remain for one release and
are removed in v0.10.0. Existingmaestro-career-studio-mcpconnections keep
working as a compatibility fallback.
Security
- Typst renders can no longer download packages, including through a computed import path. LaTeX compiles each run in its own temporary folder, so a template cannot read or overwrite another resume's source.
Fixed
- PyPI wheels include the project license and notices; untouched Classic templates receive the complete attribution header on upgrade.
- Bundled resume templates carry complete MIT attribution, including Harshibar;
third-party notices list all six seeded designs and both cover-letter sources. - The glossary and package description use match score; the social preview restores Inter Medium.
- First starts without TeX render the demo resume with Typst; a failed seed render shows its reason.
- Windows child processes keep the system environment needed for networking, including backup and update commands.
- Failed startup base-resume renders and artifact file deletions log warnings
with tracebacks; missing files and folder-pruning failures stay quiet. - Prompt reads that open their own session use the file default without writing
when no saved prompt exists, avoiding a SQLite lock wait behind another
transaction. Startup seeding and caller-supplied sessions still seed defaults.
Removed
- Companion dead code: the orphan-key sweep, the legacy
eeoAutofillEnabled
setting and unused exports;shared/guided-run.jsno longer loads into every
page's content scripts (only the panel uses it). - Word text extraction uses the standard library, removing python-docx and its
sole lxml dependency while preserving paragraph and table text output. - Four API routes with no caller outside tests:
POST /api/resume-lint/wording/reset,
GET /api/kb/extra-section-presets,GET /api/resume-versions/{kind}/{key}/{number}/diff,
andPOST /api/kb/consolidate. Word-bank reset still saves throughPUT /wording;
the preset catalog, version-detail diffs, and onboarding import remain available. - The
/exploreredirect (Analytics has lived at/analyticssince July).
v0.8.0
Breaking changes
- None that need an action from you. Read these before updating:
- Five migrations run at startup. They only add tables and columns
(filled answers, agent runs, the autofill run trace, the always-on-copy
fields, a resume's target), so your data is untouched.scripts/update.sh
snapshots the database first. - No
.envchanges.docker-compose.ymlforwards one optional new
variable,SYNC_PUBLIC_HOST, only for a published sync address. - The backend image runs uvicorn with
--no-server-header --ws none.
Nothing relied on either: the app has no WebSocket routes. - The agent skills moved from
docs/skills/<name>/to
backend/app/automations/skills/<name>/(docs/skills/is now an index).
The app and any skill you already copied into your agent are unaffected. A
link or agent instruction that names the old folder now gets a 404; point
it at the new one or copy the prompt from the Automations page.
- Five migrations run at startup. They only add tables and columns
Added
-
Run Maestro without Docker on a small always-on Linux machine. Four
commands (setup,start,stop,health) install and run the backend
from one folder, with one loopback worker. No web app there: a connected
agent starts the MCP server on demand. Seedocs/native-install.md. -
A second, always-on copy of Maestro that keeps working while your laptop
is off. Your laptop keeps your profile; each job has one owner, so nothing
merges. Job cards show With your bot, On your laptop or Going to
your bot, with Keep it here and Work on it here. A queue, skip,
status or note change on the other copy's job waits as Sent at the next
sync. With full automation on, a job you queue on the laptop is offered to
the always-on copy. It stays off until a sync key file exists; without one
nothing changes. Pairing is a one-time code. Every sync message is sealed
(protocol 2) and can travel over HTTPS through Tailscale Funnel or an SSH
tunnel. The key never travels, and anything that is not sealed gets the same
empty 404 as when sync is off, even on the published name. The MCP toolsync_nowruns a round, and
sync.shruns one from cron. The always-on copy holds a read-only copy of
your profile, including the AI key and the job-site login. See
docs/sync-setup.md. -
/health/memoryreports how much memory the backend is using now and at
its peak, so you can watch a small machine.health.shprints it too. -
Lighter ATS scoring on small machines. Set
EMBEDDINGS_OUT_OF_PROCESS=1
and each score loads its language model in a short-lived helper, one at a
time, instead of keeping it in the backend. Scores are the same; backend
memory after scoring drops from about 410 MB to about 170 MB, and each score
takes under a second longer. The nativestartcommand turns it on; the
Docker install keeps it off. -
Full automation, Off by default in Settings › Connected agents: your
agent can submit queued jobs whose final review is clean without asking
each time. The daily limit and Companies to skip still apply; anything to
check goes to Needs you. On the Automations page, Apply automatically
replaces the attended Apply prompt while the switch is On. Order, batching
and timing stay between you and your agent. -
Job-site login: save an email and a password used only for job-site
accounts. They stay in a private local file; Settings shows only whether a
password is saved. A connected agent can fetch them for a queued or approved
job while full automation is On. Each hand-off is recorded without the value;
the login passes through your agent's AI provider. -
The Agent inbox dashboard: readiness marks on open rows, an arrivals strip
and Recent runs with each automation's counts, digest and job links. Queued
jobs ready to apply sort first. Automations cards show Last ran. New MCP
toolrecord_runkeeps the latest 200 run reports. -
The Automations page: copy a prompt into Claude Desktop, Codex or any MCP
agent, which asks when to run and then does the job with Maestro. New
mail-status,referral-pagesandtailor-runskills joinjob-hunt,
apply-sessionandcustomize-job-skills; the skills now live in
backend/app/automations/skills/(docs/skills/is their index). -
Autofill keeps a private record of how it decided each field (which answer it
chose, demographic questions included, how sure it was, what the page did),
for diagnosing and tuning it. It holds no typed answer or profile text, stays
on your machine, keeps your last 50 runs, turns off with the same opt-out as
field telemetry, and goes when you press Clear data. -
What was submitted: the job page keeps a record of every answer the
Companion or a connected agent filled into the application form, page by page,
with a small pill saying where each came from (Profile, Resume, Custom,
Written, Inferred, You, Upload). Answers worth a second look (a screening
question answered by a guess, every option ticked, an answer unlike your
profile, a voluntary question with nothing saved) are flagged before you
submit, in the Companion's new Check before you submit group and in the
agent's final review, and the tab shows them with their reason. Diversity
answers are kept only with your consent, are cleared when you withdraw it,
and are never sent to an agent. New MCP toolrecord_filled_answers. -
The knock-out check on a job also compares an on-site or hybrid office with
where you live and whether you would relocate, and the Companion shows its
verdict above the form before you fill. -
A target for each base resume: the countries it may be sent to, a
company and a short focus, set in its Target dialog and shown as pills on
its card. A resume set for other countries is not scored or recommended for
a job elsewhere and is never ready to send; full automation checks it too.
Tailoring reads the target. A resume with no countries has no limit. -
Five new MCP tools:
set_base_resume_identity(a resume's target),
sync_now,record_filled_answers,record_runandget_job_site_login
(full automation only).score_atsnames the bases it skipped for country. -
Pause the always-on copy's watchdog while you work on it:
stop.sh
leaves a pause the cron watchdog respects,start.shresumes and
health.shsays when it is paused.
Changed
- A new look across the web app, from one design system: one tab style,
filled stat cards, shadows only on what floats, and filter chips with counts. - One icon for each idea, and meters that say what they mean. The same
glyph marks the same thing everywhere, in the Companion too, with no emoji
as icons. Scores, readiness and progress are small bars and dots with their
words beside them, never colour alone. - Where you stand, at a glance. The job header shows its best score; Jobs
shows each job's score, a status dot and a needs-you strip; score cards mark
the weakest score and show a shared warning once; the knock-out check is
quiet when it passes and loud on a conflict. Analytics adds a status mix and
a 28-day trend, and compare shows what a tailor gained or lost. - Actions answer you. Slow buttons spin, a status change turns the chip at
once, saves say Saved and copies say Copied. Inbox actions toast and the row
slides out. Approving a draft bullet and archiving a resume offer Undo.
Email, phone and link fields warn before you leave them. - The Companion panel uses the web app's status words and colours, with
icons in place of text symbols. - Jobs
job-huntsaves are marked as found by an agent and keep the job's
link. They wait in the Agent inbox alongside jobs from referral pages, and
later hunts recognize jobs already saved. - Agents record each form page's answers instead of attaching a screenshot of
every page; the final-review screenshot stays. In full automation, the agent
records what confirmed submission and a submission screenshot is optional.
Fixed
-
Agent inbox History says Applied yourself for jobs you applied to, with
the Applied badge, counts and filter grouping; their stored status is unchanged. -
A page of screening questions with nothing else on it (iCIMS's Candidate
Questions step: age, work authorization, sponsorship) is recognised as an
application form, so Autofill is offered there and can fill it. -
The later steps of a multi-step application (iCIMS's EEO and questions
pages, any wizard's short steps) no longer say "No application form here".
Once a form is confirmed on a site in a tab, a later page there with a field
to fill counts as the form for the next hour, and the employer's own embedded
form frame on that site accepts the fill. On the next step after a fill, the
Fill step opens by itself with Autofill. -
Autofill answers more of iCIMS's later steps:
- a veteran self-identification asked in a paragraph ("please indicate by
checking the appropriate box below"); - a follow-up box such as "If applicable, please provide info." (it now
reads the question it follows); - "Are you able to work on-site at our … location?", from your relocation
answer; - with Agreements on, a "Signature" box that signs the form.
A "please specify referral name" box no longer takes your how-heard answer.
- a veteran self-identification asked in a paragraph ("please indicate by
-
The backend starts when
NO_PROXYholds a bracketed IPv6 address, as a
default on some Linux VMs. The entry is repaired at startup, so the AI
provider and the first language-model download work too. -
The Score and tailor tab scores a job on first visit even when all it
shows is a tailored row or a base hidden for another country. -
A native health check during a launch no longer deletes the pid file.
-
Tighter responses on the published sync name. uvicorn no longer sends a
server:header and refuses WebSocket up...
v0.7.1
Breaking changes
- None. No migrations and no
.envchanges. MCP list tools return fewer rows
by default (see Changed); every one of them still takeslimitandoffset.
Added
- A listing on the official MCP Registry.
server.jsondescribes the
server asio.github.seinun-ai/maestro-career-studio, and the Claude Desktop
extension is attached to each GitHub Release so the registry, and the
directories that copy from it, can point at a checked download. - A privacy policy.
PRIVACY.mdsays what the app stores,
every place your data can go (the AI provider you configure, optional
Langfuse tracing, the assistant you connect over MCP), and how to delete it.
The README, the Claude plugin and the Claude Desktop extension link to it. - The Claude plugin has its own README and license, with example prompts,
what it runs and what it sends. The Claude Desktop extension gains an icon. - Every MCP tool has a title and read-only / destructive hints, so Claude
can show a readable name and ask before a tool changes your data.
Changed
- MCP tool descriptions say what a tool does instead of telling the agent
what to do, and thenexthints after a tool describe the available next
steps. Consent still works the same: approving points, consenting to an
application and marking it submitted record your own decision. - MCP lists return less at once.
list_jobsreturns 50 rows by default,
kb_list_points50 (at most 100, without the per-resume usage history),
list_proposals20 (newlimit/offset), andexport_jobs10 (new
limit/offset, without the raw posting text).list_tailoring_sessions
returns a summary per session;get_tailoring_sessionhas the detail. - MCP errors are shorter and readable, a timeout on a write says the write
may still have finished, and capturing career notes gets the same long wait
as other AI calls. - Next.js telemetry is off in the images built from this release.
- The plugin and extension descriptions no longer say a local model keeps
everything on your machine. Local models can be configured but are
untested (KNOWN_ISSUES.md), so the descriptions now say
only that AI features use the provider you configure.
Fixed
attach_evidence_filefinds screenshots saved on your computer when the
MCP server runs inside Docker (the Claude plugin and Desktop extension).- A tool whose change was saved no longer reports an error when only its
follow-up hint could not be loaded. - Hints no longer suggest tools the active tool profile does not have.
v0.7.0
Breaking changes
- Four migrations run by themselves at startup. One stores health-check
results with the rubric that judged them, and a table for your disputes.
Two refresh the built-in tailoring prompts (tailoring rules, gap
tailoring and the Assistant's instructions) and the built-in health-check
prompts. A built-in prompt moves to the new default only if you never
edited it; one you changed in Settings › AI & models › Prompts is left
as it is. The fourth clears saved health-check results for bullets the
check marked down by mistake, so the next health check reads those
bullets again; a rating you set by hand is kept. - Agree again to let the Companion fill agreements and signatures. The
permission now covers more (see Changed), so a yes given before this
release is off until you give it again. Profile › Autofill says so beside
the switch: "This now covers more than when you agreed. Turn it on again
to allow it." Your diversity consent is unchanged. - API routes and MCP tools: none removed or renamed. The health report gains
next_gradeand a question on each finding, andget_autofill_profile
gainslanguages.
Added
- A new Fill in the Companion. "Saved answers + AI" now works a form the
way you would, Workday-style dropdowns, searches and checkboxes included,
and counts a field filled only once it has checked what the page actually
kept. When it finishes it lists what it filled, the closest matches it
picked, what it answered for you and what still needs your answer; select
a row to jump to that field. Stop ends a run at any time. "Saved answers
only" still runs the earlier fill. - Autofill also attaches your resume when the page has an empty resume
upload box. It never replaces a file already there and never uses a
cover-letter or other document box. Attach resume is still there for
those. - Answers come from your saved answers. With a Jev key saved and Jev
chosen in Settings › AI & models › Form filling, Jev picks first and your
fast model decides where Jev is unsure.
Without Jev, your fast model does it all. - Yes/No questions worded in reverse are read correctly, such as "I do
not require sponsorship". Fill first works out whether the question asks
the same thing as your answer or the opposite, and leaves the field to you
when it can't tell. "Now or in the future" sponsorship questions are
answered from both of your sponsorship answers. - Fill adds entries for the jobs, schools, languages and websites your
profile holds, using the section's own Add button, and fills each one. - Fill remembers which clicks worked for each kind of box, so the next
form with the same widgets goes faster. No labels, values or page
addresses are kept. "Forget learned widget moves" in the Fill step clears
it. - Answer low-stakes questions for me (Profile › Autofill, off by
default): questions none of your answers covers and whose answer barely
matters, like willingness to travel or a preferred contact method, are
answered in the job's favor. Never work authorization, sponsorship,
diversity questions, salary, background checks or signatures. - Languages in Profile › Autofill: reading, speaking and writing levels
(Basic, Intermediate, Fluent), plus separate Native and Fluent answers.
The Companion adds a language to a form only when all three levels are
set. - Health check v3.
- Each bullet gets its own question, a number only where one fits the
work, always with a way to answer without one. A result stated clearly
in words now earns full credit. - "Start the questions" opens a question pass: every question on one page,
answered all at once or row by row, saved to the resume as one change
you can undo. - Not right? on a finding tells the check why it's wrong, and it reads
that bullet again with your note. A level never rises without words from
the bullet itself, and "no number exists" is remembered for that text. - A wording checklist flags spelling and grammar slips, clichés and filler
words, with Apply or Remove where the fix reads cleanly. The cliché and
filler lists, and a Never flag list, are yours to edit. - A summary band on top: the grade, the points to the next one, and "No
numbers anywhere" when no bullet has a number (a note, not a penalty).
Findings sit under tabs by what they need.
- Each bullet gets its own question, a number only where one fits the
- Windows, through Docker Desktop's WSL 2 engine: install, update and
the Claude extension work with the clone in your WSL home
(On Windows: use WSL). - Drag to reorder bullets, sections and section order in the resume
editor, by mouse or keyboard. Each bullet's ⋯ menu has Move to top, Move
up, Move down and Delete.
Changed
- The Companion panel has four steps: Job, Resume, Fill, Track. Save job
also scores your base resumes and picks the best match, in the same press. - A shorter Resume step: use your base resume or tailor to this job. An
application whose resume has no PDF yet gets Create PDF. - Refresh in the panel reads this page's job and applications again, so
a PDF you made in Maestro CS shows up. What you typed and the Fill report
stay. - The panel's fill button is now Autofill, and the note under the panel
sits on its own line instead of under the buttons. - Letting the Companion fill agreements and signatures now covers every
field, including signatures, initials, typed-name attestations and
salary history. It still never moves to the next page and never submits. - Tailoring writes bullets by the health check's rule: a concrete result,
with a number only where you gave one, not a number in every line. - Health checks judge each bullet again under the new rubric the next time
they run, so a score or grade can move. - Score and tailor: each card has one button, Analyze gaps; Restart gap
analysis and Mark applied without tailoring are in the card's ⋯ menu. - Career opens on your history: Quick capture rests as one line, and each
profile section (Contact, Summary, Skills, Notes for the AI) has its own
Edit.
Fixed
- The panel no longer asks you to tailor again when you come back to a job
whose tailored resume is ready. - Long steps in the panel scroll instead of being cut off.
- Fill no longer types your phone number into a phone extension box, or your
street address into a second address line. - Workday application steps are recognized as forms, so Fill is offered on
them. - An application form embedded from another site (such as a Greenhouse form
inside a company's careers page) is found, so Autofill is offered for it,
including when the form only appears after you select Apply. - Forms whose labels aren't linked to their fields (such as Gem's) are read:
the Companion takes the short label just before a field, and groups Yes/No
buttons that belong to one question. - A resume upload counts as attached when the page lists the file, even on
pages that clear the upload box (Workday), and never when the page refused
it. - On Workday, Attach resume is offered on the step with the resume upload
box, not one step later. - The "I currently work here" box is ticked for your current job on Workday.
- Fill no longer adds an empty second website entry.
- Military status is answered from your veteran answer.
- With Agreements on, terms and consent boxes are ticked.
- The Companion reads a job description shown inside an embedded frame
(iCIMS), and no longer saves a blank job when it can't read one. - An application form inside the page's own embedded frame (iCIMS) is found,
so Autofill is offered. - Dropdowns showing "Make a Selection" (iCIMS) are treated as empty and filled.
- Month, Day and Year boxes get only their own part, and a current job never
gets an end date.
Security
- Dependency bumps for published advisories: PyJWT 2.15.1 and urllib3 2.8.0
(backend); brace-expansion, DOMPurify and ip-address (frontend lockfile).
v0.6.0
Breaking changes
- None. The one migration adds a column and runs by itself at startup;
MCP tools and API routes are unchanged.
Added
- Agent inbox. Jobs an agent proposes live on their own page with their own
words, and every proposal says who filed it: "Proposed by " or
"Queued by you". A new migration records the filer and marks the jobs you
queued from the web app before this release as yours. - Settings and Profile are split into tabs you can link to directly; unsaved
edits still warn before you leave, across tabs too. - Gender options. Profile › Autofill adds Non-binary and Prefer to
self-describe (with a box for your own words) beside Male, Female and
Decline to answer. With diversity consent on, the Companion picks the form's
matching option ("Non-binary", "Nonbinary", "I prefer to self-describe"…)
and types your words only into a box that asks for them; a form without
the option is left for you. Answers you already saved keep working.
Changed
- Plain words everywhere: one name per thing across the web app, the
Companion extension and the server's error messages, which now say what
happened and what to do next instead of showing technical detail. - Long lists keep their toolbar (and, where the table fits, its header) in view
while you scroll, and say so when a list is cut off at 500 rows. - Applications is now Jobs, since the page lists your saved jobs as well
as your applications, and its filter reads Tracked · Yours · Agents.
Tracked (formerly All) shows the same jobs as before: agent-found jobs
nobody has proposed or applied to are under Agents. Links and bookmarks to
/applicationskeep working. Analytics keeps All, which there means every
application. - "Which model should I pick?" (Settings › AI & models) compares the two
models in words and links OpenAI's and Google's own pricing pages, instead
of quoting prices that go out of date. - The "restrictive covenant" question in Profile › Autofill now says what one
is: "Such as a non-compete or non-solicit agreement."
Fixed
- Privacy: when autofill asks the AI how to fill a field, your diversity
answers (race, gender, veteran and disability status) are sent only if
diversity consent is on. Before, they reached the AI provider even with it
off. - Pressing Queue twice quickly no longer creates two proposals for the same job.
v0.5.0
On v0.3.0 or older? Update to v0.4.0 first — it is the release that moves your data out of Postgres.
./scripts/update.shnow detects this and prints the steps; see Coming from v0.3.0 or older.
Breaking changes
- Postgres is gone. The compose file no longer has a
postgresservice or
pgdatavolume, and the backend no longer imports a Postgres database —
v0.4.0 was the release that did that. On v0.3.0 or older? Update to v0.4.0
first;./scripts/update.shnow spots an old Postgres volume that was never
imported, stops before changing anything, and prints the steps
(docs/UPDATING.md). If an
older copy of the script already moved you past v0.4.0 and the app came up
empty, your data is still in the old volume and the same steps recover it. LEGACY_DATABASE_URL,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DB
andPOSTGRES_HOST_PORTare no longer read; leaving them in.envis
harmless. Thelegacy-postgresextra andpython -m app.tools.migrate_from_postgresare removed.
Changed
- A fresh install downloads and runs two containers instead of three: no
Postgres image (about 170 MB to download, 660 MB on disk), no idle container,
no port 55432, no wait at first start. - After an update,
update.shsuggests removing the old Postgres volume and
thepostgres:16image when they are still on disk;docs/UPDATING.mdhas a
new "Freeing disk space" section.
Fixed
update.shno longer stops in git's pager (:) while listing the commits it
brought in, which hid the extension and MCP reminders printed after it.