Skip to content
Work

Full-stack automation

Internship Radar

A personal tool that scrapes placement listings into one ranked feed, filters out placeholder roles, explains every fit score rule by rule and tracks where each application stands.

Data
One scraper, plus manual entryRateMyPlacement, de-duplicated and filtered
Backend
FastAPI, SQLAlchemy, PostgreSQLRule-based fit score, explained rule by rule
Interface
React, TypeScriptRadar, Shortlist and Pipeline over one dataset
Testing
180 backend tests (pytest)Plus 36 frontend tests (Vitest)
Internship Radar's Radar view: 8 of 118 roles after a placement and internship filter, ranked by fit score, with the top role, G-Research's AI Engineering Internship 2026 scoring 60, open beside the list with its application tracker and the rule-by-rule explanation of its score.
Real listings collected by the scraper in April 2026, ranked by fit, with the top role’s score explained. Application statuses were reset for the screenshots.

01

Collecting listings

Placement listings are spread across job boards and padded with “register your interest” posts that are not real roles. Internship Radar pulls listings into one place and removes that noise before anything is scored.

  • A scraper reads RateMyPlacement’s technology listings (now higherin.com) from the JSON embedded in each results page rather than from fragile markup, then fetches each detail page for the description.
  • Requests are spaced out, and listings are de-duplicated by URL in memory, against the database and with a unique constraint.
  • Placeholder listings such as expressions of interest and talent pools are filtered out before saving.
  • Roles found elsewhere can be added by hand; the API rejects a duplicate URL with a 409.

02

A score that explains itself

Each listing gets a fit score from 0 to 100 when it is added. Five rules award points: a placement or internship role (+30), tech keywords (+5 each, up to 30), Manchester (+20) or UK, remote or hybrid (+10), stated requirements (+10) and a modern stack (+10). Three penalties subtract: graduate-only roles (−40), unpaid or volunteer roles (−50) and off-target departments such as sales or audit (−30).

Transparent rules over a model
For one user and one source, a hand-weighted score is explainable and testable. Keywords match as whole words, with plurals for longer words and capitalised acronyms inside words such as RESTful, so short terms do not match inside unrelated ones.
The explanation comes from the scorer itself
Every job the API returns carries a breakdown built from the same Python scoring module that produced its score: each rule’s points, maximum, state and the words that matched. The browser never recalculates a score, so the explanation cannot drift from the number.
Score explanation for CGI's Technical Graduate Programme 2026: four of five rules matched (tech keywords python, java, javascript and sql +20, Manchester +20, stated requirements +10, a modern stack +10) and a graduate-role penalty of −40, for a total of 20 out of 100.
Every point traces to a rule and the words that matched it. Here a graduate-scheme penalty outweighs four matched rules.

03

Tracking applications

Tracking as state, not notes
Each role moves through new, applied, interview, offer or rejected, with shortlisting kept as a separate flag. Radar, Shortlist and Pipeline are three views over the same data, so a change made in one shows in the others.
Changes apply at once and stay reversible
Status and shortlist changes update the interface immediately, roll back if the server rejects them, and can be undone.
  • Shortlist groups saved roles by what to do next: considering, worth considering (the highest-fit open roles not yet saved), deadline passed and already in the pipeline.
  • Filters cover search, role type with live counts, location, deadline window, minimum fit and status, and the current view and selected role live in the URL.
  • On phones the list and the role become separate screens with a back bar, and filters open in a bottom sheet.
Shortlist view: one role under Considering, three highest-fit open roles suggested under Worth considering, and two saved roles under Deadline passed.
Shortlist groups saved roles by what to do next and suggests the highest-fit open roles not yet saved.

04

Limits

  • One automated source. Other boards appear as sources only for roles added by hand.
  • Scraping runs as a script rather than on a schedule.
  • Scoring preferences such as Manchester are fixed in code, not user settings.
  • Single-user with no authentication, and schema changes are applied without migrations.
  • CI runs the backend tests and the frontend build, but not the frontend tests.