# OfferPilot: A Local-First AI Job Application Workspace

> OfferPilot is an open-source, self-hosted job application tracker with an AI assistant built in. It stores all data locally, lets you prepare resumes and run mock interviews against your own language model, and compares offer terms without routing your job search history through a third-party cloud.

**offercontext/offerPilot** — 开源、本地优先的 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.

- Repository: https://github.com/offercontext/offerPilot
- Stars: 736 · Forks: 100
- Language: Python
- License: AGPL-3.0
- Published: 2026-09-10 · Updated: 2026-09-10 · Language: en
- Canonical page: https://hysenlabs.com/projects/offercontext-offerpilot

## What OfferPilot Solves and Who It Is For

Job searching across multiple companies generates scattered information: application stages, resume versions tailored per role, scheduled interviews, and received offers with different compensation structures. OfferPilot centralises all of this in a single local workspace. It is aimed at individual job seekers, not recruiting teams.

The core feature set covers five areas. An application board tracks companies, roles, and stages from first contact through offer. A material workspace ties a specific resume version and job description together before generating suggestions. A mock interview module runs practice questions based on the loaded resume and job description, with AI follow-up questions and feedback. An interview review saves the session for later study. An offer comparison table accepts salary, benefits, and deadline fields and lets you prepare salary negotiation talking points.

All business data stays on the local device. The AI features send relevant records to whichever model service you configure, so the README explicitly warns that local storage does not mean all AI computation happens locally.

## The Pilot AI Assistant and the Haru Optional Character

OfferPilot includes a built-in AI assistant called Pilot. Pilot can query application status, draft content, review materials, and propose changes, all within the same session alongside a reference panel. For any modification to a key job-search record, Pilot presents a confirmation card by default: the change does not execute until the user approves it. This is a deliberate constraint to prevent silent edits to application history.

The desktop interface includes an optional Live2D character named Haru, drawn from Live2D's official sample model. The README is clear that hiding Haru has no effect on Pilot's functionality. The Haru character and the Cubism Core runtime are copyright Live2D Inc. and are not included under the project's AGPL-3.0 license. Anyone distributing an app built on OfferPilot must comply separately with the Live2D sample model terms and the Live2D SDK license.

Mock interview audio transcription uses an offline Whisper model delivered by `@huggingface/transformers`. The model is pinned to a specific Hugging Face revision and is downloaded to the browser cache only when the user explicitly clicks to enable it. It is not bundled with the application.

## Installing OfferPilot via Docker or from Source

Docker installation requires only Git and a working Docker environment, with no separate Python or Node.js installation:

```bash
git clone https://github.com/offercontext/offerPilot.git offerpilot
cd offerpilot
docker build -t offerpilot .
docker run --rm -p 127.0.0.1:8080:8080 -v offerpilot-data:/data offerpilot
```

This runs the application at `http://localhost:8080` and stores data in a named Docker volume called `offerpilot-data`.

The source installation uses `uv` for the Python backend and npm for the React frontend. Python 3.10 or higher is required:

```bash
git clone https://github.com/offercontext/offerPilot.git offerpilot
cd offerpilot
uv sync
cd web
npm ci
npm run build
cd ..
uv run oc start
```

When started from source, data defaults to `~/.offerpilot` in the user home directory. This path can be changed by setting the `OFFERPILOT_DATA` environment variable. The Docker command uses a named volume mounted to `/data` inside the container instead.

The first run does not require an AI configuration. Recording an application, saving a job description, and editing materials all work without a connected model. AI features are enabled separately under Settings, where you supply a model service URL and credentials, test the connection, and save the provider configuration.

## Backend Dependencies and the LiteLLM Gateway

The Python backend, declared in `pyproject.toml`, requires Python 3.10 or higher and lists LiteLLM as the model gateway. LiteLLM translates a standard OpenAI-compatible API call into the format required by dozens of providers, which means OfferPilot can connect to any provider that LiteLLM supports, including local Ollama servers, without changes to the application code.

Other key dependencies include FastAPI for the HTTP layer, SQLAlchemy for the local database, pypdf for parsing resume PDFs, tiktoken for token counting, and Typer for the `oc` CLI command. The `pyproject.toml` declares the entry point `oc = "offerpilot.cli:main"`, which is what the Dockerfile binds to `/usr/local/bin/oc`.

The Docker image uses a two-stage build. The first stage compiles the React frontend in a Node.js 20 Alpine image. The second stage installs the Python backend in a Python 3.12 slim image, copies the compiled frontend into `app/web/dist`, creates a non-root `offerpilot` user, and sets the entry point to the `oc` CLI.

## Limitations and Cases Where OfferPilot Is the Wrong Tool

OfferPilot does not submit applications automatically, and it does not send messages to recruiters on your behalf. The README states this directly: the tool is for managing your process, not for automating outreach. Teams looking for automated outreach or bulk application tools are outside this project's scope.

Mock interview transcription only persists within the current page session. Navigating away or closing the browser clears the recording. Audio data is never uploaded to any server and is not stored in the application database. This is a deliberate privacy choice, but it means there is no searchable transcript history across sessions. If reviewing past interview performance is important, you would need to save notes manually.

AI outputs for resume suggestions and salary negotiation guidance may contain errors. The README advises verifying all AI-generated content, particularly dates, numbers, and specific claims, before acting on them. The decision to apply for a role, accept an offer, or how to conduct salary negotiations remains with the user.

The AGPL-3.0 license is a meaningful constraint for companies. Any web service that uses OfferPilot's code and makes it accessible over a network must publish the modified source under the same terms. Teams evaluating OfferPilot for an internal HR tool should check this requirement against their licensing policies.

## Comparison with Managed Job Search Tools

The most direct alternative is a managed SaaS job tracker such as Huntr or Teal, which provide similar kanban boards and resume management in a hosted environment without local installation. The trade-off is data control: those services store your job history on their servers, require account creation, and their AI features are billed separately or gated behind subscription tiers.

OfferPilot's local-first design means the data stays on your machine and the AI cost is whatever your configured provider charges directly. The README explicitly describes the hosted counterpart at hub.offercontext.cn as a separate product with its own data handling, not an extension of the local version.

The local version's customizability is also a meaningful difference. Because you configure the model service yourself through the Settings panel, you can point OfferPilot at a local Ollama instance running a smaller model at zero per-call cost, or at a commercial API with a stronger model for complex resume drafting and salary negotiation preparation.

## Conclusion

OfferPilot suits individual job seekers who want to keep their application data on their own machine and prefer to bring their own LLM API key rather than paying for a managed service. It is a poor fit for teams sharing a single instance, because the project is designed around individual use and there is no documented multi-user access control. Before running it, check that your preferred LLM provider is compatible with LiteLLM, which OfferPilot uses as its model gateway. The AGPL-3.0 license means any public network service built on top of the code must release its own source.

## FAQ

### what is offer pilot

OfferPilot is an open-source, local-first AI job application tracker. It centralises application records, resume versions, mock interview practice, and offer comparisons in a self-hosted workspace where all data stays on your device.

### Is OfferPilot AI legit?

The source code is published at github.com/offercontext/offerPilot under the AGPL-3.0 license and can be reviewed before installation. The README notes that AI outputs may contain errors and advises verifying all suggestions before acting on them.

### Does OfferPilot work without configuring an AI model?

Yes. The README states that tracking applications, saving job descriptions, and manually editing materials are all available without connecting a model service. AI-assisted features such as material generation, mock interview question answering, and analysis require a configured model provider.

## Sources

- [Issues](https://github.com/offercontext/offerPilot/issues)
- [License: AGPL-3.0](https://github.com/offercontext/offerPilot/blob/master/LICENSE)
- [offercontext/offerPilot on GitHub](https://github.com/offercontext/offerPilot)
- [README](https://github.com/offercontext/offerPilot/blob/master/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/offercontext-offerpilot
