Applyr Job Pipeline
Automated job application engine with AI vision form filling, watchdog self-recovery, candidate profiles, and multi-platform support
Applyr Job Pipeline
Applyr is an automated job application pipeline combining multi-platform job scraping, career-level-aware scoring, AI vision-driven form filling, and self-recovery. It runs as a FastAPI service on callisto (port 8585) with an admin UI integrated into Arcturus-Prime at /admin/jobs.
Components
JobSpy Advanced Lab
Multi-platform job scraper with intelligent scoring.
Source: ~/Development/JobSpyAdvanced-Lab/
Capabilities:
- Scrapes LinkedIn, Indeed, Glassdoor, Google Jobs, ZipRecruiter
- Proxy rotation for reliable access (Sentinel VPS Squid proxy)
- Career-level-aware scoring engine
- Security clearance detection and filtering
- CSV output with detailed score breakdowns
Applyr Service
FastAPI service for automated job applications with AI form filling.
Source: ~/Development/applyr/
Service: rc-service applyr start (OpenRC, port 8585)
Git: https://git.Arcturus-Prime.com/KeyArgo/applyr.git
Key Capabilities:
- LinkedIn Easy Apply + Indeed Apply automation
- AI vision-driven form filling (Claude vision API)
- Candidate profile system with verified screening answers
- Watchdog, circuit breaker, and per-job timeout self-recovery
- Anti-bot detection hardening (Patchright, Bezier mouse, human typing)
- AI-generated tailored resumes and cover letters per job
- Application pipeline tracking with follow-up scheduling
Key Endpoints:
POST /api/jobs/start— Start apply session (csv, threshold, platforms, profile)POST /api/jobs/stop— Graceful stopPOST /api/jobs/panic-stop— Emergency browser killGET /api/jobs/status— Session statusGET /api/jobs/profiles— List candidate profilesGET /api/jobs/health— Health check
Arcturus-Prime Admin UI
Dashboard at /admin/jobs for managing job searches and reviewing results.
Proxy Config: astro.config.mjs proxies /api/jobs/* → 10.42.0.100:8585
AI Form Filling
Vision-Driven (Primary)
When enabled (APPLYR_VISION_ENABLED=true), each form step is:
- Screenshotted
- Sent to Claude vision API with candidate profile + job context
- AI returns structured JSON (field type, label, answer, confidence)
- Playwright fills elements, matching vision labels to DOM via fuzzy matching
- Falls back to legacy selectors for low-confidence fields
Module: applyr/vision.py — VisionFormAnalyzer, FieldAction, VisionFormResult
Model: Configurable via APPLYR_VISION_MODEL (default: claude-haiku-4-5-20251001)
Legacy Selector-Based (Fallback)
CSS selector pattern matching with AI text fallback:
- Field hierarchy: select → radio (fieldset) → radio (bare) → text → number → textarea → checkbox
- Screening KB keyword matching → cache → Claude Haiku fallback
- Bare radio handler for employer custom questions (agreement/consent detection)
Candidate Profile System
JSON profiles in data/profiles/ contain identity, career, education, certifications, skills, work history, projects, and screening answers. The active profile overrides the default screening KB during sessions.
Active profile: daniel-laforce.json (61 screening answers, verified from master resume)
API: GET /profiles (list), GET /profiles/{slug} (detail)
UI: Profile selector dropdown in Start Session modal
Self-Recovery
| System | Behavior |
|---|---|
| Per-job timeout | asyncio.wait_for() at 180s — cancels stuck jobs |
| Watchdog | Background task monitors heartbeats every 10s, alerts at 90s stall |
| Circuit breaker | Pauses 120s after 5 consecutive failures |
| Recovery | Escape → dismiss modal → navigate neutral page → recreate page if stuck |
| Stop signal | ctx.check_stop() inside form loops — responsive within 2-3s |
Scoring System
Role Categories
Jobs are categorized by title and scored based on fit:
| Category | Base Score | Dan’s Level |
|---|---|---|
| Core IT (SysAdmin, NetEng, SysEng) | 120 | Mid-career (15+ years) |
| Target Engineering (DevOps, SRE, Platform) | 100 | Entry-level pivot |
| Entry Level (NOC, IT Specialist) | 60 | Below level, foot in door |
| Adjacent Tech (SWE, Data Eng) | 20 | No professional experience |
| Remedial (Help Desk) | 10 | Overqualified, beats Starbucks |
Seniority Modifiers
- Entry-level DevOps/SRE: +50 boost (total: 150) — #1 target
- Entry-level + strong keywords: Additional +30 bonus
- Senior DevOps/SRE: -60 penalty (can’t compete)
- Senior Core IT: -15 (Dan could do this)
Keyword Scoring
Weighted by relevance to Dan’s actual skills:
- High value (8-10): Gentoo, K3s, Tailscale, WireGuard, Proxmox, ArgoCD
- Good match (5-7): Kubernetes, Linux, Ansible, Terraform, CI/CD, Python
- Negative: Printer repair, call center, nursing, accounting
Environment Factors
- Remote: +20, Hybrid: +5
- Open source: +15, Linux: +5
- 100% on-site: -50, Heavy travel: -100
- Security clearance required: -1000
Data Files
| File | Purpose |
|---|---|
data/profiles/*.json | Candidate profiles (identity, career, screening answers) |
data/candidate_context.md | Career positioning guide for AI resume tailoring |
data/screening_answers.json | Screening answer KB (62 categories, standalone fallback) |
data/resumes/master/ | Master resumes + RAG source |
data/resumes/role_specific/ | 9 pre-tailored resume variants |
data/scored_jobs/ | Scored job results by date |
data/session_logs/ | Per-session log files |
Quick Reference
# Start the service
sudo rc-service applyr start
# Check status
curl http://localhost:8585/api/jobs/health
# Run a job search
cd ~/Development/JobSpyAdvanced-Lab
./venv/bin/python3 run_jobspy_and_scorer.py