JobFoundry Pipeline Architecture
JobFoundry is structured as a decoupled, multi-stage processing pipeline that converts unstructured web job listings into deduplicated, score-ranked opportunities with tailored ATS resumes.
The JobFoundry server never performs outbound job-board scraping. All scraping and job-board HTTP requests originate from the user's browser extension.
By delegating ingestion to the client extension, JobFoundry bypasses aggressive IP rate-limiting, Cloudflare bot challenges, and CAPTCHAs, while ensuring user credentials and session tokens never leave the browser.
Interactive Pipeline Visualizer
Click through each stage to view the architectural rationale and code implementation:
// extension/content-script.js
const payload = {
url: window.location.href,
title: extractField('title'),
company: extractField('company'),
descriptionHtml: extractField('description'),
extractedAt: new Date().toISOString()
};
// Sent directly to local JobFoundry daemon// server/ingest/dedup.js
const hashA = computeSimHash(jobA.description);
const hashB = computeSimHash(jobB.description);
const distance = hammingDistance(hashA, hashB);
if (distance <= 3) {
// Mark as duplicate of canonical job
return deduplicate(jobB, jobA.id);
}{
"fitScore": 88,
"matchGrade": "A",
"keyStrengths": ["Distributed Systems", "TypeScript", "PostgreSQL"],
"gapAnalysis": ["Limited Go experience mentioned in posting"],
"recommendation": "Strong apply"
}// server/tailor/engine.js
const tailoredResume = await generateTailoredProfile({
masterProfile,
targetJob,
template: 'ats-modern'
});
await compileTypst(tailoredResume, 'output.pdf');GET /api/jobs?status=scored&minScore=75
Response: 200 OK
[
{ "id": "job_9412", "title": "Staff Engineer", "score": 94, "stage": "READY_TO_APPLY" },
{ "id": "job_8204", "title": "Backend Lead", "score": 88, "stage": "APPLIED" }
]Stage 1: Browser Ingestion
The companion browser extension (extension/) injects lightweight content scripts when visiting supported job boards and ATS domains.
- Extraction Strategy: Prefers structured JSON-LD (
schema.org/JobPosting) when present. Falls back to curated CSS selector trees for dynamic Single Page Applications (SPAs) like Workday or Ashby. - Payload Delivery: Sends parsed data via
POST /api/jobs/ingestto the local daemon, accompanied by an authentication token generated during initial pairing.
Stage 2: SimHash & Deduplication Engine
Job postings are frequently syndicated across multiple aggregators (e.g., posted on Greenhouse, scraped by LinkedIn, and mirrored on Indeed). JobFoundry avoids duplicate scoring through a 64-bit SimHash locality-sensitive hashing algorithm:
- Tokenization & Normalization: Strips boilerplate disclosures (EEOC, copyright), converts text to lowercase, and extracts weighted n-grams.
- 64-bit Hash Fingerprint: Computes a compact bitvector where similar documents have small Hamming distances.
- Hamming Distance Clustering: If
distance(hashA, hashB) <= 3, the job is identified as a cross-posting. The canonical posting is maintained while appending the new source URL as an alternative link.
Stage 3: LLM Fit Scoring & Criteria Evaluation
The scoring engine (server/scorer/) compares your master candidate profile against the job description using local LLMs (such as Llama 3 via Ollama or vLLM) or remote OpenAI-compatible endpoints.
- Strict JSON Schema: Responses must satisfy an Ajv-validated schema ensuring valid integer scores (0–100), key matched qualifications, identified gaps, and actionable interview talking points.
- Zero Hallucination: The model evaluates fit against provided profile facts only. It does not invent or assume credentials not present in your profile.
Stage 4: Resume Tailoring & ATS Export
Rather than rewriting your entire career history, the tailoring engine (server/tailor/) re-ranks and highlights your genuine experiences that directly align with the job's stated requirements.
- Typst Compilation: Compiles clean, modern resumes using Typst, producing pixel-perfect PDF and plain-text ATS formats.
- Deterministic Output: Generates verifiable, professional documents ready for submission.
Stage 5: Local Kanban Dashboard
The web interface (server/web/) provides a real-time Kanban board organized by pipeline status:
DISCOVERED: Newly ingested jobs awaiting automated processing.SCORED: Jobs evaluated with fit scores and match grades.READY_TO_APPLY: High-scoring jobs with generated tailored resumes.APPLIED: Active applications with date tracking.INTERVIEWING: In-progress interview stages and notes.