How to Use Podium

Podium is a real-time hackathon judging platform. Follow the steps below to organize your event from start to finish. Each section includes an interactive demo you can try out.

Create Event
Setup Floors & Judges
Add Teams
Assign Judges
Score Teams
View Results
1

Create Your Event

After signing in, you'll land on the Event Setup screen. Here you can create a new hackathon event or select an existing one.

  • Enter an event name and year
  • Each event gets a unique ID based on the name (e.g., hackprinceton-2026)
  • All your events appear as cards you can click to open

Interactive Demo

Launch New Event

Your events will appear here. Try creating one!

2

Setup Floors & Judges

The Admin Panel (Setup) is where you configure the venue and judging staff.

Floors

  • Each floor has a name and a team number range
  • Example: "Floor 1" covers teams 1-30, "Floor 2" covers teams 31-60
  • Ranges must not overlap

Judges

  • Add judges by name (one per line)
  • Drag and drop judges between floors
  • Or use Auto-Distribute to evenly spread them

Interactive Demo

Manage Floors

FloorTeam Range
Floor 11 - 30
Floor 231 - 60

Assign Judges to Floors

Drag judges to floors, or auto-distribute

Unassigned (2)

Charlie Diana

Floor 1

Alice

Floor 2

Bob
3

Add Teams

The Teams page lets you populate your event with participating teams. There are multiple ways to add them:

Generate

Set a prefix, start number, and count to auto-create teams (e.g., "Team 1" through "Team 30").

Bulk Import

Paste a list of team names (tab, comma, or colon separated) for quick import from a spreadsheet.

Manual Add

Add teams one at a time with a custom number and optional name.

Teams are automatically assigned to floors based on their number and the floor ranges you configured. You can also pause teams to temporarily exclude them from judging.

Interactive Demo

Teams (0)

No teams yet. Try generating or importing!

4

Assign Judges to Teams

The Assignments dashboard is where the magic happens. Select a floor, then assign judges to blocks of teams.

Auto Mode

  • Select which judges to assign, then click Generate & Assign
  • The algorithm assigns each judge a block of 5 teams
  • It minimizes overlap and spreads reviews evenly
  • Judges who have seen most teams are automatically marked as "Finished"

Manual Mode

  • Select a specific judge and pick teams manually
  • Already-judged teams are grayed out to prevent duplicates
  • Useful for edge cases or special assignments

Judge Statuses: Busy = currently assigned, Assignable = ready for a new block, Finished = has seen nearly all teams.

Interactive Demo

Assignable Judges

Assignment Results

Select judges and click Generate to see assignments

5

Score Teams

From the Floor Dashboard or the Assignments page, click Enter Scores on a busy judge to open the scoring form.

Ranking System

1st Place

3 points

2nd Place

2 points

3rd Place

1 point

Unranked

0 points

Each rank is exclusive per judge — only one team can be 1st, one 2nd, and one 3rd per assignment. Judges can also leave optional comments on each team.

Interactive Demo

Enter Scores for Judge Alice

CyberSquad(#1)

DataDragons(#2)

CodeCrafters(#3)

ByteBuilders(#4)

PixelPioneers(#5)

Monitoring Views & Dashboards

While judging is in progress, Podium provides several real-time views to monitor the state of your event at every level.

Floor Dashboards

Each floor gets its own dedicated dashboard tab in the navbar. This is your primary view during active judging.

Judge Panel (Left Side)

  • See all judges on this floor with real-time status badges: Busy Assignable Finished
  • Search judges by name, filter by status, and sort by name or completed assignments
  • See each busy judge's actively assigned teams listed as badges
  • Track how many teams each judge has reviewed out of the total on the floor
  • Click Enter Scores on any busy judge to immediately open the scoring form

Team Grid (Right Side)

  • Cards for every active team showing review count and assigned judge avatars
  • Filter teams by All / Assigned / Unassigned
  • Sort by team number, most seen, or least seen
  • Click any team card to see its full score detail breakdown
  • Pause or unpause teams that leave early or have issues

Judge Details Modal

Click the settings icon on any judge to open their detailed view.

Currently Evaluating

See the exact teams the judge is currently assigned to. Remove individual teams from the assignment, or cancel the entire assignment.

Completed History

Full list of all teams this judge has already reviewed, with their total completed assignment count.

Move to Another Floor

Reassign a judge to a different floor (one-time switch). Only available when the judge has no active assignment.

Team Status Matrix

Click the grid icon on the Floor Dashboard or the Assignment Dashboard to open a bird's-eye view of all teams on a floor.

Legend: Not Seen Seen (intensity = review count) Actively Assigned
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Each dot represents a team. Hover over any dot to see team details, review count, and active assignment status.

Per-Judge Matrix: You can also view a judge-specific matrix by clicking the grid icon on an individual judge. This shows only the assignments belonging to that judge, so you can see exactly which teams they've covered.

6

View Results & Export

The Results page gives you a complete overview of all scores.

Leaderboard View

  • Teams ranked by average score
  • See high, low, and average scores per team
  • Filter by floor, search by name or number
  • Sort by average, high, low, or team number
  • Click any team to see detailed score breakdown

Matrix View

  • Teams vs. Judges grid showing who reviewed whom
  • Quickly spot gaps in coverage
  • Exportable as CSV for external analysis

Export: Both the leaderboard and matrix can be exported as CSV files for sharing with organizers, sponsors, or for recordkeeping.

Interactive Demo

Final Results

RankTeam#FloorReviewsHighLowAvg
CyberSquad3Floor 143.002.002.75
DataDragons7Floor 143.001.002.50
CodeCrafters12Floor 233.001.002.33
4ByteBuilders15Floor 232.001.001.67
5PixelPioneers22Floor 122.000.001.00
?

Tips & Best Practices

Before the Event

  • Create your event and set up all floors with the correct team ranges
  • Add all judges and assign them to floors in advance
  • Generate or import teams once table assignments are finalized

During Judging

  • Use Auto Mode to quickly assign judges in rounds
  • Monitor judge statuses on the Assignment Dashboard
  • Use Floor Dashboards for a per-floor view of progress
  • Pause teams that leave early or have issues

Scoring Tips

  • Judges should rank their top 3 out of 5 teams per assignment
  • Encourage judges to leave comments for the top teams
  • Scores update in real-time across all connected devices

After Judging

  • Check the Results page for the final leaderboard
  • Use the Matrix view to verify all teams were reviewed
  • Export CSVs for your records before closing the event
  • Click on individual teams to see their full review breakdown

How the Assignment Algorithm Works

When you click Generate & Assign, Podium runs a multi-pass algorithm that distributes teams across judges as fairly and spread-out as possible. Here's a breakdown of every step.

1Shuffle Judge Order

The selected judges are randomly shuffled using the Fisher-Yates algorithm before any assignments are made. This prevents the same judges from always getting "first pick" of the best teams, and ensures fairness across multiple rounds of assignment.

2Detect Exclusive vs. Overlap Mode

The algorithm checks whether there are enough teams for each judge to get an entirely unique block of 5:

Exclusive Mode

When floor(availableTeams / 5) ≥ numJudges, each judge's 5 teams are locked exclusively — no two judges in the same batch see the same team.

Overlap Mode

When there aren't enough teams for exclusive blocks, overlap is allowed. Instead of locking teams, the algorithm uses a pressure map to minimize how many judges see the same team.

3Build Candidate Pool per Judge

For each judge, the algorithm filters out teams they've already reviewed in prior submitted assignments. This creates their candidate pool of teams they haven't yet seen.

// For each judge:
candidateTeams = allTeamsOnFloor
  .filter(team => !judge.alreadyJudged.includes(team))
  .filter(team => !lockedByOtherJudge(team))

// If fewer than 5 candidates remain, judge is skipped ("Finished")

4Two-Pass Window Scoring

The algorithm slides a window of 5 consecutive teams across the candidate pool and scores each possible block. It uses a two-pass approach:

Pass 1: Strict

Finds the best block that does not share 4 or more teams with any existing assignment (submitted or active). This prevents judges from seeing nearly identical groups.

Pass 2: Relaxed

If Pass 1 finds nothing (all blocks are too similar), re-runs without the similarity check. This ensures every judge gets something, even if it overlaps more.

Scoring Formula

Each candidate window of 5 teams is scored. The lowest score wins:

totalScore = pressureScore × 1000 + closenessPenalty

PPressure Score

Sum of review counts for all 5 teams in the window:

pressureScore = team1.reviews + team2.reviews + ... + team5.reviews

This ensures judges are sent to teams that have been reviewed the fewest times, balancing coverage across all teams.

CCloseness Penalty

The spread of team numbers within the window:

closenessPenalty = lastTeam.number - firstTeam.number

Prefers tightly grouped teams so judges don't have to walk far between adjacent tables. A block of teams 5-9 scores 4 (closeness), while 5-20 scores 15.

Why multiply pressure by 1000? This ensures review balance is always prioritized over physical closeness. A block with fewer total reviews will always beat a closer block that has more reviews. The closeness penalty is only a tiebreaker.

5Spread Logic: Shuffled Search Order

To prevent assignments from clustering at the beginning of the team list, the algorithm shuffles the order it searches through window positions. Instead of always checking windows starting at team 1, then team 2, etc., it randomizes which starting positions are evaluated first.

// Instead of checking windows [0,1,2,3,4,5...]
// We shuffle to [4,1,5,0,3,2...] so the search
// doesn't always favor early team numbers

shuffledIndices = shuffle([0, 1, 2, ..., candidateTeams.length - 5])

When multiple windows have the same score, the first one found (in the shuffled order) wins. This means even when all teams have zero reviews, the assignments will be naturally spread out across the floor.

6Overlap Reversal & Team Locking

After selecting a block of 5 teams for a judge, two final safeguards kick in:

Reversal (Overlap Mode)

If two judges in the same batch get the same 5-team block (only possible in overlap mode), the second judge's block is reversed. So if Judge A visits teams 5→6→7→8→9, Judge B visits 9→8→7→6→5. This prevents judges from colliding at the same table at the same time.

Team Locking (Exclusive Mode)

In exclusive mode, once a block of 5 teams is assigned to a judge, those teams are locked for the rest of the batch. No other judge in this round can be assigned overlapping teams.

7Cross-Batch Deduplication

Every newly assigned block within the same batch is added to the list of existing block signatures before the next judge is processed. This means each subsequent judge in the batch also avoids blocks that overlap ≥ 4 teams with blocks assigned earlier in the same generate operation, not just historical ones. The result: maximum team coverage diversity across all judges.

Algorithm Summary

Shuffle JudgesDetect ModeBuild CandidatesScore WindowsStrict PassRelaxed PassLock / ReverseCommit
Get Started with Podium

Ready to organize your hackathon? Head back and create your first event.