Skip to main content
Projects

Applyr Job Pipeline

Automated job application engine with AI vision form filling, watchdog self-recovery, candidate profiles, and multi-platform support

February 25, 2026

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 stop
  • POST /api/jobs/panic-stop — Emergency browser kill
  • GET /api/jobs/status — Session status
  • GET /api/jobs/profiles — List candidate profiles
  • GET /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:

  1. Screenshotted
  2. Sent to Claude vision API with candidate profile + job context
  3. AI returns structured JSON (field type, label, answer, confidence)
  4. Playwright fills elements, matching vision labels to DOM via fuzzy matching
  5. 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

SystemBehavior
Per-job timeoutasyncio.wait_for() at 180s — cancels stuck jobs
WatchdogBackground task monitors heartbeats every 10s, alerts at 90s stall
Circuit breakerPauses 120s after 5 consecutive failures
RecoveryEscape → dismiss modal → navigate neutral page → recreate page if stuck
Stop signalctx.check_stop() inside form loops — responsive within 2-3s

Scoring System

Role Categories

Jobs are categorized by title and scored based on fit:

CategoryBase ScoreDan’s Level
Core IT (SysAdmin, NetEng, SysEng)120Mid-career (15+ years)
Target Engineering (DevOps, SRE, Platform)100Entry-level pivot
Entry Level (NOC, IT Specialist)60Below level, foot in door
Adjacent Tech (SWE, Data Eng)20No professional experience
Remedial (Help Desk)10Overqualified, 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

FilePurpose
data/profiles/*.jsonCandidate profiles (identity, career, screening answers)
data/candidate_context.mdCareer positioning guide for AI resume tailoring
data/screening_answers.jsonScreening 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
applyrjob-searchautomationcareerfastapivisionai