Skip to content

Releases: seinun-ai/maestro-career-studio

v0.11.1

Choose a tag to compare

@AjeyDS AjeyDS released this 17 Oct 01:07

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 set MAESTRO_CS_EXTENSION_IDS yourself,
    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

Choose a tag to compare

@AjeyDS AjeyDS released this 16 Oct 16:49

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-options takes {"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 MCP tailor_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.py replays those snapshots against other models and prints the valid and ask-you rates,
      latency, tokens and a cost estimate. scripts/fill_trace.py last prints 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). Settings think_when_stuck (GET/PUT /api/settings/companion-apply) and reasoning_model.
  • 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...
Read more

v0.10.1

Choose a tag to compare

@AjeyDS AjeyDS released this 12 Oct 07:40

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 run now 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

Choose a tag to compare

@AjeyDS AjeyDS released this 12 Oct 06:51

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 to gemini-3.5-flash-lite
    or gemini-3.7-flash to 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 example gemini-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 named Company – Job title (date) under
    Documents/Maestro Career Studio/Applications and 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
    maestro command, and not on the Docker route or on the second copy that stays on.
    MCP render_pdf on an application now returns copy_path.
  • Claude as an AI provider. Add a Claude API key in Settings › AI & models
    (or ANTHROPIC_API_KEY in .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 official anthropic SDK, 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 (or OPENROUTER_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 brings httpx2). The Docker
    lock also gains psutil, which 0.9.0 added to the package but not the lock.
  • maestro.env, .env.example and docker-compose.yml list ANTHROPIC_API_KEY
    and OPENROUTER_API_KEY. Like the other keys, a key saved in the app wins over
    one from the environment.
  • A database migration adds parts, provider and model to chat_messages
    and fills parts from every existing message when the backend starts. The old
    tool_calls and tool_call_id columns 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 sends reasoning_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

Choose a tag to compare

@AjeyDS AjeyDS released this 11 Oct 04:58

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 running docker exec. They need v0.9.0 images: earlier images
    have no /mcp endpoint. If you changed BACKEND_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_DIR and RESUME_TAILOR_PDF_DIR.
    Use the MAESTRO_CS_* names. Leaving these set without their replacements
    means an unpacked Companion id loses API write access, the MCP profile falls back
    to full, 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 and scripts/update.sh work 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 CHECKOUT moves 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 .env that 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 and maestro.env if anything fails. --dry-run shows the plan. See docs/UPDATING.md.
  • A Docker-free install with uv, and the maestro command.
    uv tool install --python 3.12 maestro-career-studio installs 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,
    connect and mcp run it from one per-user folder with one settings file,
    maestro.env. maestro update saves a verified snapshot of your data before it
    changes anything and prints the changelog's breaking changes first. See the
    README, docs/GETTING_STARTED.md and docs/UPDATING.md.
  • maestro connect adds Maestro to Claude Desktop (waiting until you quit it,
    because it rewrites its settings while running), Claude Code, Codex, Cursor and
    VS Code. maestro mcp is 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.md has the
    one-time PyPI setup).
  • HTTP MCP inside the backend at /mcp, with full, hunt, apply,
    explore, templates and career tool 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 --unpause clears a maintenance pause and exits without
    starting the backend, so the watchdog can start Maestro. sync.sh exits 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.md and docs/SETUP_REFERENCE.md.
  • The backend's Python distribution is renamed maestro-career-studio-backend
    to maestro-career-studio (it is the PyPI name). The setup scripts uninstall the
    old name; nothing to do. pyproject.toml is also the PyPI version.
  • The frontend image runs node server.js from Next's standalone output
    instead of next start, with image optimization off (nothing uses it) and no
    sharp. npm start does 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, and pip install -e backend for development.
  • /health/memory and the sync file reads work on Windows. On Windows, a sync file
    read no longer refuses a symlink at open (there is no O_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.md names the scoring model's first download (Hugging Face) and the
    maestro command'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.lock leaves it out.
  • The Claude Desktop .mcpb bundle 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.
  • mcp is 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 tracing extra. Docker and native installs still
    include it; a source/dev install gets it with pip install -e ".[tracing]" from
    backend/.
  • Backend image copies files with the app user's ownership and excludes tests
    and every backend script except scripts/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, cutting frontend/public/monaco from about 25 MB to 11 MB.

Deprecated

  • scripts/setup-mcp.sh and the host stdio venv remain for one release and
    are removed in v0.10.0. Existing maestro-career-studio-mcp connections 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.js no 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,
    and POST /api/kb/consolidate. Word-bank reset still saves through PUT /wording;
    the preset catalog, version-detail diffs, and onboarding import remain available.
  • The /explore redirect (Analytics has lived at /analytics since July).

v0.8.0

Choose a tag to compare

@AjeyDS AjeyDS released this 07 Oct 18:30

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 .env changes. docker-compose.yml forwards 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.

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. See docs/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 tool sync_now runs a round, and
    sync.sh runs 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/memory reports how much memory the backend is using now and at
    its peak, so you can watch a small machine. health.sh prints 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 native start command 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
    tool record_run keeps 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-pages and tailor-run skills join job-hunt,
    apply-session and customize-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 tool record_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_run and get_job_site_login
    (full automation only). score_ats names 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.sh resumes and
    health.sh says 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-hunt saves 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.

  • The backend starts when NO_PROXY holds 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...

Read more

v0.7.1

Choose a tag to compare

@AjeyDS AjeyDS released this 01 Oct 21:15
715c07c

Breaking changes

  • None. No migrations and no .env changes. MCP list tools return fewer rows
    by default (see Changed); every one of them still takes limit and offset.

Added

  • A listing on the official MCP Registry. server.json describes the
    server as io.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.md says 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 the next hints 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_jobs returns 50 rows by default,
    kb_list_points 50 (at most 100, without the per-resume usage history),
    list_proposals 20 (new limit/offset), and export_jobs 10 (new
    limit/offset, without the raw posting text). list_tailoring_sessions
    returns a summary per session; get_tailoring_session has 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_file finds 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

Choose a tag to compare

@AjeyDS AjeyDS released this 01 Oct 05:41

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_grade and a question on each finding, and get_autofill_profile
    gains languages.

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.
  • 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

Choose a tag to compare

@AjeyDS AjeyDS released this 24 Sep 22:33

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
    /applications keep 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

Choose a tag to compare

@AjeyDS AjeyDS released this 24 Sep 02:57

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.sh now 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 postgres service or
    pgdata volume, 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.sh now 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
    and POSTGRES_HOST_PORT are no longer read; leaving them in .env is
    harmless. The legacy-postgres extra and python -m app.tools.migrate_from_postgres are 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.sh suggests removing the old Postgres volume and
    the postgres:16 image when they are still on disk; docs/UPDATING.md has a
    new "Freeing disk space" section.

Fixed

  • update.sh no longer stops in git's pager (:) while listing the commits it
    brought in, which hid the extension and MCP reminders printed after it.