Project
A fully automated job-search pipeline that scans remote job boards daily, filters matches against target keywords, and generates a tailored resume and cover letter for each one — delivered by email every morning, with zero manual work and zero recurring cost. Built with Python, Groq AI, GitHub Actions, and Gmail.
Job hunting is repetitive by nature — the same information gets re-typed and re-tailored, posting after posting. Most "auto-apply" tools solve this by scraping platforms like LinkedIn or Indeed and submitting applications with no human involved. That approach is fast, but built on a foundation that doesn't hold — those platforms explicitly prohibit bots and actively ban accounts caught running them.
This agent takes a different path. It sources only from job boards with free, public
APIs meant to be queried programmatically, filters listings against a keyword list,
and for every genuine new match, uses an LLM to tailor a professional summary and reorder
skills to fit that specific posting — never inventing new experience, only
reframing what's already true. The tailored resume and cover letter are generated as real
.docx files and emailed directly, attached and ready to send.
Runs entirely on free-tier infrastructure — no server to maintain, no recurring cost, and nothing running against a platform's Terms of Service.
Actual console output from a production run, triggered manually to verify the pipeline end-to-end before enabling the daily schedule.
// GitHub Actions run #1 — succeeded in 21s · install deps → run agent → commit + push results
| # | Step | Tool | Status |
|---|---|---|---|
| 1 | GitHub Actions wakes on a daily cron schedule (or manual trigger) and checks out the repo | GitHub Actions | ✓ Live |
| 2 | Script queries three free job-board APIs and filters listings against the keyword list | Remotive · Arbeitnow · RemoteOK | ✓ Live |
| 3 | Matches are checked against a processed-jobs log so nothing gets sent twice | Python — JSON log | ✓ Live |
| 4 | Each new match is sent to the LLM with the base resume — returns a tailored summary, reordered skills, and a full cover letter, grounded only in real experience | Groq AI (llama-3.3-70b) | ✓ Live |
| 5 | Tailored content is rendered into a formatted resume and cover letter as real, downloadable Word documents | python-docx | ✓ Live |
| 6 | One digest email is sent — job title, company, summary, posting link, resume + cover letter attached. Results also committed to the repo as a permanent archive | Gmail SMTP + Git | ✓ Live |
The pipeline works end-to-end, but "working" and "finished" aren't the same thing. These are the next real improvements planned — fine-tuning an already-live system, not fixing something broken.
This project didn't start with a fixed architecture. It went through a few real pivots as constraints — cost, platform rules, tool limits — came into focus.
The first idea was the obvious one — an agent that finds jobs and submits applications everywhere automatically, LinkedIn and Indeed included. That plan didn't survive first contact with those platforms' Terms of Service, which explicitly prohibit bots and actively ban accounts caught running them.
The design shifted to sourcing only from platforms with free, public APIs meant for programmatic use, and stopping short of submission entirely — the agent hands over a link, a tailored resume, and a cover letter, and a human still sends it.
Make.com's free tier offered a faster visual build, but its 1,000-operations-per-month ceiling would have been exhausted almost immediately by daily runs. GitHub Actions has no such ceiling and already hosted the code, so it became the scheduler.
Claude's writing quality is stronger, but its free allowance is a one-time trial credit, not an ongoing tier. Groq offers a genuinely free, ongoing allowance — the better fit for a tool meant to run indefinitely during an active job search.
The first production run found a genuine remote administrative-support match, generated a tailored resume and cover letter, and delivered both by email — end to end, unattended, for free.
Shipping the pipeline wasn't the end of the story. The first real run surfaced a small but visible formatting bug — the kind that's easy to miss in testing but immediately obvious once real data flows through.
_clean() helper using Python's built-in html.unescape()This agent runs on a private GitHub repository, scheduled daily via GitHub Actions. It's not a public demo — it's a working piece of personal infrastructure, actively finding and preparing job matches every morning without any manual input.
// stack: Python · Groq AI · GitHub Actions · python-docx · Gmail SMTP — $0/month