• v0.8.4 b6baa664b4

    v0.8.4 — Cloud per-user profile fix + Vue SPA for all tiers
    Some checks failed
    CI / test (push) Failing after 30s
    Stable

    pyr0ball released this 2026-04-02 17:47:26 -07:00 | 20 commits to main since this release

    Bug Fixes

    Cloud: cover letter used wrong user's profile

    All cloud users were getting the default user's name, voice, and mission preferences in their generated cover letters. generate() now accepts user_yaml_path; task_runner derives it from the per-user config directory. The fix flows through _build_system_context, _build_mission_notes, detect_mission_alignment, build_prompt, and _trim_to_letter_end.

    Apply Workspace: hardcoded config paths in cloud mode

    4_Apply.py was loading the user profile and resume YAML from the global config/ before resolve_session() ran. Both paths now use get_config_dir() after session resolution, so each cloud user sees their own resume.

    Changes

    • Vue SPA open to all tiers — no longer gated behind beta flag
    • LLM model candidates — Qwen2.5-3B first, Phi-4-mini fallback; cf_orch block added to vllm config
    • Preflightvllm removed from Docker adoption list (managed by cf-orch)

    See CHANGELOG.md for full history.

    Downloads
  • v0.7.1 16d27c91fc

    v0.7.1 — Demo/wizard ui-switcher fixes
    All checks were successful
    CI / test (push) Successful in 1m35s
    Stable

    pyr0ball released this 2026-03-24 12:31:49 -07:00 | 116 commits to main since this release

    Bug fixes

    Demo instance blank screen

    The demo instance (demo.circuitforge.tech/peregrine) was briefly showing Streamlit, then switching to a blank Vue SPA. Root cause: demo/config/user.yaml had ui_preference: vue, and sync_ui_cookie() bypassed the paid-tier gate in demo mode — so it happily navigated to the Vue SPA nginx container, which has no demo data wiring.

    Fix: sync_ui_cookie() now has an explicit early guard that forces pref = streamlit whenever DEMO_MODE=true, before any tier or preference logic runs. demo/config/user.yaml also reset to streamlit as belt-and-suspenders. Vue demo mode is tracked in #46.

    Cloud users stuck in Streamlit wizard

    Cloud users with ui_preference: vue set (e.g. provisioned manually) were landing in the Streamlit wizard instead of being redirected to Vue. Root cause: sync_ui_cookie() was only called after pg.run() in app.py, but the wizard gate called st.stop() first — so the cookie/redirect never fired.

    Fix: sync_ui_cookie() is now called inside the wizard gate block, before st.stop().

    Self-service free key provisioning 0.6.0

    Added to the CircuitForge website (separate repo):

    • /api/account/claim-free-key — idempotent endpoint; calls Heimdall /admin/provision so users can recover from auto-provision failures at signup without contacting support.
    • Account page claim card — shown when a Peregrine key is missing; one-click activation with success/error state.

    E2E tests (website) 0.5.0

    • signup-smoke.spec.ts — happy path: register → Heimdall provisions free key within 8s → login → product card visible on /account
    • claim-key-recovery.spec.ts — sad path: blocks Heimdall provision at signup, navigates to /account, asserts claim card visible, clicks it, asserts success
    Downloads
  • v0.4.1 94fd2ea332

    v0.4.1 — Jobgether Integration
    Some checks failed
    CI / test (push) Failing after 32s
    Stable

    pyr0ball released this 2026-03-15 09:45:51 -07:00 | 162 commits to main since this release

    Changes

    • Jobgether filter — all scrapers now silently drop listings with company = "Jobgether" via config/blocklist.yaml; no more ghost employer entries in the pipeline
    • Jobgether URL scraper_scrape_jobgether() in scrape_url.py handles direct jobgether.com URLs; Playwright-based with URL slug company extraction as fallback (bypasses previous 403 errors on manual imports)
    • Cover letter recruiter framing — when source = "jobgether", cover letter prompts now address the Jobgether recruiter: "Your client at {company} will appreciate..." or "Your client will appreciate..." when employer is anonymous

    Notes

    A full Jobgether discovery scraper was investigated but found not viable — Cloudflare Turnstile blocks all headless browsers and robots.txt blocks all bots. The email digest → paste URL → slug extraction flow covers the practical use case.

    Downloads
  • v0.4.0 100add23bc

    v0.4.0 — LinkedIn Import
    Some checks are pending
    CI / test (push) Waiting to run
    Stable

    pyr0ball released this 2026-03-13 11:28:03 -07:00 | 188 commits to main since this release

    What's New

    🔗 LinkedIn Profile Import

    One-click import from a public LinkedIn profile URL (no login required) or from a LinkedIn data export zip. Staged to linkedin_stage.json so scraping only happens once per session.

    • URL scrape via Playwright headless Chrome — no credentials, user-initiated only
    • Export zip fallback (ToS-compliant) for when scraping is blocked
    • Extracts: experience, education, skills, certifications, career summary
    • Available in first-run wizard (step 3) and Settings → Resume Profile
    • Available on all tiers including Free

    🐞 Bug Fixes

    • Cloud mode perpetual onboarding loop — wizard now correctly detects per-user wizard_complete flag instead of checking a shared repo path
    • Cloud session redirect — unauthenticated users now redirect to login instead of seeing a raw error
    • Removed remaining AIHawk UI references

    🐳 Docker

    • Playwright Chromium is now installed in the Docker image (playwright install chromium)
    • Rebuild required: docker compose build --no-cache app && ./manage.sh restart

    Full changelog: CHANGELOG.md

    Downloads
  • v0.3.0 d54770ffbb

    v0.3.0 — Feedback, BYOK Privacy Warning, LLM Suggest
    Some checks are pending
    CI / test (push) Waiting to run
    Stable

    pyr0ball released this 2026-03-06 16:02:33 -08:00 | 218 commits to main since this release

    What's new in v0.3.0

    Feedback Button

    • In-app issue reporting with screenshot paste support
    • Posts directly to Forgejo as structured issues
    • Available from the sidebar on every page

    BYOK Privacy Warning

    • Cloud backend detection engine (scripts/byok_guard.py) — classifies backends as cloud or local by type, URL heuristic, and opt-out local: true flag
    • One-time acknowledgment required in Settings when enabling a new cloud LLM backend
    • Shows a data inventory: exactly what leaves your machine per feature, what stays local always
    • Provider privacy policy links (Anthropic, OpenAI)
    • Acknowledgment state persisted to config/user.yaml — re-warns only for newly added providers
    • Persistent amber sidebar badge on every page when any cloud backend is active

    LLM Suggest in Settings

    • Suggest search terms from your resume (job titles, skill keywords, and exclude terms)
    • Suggest resume keywords for skills gap analysis
    • LLM Suggest button in Settings → Search → Skills & Keywords

    Other Additions

    • Backup/restore script (scripts/backup.py) with multi-instance and legacy support
    • PRIVACY.md short-form privacy notice

    Fixes

    • Settings widget crash on rerun
    • Docker service controls in Settings → System tab
    • DEFAULT_DB now correctly respects STAGING_DB env var
    • Cover letter refinement max_tokens kwarg propagation

    Privacy & Security

    • Full test suite anonymized — fictional "Alex Rivera" replaces all real personal data in test fixtures
    • Complete PII scrub from git history: real name, email address, and phone number removed from all prior commits via git filter-repo

    See CHANGELOG.md for full details.

    Downloads
  • v0.1.0 006738f7b3

    v0.1.0 — First Beta Pre-release

    pyr0ball released this 2026-02-25 16:44:59 -08:00 | 320 commits to main since this release

    Peregrine v0.1.0 — First Beta

    AI-powered job discovery and application pipeline by Circuit Forge LLC.

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

    What's included

    • Docker Compose deployment (remote / cpu / single-gpu / dual-gpu profiles)
    • First-run wizard (app/pages/0_Setup.py) with LLM backend connection testing
    • Job discovery via JobSpy + Adzuna + The Ladders + Craigslist
    • Resume keyword matching + cover letter generation
    • Fine-tune pipeline: web upload → training data extraction → containerised LoRA fine-tune → auto-register in Ollama
    • SearXNG-powered company research with inclusion & accessibility sections
    • Email sync + IMAP classifier
    • Interview kanban + prep sheet
    • Survey assistant (text + screenshot via moondream2)
    • Podman support with CDI GPU overlay

    Quick start

    git clone https://git.opensourcesolarpunk.com/pyr0ball/peregrine.git
    cd peregrine
    bash setup.sh
    make start
    # Open http://localhost:8501 — the setup wizard will guide you
    

    Profiles

    Command GPU Services
    make start none app + searxng
    make start PROFILE=cpu none + ollama
    make start PROFILE=single-gpu GPU 0 + ollama + vision
    make start PROFILE=dual-gpu GPU 0+1 + ollama + vision + vllm
    Downloads