Inspiration

The game is over. The paperwork is not. A scoresheet already contains the names, games and results an organizer needs, but turning it into something everyone can follow means entering it again.

At ShellHacks, we started with a paper scoresheet and a phone. Snap to League turns that photo into a draft an organizer can check, correct and share.

What it does

Upload a scoresheet, whiteboard photo or results screenshot. Snap extracts teams and scores, computes standings from the games and flags inconsistencies. Review the draft, correct names or scores, and compare another photo with the current competition.

Supported game competitions publish through EasyChamp after sign-in. Knockout results become brackets. Races, trivia and cup-stacking results become shareable placement boards on Snap; they do not publish as EasyChamp stages. An in-product Read out control speaks standings through ElevenLabs when configured, with browser speech as a fallback.

How we built it

FastAPI handles photo jobs and publishing. Pydantic validates structured extraction; application code reconciles names, calculates standings and exposes review checks. The demonstrated imports use Google's Gemini API. A configurable second reader checks extraction independently; an import can finish if that second read fails. ElevenLabs supplies the demonstrated standings voice.

A Cloudflare Worker routes the public demo to the development host. EasyChamp sign-in identifies the publishing organizer.

Challenges and what we learned

Similar spellings must be reconciled without merging opponents or players from different teams. A bracket needs advancement relationships, not only scores. We compare model-extracted results with standings calculated from the games and leave the draft editable.

The lesson: useful AI does not need a chat window, and uncertainty belongs in the review flow. The organizer stays in control of the result.

What the demo proves

The film shows paper results, real extraction and review, standings, a separately labeled bracket example, an original in-product voice readout, and comparison with another photo. Previously published EasyChamp pages are labeled separately. The new-photo capture compares a draft; it is not presented as a newly saved EasyChamp update. We make no universal accuracy or processing-time claim.

Built at ShellHacks and existing components

Snap's photo import, review, reconciliation and publishing integration are the event contribution. EasyChamp identity, league import, competition sites and Matchday design tokens predate ShellHacks. Framework dependencies are listed in pyproject.toml; model and speech providers are external services. This repository's history begins September 26, 2026.

What's next

Move beyond development-host deployment, evaluate more representative scoresheets, and improve review. Placement-based publishing in EasyChamp remains future work; shareable Snap podiums already work.

Try it

Open https://snap.easychamp.com and choose a sample or import a scoresheet. Review needs no EasyChamp account; publishing requires sign-in. The hackathon demo depends on a development Mac and its tunnel, so the recorded demonstration is also available as a fallback.

Team: Anton Abyzov and Anna Abyzova. Discord: anton.abyzov.

Built With

Share this project:

Updates

Submission history