Inspiration

I've been to over 10 international hockey tournaments, and every single one was a mess. Parents scatter across five different group texts. Nobody knows which hotel block is actually the team's. Forty families show up at the same restaurant at once. A game ends early or gets rained out, and the whole schedule falls apart in real time. At a sprawling multi-field complex, you lose track of your own team's sideline. I wanted one place that shows what's happening right now, what you need nearby, and where your people actually are.

What it does

Touro gives tournament families a single dashboard for the whole weekend. A live event feed pushes score updates, field changes, and weather delays straight to your phone. Coaches and parents spin up a "squad" for their team, and everyone in it gets a shared feed, a logistics hub, and a live map of where teammates are. A nearby logistics layer surfaces hotels, restaurants, gyms, and urgent care around the venue, sorted by distance and price. Location sharing stays opt-in and squad-scoped, and it expires automatically at the end of the tournament weekend. An emergency card holds allergies, contacts, and insurance info for each athlete, ready for a coach to pull up instantly. At the end of each day, the app generates a one-glance digest with final scores, tomorrow's first game time, and any logistics reminders.

How we built it

We built the Schedule Engine as the technical core of Touro. It models each bracket as a dependency graph, so when a game ends early or gets rained out, the engine recalculates every downstream game time using historical game-duration data and alerts only the squads actually affected. The live feed runs over WebSockets scoped to each tournament and squad. Location sharing pairs the browser Geolocation API with the Google Maps JS SDK and auto-expires the session. The Crowd-Spreading engine aggregates anonymized check-in data from squads at the same tournament and nudges new searchers toward comparable spots once a location gets saturated. We built the frontend on Next.js, used Cloudflare D1 with Drizzle for data, and pulled logistics data from the Google Places API.

Challenges we ran into

The Schedule Engine was the hardest part by far. Cascading a schedule change through a live bracket, and notifying only the squads actually affected instead of blasting the whole tournament, took several rounds of rethinking the dependency model. Keeping location sharing accurate and low-latency while auto-expiring it safely required careful state management too. We also had to fight scope creep. It would have been easy to build a generic team-management app, so we kept cutting anything that didn't serve the actual moment of a parent standing at a multi-field complex trying to figure out where to be next.

Accomplishments that we're proud of

We're proud the Schedule Engine works as a live demo: end a game early and watch the rest of the squad's schedule and notifications update in real time. We're proud the medical card and auto-expiring location sharing show we thought about trust and safety, not just features. And we're proud we built something that solves a problem I lived through more than 10 times, not a hypothetical one.

What we learned

We learned that the hardest technical problems are often the most practical ones. A parent doesn't care about a dependency graph, they care about knowing if they have time to grab lunch before the next game. We built the algorithm around that question instead of the other way around. We also learned how much trust matters in a location-sharing feature, and how much a small detail like auto-expiration changes whether people actually turn it on.

What's next for Untitled

Next, we want to ingest live scores straight from real tournament data sources instead of demo data. We're adding push notifications so schedule cascades and squad chat reach parents the moment something changes, not when they happen to open the app. And we want to expand GameDay AI to proactively surface conflicts, like flagging that your flight overlaps with the championship game, instead of only answering when someone asks.

Built With

Share this project:

Updates