GS.Let's talk
← All workEvent Schedule
Live

Event Schedule

The phone app teens used at a youth retreat to find their room, court or station — live from the organisers' Google Sheet.

Event ScheduleInteractive demo · sample data

What it is

A phone-first, read-only schedule viewer for the three days of a youth retreat. Teens pick a day and their team and see where to go right now, where to go next, their standings and the brackets; Saturday and Sunday pin their court or station on an aerial map of the venue.

Why I built it

The organisers already ran everything from a Google Sheet, so I didn't want to replace it — I wanted to put it in everyone's pocket. No logins: you pick a day and look things up, and the data is pulled live from the organisers' sheet, which stays the single source of truth.

3days: rooms, courts, stations
3 sphone poll interval (Friday)
2 sshared server cache

How it works

The sheet is the database

Organisers keep typing scores and room changes into their Google Sheet. The server reads it and parses it into one JSON payload; every view (my team, rooms, brackets, standings) is derived from that payload on the phone.

CSV export, not gviz

At the venue Google's gviz query endpoint served stale data (missing court assignments, lagging scores). Switching to the sheet's live CSV export made updates near-real-time.

Cheap live updates

Phones poll every 3–4 seconds with the ETag they already have. The server keeps a 2–4 second single-flight cache, so every phone's poll collapses into roughly one sheet read, and unchanged data comes back as an empty 304.

Score-based 'now'

On Friday a team's first game without a score is the one being played, so the big 'Playing now' card moves on the moment a score is typed into the sheet; knockout matchups fill in from the sheet's own formulas.

Maps and alerts

Court and station pins were placed on the venue's aerial photo from the organiser's labelled map. A cron sends a web push when a round starts or ends, and on Sunday a WhatsApp worker posts the same message to the group.

Built with

Next.js (App Router)TypeScriptTailwind CSS v4Google SheetsWeb PushService worker (offline)Node WhatsApp worker