Skip to main content

Open-source autonomous job search agent. Runs locally.

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

openapply

Autonomous job search agent. Runs 100% locally. Your CV never leaves your machine.

openapply is an open-source, privacy-first, terminal-first job application assistant. It helps you discover roles, score fit, tailor ATS-safe CVs, and draft applications with Human In The Loop controls.

Why

career-ops showed the world this is possible. openapply makes it accessible to everyone:

  • No paid cloud AI subscription requirement
  • No cloud API key requirement
  • No vendor lock-in
  • Full local control over data and models

What It Does

openapply is designed as an end-to-end local pipeline:

  1. Job discovery across configured portals
  • scans active portals and discovers new listings
  • deduplicates against existing DB records and scan history
  1. 10-dimension fit evaluation
  • scores each role from 1.0 to 5.0 across role, skills, seniority, compensation, geo, stage, PMF, growth, interview likelihood, and timeline
  • computes weighted score + grade (A/B/C/D/F)
  • writes a markdown report to reports/
  1. Tailored ATS CV generation
  • extracts high-value JD keywords
  • reorders bullets by relevance (without deleting user content)
  • renders ATS-safe HTML to PDF via Playwright
  • saves artifacts to output/ and metadata to DB
  1. Human-reviewed application drafting
  • opens and drafts common form fields
  • never auto-submits
  • requires explicit human review before marking as applied
  1. Parallel batch processing
  • processes queued URLs concurrently
  • fault tolerant: one failure does not block the queue
  • resumable behavior for previously processed jobs
  1. Outcome learning loop
  • logs interview/rejection/offer/ghosted outcomes
  • adjusts scoring weights in DB based on feedback patterns

Quick Start

pip install openapply
openapply setup

Then:

openapply scan

Required: enable at least 1 portal

scan requires at least one active portal in portals.yml (setup creates it for you, but everything is disabled by default).

  1. Open portals.yml
  2. Set at least one entry to active: true
  3. Run:
openapply doctor
openapply scan --limit 5 --link-limit 30

How To Test (Recommended)

1) Developer install (this repo)

python -m venv .venv
.venv\Scripts\activate
pip install -e .
python -m playwright install chromium

Run quick health checks:

openapply doctor

Run unit tests:

python -m unittest discover -s tests -v

2) User install (PyPI / TestPyPI)

Once you publish (see “Publish To PyPI” below), verify in a clean environment:

python -m venv .venv
.venv\Scripts\activate
pip install openapply
openapply setup
openapply doctor

3) End-to-end CLI smoke test

  • Ensure portals.yml exists (setup creates it) and set at least one portal to active: true.
  • Scan:
openapply scan --limit 5 --link-limit 30
  • Run auto-pipeline for a known job URL:
openapply pipeline <job-url>
  • Open tracker TUI:
openapply tracker

Philosophy

AI analyzes. You decide. HITL always.

openapply intentionally avoids full autonomy on final submission actions. The system can evaluate, draft, and prefill, but a human must review before applying.

Core Commands

openapply setup
openapply doctor
openapply scan
openapply scan --auto
openapply batch --min-score B --limit 20
openapply pipeline <url-or-jd-text>
openapply apply <url-or-jd-text>
openapply tracker
openapply learn <job-id> <outcome>

Models

openapply uses local Ollama models. A practical starting setup:

  • llama3.1:8b for evaluation

    • Pros: fast, low hardware footprint, good for scoring and routing
    • Tradeoff: less nuanced generation quality for long-form text
  • qwen2.5:14b for generation

    • Pros: stronger CV/cover-letter drafting quality
    • Tradeoff: slower and heavier resource usage

General guidance:

  • Use smaller models for high-volume scan/eval loops.
  • Use larger models for final artifact generation quality.
  • Keep all inference local through Ollama.

Local-First Privacy

  • CV, config, reports, and generated files are stored locally.
  • SQLite DB runs locally (data/openapply.db).
  • Prompt and model execution are local-first by design.

Project Status

openapply is in active development (0.1.1) and currently optimized for terminal workflows. Web UI support is planned as secondary priority.

Documentation

  • docs/ARCHITECTURE.md
  • docs/SETUP.md
  • docs/PUBLISH.md (maintainers: publish to PyPI)

Publish To PyPI

Use this flow to publish releases so users can run:

pip install openapply
openapply setup

Build and validate:

python -m pip install --upgrade build twine
python -m build
python -m twine check dist/*

Upload to TestPyPI first:

python -m twine upload --repository testpypi dist/*

Test install from TestPyPI in a clean environment:

python -m pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple openapply

Upload to PyPI:

python -m twine upload dist/*

PowerShell helper:

./scripts/publish.ps1
./scripts/publish.ps1 -TestPyPI
./scripts/publish.ps1 -PyPI

Inspiration

Inspired by the ideas popularized in career-ops (MIT), including structured fit scoring, CV templating workflow, and portal scanning patterns. openapply is implemented from scratch as a standalone Python product.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openapply-0.1.1.tar.gz (66.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

openapply-0.1.1-py3-none-any.whl (82.9 kB view details)

Uploaded Python 3

File details

Details for the file openapply-0.1.1.tar.gz.

File metadata

  • Download URL: openapply-0.1.1.tar.gz
  • Upload date:
  • Size: 66.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.4

File hashes

Hashes for openapply-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a5cb616b3588c6e7e13c906dc1d93188abbbaec2cbc3e6283ea30c5d04ebfd71
MD5 ce8b68627ba567fd19b803899293556f
BLAKE2b-256 dbf0266ac6a41ac4db5458de0cfbe95f614145d045f687ef93108da7bf5015ea

See more details on using hashes here.

File details

Details for the file openapply-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: openapply-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 82.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.4

File hashes

Hashes for openapply-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ceddf4c75359214fa4e26f5b127858af9ac0d60998d1b0196cde236d77635808
MD5 a165051edd8170c840ed7af6ef1724fd
BLAKE2b-256 26a254cb4de157da7ce8cff2ccb9146a746c9aa7929f8bd494ef21199f3e562e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page