Thank you for your interest in contributing to ApplyPilot. This guide covers everything you need to get started.
- Python 3.11 or higher
- Git
git clone https://github.com/Pickle-Pixel/ApplyPilot.git
cd ApplyPilot
pip install -e ".[dev]"
playwright install chromiumThis installs ApplyPilot in editable mode with all development dependencies (pytest, ruff, etc.) and downloads the Chromium browser binary for Playwright.
applypilot --version
pytest tests/ -v
ruff check src/Workday employer portals are configured in config/employers.yaml. To add a new employer:
- Find the company's Workday career portal URL (usually
https://company.wd5.myworkdaysite.com/) - Identify the Workday instance number (wd1, wd3, wd5, etc.) and the tenant ID
- Add an entry to
config/employers.yaml:
- name: "Company Name"
tenant: "company_tenant_id"
instance: "wd5"
url: "https://company.wd5.myworkdaysite.com/en-US/recruiting"- Test discovery:
applypilot discover --employer "Company Name" - Submit a PR with the new entry
Direct career site scrapers are configured in config/sites.yaml. To add a new site:
- Inspect the company's careers page and identify the job listing structure
- Add an entry to
config/sites.yamlwith CSS selectors:
- name: "Company Name"
url: "https://company.com/careers"
selectors:
job_list: ".job-listing"
title: ".job-title"
location: ".job-location"
link: "a.job-link"
description: ".job-description"- Test:
applypilot discover --site "Company Name" - Submit a PR
- Check existing issues to avoid duplicating work
- For new features, open an issue first to discuss the approach
- Fork the repo and create a feature branch from
main - Write your code with type hints and docstrings
- Add tests for new functionality
- Update the CHANGELOG.md under an
[Unreleased]section - Submit a PR
# Run all tests
pytest tests/ -v
# Run a specific test file
pytest tests/test_scoring.py -v
# Run with coverage
pytest tests/ --cov=src/applypilot --cov-report=term-missingApplyPilot uses Ruff for linting and formatting.
# Check for issues
ruff check src/
# Auto-fix what can be fixed
ruff check src/ --fix
# Format code
ruff format src/- Type hints: All function signatures must have type annotations
- Docstrings: All public functions and classes must have docstrings (Google style)
- Naming: snake_case for functions and variables, PascalCase for classes
- Imports: Sorted by Ruff (isort-compatible)
- Line length: 100 characters maximum
- One feature per PR. Keep changes focused and reviewable.
- Include tests. New features need test coverage. Bug fixes need a regression test.
- Update CHANGELOG.md. Add your changes under
[Unreleased]. - Write a clear PR description. Explain what changed and why.
- Keep commits clean. Squash fixup commits before requesting review.
- CI must pass. All linting and tests must be green.
ApplyPilot/
├── src/applypilot/ # Main package
│ ├── __init__.py
│ ├── cli.py # CLI entry points
│ ├── discover/ # Stage 1: job discovery scrapers
│ ├── enrich/ # Stage 2: description extraction
│ ├── score/ # Stage 3: AI scoring
│ ├── tailor/ # Stage 4: resume tailoring
│ ├── cover/ # Stage 5: cover letter generation
│ ├── apply/ # Stage 6: browser automation
│ └── utils/ # Shared utilities
├── config/ # Default configuration files
├── tests/ # Test suite
├── docs/ # Documentation
└── pyproject.toml # Package configuration
By contributing to ApplyPilot, you agree that your contributions will be licensed under the GNU Affero General Public License v3.0.