← Work

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
ReactTypeScriptNode.jsPostgreSQL
Internship Radar — scored listings, filters, and detail panel

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 and per-role status tracking

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.