Fitfoundry
An agentic AI workflow leveraging AI to automate the job search. It cross-references multiple boards against a deep personal profile, performing multi-stage filtering, gap analysis, and fit-scoring. Efficiently identifies high-signal opportunities and generates readiness reports.
Install / Use
/learn @ecodad/FitfoundryREADME
FitFoundry — AI-Assisted Job Search Workflow
An AI-assisted job search system designed to run inside Cowork (Anthropic's agentic desktop tool). FitFoundry automates the repetitive parts of a job search across three stages: building a career profile, scraping and scoring job boards, and generating tailored application materials.
Website & workshops: ecodad.github.io/fitfoundry — live demos, upcoming workshop dates, and registration.
Getting Started
Download and Install
-
Go to github.com/ecodad/fitfoundry in your browser.
-
Click Releases on the right side of the page.
-
Under the latest release, click Assets and download the
fitfoundry.skillfile.Do this in your browser — Claude Desktop cannot reach GitHub on your behalf.
-
Open Claude Desktop and go to Customize → Skills.
-
Click the + button next to Skills and select Upload.
-
Select the
fitfoundry.skillfile you just downloaded. -
Make sure the FitFoundry skill is toggled On.
-
Restart Claude Desktop.
Updating an Existing Install
If you already have FitFoundry set up and want to apply a new release, use the delta package rather than reinstalling from scratch. Delta packages preserve your personal run history and any boards you have added yourself.
- Download the latest ZIP from the Releases page and extract it, or clone/pull the repo.
- Open the
deltas/folder and find the folder for the latest release date (e.g.deltas/2026-03-18/). - Read
DELTA-APPLY.mdat the repo root — it contains step-by-step instructions for merging new and updated site files into your workspace without overwriting your run history.
The short version: copy new site files straight in, replace updated site files but restore your own Last run date, and merge the board index table row by row. Full details are in DELTA-APPLY.md.
Setup — Two Steps
Setup is split into two steps. Complete them in order.
| Step | File | What it covers | Time | |---|---|---|---| | Step 1 | SETUP-STAGE1.md | Install Node.js, add Puppeteer MCP server, connect Indeed and Dice, install Claude in Chrome | 15–20 min | | Step 2 | SETUP-STAGE2.md | Open Cowork, select your job search folder, run workspace bootstrap, build your career profile | 10–30 min |
A restart of Claude Desktop is required at the end of Step 1, and again within Step 2 between the two Cowork sessions. Both restarts are one-time steps.
Running FitFoundry After Setup
Open a new Cowork session, select your job search folder, and tell Claude what you want to search. For example:
Use FitFoundry to search Indeed for jobs posted in the past 10 days
Use FitFoundry to search for jobs posted in the last two weeks at Microsoft
Use FitFoundry to find job openings in the Seattle area
See QUICKSTART.md in your job search folder for more prompts and a troubleshooting reference.
Three-Stage Workflow
| Stage | File | Purpose | When to Run |
|---|---|---|---|
| 1 — ProfileBuilder | PROFILEBUILDER.md | Conducts an interview to generate your career profile and scoring quick reference | Once; re-run when your situation changes |
| 2 — FitFoundry | FITFOUNDRY-WORKFLOW.md | Scrapes a job board, scores listings against your profile, verifies postings, and generates output files | Repeatedly — different boards and periodic re-runs to catch new listings |
| 3 — LaunchKit | LAUNCHKIT.md | Generates tailored resumes and cover letters for jobs you select from your results | After reviewing Stage 2 output and deciding which roles to pursue |
What Each Stage Does
Stage 1 — ProfileBuilder
Conducts a structured interview (quick ~5 min or full ~20 min) and generates two files that drive all subsequent stages:
MY-PROFILE.md— your career profile, used by FitFoundry as the scoring source of truthQUICK-REFERENCE.md— scoring calibration, hard filters, and board-specific search settings
If you provide a resume, ProfileBuilder pre-fills answers it can infer and only asks for what's missing.
Stage 2 — FitFoundry
- Scrapes job boards using the Puppeteer MCP server and, for login-gated boards, the Claude in Chrome extension. Handles lazy-loaded React apps, static pages, and direct API queries where available.
- Filters listings by location, workplace type (remote / hybrid / in-person), and employment type (full-time only).
- Pre-screens by title using include/exclude keywords to reduce large result sets before visiting individual postings.
- Scores each job against your profile — interest and fit on a 1–10 scale with written rationale.
- Verifies postings against the company's own career site to flag potential ghost jobs.
- Generates structured output — a master list per run, and one individual markdown file per scored job.
- Logs lessons learned per board so scraping approaches improve over time without re-discovery.
Stage 3 — LaunchKit
- Scans your results folder and presents scored jobs as a numbered list.
- You select which jobs to pursue, with optional per-job notes to Claude.
- LaunchKit discovers your base resume(s) and cover letter(s) in the workspace and synthesizes tailored versions for each job.
- Creates a folder per job containing the original report, a tailored resume, and a tailored cover letter.
- Batches any ambiguous document-pairing questions to the end rather than interrupting the run.
Supported Job Boards
| # | Board | URL | Notes |
|---|-------|-----|-------|
| 1 | Climatebase (Remote) | climatebase.org | React SPA; scroll-based extraction; detail pages require Claude in Chrome (Cloudflare-blocked) |
| 2 | Climatebase (In-Person) | climatebase.org | Same board, Hybrid + In-person filter via UI |
| 3 | 80,000 Hours | jobs.80000hours.org | Algolia API; high curation, low volume |
| 4 | Draper Laboratory | draper.wd5.myworkdayjobs.com | Workday CXS API; most roles require security clearance |
| 5 | Work on Climate | workonclimate.org | Slack community + newsletter only — not scrapable |
| 6 | Wellfound | wellfound.com/jobs | Requires Claude in Chrome + login. Cloudflare CAPTCHA blocks Puppeteer. |
| 7 | Y Combinator | workatastartup.com | Server-rendered; no login required; industry filter unreliable |
| 8 | BEV Jobs | bevjobs.breakthroughenergy.org | Getro; UI filters required (URL params → HTTP 500) |
| 9 | BEF Jobs | befjobs.breakthroughenergy.org | Getro; small board, review unfiltered |
| 10 | Formlabs | careers.formlabs.com | Direct company site; apply flow via Sensata Workday |
| 11 | LinkedIn | linkedin.com/jobs | Requires Claude in Chrome + login. JS injection blocked — uses accessibility tree. |
| 12 | Indeed | indeed.com | MCP connector — search_jobs + get_job_details + get_company_data |
| 13 | Dice | dice.com | MCP connector for discovery + Puppeteer for full descriptions |
| 14 | Harvard | careers.harvard.edu | SmartRecruiters public API — no auth required; UI broken, use API directly |
| 15 | Autodesk | autodesk.wd1.myworkdayjobs.com | Workday CXS POST API; high global volume — filter by Boston/Remote |
| 16 | Markforged | job-boards.greenhouse.io/markforged | Greenhouse public API; markforged.com unreachable via Puppeteer |
| 17 | PTC | ptc.wd1.myworkdayjobs.com | Workday CXS POST API; Boston HQ |
| 18 | Desktop Metal | desktopmetal.com | ⚠️ ON HOLD — domain parked as of 2026-03-17; company status unclear |
Detailed scraping notes, selector patterns, filter quirks, and known ATS compatibility issues for each board are in JOB-BOARD-SITE-NOTES.md.
Ghost Job Check
After scoring jobs, FitFoundry attempts to verify each posting on the company's own career site to catch ghost jobs — listings left up after a role has been filled or cancelled. Verification uses Puppeteer for most career sites; for sites that block unauthenticated access (e.g., Cloudflare-protected pages), Claude in Chrome is used as a fallback if the extension is connected.
| Status | Meaning | |--------|---------| | ✅ Confirmed live on [ATS] (date) | Posting found on company career site | | ⚠️ Possible Ghost Job — not found on company career site (date) | May be filled, cancelled, or never posted directly | | ❓ Unverified — career site inaccessible (date) | Site blocked or CAPTCHA prevented verification |
Output Format
Results are organized into subfolders of OUTPUT_FOLDER (set in .env, default results/):
results/
├── runs/ ← master list files (one per FitFoundry run)
├── inbox/ ← new individual job reports (land here after each run)
├── shortlisted/ ← LaunchKit application folders (actively working on)
│ └── Company_JobTitle/
│ ├── Company_JobTitle_YYYY-MM-DD.md
│ ├── Resume_Company_JobTitle.docx
│ └── CoverLetter_Company_JobTitle.docx
├── applied/ ← submitted applications (moved from shortlisted/)
├── declined/ ← jobs you decided not to pursue
└── closed/ ← completed cycles (rejected, withdrawn, offer concluded)
Move files between folders by updating the Status: field in the job report header and running FitFoundry Cleanup.
Master list (results/runs/YYYY-MM-DD-BoardName.md)
A markdown table of all listings collected in a run, followed by a session summary. At the end of each run, FitFoundry shows this table and offers to generate full reports for any master-list-only job you want to examine further.
Individual job file (results/inbox/Company_Role_YYYY-MM-DD.md)
Generated for each posting scoring 6 or above, and on demand for lower-scoring jobs via "Generate full report":
Status: inbox
Score: 8
Board:
Security Score
Audited on Apr 9, 2026
