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.
Fires Mon–Thu at 07:00. Rotates LinkedIn search URL by day of week so you hit different roles across the week.
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.
Drops any listing whose ID already appears in seen_ids.json. Marks the new ones as seen so future runs skip them automatically.
Reads .data/resume.txt and optionally scrapes your portfolio URL, then outputs a structured JSON profile the scoring agent uses as its reference.
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.
Jobs at or above your configured threshold continue to document generation. Everything below is logged as skipped — score and reason preserved for review.
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.
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.
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.
Create a virtual environment, install Python dependencies, and install Playwright's Chromium browser for PDF rendering.
Add your LinkedIn search URLs (one per weekday), scoring criteria, application prompt, and Google Drive/Sheets IDs in the constants/ directory. Templates are provided.
Set APIFY_TOKEN in .env, then place credentials.json from Google Cloud Console in the project root to enable Drive upload and Sheets logging.
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.