← All projectsapprenticeship2024Under the hood ↓
Faderco HR Portal
My first production system. Built it alone, from “what do you need” to “it's live.”
An internal HR portal that retired the spreadsheets: candidate intake through offer, 50+ a cycle.
- Role
- Apprenticeship · solo, 10 months
- Stack
- DjangoReactPostgreSQLBootstrapStreamWebRTCGoogle OAuth2
- Result
- 4h → 15minper interview, once the call moved into the browser
A Screens
The interview moved into the browser
WebRTC replaced a four-hour round trip with a fifteen-minute call. This is the change the whole project is judged on.
What replaced the spreadsheet
Every candidate, stage and decision in one pipeline. Before this the process lived in a file passed between inboxes.
Intake through offer, 50+ a cycle
Applications, screening, interviews and offers as one tracked flow, so nobody is lost between two stages neither side owns.
Two roles, two surfaces
Managers raise hiring requests, HR runs the process. Each sees only the surface their job needs, off the same data.
Under the hood
Faderco HR Portal
Under the hood
Faderco HR Portal
B Architecture
A vacancy, end to end
Two staff roles and a candidate who never gets an account. Every stage moves the applicant's record one notch along a five-state ladder, and the interview happens on a private link that dies with the call.
From a vacancy to a hire
A hiring pipeline with two roles on it: managers raise the need, HR runs the process, and the interview happens in the browser.
- What people use
- Code I wrote
- Where it is kept
- Someone else's service
A vacancy becomes a hire
The whole pipeline is one chain of records. A request becomes a post, a post collects applicants, and an applicant carries an interview and an evaluation, so nothing about a candidate lives in somebody's inbox.
C Decisions
The calls that made the difference, and what each one bought.
Shipped their first remote interviewing on the Stream API. A four-hour drive each way became a fifteen-minute call in the browser.
Every interview room is a UUID with a per-candidate guest id and an expiring token, so a link cannot be forwarded into an open door.
D What it runs on
- Django
- React
- PostgreSQL
- Bootstrap
- Stream
- WebRTC
- Google OAuth2
internal tool, code stays with Faderco