Peregrine by Circuit Forge LLC — LLM-powered job discovery and application pipeline https://circuitforge.tech/software/peregrine
Find a file
pyr0ball be3bed6e54 feat: BYOK unlocks LLM features regardless of tier
BYOK policy: if a user supplies any LLM backend (local ollama/vllm or
their own API key), they get full access to AI generation features.
Charging for the UI around a service they already pay for is bad UX.

app/wizard/tiers.py:
  - BYOK_UNLOCKABLE frozenset: pure LLM-call features that unlock with
    any configured backend (llm_career_summary, company_research,
    interview_prep, survey_assistant, voice guidelines, etc.)
  - has_configured_llm(): checks llm.yaml for any enabled non-vision
    backend; local + external API keys both count
  - can_use(tier, feature, has_byok=False): BYOK_UNLOCKABLE features
    return True when has_byok=True regardless of tier
  - tier_label(feature, has_byok=False): suppresses lock icon for
    BYOK_UNLOCKABLE features when BYOK is active

Still gated (require CF infrastructure, not just an LLM call):
  llm_keywords_blocklist, email_classifier, model_fine_tuning,
  shared_cover_writer_model, multi_user, all integrations

app/pages/2_Settings.py:
  - Compute _byok = has_configured_llm() once at page load
  - Pass has_byok=_byok to can_use() for _gen_panel_active
  - Update caption to mention BYOK as an alternative to paid tier

app/pages/0_Setup.py:
  - Wizard generation widget passes has_byok=has_configured_llm()
    to can_use() and tier_label()

tests/test_wizard_tiers.py:
  - 6 new BYOK-specific tests covering unlock, non-unlock, and
    label suppression cases
2026-03-02 11:34:36 -08:00
app feat: BYOK unlocks LLM features regardless of tier 2026-03-02 11:34:36 -08:00
config feat: add reverse-proxy basepath support (Streamlit MIME fix) 2026-03-01 22:49:29 -08:00
data feat: add scoring JSONL example and gitignore for benchmark data files 2026-02-26 23:46:29 -08:00
demo feat: DEMO_MODE — isolated public menagerie demo instance 2026-03-02 11:22:38 -08:00
docker feat: add Docker Compose stack with remote/cpu/single-gpu/dual-gpu profiles 2026-02-24 19:31:57 -08:00
docs feat: dual-GPU DUAL_GPU_MODE complete — ollama/vllm/mixed GPU 1 selection 2026-02-27 06:20:57 -08:00
scrapers fix: repair beta installer path for Docker-first deployment 2026-02-25 16:03:10 -08:00
scripts feat: DEMO_MODE — isolated public menagerie demo instance 2026-03-02 11:22:38 -08:00
tests feat: BYOK unlocks LLM features regardless of tier 2026-03-02 11:34:36 -08:00
tools feat: discard button — removes email from queue without writing to score file 2026-02-27 15:48:47 -08:00
.dockerignore feat: add Docker Compose stack with remote/cpu/single-gpu/dual-gpu profiles 2026-02-24 19:31:57 -08:00
.env.example feat: add vision service to compose stack and fine-tune wizard tab to Settings 2026-02-24 19:37:55 -08:00
.gitignore feat: DEMO_MODE — isolated public menagerie demo instance 2026-03-02 11:22:38 -08:00
CHANGELOG.md docs: mark cover letter refinement complete in backlog + changelog 2026-02-25 14:44:50 -08:00
compose.gpu.yml feat: assign ollama_research to GPU 1 in Docker and Podman GPU overlays 2026-02-27 06:16:04 -08:00
compose.menagerie.yml feat: DEMO_MODE — isolated public menagerie demo instance 2026-03-02 11:22:38 -08:00
compose.podman-gpu.yml feat: assign ollama_research to GPU 1 in Docker and Podman GPU overlays 2026-02-27 06:16:04 -08:00
compose.yml feat: add reverse-proxy basepath support (Streamlit MIME fix) 2026-03-01 22:49:29 -08:00
CONTRIBUTING.md docs: mkdocs wiki — installation, user guide, developer guide, reference 2026-02-25 12:05:49 -08:00
Dockerfile feat: add Docker Compose stack with remote/cpu/single-gpu/dual-gpu profiles 2026-02-24 19:31:57 -08:00
Dockerfile.finetune feat: containerize fine-tune pipeline (Dockerfile.finetune + make finetune) 2026-02-25 16:22:48 -08:00
environment.yml fix: resume CID glyphs, resume YAML path, PyJWT dep, candidate voice & mission UI 2026-02-26 12:32:28 -08:00
LICENSE-BSL docs: LICENSE-MIT + LICENSE-BSL + updated README for 7-step wizard and current feature set 2026-02-25 12:06:28 -08:00
LICENSE-MIT docs: LICENSE-MIT + LICENSE-BSL + updated README for 7-step wizard and current feature set 2026-02-25 12:06:28 -08:00
Makefile feat: inject DUAL_GPU_MODE sub-profile in Makefile; update manage.sh help 2026-02-27 06:18:34 -08:00
manage.sh feat: inject DUAL_GPU_MODE sub-profile in Makefile; update manage.sh help 2026-02-27 06:18:34 -08:00
mkdocs.yml docs: mkdocs wiki — installation, user guide, developer guide, reference 2026-02-25 12:05:49 -08:00
pytest.ini chore: seed Peregrine from personal job-seeker (pre-generalization) 2026-02-24 18:25:39 -08:00
README.md fix: auto-configure git safe.directory in setup.sh for /opt-style installs 2026-02-26 22:07:39 -08:00
requirements.txt fix: remove lib-resume-builder-aihawk from Docker requirements 2026-02-26 22:16:28 -08:00
setup.sh fix: auto-configure git safe.directory in setup.sh for /opt-style installs 2026-02-26 22:07:39 -08:00

Peregrine

AI-powered job search pipeline — by Circuit Forge LLC

"Don't be evil, for real and forever."

Automates the full job search lifecycle: discovery → matching → cover letters → applications → interview prep. Privacy-first, local-first. Your data never leaves your machine.


Quick Start

1. Clone and install dependencies (Docker, NVIDIA toolkit if needed):

git clone https://git.opensourcesolarpunk.com/pyr0ball/peregrine
cd peregrine
./manage.sh setup

2. Start Peregrine:

./manage.sh start                          # remote profile (API-only, no GPU)
./manage.sh start --profile cpu            # local Ollama on CPU
./manage.sh start --profile single-gpu    # Ollama + Vision on GPU 0
./manage.sh start --profile dual-gpu      # Ollama + Vision + vLLM (GPU 0 + 1)

Or use make directly:

make start                        # remote profile
make start PROFILE=single-gpu

3. Open http://localhost:8501 — the setup wizard guides you through the rest.

macOS: Docker Desktop must be running before starting. Windows: Not supported — use WSL2 with Ubuntu.

Installing to /opt or other system directories

If you clone into a root-owned directory (e.g. sudo git clone ... /opt/peregrine), two things need fixing:

1. Git ownership warning (fatal: detected dubious ownership) — ./manage.sh setup fixes this automatically. If you need git to work before running setup:

git config --global --add safe.directory /opt/peregrine

2. Preflight write access — preflight writes .env and compose.override.yml into the repo directory. Fix ownership once:

sudo chown -R $USER:$USER /opt/peregrine

After that, run everything without sudo.

Podman

Podman is rootless by default — no sudo needed. ./manage.sh setup will configure podman-compose if it isn't already present.

Docker

After ./manage.sh setup, log out and back in for docker group membership to take effect. Until then, prefix commands with sudo. After re-login, sudo is no longer required.


Inference Profiles

Profile Services started Use case
remote app + searxng No GPU; LLM calls go to Anthropic / OpenAI
cpu app + ollama + searxng No GPU; local models on CPU (slow)
single-gpu app + ollama + vision + searxng One GPU: cover letters, research, vision
dual-gpu app + ollama + vllm + vision + searxng GPU 0 = Ollama, GPU 1 = vLLM

First-Run Wizard

On first launch the setup wizard walks through seven steps:

  1. Hardware — detects NVIDIA GPUs and recommends a profile
  2. Tier — choose free, paid, or premium (or use dev_tier_override for local testing)
  3. Identity — name, email, phone, LinkedIn, career summary
  4. Resume — upload a PDF/DOCX for LLM parsing, or use the guided form builder
  5. Inference — configure LLM backends and API keys
  6. Search — job titles, locations, boards, keywords, blocklist
  7. Integrations — optional cloud storage, calendar, and notification services

Wizard state is saved after each step — a crash or browser close resumes where you left off. Re-enter the wizard any time via Settings → Developer → Reset wizard.


Features

Feature Tier
Job discovery (JobSpy + custom boards) Free
Resume keyword matching Free
Cover letter generation Paid
Company research briefs Paid
Interview prep & practice Q&A Paid
Email sync & auto-classification Paid
Survey assistant (culture-fit Q&A) Paid
Integration connectors (Notion, Airtable, Google Sheets, etc.) Paid
Calendar sync (Google, Apple) Paid
Cover letter model fine-tuning Premium
Multi-user support Premium

Email Sync

Monitors your inbox for job-related emails and automatically updates job stages (interview requests, rejections, survey links, offers).

Configure in Settings → Email. Requires IMAP access and, for Gmail, an App Password.


Integrations

Connect external services in Settings → Integrations:

  • Job tracking: Notion, Airtable, Google Sheets
  • Document storage: Google Drive, Dropbox, OneDrive, MEGA, Nextcloud
  • Calendar: Google Calendar, Apple Calendar (CalDAV)
  • Notifications: Slack, Discord (webhook), Home Assistant

CLI Reference (manage.sh)

manage.sh is the single entry point for all common operations — no need to remember Make targets or Docker commands.

./manage.sh setup               Install Docker/Podman + NVIDIA toolkit
./manage.sh start [--profile P] Preflight check then start services
./manage.sh stop                Stop all services
./manage.sh restart             Restart all services
./manage.sh status              Show running containers
./manage.sh logs [service]      Tail logs (default: app)
./manage.sh update              Pull latest images + rebuild app container
./manage.sh preflight           Check ports + resources; write .env
./manage.sh test                Run test suite
./manage.sh prepare-training    Scan docs for cover letters → training JSONL
./manage.sh finetune            Run LoRA fine-tune (needs --profile single-gpu+)
./manage.sh open                Open the web UI in your browser
./manage.sh clean               Remove containers, images, volumes (asks to confirm)

Developer Docs

Full documentation at: https://docs.circuitforge.io/peregrine


License

Core discovery pipeline: MIT AI features (cover letter generation, company research, interview prep, UI): BSL 1.1

© 2026 Circuit Forge LLC