Intern8n
The problem
I'm in my final year and was hunting for internships manually every week. I wanted an agent that does that search for me, automatically, and only surfaces relevant roles.
What I did
I used SerpApi's Google Jobs search. Generous free tier, and I wanted to keep the whole project free. Results get filtered for actual internships, then checked against a Google Sheet tracking jobs I've already seen, so I don't get mailed the same listing twice.
An LLM ranks what's left against the role I asked for and scores relevance. Early on, the LLM sometimes hallucinated the apply link. I fixed it by pulling the real apply links straight from the SerpApi data in code, and telling the LLM not to touch URLs at all.
Two triggers feed the same pipeline: a chat trigger for when I want to search on demand, and a weekly schedule trigger that runs on its own. That schedule trigger is what actually makes this an agent. Even without my input, it runs on the chosen day and emails me the results.
I built a failure handler, since I stuck to free-tier LLMs (Groq and Gemini) and both can hit rate limits. I tested it by deliberately disconnecting both. Instead of failing silently, it emails me that ranking failed, so I'm not left guessing whether it ran.
Architecture
flowchart LR
CHAT["Chat Trigger (on demand)"]
SCHED["Schedule Trigger (weekly)"]
CHAT --> SEARCH
SCHED --> SEARCH
SEARCH["SerpApi: Google Jobs Search"]
SEARCH --> FILTER["Filter: internship only"]
FILTER --> DEDUP["Google Sheet dedup check"]
DEDUP --> RANK["LLM Rank (Groq / Gemini)"]
RANK --> EMAIL["Email Results"]
RANK -.-> FAIL["Failure Handler"]
FAIL --> EMAILWhat came of it
It works. A typical run ranks and sends up to 5 internships to my email, and I've applied to some it surfaced. It's not deployed long-term yet; I'm still looking for a free way to host it and run it on a real schedule. The failure handler has only been tested deliberately, not proven under real conditions.
- Free-tier only (SerpApi, Groq, Gemini)
- Weekly schedule + on-demand chat trigger
- Up to 5 ranked results per run
- Failure handler tested via deliberate disconnect
Next time
Deploy it. Everything else was a good learning experience as-is.