# We Built a March Madness Bracket Projector in One Night

*From "feat: brackets" to simulated tournament outcomes in under three hours. Here's how — and what NCAAB prediction taught us that NBA prediction didn't.*

## The Spark

It was March 18th, 2026. The NCAA tournament was about to start. We'd been building EdgeGoat for just over two weeks, and we had a working NCAAB prediction model — trained on the regular season, backtested, calibrated. It was hitting 68.8% win accuracy on college basketball games.

Then someone (me) asked: "What if we ran the model forward through the entire bracket?"

Three hours later, at 11:46 PM, we had a working bracket projector. The commit log:

```
10:32 PM  feat: brackets
10:47 PM  fix bracket call
10:57 PM  fix: bracket
11:02 PM  chore: move first 4 to the bottom
11:15 PM  feat: project forward
11:29 PM  feat: bracket projections
11:46 PM  maybe this time is good
```

Seven commits. One evening. A bracket projector that simulates thousands of possible tournament outcomes using the same prediction pipeline that powers our daily picks.

## How It Works

The idea is simple in concept: take the bracket, simulate each game using our prediction model, advance the winners, and repeat until you have a champion.

The implementation is a bit more involved:

### Game-by-game simulation
For each matchup in the bracket, we run the full prediction pipeline — the same one we use for daily NBA/NCAAB projections. That means pace analysis, team scoring models, defensive adjustments, strength of schedule, home court (or neutral court) effects, the whole thing.

The output isn't just "Team A wins." It's a probability distribution: "Team A wins 64.3% of the time, with a projected score of 74-68."

### Forward projection
Once we simulate the first round, we advance the winners and simulate the second round. But here's the nuance: we don't just simulate once. We run it probabilistically, accounting for the uncertainty in each game.

If a 3-seed has a 72% chance of beating a 14-seed in the first round, and then a 55% chance of beating the winner of the 6/11 matchup, the probability of that 3-seed reaching the Sweet 16 is 72% x 55% = 39.6%. We propagate these probabilities through the entire bracket.

### The visualization
The frontend shows the bracket with probability bars for each team in each round. You can see at a glance which teams the model likes for the Final Four, which upsets are most likely, and where the bracket gets unpredictable.

## What NCAAB Taught Us That NBA Didn't

College basketball is a completely different prediction problem than the NBA. Building the NCAAB model forced us to confront challenges that NBA data conveniently hides:

### Small sample sizes
An NBA team plays 82 regular season games. A college team plays 30-35. Some players only have 20 games of data. Statistical stabilization that's reliable for NBA projections is noisy and unreliable for NCAAB.

Our fix: more aggressive Bayesian priors. When you don't have enough data on a player, lean harder on the league average. The NCAAB model uses stronger shrinkage parameters across the board.

### The name matching nightmare

NBA rosters are stable and well-documented. ESPN has clean, consistent player IDs. College basketball? Different story.

The "name matcher ncaab" and "ncaab fix? hopefully" commits from day one were about matching player names between different data sources. ESPN might list "D.J. Burns Jr." while the odds feed has "DJ Burns" and the play-by-play has "D. Burns." Multiply that by 350+ Division I teams and you've got a data cleaning project that never ends.

### Massive variance
In the NBA, the best team might win 75% of their games and the worst might win 25%. In college basketball, top teams beat mid-majors by 30 points, and then Cinderella stories happen in March.

The variance in NCAAB outcomes is enormous compared to the NBA. Our NCAAB model has a higher MAE simply because college games are less predictable. The talent gap between teams is wider, but the game-to-game variance is also wider. A team that should win by 15 sometimes wins by 2 and sometimes by 35.

### Chemistry matters differently
In the NBA, our chemistry model measures how specific lineup combinations perform. It's a meaningful signal worth 1.8 percentage points of win accuracy.

In NCAAB, we tried the same approach and it actually *hurt* accuracy — adding 2.7 points of prediction bias. College teams have fewer lineup variations, shorter histories together, and the chemistry signal became noise. We disabled it for NCAAB.

### Home court is massive
Home court advantage in the NBA is worth about 3-4 points. In college basketball, it's worth 5-7 points. Cameron Indoor is a different planet than a neutral-site tournament game.

Our HCA parameter for NCAAB (0.73) is nearly double the NBA value (0.43). And in the tournament, where every game is at a neutral site (sort of — geographic proximity matters), properly zeroing out home court advantage is crucial.

## Bracket Insights

Without giving away our current year's projections, here are some structural insights the bracket projector has revealed over testing:

**Mid-major upsets are underrated in early rounds, overrated in later rounds.** A 12-seed beating a 5-seed happens roughly 35% of the time historically. But that 12-seed reaching the Elite Eight? Much rarer. The model captures this: mid-majors can match up in single games but lack the depth for four wins in a week.

**Tempo mismatches create the biggest upsets.** When a slow, methodical team faces a fast, chaotic team, the variance increases dramatically. Fewer possessions mean fewer chances for the better team's talent to assert itself. The model accounts for pace, but the uncertainty bands widen significantly in tempo-mismatch games.

**The "toughest" bracket region is often not what the seeds suggest.** Seeds are assigned by committee, not by algorithm. Sometimes a 3-seed is better than a 2-seed in another region. The projector identifies the actual strength of each region, which sometimes disagrees with the seeding.

## The Speed of Shipping

The bracket projector is one of our favorite features, not because it's the most sophisticated, but because of what it represents: the compound advantage of having a solid prediction infrastructure.

We didn't build a bracket projector from scratch. We already had:
- A NCAAB prediction model (built over weeks of calibration)
- A game data pipeline (ESPN API integration from day one)
- A projection client (the interface between frontend and backend)
- A frontend component system (React components for displaying game data)

Building the bracket was "just" connecting these existing pieces in a new way. The prediction model didn't change. The data pipeline didn't change. We added bracket-specific routing, the forward projection logic, and a bracket visualization component.

That's the power of building on a good foundation. When the March Madness tournament was two days away and we suddenly wanted a bracket feature, we could ship it in an evening because the hard work was already done.

## Did It Work?

Bracket prediction is brutal to evaluate because you get one tournament per year. Small sample size, the ultimate enemy.

What we can say: the model's round-by-round accuracy on historical data is solid. It picks more first-round upsets correctly than the consensus bracket (which tends to favor higher seeds too much). It identifies Final Four contenders that don't always match the "brand name" picks. And it gives probability estimates, not just picks — so you can build bracket strategy around confidence levels rather than binary choices.

Was our bracket perfect? No. Nobody's is. That's what makes March Madness great. But we like our odds — and we had a blast building it between dinner and midnight on a random Tuesday.

---

*We built a bracket projector in one night because we'd already built a prediction engine over two weeks. The hardest part wasn't the bracket — it was everything that came before.*

---

Source: EdgeGoat model projections (https://edgegoat.com) — CC BY 4.0
Canonical: https://edgegoat.com/learn/march-madness-bracket-in-one-night
License: CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/
Methodology: https://edgegoat.com/methodology
Model probabilities are estimates, not guarantees. 21+. Gambling problem? Call 1-800-GAMBLER.
