← Selected workSoftware / Product
CASE STUDY

Sprintern

An internship discovery platform with real users. It polls community-maintained job repositories, normalises and deduplicates what it finds, matches postings against each user's filters, and delivers them as instant Telegram alerts or a curated daily email digest. Users track applications from saved through to offer, and administrators can add, preview or disable a source without touching application code.

Next.jsTypeScriptFastAPIPythonPostgreSQLRedisSupabasePlaywright
Preview of Sprintern
01 / THE CHALLENGE

What needed to change.

Internship postings are scattered across community-maintained repositories that each use a different table format, and the same role frequently appears in several of them at once.

02 / THE IDEA

The system I chose to build.

An ingestion pipeline that polls each source with conditional requests, tolerates schema drift, and merges duplicates on a canonical fingerprint. Matching runs against user-defined filters and fans out to Telegram and email through a Postgres-backed job queue with idempotency keys and leased claims. Row-level security in the database sits behind the API's own ownership checks, so a mistake in one layer still cannot expose another user's data.

My role: Solo. Ingestion pipeline, REST API, background workers, database security model and frontend.

03 / ARCHITECTURE

Under the surface.

GitHub Sources. Ingest + Dedupe. Postgres + RLS. FastAPI. Telegram + Email. Next.js App.
04 / WHAT GOT HARD

The interesting parts rarely stay simple.

05 / RESULT

What came out the other side.

In production at sprintern.ca with real users, aggregating nine sources into a single feed of 1,000+ live postings.

06 / NEXT

What I would improve next.

GitHub Live demo
NEXT PROJECTSpatial Mapping System