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.2) and currently optimized for terminal workflows. Web UI support is planned as secondary priority.

Documentation

  • docs/README.md (documentation index)
  • docs/SETUP.md
  • docs/ARCHITECTURE.md
  • docs/PUBLISH.md (maintainers: publish to PyPI)
  • CONTRIBUTING.md
  • SECURITY.md
  • CODE_OF_CONDUCT.md

Community

To help keep the project healthy and maintainable:

  • Read CONTRIBUTING.md before opening pull requests.
  • Review SECURITY.md for vulnerability reporting guidance.
  • Follow CODE_OF_CONDUCT.md in all project spaces.

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.2.tar.gz (67.2 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.2-py3-none-any.whl (83.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: openapply-0.1.2.tar.gz
  • Upload date:
  • Size: 67.2 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.2.tar.gz
Algorithm Hash digest
SHA256 eb4e224ef1f3a44e60ac3841af18692256ec2a5527ab70f036469f8fb7c0fa12
MD5 5aabc46d7c6c34cd47177f4731cdb512
BLAKE2b-256 9cb9d946f09204a5520a7339cdffd0ea1dc0157c181ca9a9bcd3638a2106d1e0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: openapply-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 83.5 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e0bb4cacdf2fd4cd158280654f8cd12c2d5aa16f2352e288becad5058fa36730
MD5 67d5829111e7d235076353fc0b2c579a
BLAKE2b-256 9c1dd175b0f78acc8533400ac0341e680c4971d62d6d993d84afb38bd94bb75b

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