←Projects

InternTrack

2025

A job application tracker I built during recruiting season to keep track of applications and see how the search was going.

ReactTypeScriptTailwind CSSViteGitHub

I built InternTrack during recruiting season because keeping track of applications in a spreadsheet was becoming difficult. Statuses would get outdated, I would lose track of follow-ups, and after a few dozen applications, it was hard to get a sense of how the search was going. I wanted one place where I could keep everything organized and see how applications were moving through the pipeline.

Each application has a company, a role, and notes. Applications move through Applied, Online Assessment, Interview, Offer, and Closed. Every status change is saved to that application's timeline, so I can still see its previous statuses.

The dashboard also tracks counts and response rates for each stage. Since everything comes from the same application list, these numbers update whenever I make a change.

One application through the pipeline
Stripe
Mar 4
Software Engineer
Applied
Applied8

Mar 4 · Application submitted

Online Assessment3

Mar 11 · Assessment sent

Interview2

Mar 18 · Interview loop

Offer1

Mar 25 · Offer received

Closed4

·

Stripe is Applied. The count on that stage includes it.

Each application has a current status and a timeline of previous changes. The dashboard groups applications by their current stage, including Closed.

Implementation

The app is built with React and TypeScript, bundled with Vite and styled with Tailwind CSS.

All applications are stored in one list, and the different folders are just filters on that list. The application cards, timelines, and dashboard statistics all use the same data, so changing an application's status updates everything together.

One list, every view
Change
Stripe
Software Engineer
Applied
Record
folder
Summer 2025
status
Applied
timeline
Mar 4 · Applied
Mar 18 · Interview
Views
JobCard
Applied
Timeline
Mar 4 · Applied
Stats
2 interviewing

Stripe is Applied. The card, the timeline, and the stats already agree.

Changing an application's status saves the update and adds an event to its timeline. The cards, timeline, and statistics all reflect the change.

I also added a way to create applications directly from a job description. Instead of filling in every field manually, you can paste a posting and have a model extract the role, company, location, experience requirements, skills, remote status, and notes into a JSON object.

The form fills in using the response, and you can review or edit the details before saving. If the response cannot be parsed, it falls back to default values that can still be edited.

Once saved, the application is added with an Applied status and its first timeline entry. From there, it works just like any other application.

From a posting to a record
Posting
Software Engineer (Fall 2025)
Stripe · Toronto, ON
React, TypeScript

{ role, company, location, skills }

Fields
role
—
company
—
location
—
skills
—
Application
status
—
timeline
—

A job posting starts as a block of text.

The model extracts the job details into JSON. The title and location are cleaned up before saving, and the result becomes a regular application.

I used InternTrack throughout that recruiting season.