all projects
Pharmacy Job Finder preview

Pharmacy Job Finder

Privatetools

Node.js bot that scrapes 4 pharmacy job platforms hourly and sends real-time Telegram alerts for matching listings. Cron-scheduled, production-deployed, saves 3+ hours daily.

Node.jsPuppeteerTelegram APICron
Replacing 3 hours of daily job-hunting with a Telegram ping.

The problem

A family member was spending 3+ hours/day refreshing 4 pharmacy job platforms looking for new listings — slow, repetitive, and they kept missing fast-moving postings that closed within hours.

The approach

Built a Puppeteer-driven scraper that polls each of the 4 platforms hourly via cron, dedupes against a small JSON-Lines history file, and pushes new listings to a private Telegram channel with a one-tap 'open posting' link. Each platform has its own scraper module so a layout change at one site doesn't break the others. Deployed to a small VPS with PM2 supervision.

Tech decisions

Puppeteer over fetch
Most job boards render listings client-side; Puppeteer handles JS-rendered DOMs reliably
Per-platform scraper modules
Isolated blast radius — one site changes layout, the other three keep working
JSON-Lines dedupe history
Cheap, append-only, human-readable; no DB needed at this scale
Telegram alerts
Notification reach without writing a mobile app

Outcomes

  • Saves 3+ hours of daily manual search time
  • Real-time Telegram alerts on matching listings
  • Per-platform isolation — one site's redesign doesn't break the others
  • Production-deployed under cron + PM2 supervision

What I learned

The best small automations replace specific, painful human routines — not 'general productivity'. Tying the output to a notification channel the user already lives in (Telegram, email) beats building a dashboard they have to remember to check.