runs every morning, while you have coffee

Job ApplyKit
an automated job application workflow

Scrapes LinkedIn job listings daily, scores them against your profile, and generates a tailored resume and cover letter PDF for every role that passes — then uploads everything to Google Drive and logs it in a spreadsheet.

WorkflowsAgentsToolsbuilt on the WAT framework
$.venv/bin/python tools/scrape_linkedin_jobs.py

The workflow

9 nodes, fully linear, zero clicks
TRIGGER01

Daily Schedule

Fires Mon–Thu at 07:00. Rotates LinkedIn search URL by day of week so you hit different roles across the week.

TOOL02

LinkedIn Scraper

Fetches up to 50 fresh job listings via the Apify curious_coder/linkedin-jobs-scraper actor. Returns structured JSON — title, company, location, description, salary, URL.

$.venv/bin/python tools/scrape_linkedin_jobs.py
TOOL03

Filter & Dedup

Drops any listing whose ID already appears in seen_ids.json. Marks the new ones as seen so future runs skip them automatically.

$.venv/bin/python tools/filter_new_jobs.py
TOOL04

Profile Extractor

Reads .data/resume.txt and optionally scrapes your portfolio URL, then outputs a structured JSON profile the scoring agent uses as its reference.

$.venv/bin/python tools/extract_candidate_profile.py
LLM05

Job Scorer

Claude evaluates each job against your profile using your custom scoring prompt. Returns a 0–100 score, a verdict (pass / skip / maybe), and a one-line reason for each listing.

$.venv/bin/python tools/score_jobs.py
LOGIC06

Score Gate

Jobs at or above your configured threshold continue to document generation. Everything below is logged as skipped — score and reason preserved for review.

LLM07

Application Pack Generator

For each passing job, Claude tailors your resume and writes a targeted cover letter — both output as clean HTML files, grounded in your real experience and the specific role.

$.venv/bin/python tools/prepare_application_pack.py
TOOL08

PDF Renderer

Playwright headless Chromium renders each HTML file to a selectable, ATS-safe PDF with embedded IBM Plex fonts. One resume PDF and one cover letter PDF per job.

$.venv/bin/python tools/render_pdf.py
TOOL09

Drive & Sheets

Uploads both PDFs to Google Drive under a folder named for the company. Appends one row to your tracking spreadsheet: title, company, score, salary, location, and direct PDF links.

$.venv/bin/python tools/upload_and_log.py
done — check your Drive

Run it yourself

~10 minutes of setup, then it's hands-off
1

Clone and install

Create a virtual environment, install Python dependencies, and install Playwright's Chromium browser for PDF rendering.

$pip install -r requirements.txt && playwright install chromium
2

Configure constants

Add your LinkedIn search URLs (one per weekday), scoring criteria, application prompt, and Google Drive/Sheets IDs in the constants/ directory. Templates are provided.

3

Add credentials

Set APIFY_TOKEN in .env, then place credentials.json from Google Cloud Console in the project root to enable Drive upload and Sheets logging.

4

Drop in your resume

Add a plain-text resume at .data/resume.txt and your HTML templates in application-pack/. Run the pipeline once manually, then set a Claude Code scheduled task to run it every morning.

SCHEDULEMon–Thu, 07:00
RUNTIME~4 min / run
OUTPUTS2 PDFs / job + log row
SCRAPERApify · LinkedIn Jobs
RENDERERPlaywright · Chromium
LICENSEjaimenguyen168