Skip to content
All projects

Product & technical · Live in production

Apply180

USC’s first end-to-end club recruitment platform.

Every semester, 180 Degrees Consulting at USC ran recruiting across Google Forms, Drive folders, spreadsheets, email threads, and group chats. I designed and built one production platform to replace that fragmented process, from the first application through blind review, interviews, team cases, final decisions, and communication.

Role
Product and engineering, built end to end
Status
Live in production
Built for
180 Degrees Consulting at USC
The 180 Degrees Consulting chapter at USC: around two dozen students in business attire gathered on a ledge outside a brick campus building.
Applicants managed and evaluated
500+
Structured evaluation rounds
3
Distinct user groups
3
Automated test suites
100+

Apply180 is being used for 180 Degrees Consulting USC’s Fall 2026 recruitment cycle, with every application evaluated through the platform. The chapter admits roughly 8 to 15 people; the platform runs the process, and people make the decisions.

The problem

Recruiting ran on whatever tools were nearest to hand: Google Forms for applications, a shared Drive for resumes, one spreadsheet for reviewer assignments and another for scores, email for scheduling, a group chat for decisions. Every seam between two tools is a place where fairness and privacy quietly come apart, and the failures land on applicants rather than on the people running the process.

  • Reviewers could see whose application they were reading.
  • Scores could attach to the wrong person, or strand in a spreadsheet nobody reopened.
  • Two interviewers could book the same applicant, or the same slot.
  • Reviewer workloads drifted, so some applications got more attention than others.
  • An applicant could learn their outcome from the wrong channel.
  • Demographic and evaluation data sat one careless share from the wrong audience.

Three groups, one system

Applicants

Any USC student

Apply, upload a private resume, edit until the deadline, book an interview and a team-case session, and see where they stand.

Internal members

Reviewers and interviewers

Read anonymous applications, run interviews, grade team cases, and take an assignment load balanced against everyone else’s.

Administrators

Recruitment leadership

Configure the cycle, staff each round, run deliberation, record decisions, and control what applicants receive.

Some of what one group needs is information another must never have. That makes permissions and information boundaries the substance of the product rather than a setting inside it.

The same cycle, three ways

The applicant view of Apply180: a written application with saved drafts and a progress bar, a private resume upload, a review-your-answers screen, and interview and team-case booking.
Applicant: apply, save a draft, upload a resume, and book both sessions.
The reviewer view of Apply180: an assignment queue of anonymous applicant codes, a scored written application with no name attached, and interview and team-case evaluation forms.
Reviewer: a queue of anonymous codes, a rubric, and a panel spelling out what a reviewer cannot see.
The administrator view of Apply180: cycle overview, applicant records, written review progress and balanced assignment, interview scheduling, team-case sessions, deliberation, decisions, email campaigns, conflicts of interest, and launch readiness.
Administrator: staffing, assignment, scheduling, deliberation, decisions, and the email that follows.

Recorded in the seeded demonstration environment the end-to-end tests run against. Every name, essay, and score here is a fixture, and the counts are the test cycle rather than the live one.

The principle

The fair behavior should be the only behavior the system can express.

A rule that depends on people remembering it gets broken by someone in a hurry. There are about thirty of these, each written down with the specific failure it prevents. Six of them:

Blind review is a database rule

Identity is stripped at the permission layer, not hidden in the interface, so a reviewer cannot recognise a friend or a classmate.

Demographic questions cannot reach reviewers

There is no setting that makes them visible. The switch was never built.

Scores never produce a decision

Nothing advances or rejects automatically, so nobody can point at a number and call it the verdict.

Applicants cannot read their outcome early

The internal value is not retrievable from an applicant session, so results arrive the way the chapter intends.

Interviewers are hidden from each other until both submit

Two independent reads stay independent, with no anchoring to a score already seen.

Recording, releasing, and emailing are separate acts

The chapter calls before it emails, so recording an outcome can never send it by accident.

What I built

  • Application intake: structured application, saved drafts, deadline enforcement, private resume upload.
  • Blind written review: anonymous applications, balanced loads, two independent reads, conflicts declared up front.
  • Interviews: self-service scheduling, and an evaluation each interviewer completes alone.
  • Team case: session planning, a reproducible room draw, and a grader rotation where nobody assesses the same applicant twice.
  • Deliberation and decisions: every piece of evidence in one committee view, outcomes recorded by hand.
  • Communications: versioned campaigns with delivery tracking, and a merge-field allowlist so no score, demographic, or reviewer note can reach a message.

Decisions worth defending

No automated admissions decisions

No ranking formula, composite score, threshold, or model. Admitting a dozen people from hundreds is exactly where a tidy number gets trusted more than it has earned.

No AI-detection system

Every available approach produces false positives, and a false positive costs an applicant their place while costing the chapter nothing. The platform records acknowledgment of a written AI-use policy instead.

Privacy enforced structurally

Identity and demographic data are unreachable at the permission layer. A field hidden only on screen protects nobody.

Concurrency as a system constraint

Nobody can be booked into overlapping commitments, enforced where the data is written rather than checked in the browser.

Scope held to one complete cycle

Event management, document management, and historical analytics were specified and then left out. Nothing shipped that a full cycle could run without.

How it is built

Next.js 16 and React 19 in TypeScript, on PostgreSQL through Supabase with Auth and private storage, plus Tailwind, Resend, and Vercel. The fairness rules live in the database as row-level security policies, functions, triggers, and constraints, so they hold no matter which client is asking. That is the difference between a policy the product follows and one it cannot break.

  • Roughly 74,000 lines of TypeScript and 59,000 of SQL across 76 append-only migrations.
  • 47 unit suites, 20 database-authorization suites, and 35 browser end-to-end suites.
  • Concurrency race testing, a 1,200-application performance fixture, and WCAG 2.2 AA checks.

Outcome

Apply180 is now live for 180 Degrees Consulting at USC, where more than 500 applicants are moving through a recruiting process managed and evaluated entirely on the platform. What began as a replacement for scattered tools became a lesson in designing high-stakes systems: efficiency matters, but trust comes from deciding what the product must make impossible.

View Apply180 liveapply180usc.orgOpen the platform (opens in a new tab)