Public project

Jobs Tracker Bot

An async Python bot that reads ATS, employer, and curated job feeds, applies hard eligibility and fit checks, persists deduplicated matches in SQLite, and routes immediate or digest alerts to Discord and Telegram.

Role
Designed and implemented the aggregation, filtering, scoring, persistence, notification, scheduling, health, concurrency, and delivery pipeline.
Result
Turns heterogeneous job feeds into deterministic, SQLite-deduplicated immediate, digest, and diagnostic outcomes.
Stack
Python · SQLite · Docker · GitHub Actions · Discord · Telegram

System architecture

The building blocks in view

Read the system as text
  1. ATS and employer boardsDirect employer feeds such as Greenhouse, Ashby, Personio, Lever, Workable, and JSON-LD career pages.Connects to Source adapters (job data).
  2. Curated job feedsConfigured secondary sources supplement direct employer boards.Connects to Source adapters (job data).
  3. Async scan schedulerAPScheduler starts scans and periodic operational tasks.Connects to Source adapters (runs scans).
  4. Source adaptersAsync provider-specific acquisition is isolated from the shared pipeline.Connects to Eligibility and scoring (normalised jobs).
  5. Eligibility and scoringHard eligibility, role, stack, language, recency, NGO classification, and match scoring.Connects to SQLite job store (accepted jobs).
  6. SQLite job storeURL/content deduplication, jobs, and notification state persist across scans.Connects to Alert router (new match tiers).
  7. Alert routerRoutes immediate, digest, and diagnostic tiers.Connects to Discord and Telegram (alerts and digests).
  8. Discord and TelegramImmediate alerts and digest delivery channels.

Key decisions

What shaped the implementation

Isolate source adapters

Reason
Kept provider-specific acquisition behaviour outside the shared pipeline.
Trade-off
Each source needs its own adapter maintenance.

Keep eligibility and fit separate

Reason
Made location suitability and role relevance reviewable as distinct decisions.
Trade-off
Requires more pipeline stages than one combined score.

Persist before alerting

Reason
Prevents duplicate alerts across scheduled runs.
Trade-off
Introduces stored notification state to manage.

Outcome

Verified delivery

520+

Automated tests

Pipeline and adapter coverage.

Docker

Containerised delivery

GitHub Actions

CI and deployment