I moved my job-search automations off my laptop onto a hardened cloud server, behind a zero-trust tunnel, with scheduled daily runs and nightly backups.
~1,000 posts processed → ~80 AI-shortlisted daily · hours of manual work automated · zero open ports
GitHub soon
~1,000posts processed / day
~80shortlisted / day
0open inbound ports
24/7automated
01Architecture
02The problem
Searching LinkedIn, Indeed, Bayt and Workable by hand every day took hours, and my automations only ran while my laptop was on.
03What I built
An ARM server on Oracle Cloud running n8n and cloudflared with Docker Compose, with no app ports published on the host.
Cloudflare Tunnel and Access in front of n8n, so the only way in is an email PIN for a single allowed user, then n8n's own login.
A daily pipeline that scrapes four job boards, normalizes and de-duplicates posts, pre-scores them in JavaScript, then lets an LLM extract job facts and decide.
Nightly backups of workflows and encrypted credentials with 14-day retention, plus a monthly off-server copy.
04Challenges
Google OAuth tokens expired every 7 days in "Testing" mode; moving the consent screen to production fixed it.
Re-runs created duplicate rows until de-duplication checked the sheet across runs.
05Results
The daily job pipeline runs unattended in the cloud. My laptop no longer needs to be on.
About 1,000 posts in, about 80 ranked and shortlisted out, with zero duplicates on re-runs.