Spectator experience · 2026-05-23

Lock-screen water polo: how Live Activities changed the spectator experience

The spectator who used to stand at deck level shouting 'what's the score?' now feels the goal vibrate on their wrist before the next play starts. Here's what shipped, what it took to wire up, and why it matters more than any other spectator feature we've built.

Published May 23, 2026 · ~8 min read

Five years ago, watching a youth water polo game you couldn’t physically attend meant texting another spectator in the stands and waiting for an emoji reply. Today, with three taps in the Eggbeater app, the same spectator’s iPhone vibrates the instant a goal scores, their Apple Watch taps with a different rhythm depending on which team scored, and the lock screen shows the live score the whole time the game is running — without ever opening an app. This piece is about how those pieces fit together, what the engineering looks like, and why a sport played in a pool with no commentary track needed this more than any other.

What is a Live Activity?

Apple introduced Live Activities in iOS 16.1 (October 2022) and refined them through iOS 17 and 18. A Live Activity is a small, persistent panel that lives on the iPhone lock screen and, on supported devices, expands into the Dynamic Island at the top of the screen. Think of the way Uber shows your driver’s car icon moving on the lock screen while your ride is in progress — same mechanism.

From the user’s perspective, a Live Activity is a thing that:

  1. Appears automatically when an event the user cares about starts, without them opening an app.
  2. Updates in near-real-time as the event progresses — score changes, quarter changes, clock running.
  3. Stays visible on the lock screen so a glance tells you everything without unlocking the phone.
  4. Disappears cleanly when the event ends (game finalized, ride completed), with a final state preserved briefly so you can see how it ended.

From the platform’s perspective, a Live Activity is a constrained-but-rich SwiftUI surface controlled by your app, with a separate APNs (Apple Push Notification service) channel that bypasses the normal "open the app to update" cycle. The app doesn’t need to be running. The user doesn’t need to interact with anything. The Live Activity just exists for the duration of the event.

For sports, this is the killer use case. A ride share has one variable to update (driver location). A delivery has two (driver location, ETA). A water polo game has at least six the spectator cares about: the score line, the quarter, the clock, the team in possession on power play, the player who just scored, and which goalkeeper is in. Live Activities can carry all of it.

Why water polo needed this specifically

Every team sport has its own "I can’t actually attend this game" problem. Soccer spectators get text updates from the sideline. Basketball spectators follow scrolling box scores on ESPN’s youth-league platforms. Hockey spectators have apps with live scoring on most pickup leagues. Water polo had effectively nothing — and that’s a quirk of the sport’s media footprint, not its difficulty.

Three structural reasons water polo was underserved:

  1. No commentary track. Football, basketball, hockey have decades of TV coverage that trained audiences to follow games by audio. Water polo has none of that infrastructure at youth and club level. You either see the game or you don’t know what happened.
  2. The pool deck is loud. Whistles, splashes, spectators yelling, refs blowing horns — there is no audible signal that a goal scored. Even physically present spectators routinely miss goals at busy tournaments because three pools are playing at once and the scoring pool’s announcer is overloaded.
  3. Game clocks are not connected to anything. The pace clock on the wall is on its own circuit. The scoreboard, if there is one, is on a different circuit. Neither was networked to anything outside the pool. Until someone wired the desk volunteer’s score-entry directly to the spectator’s phone, those events were invisible the moment they happened.

What this meant in practice: even when a spectator was sitting at the pool watching their kid’s game, they often couldn’t tell you the current score five minutes after a goal. The kid’s pool was a chaotic wall of motion, and the desk volunteers had a paper sheet and a clipboard. Goals scored. Time passed. Nothing made it past the deck.

The "what did I just see?" moment. Anyone who’s spent a Saturday at a multi-pool tournament has had this experience: kid scores, spectators cheer, spectators immediately ask each other "what’s the score now?" — because no one was tracking it cleanly. Live Activities solve a problem that was both digital and social.

How Eggbeater wired it up (in plain English)

The Live Activity itself is the visible tip. Below it is a pipeline that goes from the volunteer scorer’s tap to the spectator’s lock screen in under five seconds.

Walking through it from left to right:

[Volunteer tap][Worker write][Firebase broadcast][APNs push][Lock screen update]
~50ms · ~80ms · ~300ms · ~1-3s · immediate

Step 1: The desk volunteer scores

At every Eggbeater-powered tournament, one volunteer per pool sits at a game desk with a tablet or laptop. The scoring UI is a tap-grid: action verbs (Goal, Assist, Steal, Turnover, Block, Excl, 5m, GK Save) on the left, players on the right. Tap action, tap player, the event is captured. The interface is designed so a first-time volunteer can be productive in 15 minutes.

The moment a tap registers, the local app fires a state update and immediately ships the event to the cloud. No "save" button. No batch upload. Every event is its own write.

Step 2: A Cloudflare Worker writes the event

The event lands at a Cloudflare Worker — a tiny serverless function at the edge of the network. The Worker does three things in one trip: writes the event to durable storage (Firebase Realtime Database), updates the running score in a KV cache, and acknowledges back to the scorer so the local UI confirms.

Workers run at the edge — physically close to whoever’s at the desk — so this hop is consistently under 100 milliseconds even on tournament-day venue wifi.

Step 3: Firebase broadcasts to subscribed devices

Every spectator viewing this game’s public URL has an open Realtime Database subscription. When the event lands, Firebase pushes the new state to every connected client in roughly the same moment. Browsers update their visible scoreboard. Mobile apps update their in-app views.

Up to here, this is the "browser refresh" experience refined. The interesting part is what happens to spectators whose app is not open.

Step 4: APNs delivers a Live Activity update

For every iPhone spectator who has started a Live Activity for this game, the Worker also fires an Apple Push Notification Service (APNs) update with a "liveactivity" content type. APNs is Apple’s notification delivery system — the same pipeline that powers iMessage and standard push notifications, but with a special channel for Live Activities that updates the on-screen state directly without showing a notification banner.

APNs delivery is 1-3 seconds typical. It’s the longest hop in the pipeline, and it’s the hop we don’t control. Most of the time it’s near-instant; occasionally on poor cellular it stretches to a few seconds. Either way, the spectator sees the new score on their lock screen without lifting a finger.

Step 5: The lock screen reflects the new state

The Live Activity surface is a small SwiftUI view we wrote inside the Eggbeater iOS app. It renders the home and away team names, the score line, the quarter, the time remaining, and a status pill (LIVE / FINAL / Q1 / Q2 / etc). When the APNs update arrives, iOS hands the new state to our view and the values update in place — no animation jitter, no app launch, no battery drain.

On iPhones with the Dynamic Island, the same Live Activity expands into a compact pill at the top of the screen when the user picks up the phone. Tap the pill, you get a larger expanded view with the play-by-play of the last few events. Tap that, you’re in the full app at the live game view.

The Apple Watch piece

The Live Activity gets the screen real estate. The Apple Watch gets the feedback.

When a Live Activity is running on an iPhone and the spectator has an Apple Watch paired, the watch automatically participates. Two specific behaviors that matter:

Haptic taps on score events

When the home team scores, the watch fires a "Notification Up" haptic — a sharp double-tap on the wrist. When the away team scores, it fires "Notification Down" — a longer single tap. The rhythms are different on purpose: even without looking at the watch, the wearer knows which side scored. Spectators in restaurants, in airports, anywhere away from the pool, get the goal feedback through their wrist.

Watch face complications

If the spectator adds the Eggbeater complication to their watch face, the live game’s score and clock appear directly on the watch face for the duration of the game. The complication updates on the same APNs channel as the Live Activity, so glance latency is the same — under 5 seconds from desk to wrist.

The non-obvious win: the watch haptic also tells you when to look. Most spectators following remotely don’t want a constant stream of distraction — they want to know when something happened. The "Notification Up" tap is the signal: pull out your phone, the Live Activity is already on the lock screen, you see the new score, you put the phone away. The total interaction is under five seconds and didn’t require opening an app.

What this means at deck level

The technology is interesting. The cultural effect is the bigger story.

Three things changed at tournaments where every spectator can have a Live Activity running:

  1. Less "what’s the score?" shouting. The most-asked question in a noisy pool deck stopped being asked. Spectators look at their lock screen and they know. This sounds small but it’s the single most-reported change from clubs that adopted the platform.
  2. More spectators following remotely. Grandparents at home, traveling families, the spectator who couldn’t get off work — they can now follow live with the same lag as someone in the stands. Average remote-viewer counts at Eggbeater-powered tournaments are 3-5x the in-pool spectator count.
  3. Cleaner referee interactions. When a goal is disputed, the desk volunteer and the ref can both see the same source of truth on a tablet. The score on the lock screen is the same score the ref signs off on. There’s no "the scoreboard says 7-6 but I have 7-7 written down" moment, because everyone is reading from the same broadcast.

The most surprising effect: it cooled down a lot of sideline tension. The number-one source of stress at youth water polo tournaments is spectators not knowing what’s happening. Once they can see, the temperature drops.

Setup walkthrough for spectators

If you’ve never used Live Activities for water polo and want to try this at your kid’s next game, the setup is three steps:

  1. Install the Eggbeater app from the App Store on your iPhone. (It’s free; spectator features don’t require a subscription for browsing public tournaments.)
  2. Open the public tournament page in the app — either via the share link your tournament director sent, or by entering the 6-character tournament code on the splash screen. Tap "Browse tournaments" if it’s a public event.
  3. Tap "Follow" on your kid’s game. The first time, iOS will ask permission to show Live Activities — say yes. From then on, every Following game automatically starts a Live Activity when it goes live and clears it when the ref signs off the final score.

For Apple Watch haptics: just have the Eggbeater app installed; the watch companion installs automatically. If you want the score on your watch face, edit your watch face and add the Eggbeater complication.

For Android users: the same live scoring works in the browser and via the Eggbeater Android app’s home screen widgets. Android doesn’t have Live Activities specifically (Google has been promising an equivalent for years), but lock-screen notifications and home screen widgets cover most of the same use case.

What shipped recently

Live Activities ship today on every Eggbeater-powered tournament and league, and the lifecycle around them keeps maturing. Recent ship log:

  1. Pregame "Starting Soon" Live Activities. A Live Activity now auto-starts ~5 minutes before a Following game’s scheduled time, so spectators en route to the venue see the countdown on their lock screen. Triggered via push-to-start so it lands even when the app is fully closed. Shipped May 2026 alongside the four-phase LA lifecycle (pregame → live → final → dismissed).
  2. Final-state retention. A "final" Live Activity now stays on the lock screen for an hour after the final whistle (and dismisses cleanly on the next push). A spectator who finished their kid’s morning game can walk to the car, drive home, and still see the score on their wrist on the way. Reset triggers immediate dismissal.
  3. Apple Watch parity. The same payload populates the Smart Stack widget and Live Activity surface on Apple Watch — the watch face shows score + clock + period whenever the iPhone is broadcasting one.

What’s coming next

  1. Multi-game pinning. Spectators with multiple kids in different pools want to follow more than one game at once. iOS supports up to two simultaneous Live Activities per app — the UI for selecting which two to pin is still in design.
  2. Android equivalent. Android 16 Live Updates are stabilizing and we’ve been prototyping. Today Android users get lock-screen notifications + home-screen widgets — both cover most of the use case, but a true Live Update surface is the parity goal.

Related reading

How to run a water polo tournament: the complete guide

Eggbeater spectator guide — for the spectator who just got the share link

Water polo stats explained — what every box-score abbreviation means

Volunteer scorer onboarding — the desk worker side of the same pipeline

Want this experience at your tournament?

Eggbeater’s tournament hosting platform includes Live Activities, push notifications, Apple Watch haptics, home-screen widgets, and a public spectator page — all for $199 per event, with spectator access free for every attendee. No app required for browser viewing.

See the tournament platform

Frequently asked questions

A Live Activity is a small, persistent panel that appears on the iPhone lock screen and in the Dynamic Island while an event is happening — a game in progress, an order being delivered, a workout running. It updates in real time without the user opening the app. Apple introduced them in iOS 16.1; Eggbeater uses them so water polo spectators can follow live games without opening any app.

No. Spectators can view live scores in any web browser via the public tournament or league URL. Installing the Eggbeater app unlocks Live Activities on the lock screen, push notifications, Apple Watch haptics on goals, and home-screen widgets — but every spectator can watch from a browser with zero install required.

Under five seconds from the desk volunteer tapping the action to the spectator’s lock screen reflecting it. The pipeline is: scorer tap → Cloudflare Worker write → Firebase Realtime Database broadcast → APNs push to the spectator’s device → Live Activity update. Each hop is sub-second on a modern wifi or LTE connection.

Yes. With the Eggbeater Apple Watch companion installed and a game pinned as Following, a goal scored fires a haptic tap on the watch and updates the watch face complication if you have one set. Goals against your team also haptically tap (different rhythm) so you know to look at your phone.