RoboTech Scoring
RoboTech is GT IEEE's annual robotics hackathon. In 2026 the event scaled to 120+ participants across three competition tracks — Beginner, Controller, and Autonomous — with 30+ judges scoring teams across two phases. The scoring platform I built handled all of it in real time, from team registration through final rankings.
Source is closed — the system contains judge scores, team data, and user accounts — but the live app is publicly accessible and I'm happy to walk through the architecture. View live app →
What it does
- Live scoring — Firestore real-time listeners push score changes and phase transitions to every connected client instantly. No polling, no refresh.
- Leaderboard — competitors see live rankings filtered by track. Scores aggregate automatically as judges submit.
- Role-based access — four distinct roles each have a tailored interface. Firestore security rules enforce permissions at the database, not just the UI.
- Judge management — admins assign judges to teams per phase and track submission progress live.
- Audit trail — every sensitive action (score edits, phase transitions, judge assignments) writes to an append-only log with actor ID, timestamp, and before/after state.
- Bulk import — super admins can import teams from a structured file. Each team gets a unique code for competitor login.
Scoring
Every score has two components — Task Performance and Feature Score — each worth up to 50 points, for a maximum of 100. Feature weights differ per track to reflect what each competition type values.
- Task = 10 × (Execution × 0.4 + Difficulty × 0.3 + Design × 0.3)
- Feature = 10 × (Mechanical × w₁ + Software × w₂ + Electrical × w₃ + Design × w₄)
Track weights:
- Beginner — Mech 20 · SW 30 · Elec 20 · Design 30
- Controller — Mech 30 · SW 20 · Elec 30 · Design 20
- Autonomous — Mech 10 · SW 55 · Elec 15 · Design 20
Competition flow
The competition runs in two locked phases controlled by admins. The system blocks a phase from closing until all assigned judges have submitted.
- Phase 1 — all teams scored by multiple judges; scores averaged across all assigned judges; top N teams advance via auto or manual selection
- Phase 2 — admin designates a single Final Judge; that score is the definitive result; Phase 1 scores preserved in the audit trail
Roles
- Super Admin — full system control: invite users, configure competition settings, bulk import teams, read access to every action
- Admin — competition day-of: assign judges, monitor scoring progress, advance phases
- Judge — scores assigned teams across all criteria; sees anonymized peer scores after their own submission locks
- Competitor — logs in with a team code; views their scores, judge comments, and live leaderboard position
Security
- Firestore security rules explicitly allow/deny per collection — judges cannot read other judges' scores before submitting, competitors have zero write access
- All input validated before writing to Firestore; score values validated server-side to the 1–5 range
- Append-only audit log on every sensitive mutation
Stack
- React 18, TypeScript, Vite
- Firebase — Firestore, Firebase Auth, Cloud Functions
- Deployed on Firebase Hosting