One Month, Three Leagues, 354 Commits

A look at the absurd pace of building EdgeGoat — told through commit timestamps, 2 AM debugging sessions, and the messages we left for ourselves.

6 min read

The Timeline

EdgeGoat went from "first commit" to a full-blown multi-sport prediction platform in 32 days. 354 commits. Here's what that actually looked like.

March 2: Day One (42 commits)

The first commit landed at 12:20 AM. By 4:53 AM, we had a working parlay tracker pulling data from Hard Rock and ESPN. The commit messages from that first night are a journey:

12:20 AM  first commit
2:01 AM   deployment
2:05 AM   workflow fix
2:07 AM   retrigger workflow
2:09 AM   update lockfile
2:15 AM   fix build errors
2:17 AM   fix api service
2:20 AM   fix attempt
2:26 AM   this should work
2:29 AM   retrigger again
2:34 AM   retrigger #1999
2:43 AM   trigger verbose
3:28 AM   allow cors
4:00 AM   fix a few issues
4:12 AM   fix migration?
4:34 AM   fix odds
4:53 AM   Parlay fix

That's 17 commits in 4.5 hours, mostly fighting deployment and CORS. Classic first night energy.

But we weren't done. After a few hours of sleep:

12:19 PM  fixes
3:16 PM   cleanup the frontend
3:21 PM   chore: fix build
3:58 PM   ncaab improvements
4:14 PM   runtime errors fix
4:39 PM   name matcher ncaab
4:51 PM   ncaab fix? hopefully
5:10 PM   job separation

By the end of day one, we had: live parlay tracking, NBA and NCAAB support, job orchestration, real-time WebSocket updates, odds matching, and a backtesting dashboard. 42 commits. One day.

March 4-8: The Prediction Engine Awakens

March 4   calibration
March 4   fix: venue adjustment on parlay builder
March 5   fix: edge against books with vig included
March 5   per leg tracking
March 7   parlay portfolio mode
March 8   fix: NCAAB seeing a massive edge on total under bets

This is where the pivot happened. We went from "track my parlays" to "predict outcomes." Calibration rounds started. The backtesting framework appeared. We were comparing our predictions to actual sportsbook odds and finding... edge? Maybe? The NCAAB under bet thing was our first brush with "is this real edge or a data bug?" (It was a bug.)

March 9-10: The Prediction Grind

MAE - NBA 15.65, NCAAB 14.0
engine v2, and latest snapshot without pbp
NCAAB tuning 67% winAccuracy
calibration round 4
round 5 adjustments
props plateau hit...
Round 10, my best guess

The "props plateau hit..." commit at the end of Round 5 is one of my favorites. It's 3 AM, you've been tweaking parameters for hours, and prop prediction accuracy just won't budge. So you commit your frustration and go to bed.

March 11-12: Strategy Mode

feat: make parlays
feat: strategy history
feat: secondary stats
feat: retune NBA pipeline
fix: thrid pass audit

Note the typo in "thrid pass audit" — committed at 12:05 AM. Spell-checking is the first casualty of late-night coding.

This was the week the Smart Builder was born. Instead of just tracking parlays you've already made, EdgeGoat started suggesting them. Finding legs with statistical edge across all available games. Optimizing combinations. Backtesting strategies.

March 14: The 3 AM Round Robin

1:00 AM   feat: round robin
1:10 AM   feat: Fix this thing
3:12 AM   fix: min bet and RR optimize

We added round robin parlay support at 1 AM and were still debugging it at 3 AM. Round robins are combinatorially complex — a 6-pick round robin generates 57 individual parlays. Getting the math right while half-asleep was... an experience.

March 16: The Hard Rock Cat-and-Mouse

12:30 PM  fix: hr missing user agent
12:45 PM  fix: potential blocked by HR?
1:03 PM   more headers
2:00 PM   better logs
2:33 PM   use curl for hardrock
2:37 PM   fix: install curl

Hard Rock started blocking our odds requests. We added user agents. Still blocked. More headers. Still blocked. Switched to curl. That worked. Until it didn't, and we eventually moved to headless browser instances. The joys of web scraping.

March 18: Three Features In One Evening

9:18 PM   feat: Hockey split pipeline
10:32 PM  feat: brackets
11:29 PM  feat: bracket projections

In a single evening, we added NHL as a third sport AND built a March Madness bracket projector. The hockey pipeline was a full fork of the basketball pipeline with sport-specific adaptations (time on ice instead of minutes, goalie models, skater props). The bracket projector simulated tournament progression using our NCAAB game model.

March 19: The Rebrand

4:44 PM   Rebrand to OddsDeity with landing page, waitlist API, and UX polish

This was the commit where "Hoops Stats" died and "OddsDeity" was born. New name, new domain, new landing page, waitlist API. A single commit that touched every corner of the codebase. (We later rebranded again to "EdgeGoat" — third time's the charm.)

March 20: The Biggest Day

March 20th might be the most productive day in the project's history. Look at what shipped:

12:42 PM  feat: add user accounts, JWT auth, billing service, and landing page
1:41 PM   user dashboard
2:06 PM   fix: refresh token returns user data, WS token routing
2:12 PM   fix: add hq-net to billing service
2:15 PM   fix: allow outbound internet for Mailgun/Stripe
2:39 PM   feat: email templates
3:02 PM   fix: 401 race condition on login
3:29 PM   refactor: cookie-based auth instead of stateful token management
6:02 PM   Bookie Comparison
7:21 PM   feat: odds bookies
8:44 PM   use browser instance for odds

User accounts with JWT auth. Stripe billing. Email templates via Mailgun. Cookie-based auth refactor. AND a multi-bookie odds comparison feature. In one day.

March 21: The All-Nighter

12:06 AM  improve compare
12:33 AM  fix: improved logging
12:36 AM  change individual calls to browser with better logging
12:54 AM  more logging
1:05 AM   fixes fixes fixes
1:14 AM   fix AN
1:31 AM   anti bot workaround
1:55 AM   fix caesars
2:18 AM   compare page
2:24 AM   fix team assignment
2:35 AM   fix: flickers
2:49 AM   fix: flickering and name matching
2:52 AM   fix build errors
3:24 AM   feat: odds by
3:38 AM   ui polish 1

Fifteen commits between midnight and 3:38 AM. Fighting sportsbook anti-bot systems, fixing UI flickers, matching team names across different odds providers. The "fixes fixes fixes" commit at 1:05 AM is a whole mood.

March 25-28: Mobile

March 25  ios first pass, fixes to builder
March 26  feat: updated tracking logic for scalability
March 28  fix: builder and copy hr link

The iOS app appeared. Capacitor wrapper around the web UI, shared component library, MemoryRouter instead of BrowserRouter. Built in a day, polished over the week.

April 1-2: Launch Prep

feat: gtm changes
feat: env and umami
drizzle migration
odds snapshots TTL
certificate permissions
fixes: apple and stuff
feat: parlay cart changes
fix: labels array query + add Sentry to all services
new leagues

Google Tag Manager. Umami analytics. Sentry error tracking. Database migrations. Apple certificate wrangling. The boring but necessary stuff that means you're actually shipping to real users.

The Commit Message Hall of Fame

Some favorites from the journey:

  • "this should work" (it didn't — 4 more fixes followed)
  • "retrigger #1999" (desperation numbering)
  • "ncaab fix? hopefully" (narrator: it was not, hopefully)
  • "props plateau hit..." (the sound of hitting a wall at 3 AM)
  • "Round 10, my best guess" (when science becomes art)
  • "just claude giving me headaches today" (AI-assisted development has its moments)
  • "fixes feel like features" (when your bug fix accidentally improves UX)
  • "blah" (5:39 PM, March 29th. We've all been there)
  • "stuff" (the final commit. Peak descriptiveness)

What 354 Commits In 32 Days Feels Like

It feels like mania, honestly. Every feature you build reveals three more you need. Every bug you fix uncovers two others. You're in a constant state of "just one more thing."

But there's also a compounding effect. Early commits were fighting infrastructure — CORS, deployment, database migrations. By week two, the foundation was solid enough that new features could be built in hours instead of days. By week four, adding a new sport meant forking an existing pipeline and adapting it, not starting from scratch.

The pace wasn't sustainable (commit messages like "blah" and "stuff" are evidence of that). But there's something to be said for the initial sprint. When the vision is clear and the motivation is high, you can build an extraordinary amount of software in a very short time.

354 commits. 32 days. Three leagues. One RTX 5090. Zero regrets.


EdgeGoat was built at a pace that would make a sprint planning meeting weep. The commit messages are the diary entries we left along the way.

See the model on today's slate

Every line the model prices, with its probability next to the sportsbook's.