AI-Assisted Job Search Automation
Job Pipeline
A job-search assistant that reduces the repetitive work around finding, comparing, drafting for, and tracking roles without applying on the candidate’s behalf.

The problem
Finding new listings, removing duplicates, checking fit, drafting from real experience, and tracking outcomes consumes time before an application is even sent.
A retry can surface the same role twice, a fluent draft can claim unsupported experience, and an automated sender can take away the candidate’s final judgment.
My contribution
Workflow Automation Engineer
Solo project · Validated; disabled by default
Designed seven independently scheduled n8n workflows for discovery, drafting, Slack alerts, manual review, archival, analytics, and recommendations.
Built the pipeline from versioned configuration, an 89-field canonical job record, additive Google Sheet migration, and 147 deterministic tests.
The choices behind the work
The pipeline prepares a smaller, better-supported review queue; the candidate decides what is true, worth pursuing, and ready to send.
Generate seven automations from one policy
Editing exported workflows directly would let runtime behavior drift from profile, ranking, alert, analytics, and application rules.
Treat versioned configuration as the source of truth and generate the seven workflow exports and Sheet setup from it.
Review and test one set of rules before producing the files n8n and Google Sheets consume.
Give every listing one durable identity
Independent schedules, retries, legacy rows, and reviewer actions could otherwise duplicate work or overwrite a newer decision.
Use canonical job identities, append-only claims, processing tokens, state guards, idempotent upserts, and archive confirmation before deletion.
Recognize the same listing across active and archived Sheets even when work overlaps or retries.
Automate preparation, never submission
The pipeline needed better prioritization and feedback without allowing generated output or aggregate analytics to take action for the candidate.
Keep review, Apply Points, submission, and outcomes explicit while limiting analytics and weekly recommendations to versioned, evidence-backed advisory output.
Use past outcomes to improve the review queue without making the candidate’s decision.
The system prepares and prioritizes work but never applies for a job.
Outcome
Separates discovery, generation, Slack alerts, manual review, archival, analytics, and recommendations into independently scheduled n8n workflows.
Runs a versioned search catalog while reconciling active and archived records around one canonical job identity.
Covers profile and policy contracts, discovery, ranking, generation, review, alerts, archival, analytics, recommendations, generated artifacts, and a synthetic lifecycle.
Prepares application material while requiring the candidate to review and submit every application.
What I learned
The safest way to maintain exported automation is to generate it from checked-in rules instead of editing seven copies by hand.
A durable listing identity matters more than row position when schedules overlap, retries happen, and records move to an archive.
What comes next
Enable external services one at a time, inspect real listing, Sheet, model, and alert behavior, then increase the schedule frequency.
The 147 deterministic tests prove checked-in behavior, not better application conversion or reliable live provider performance.
Stack
- n8n
- Node.js
- JavaScript
- Groq API
- Google Sheets API
- Google Apps Script
- Slack Webhooks