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.

Public evidence
These reviewed public sources support the adjacent build claims; they do not imply adoption or unmeasured outcomes.
Problem
- Target user
- A job candidate reviewing OnlineJobs.ph at scale who still wants to judge fit and submit every application personally.
- Challenge
- Finding new listings, removing duplicates, checking fit, drafting from real experience, and tracking outcomes consumes time before an application is even sent.
- Why it mattered
- 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.
Constraints
- The seven n8n workflows run independently and must handle retries, moved rows, unfinished work, and older records.
- Drafts and scoring must stay grounded in one versioned candidate profile and policy set.
- Live OnlineJobs.ph, Google Sheets, Groq, Slack, and n8n actions are disabled by default while deterministic checks run.
Solution
The pipeline prepares a smaller, better-supported review queue; the candidate decides what is true, worth pursuing, and ready to send.
- Twenty-two evidence-linked searches find listings and compare them with active and archived history using a canonical job identity.
- Qualification and opportunity scores prioritize roles before Groq prepares experience-grounded application material and Slack alerts.
- The candidate performs manual review, submits outside the automation, records outcomes, and receives deduplicated analytics and recommendations.
Engineering Decisions
Generate seven automations from one policy
- Constraint
- Editing exported workflows directly would let runtime behavior drift from profile, ranking, alert, analytics, and application rules.
- Decision
- Treat versioned configuration as the source of truth and generate the seven workflow exports and Sheet setup from it.
- Rationale
- Review and test one set of rules before producing the files n8n and Google Sheets consume.
- Validation
- The validation command checks generated-artifact drift and runs 147 deterministic tests without live service calls.
Give every listing one durable identity
- Constraint
- Independent schedules, retries, legacy rows, and reviewer actions could otherwise duplicate work or overwrite a newer decision.
- Decision
- Use canonical job identities, append-only claims, processing tokens, state guards, idempotent upserts, and archive confirmation before deletion.
- Rationale
- Recognize the same listing across active and archived Sheets even when work overlaps or retries.
- Validation
- Regression fixtures cover duplicate discovery, stale claims, concurrent review, partial archive writes, row shifts, and legacy records.
Automate preparation, never submission
- Constraint
- The pipeline needed better prioritization and feedback without allowing generated output or aggregate analytics to take action for the candidate.
- Decision
- Keep review, Apply Points, submission, and outcomes explicit while limiting analytics and weekly recommendations to versioned, evidence-backed advisory output.
- Rationale
- Use past outcomes to improve the review queue without making the candidate’s decision.
- Trade-off
- The system prepares and prioritizes work but never applies for a job.
Outcomes
Product and delivery
7 workflows
Jobs split by responsibility
Separates discovery, generation, Slack alerts, manual review, archival, analytics, and recommendations into independently scheduled n8n workflows.
22 queries
Repeatable search coverage
Runs a versioned search catalog while reconciling active and archived records around one canonical job identity.
Manual-only
Candidate keeps control
Prepares application material while requiring the candidate to review and submit every application.
Implementation evidence
147 tests
Checked without live actions
Covers profile and policy contracts, discovery, ranking, generation, review, alerts, archival, analytics, recommendations, generated artifacts, and a synthetic lifecycle.
Learnings and Next Steps
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 I would improve
- Enable external services one at a time, inspect real listing, Sheet, model, and alert behavior, then increase the schedule frequency.
What remains unvalidated
- The 147 deterministic tests prove checked-in behavior, not better application conversion or reliable live provider performance.