Local job-search automation. You approve every application.
Live demo · Docs · Comparison · Help test
The screenshot uses synthetic data.
JobCtrl finds job postings, scores each one against your profile, writes a
tailored resume and PDF, and prepares the application for your review. Cover
letters are optional and off by default.
Your data lives in ~/.jobctrl/ on your machine; there is no account and no
hosted backend.
Early access. The signed release runs on Apple-silicon Macs with macOS 15 or later and bundles its own runtimes.
curl -fsSL https://jobctrl.dev/install.sh | sh
# or: brew install ebarti/tap/jobctrlIn a new terminal, run jobctrl start to start the local services and open the
app. Create your profile, then connect an LLM provider (Codex, Claude, or
Google) under Settings → Credentials; JobCtrl uses your own provider
account. After saving Claude or Google credentials, restart with jobctrl stop
and jobctrl start. Then run jobctrl setup and fix any MISSING rows in its
report.
To get your first jobs, set target roles on the Discovery page and start a
run from Pipelines. Getting Started
covers first-run setup in detail. jobctrl uninstall removes JobCtrl and keeps
~/.jobctrl/ unless you add --remove-data.
- Discover: searches job boards and configured company sources for your target roles, locations, and seniority.
- Enrich: fetches the full posting and its apply link. While the local worker runs, it also rechecks saved postings and shows overdue or uncertain availability without replacing saved descriptions or materials.
- Score: rates fit from 1 to 10 by checking each requirement against your profile evidence.
- Tailor: writes a resume from your profile and, when enabled, a cover letter. Each resume bullet links to the profile fact behind it. Drafts that invent a metric, date, title, or employer fail validation.
- Review: you edit the resume on the Apply review page and approve the exact version for that application.
- Apply: a dry run inspects the application form and submits nothing; it needs Claude and a Chrome or Chromium browser enabled in Settings. You fill in and submit browser forms yourself. The only applications JobCtrl submits itself are emails from your Gmail, with the recipient and attachment you approved, sent at most once.
Steps 1–4 run on Temporal, a workflow engine, and resume after a crash or restart.
JobCtrl also shows posted salaries and market estimates with their evidence, records application outcomes, keeps contacts, and drafts outreach for you to send. Explore the local interview question library and job preparation; its guidance is a research draft, and personal prep remains in beta.
- Auto-apply is off by default. When on, it sends the email applications you approved; browser forms still wait for you to complete and submit them.
- A confirmed application to an opening blocks further submissions to it. An equivalent role at the same employer needs your explicit confirmation.
- A daily LLM budget, $25 by default, stops new LLM work once JobCtrl's own estimate of the day's spend reaches it.
- The local API binds to 127.0.0.1 by default. Don't expose it to a network: it serves your profile, jobs, and documents.
- Discover queries Indeed, LinkedIn, and ZipRecruiter by default and does not check robots.txt. Automated access can violate a site's terms; disable any source you are not allowed to query automatically.
Outside requests run when you start a step that needs them, and while the local worker rechecks due saved postings:
- LLM providers: posting text, relevant profile evidence, and generated text. Offer communication drafts also send the confirmed offer terms and sources, decision attestation, and recorded compensation evidence through the configured outreach provider. Optional company briefings send only selected public source text and the reviewed company identity. Opt-in Required-bullet coaching sends the selected saved bullets and linked evidence to your configured provider. During a dry run, Claude also sees the application page, but never your profile or documents.
- Job boards and other sites: Discover, Enrich, and Apply dry-run requests, plus opt-in contact research, company briefings and bounded saved-posting availability checks. The availability checks use public APIs or an anonymous browser. With the browser extension paired and connected, Discover and Enrich use your Chrome session and its cookies for supported provider-owned hosts. Other posting hosts use the worker’s address-pinned public transport.
- Salary data sources: when a benchmark is missing or over a week old, a Discover run fetches public data from Euro Top Tech, plus ECB exchange rates and Eurostat price levels when needed; Levels.fyi or Glassdoor only if you enable them.
- Gmail, if connected: verification-code and outcome lookups, and the application emails you approve.
- Google Maps (address autocomplete), CapSolver (CAPTCHA solving), and Langfuse (metadata-only traces by default; prompt/completion capture requires an additional explicit debugging opt-in): only if you configure them.
Details: Data, Privacy & Safety · Security
Getting Started · Daily Workflow and CLI reference · Configuration · Architecture · Developer Guide · Roadmap · Contributing · Security policy
git clone https://github.com/ebarti/JobCtrl.git && cd JobCtrl
scripts/install # install the toolchain and dependencies
corepack pnpm check # typecheck and lint
corepack pnpm test # run the test suites
corepack pnpm dev # run the full stack; keep this terminal openSee Local Development.
AGPL-3.0-only. Copyright (C) 2026 Eloi Barti. See NOTICE.
For source-linked translations of accepted resumes and cover letters, see Reviewed Locale Variants. Terminology and formatting are reviewed independently before locale acceptance and export.
Reviewed open-ended screening answers are available in Job Detail and Apply Review. See Screening Answers for deliberate source selection, review, reuse and manual-use history.