Job Discovery
Internship Radar
A full-stack platform that aggregates placement and internship listings from multiple sources, scores them for relevance, and tracks every application from discovery through to offer.
Live Demo
Dashboard — three-panel view with fit scoring, real-time filtering, and role detail.
Overview
Internship Radar pulls placement and internship listings from multiple job boards into one interface, scores each one 0 to 100 against a student profile, and tracks every application from save through offer. Before a tool like this, tracking applications across boards usually means a spreadsheet, one row per role, updated by hand after every site check.
- —Aggregates listings from multiple job boards into one place.
- —Scores each role 0–100 against a student profile.
- —Tracks applications through applied, interview, and offer stages.
- —Discovery and tracking are separate views, not one screen doing both.

My Applications — aggregate statistics, activity feed, and status tracking per role.
Build
The layout is three panels: filters on the left, scored listings in the centre, role detail on the right, so nothing requires a page change. The Applied view is a separate screen from discovery entirely, since searching and tracking are different tasks with different mental models.
The Node.js API aggregates listings from each source, normalises them into one schema, then runs a weighted scoring algorithm against the student's profile. PostgreSQL stores roles, users, saved listings, and full application history, with every status change recorded as an event rather than overwritten.
Frontend
React · TypeScript
Three-panel layout with tab-based navigation between Dashboard, Saved, and Applied.
Backend
Node.js · REST API
Multi-source aggregation, schema normalisation, fit score computation, and state management.
Database
PostgreSQL
Roles, users, saved listings, application records, and status history.
Data Pipeline
Aggregation layer
External listings scraped and normalised into a consistent schema before scoring.
Normalising listings across job boards ended up taking longer than writing the scoring algorithm itself. Every source formats fields differently, and getting that schema right early mattered more than any single scoring tweak.