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.