Self-hosted service
offercontext/offerPilot avatar
offercontext/offerPilot

OfferPilot: a local-first job application tracker with an optional AI layer

开源、本地优先的 AI 求职与投递管理工具,支持简历管理、刷题练习、模拟面试、面试复盘、Offer 对比与谈薪指导。Open-source, local-first AI job-search workspace and application tracker with resume management, practice questions, mock interviews, interview reviews, offer comparison, and salary negotiation guidance.

724 stars100 forksPythonAGPL-3.0

At a glance

What is it?
OfferPilot is an AGPL-3.0 Python workspace that keeps applications, resumes, mock interviews and offer comparisons on your own machine, with AI features wired to whatever model service you configure. The interesting design choice is that the tracker works before any model is connected, and the documentation is explicit that local storage does not mean local inference.
Who is it for?
Adopt OfferPilot if you are an individual job seeker who wants application records, resume versions and offer comparisons on your own disk and is comfortable pointing the AI features at a model service you already pay for. Do not adopt it if you need a hosted multi-user pipeline, automated applications, or a guarantee that your resume never leaves the machine, because the README states that AI features send the relevant material to the provider you configure.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap OfferPilot targets: a job search that lives in six browser tabs

A job search generates state. Which company, which posting, which resume version went out, when the interview is, what was asked, what the offer said, and what deadline attaches to it. Most people hold that state in a spreadsheet, a notes app and a mailbox, which works until the search runs for three months and the spreadsheet stops matching reality. OfferPilot is aimed at that single user. The README describes it as a workspace for individual job seekers, with a kanban of companies, roles and stages (to apply, applied, written test, interview, offer, closed), resume versions tied to a specific posting, mock interview sessions, saved reviews, and a side-by-side offer comparison that includes salary, benefits and reply deadlines. The scope is deliberately personal: the README states plainly that OfferPilot does not auto-apply and does not message recruiters on your behalf. If you are hiring, or running a recruiting pipeline, this is not the tool.

Local-first storage with remote inference, and why the README separates the two

The architecture visible in the material is a Python backend served on port 8080 with a Node-built web frontend, plus a data directory. Source runs default to `~/.offerpilot`, overridable with the `OFFERPILOT_DATA` environment variable; the documented Docker invocation mounts a named volume at `/data`. Business records stay in that workspace. The AI layer is a separate concern. Under the settings path the README gives as 设置 → AI 与模型 → 配置 AI, you enter model service details, test the connection, apply it to the provider list, and save. From that point the Pilot assistant can query your records, analyze them, or draft content, and the README's own FAQ answers the obvious question with a no: local-first does not mean the material never leaves the device, because AI features send the relevant data to the model service you configured, and that service may charge you. That is an honest framing, and it is the sentence to read before you paste a resume into a chat box. One narrower privacy claim does hold: mock interview audio exists only in the current page, is not uploaded and is not persisted, and the optional offline Whisper model downloads from Hugging Face into browser cache only when you click to start it.

Getting it running: Docker in four commands, or uv plus npm from source

The README offers two paths and says either is sufficient. Docker requires Git and a working Docker environment, no separate Python or Node install. The documented sequence is `git clone https://github.com/offercontext/offerPilot.git offerpilot`, then `cd offerpilot`, then `docker build -t offerpilot .`, then `docker run --rm -p 127.0.0.1:8080:8080 -v offerpilot-data:/data offerpilot`. Note the bind address: the port is published to loopback only, which matches the stated default of local access. The source path needs Git, uv, Python and Node.js/npm: `uv sync`, then `cd web`, `npm ci`, `npm run build`, then back up and `uv run oc start`. Python 3.10 is the declared minimum; the Docker build currently uses Python 3.12 and Node.js 20, and the README is careful to say those build versions are not the source minimum. First use does not require a model: add a company and role on the board, open the detail view, and save the job description. AI configuration comes later, and the README notes the save button at the top of the page is the step people miss after applying a provider.

Pilot, Haru and the confirmation cards: how writes are gated

Pilot is the built-in assistant; Haru is described as an optional character entry point, and hiding Haru does not disable Pilot. The interaction model that matters is confirmation. The README states that Pilot's changes to key job-search records require your confirmation by default, and that you should check the system confirmation card before it executes. In the screenshot description for the Pilot page, the middle column shows the conversation and a new-application confirmation card, with reference material in the right panel. So the assistant is not a silent writer against your database. It also means the assistant cannot be trusted to have finished a task until you have accepted the card, which is a real workflow constraint rather than a technical one. The README adds the standard caveat that AI output can be wrong and that you should verify experience, numbers, dates and commitments before using them, and that the decision to apply, accept an offer or negotiate remains yours.

Where the material runs out: releases, tests and failure modes

There are no releases retrieved for this repository, so there is no versioned changelog to read and no upgrade path documented beyond pulling the branch and rebuilding. The README points to a product manual under `docs/product-manual/` for detailed operations and troubleshooting, and that file is where you would look for the failure modes this review cannot confirm. What can be said from the material is narrower. The AI features depend on an external model service, so a misconfigured or unreachable provider degrades exactly those features and nothing else, which is the point of keeping the tracker independent of the model. The offline Whisper transcription is pinned to a specific revision (`461d552a09349d5d0d0779b40dd79800eaa3e35a`) and cached per browser, so it is not shared across machines and will re-download on a new browser profile. And the offer comparison only compares what you typed in; the README describes filling in salary, benefits and reply deadlines plus custom comparison dimensions, not importing them. If your offers arrive as PDFs you will be transcribing them by hand.

The alternative to weigh: a plain tracker versus a general assistant

The realistic comparison is not another job-search product but the combination most people already use: a spreadsheet or Notion board for the pipeline plus a general chat assistant for drafting. A spreadsheet has no schema, no resume versioning and no confirmation step, but it also has no install, no Docker build and no provider configuration, and it never sends your resume anywhere. The difference in approach is that OfferPilot binds the assistant to structured records. When you ask Pilot about an application, the reference panel shows the material the answer is grounded in, and writes go through a confirmation card. That grounding is the reason to prefer it over pasting context into a chat window each time, and it is also the reason the tool is heavier than a board. If your search is short or you are applying to two or three places, the setup cost of `uv sync`, `npm ci` and a provider configuration will likely exceed the benefit.

Licence and maintenance: AGPLv3 plus a carve-out you should not skip

OfferPilot is AGPL-3.0. For an individual running it locally that is unremarkable. If you modify it and expose it to other users over a network, the AGPL's source-availability obligation is the part to understand, and that is a question for your own counsel rather than for this article. The carve-out is more concrete: the desktop-wide Pilot character uses the Live2D official sample model Haru and Cubism Core, and the README states that those character and runtime rights belong to Live2D Inc. and are not included in the AGPLv3 grant. Anyone redistributing a build with that character visible has to satisfy the Live2D sample model terms and the Live2D SDK licence as well. The optional offline transcription stack is separately licensed: `@huggingface/transformers` and ONNX Runtime Web under Apache-2.0, with the `onnx-community/whisper-small` weights pinned by revision and downloaded to the browser rather than committed to the repository. On maintenance, the honest position from the material is that with no releases retrieved, you are tracking `master`; budget for rebuilding the frontend and re-running `uv sync` when you pull, and keep the data directory or volume backed up independently of the code.

Editorial conclusion

Adopt OfferPilot if you are an individual job seeker who wants application records, resume versions and offer comparisons on your own disk and is comfortable pointing the AI features at a model service you already pay for. Do not adopt it if you need a hosted multi-user pipeline, automated applications, or a guarantee that your resume never leaves the machine, because the README states that AI features send the relevant material to the provider you configure. Before committing, verify three things: that `uv sync` plus `npm run build` succeeds on your Python version (3.10 is the declared floor, while the Docker image uses 3.12 and Node.js 20), that `~/.offerpilot` or your `OFFERPILOT_DATA` volume is on a path you actually back up, and that you have read the Live2D sample model terms, since the desktop Haru character is not covered by the AGPLv3 grant.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. offercontext/offerPilot on GitHub
  4. README
Community notes

Community notes