Case Study
Gnomad Job Scout
Autonomous job-discovery and Playwright browser application automation pipeline with human-in-the-loop fallback.
- Python
- Playwright
- Supabase
- n8n
- Browserbase
- ai-agents
- automation
- playwright
- n8n
The Business Case
Traditional job searching and application submission is an inefficient, manual process. Gnomad Job Scout shifts this dynamic by turning job discovery into a 24/7 autonomous pipeline. By coordinating headless browser sessions, local LLM parsing, and vector-based profile matching, the system automatically discovers jobs, rates their alignment with a target profile, and stages applications—saving dozens of hours of manual labor.
Technical Architecture
The architecture utilizes a distributed, multi-tiered agent structure to ensure reliability and handle blockers like CAPTCHAs.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Target Boards │ ──► │ HUNTER Agent │ ──► │ n8n Engine │
│ (Scrape Target) │ │ (Playwright) │ │ (Orchestration) │
└─────────────────┘ └────────┬────────┘ └────────┬────────└
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Supabase DB │ ◄──► │ pgvector │
│ (Handoff State) │ │ (Fit Score) │
└─────────────────┘ └─────────────────┘
Engineering Highlights
1. Self-Correcting Browser Loops
The crawler agent (HUNTER) executes synchronized Playwright scripts. If it encounters a Cloudflare wall or CAPTCHA challenge, it triggers a system state update in Supabase (handoff_resume) and pauses. Once the user completes the challenge, the system immediately resumes execution without losing current DOM state.
2. Semantic Fit Analysis
Rather than relying on basic keyword matching, the pipeline embeds the parsed job description using nomic-embed-text and runs a cosine-similarity query (job_fit_from_embedding RPC) inside Supabase against the candidate’s vector profile, ranking opportunities with mathematical precision.
3. Asynchronous Workflow Coordination
All tasks are orchestrated via self-hosted n8n workflows (ingestion_pipeline.json, command_control_blocker.json). The webhooks decouple scraping from LLM analysis, preventing connection timeouts and allowing reliable processing.