Filtering Freelance Leads: Recency Windows and Job‑Board Rules in My Home‑Hosted Scanner
Description and use
The author built a filter layer for a freelance job board scanner, limiting results to fresh posts and removing noise by applying recency windows and board‑specific rules.
Problem
Freelance job boards return stale or noisy listings, making it hard to identify fresh, relevant opportunities for personal projects.
Outcome
The filter pipeline reduces noise and stale data, delivering a focused set of fresh freelance leads to Slack.
Workflow
- 1. Cron job triggers Node.js script every 30 minutes.
- 2. Script fetches raw JSON feeds from each board.
- 3. Normalises payloads into a common shape (id, title, board, postedAt, budget, description, url).
- 4. Applies recency filter based on per‑board window (config/recency.json).
- 5. Applies board‑specific rules (upworkRule, freelancerRule, guruRule).
- 6. Sends surviving leads to Slack via webhook.
Evidence
When I started scanning freelance job boards for my own projects, I quickly ran into two problems: most listings were stale, and each board had its own quirks that made a naïve scraper return a lot of noise.
The scanner runs on a modest Raspberry Pi 4 that I keep in my garage.
A cron job triggers a Node.js script every 30 minutes.
The filter reads this file at start‑up: // src/filters/recency.js ... const minutes = recencyConfig[job.board] || 60;
I encode these as small predicate functions: // src/filters/boardRules.js ... function upworkRule(job) { if (job.budget === 0 && !/fixed-price/i.test(job.title)) return false; return true; }
- Record date: 2026-11-01T23:14:09.659Z