F1inTO

Race Control

We put a live grand prix inside WhatsApp.

Client
F1inTO
Format
Digital
Location
Toronto, Canada
Year
2026
Illustrative Feed lines follow the real timing format with made-up values, and the messages are made up. The rate is what we measured in a recorded race: about twelve updates a second.
Timing updates a second, measured in a race
~12
From the track to the database
1.5s
Live pipe on its first race weekend, zero errors
23h
People in the closed test
10

The brief

F1inTO fans already use the race-day app to enter the draw and play along in the room. The open question was the rest of the race day: the hour before doors, the laps when you are at the bar, the week until the next one. We wanted the room’s concierge to live in the app everyone already has open. That app is WhatsApp.

The build

Race Control is a WhatsApp number fans can talk to. A fan taps one button in the race-day app, WhatsApp opens with a code already typed, and they hit send. That message links their phone to their fan profile, with no form, and it counts as consent because they sent it.

From there it answers like someone who knows the race and knows you. Tickets for the next race day. How many draw entries you have. The live order and gaps while the cars are out. Your driver’s team radio, as it happens.

Under it is a live data pipe. F1’s timing feed changes more than three times a second; in our recording of the Dutch Grand Prix it averaged about twelve updates a second across thirteen feeds. One always-on process holds that stream open, merges every change into a single state and writes it to the database every 1.5 seconds. Everything Race Control says is read from that state.

The hard part

Moving data fast was the easy half. Saying only what the data supports was the hard half. On its first test weekend the pipe ran for 23 hours without an error, and the test showed us exactly where a conversation could get ahead of the data. So we built a truth layer: one answer to “what is happening right now”, decided by the session status and never by a lap counter or a clear track.

Facts like the leader, the lap or a flag are now answered by code in microseconds, before any model is involved. Anything conversational goes through a gate that blocks a number the feed does not support. Stale data is treated as absent, never as current. And the recording of that race, red flag and all, replays as a test before every change.

Where it stands

Race Control has run as a controlled test, not a public launch: a closed group of ten on a test allowlist for the Dutch Grand Prix weekend, then small groups at the races that followed. Consent, an opt-out that is honoured on the spot, a monthly spend cap and alarms that page a person were there from the first message.

Race Control on WhatsApp

The race, in your chat.

Fans message Race Control like they would message a friend at the track. It knows the race as it happens, and it knows them: their entries, their team, their driver.

  1. 01

    Tickets

    The next race day, one tap from the chat.

  2. 02

    Draw entries

    How many you have today, and how to earn more.

  3. 03

    The tower

    Live order and gaps while the cars are out.

  4. 04

    Team radio

    Your driver and his engineer, as it happens.

The tower in this phone runs live so you can see the feed underneath it. In WhatsApp, every answer is read from that same state at the moment you ask.

Race Controlonline

Illustrative conversation. Made-up messages, no real fans.

Race day

Morning. What time is lights out?

8:41

Lights out at 9:00. You are checked in, and you have 6 entries in today’s draw.

8:41

Tap below for the race, or just ask.

8:41
Race day menu

Race update right now

9:24
LIVELAP 23/57GREEN
  1. 1NOR Interval
  2. 2PIA +0.842
  3. 3RUS +1.370
  4. 4VER +2.105
  5. 5LEC +0.611
  6. 6ANT +3.420
Interval to car ahead0 updates
9:24

Team radio · car 81 to his engineer

0:09
9:26

wait is that a red flag??

9:31

Yes. Red flag on lap 24 and the race is suspended. Timing feed as of 9:31:08.

9:31

Need tickets for the next one

10:52
Illustrative Made-up messages. No real fans, numbers or chats.

How it is built

From the track to your phone in seconds.

Six parts and one rule: the worst thing the system can do is say something the data does not support. Scroll to build it.

  1. 01

    The feed

    F1’s live timing arrives over a websocket: thirteen feeds, from the timing tower to race control messages and team radio. In our recording of a race it changed about twelve times a second.

  2. 02

    The always-on host

    One small process on a home connection, because F1 turns cloud servers away. It merges every change into one state, writes it to the database every 1.5 seconds and records every frame for replay.

  3. 03

    The database and the alarms

    Supabase holds the race state, the fans, their entries and their consent. A watchdog checks the feed every minute of a session, and a 7am canary reports on race mornings.

  4. 04

    The truth layer

    One function answers what is happening right now. Session status decides, never a lap counter or a clear track, and stale data counts as absent, never as current.

  5. 05

    WhatsApp and the model

    Facts like the leader, the lap or a flag are answered by code in microseconds. Conversation goes to the model with the live state attached, and a gate blocks any number the feed does not support.

  6. 06

    The fan

    Tap once in the app, send the code WhatsApp has typed, and your phone is linked. No form. Tickets, entries, the tower and your driver’s radio arrive on the phone you already hold.

  7. 07

    Guardrails, everywhere

    One door for every message checks consent, the 24 hour window, the spend cap and the test allowlist. Opt-outs are honoured on the spot, and radio and boards stop at the flag.

Guardrails, on every message Numbers checked against the feedNever deny the feedStops at the flagConsent and opt-out24 hour windowSpend capTest allowlistAlarms on two rails Source F1 live timing 13 feeds over one websocket 12.5 updates a second updates 0 Always on The host Merges every patchWrites every 1.5sRecords every frame State Supabase Postgres, functions,cron and consent Watch Alarms Watchdog, everyminute in session7am race canary Meaning Truth layer One answer towhat is happening Channel WhatsApp One door forevery message Conversation The model Grounded in the state,checked before send The fan Your phone 1 NOR Leader 2 PIA +0.842 3 RUS +1.370 4 VER +2.105 5 LEC +0.611 6 ANT +3.420 Guardrails, on every message Numbers checked against the feedNever deny the feedStops at the flagConsent and opt-out24 hour windowSpend capTest allowlistAlarms on two rails Source F1 live timing 13 feeds over one websocket 12.5 updates a second updates 0 Always on The host Merges every patchWrites every 1.5sRecords every frame State Supabase Postgres, functions,cron and consent Watch Alarms Watchdog, everyminute in session7am race canary Meaning Truth layer One answer towhat is happening Channel WhatsApp One door forevery message Conversation The model Grounded in the state,checked before send The fan Your phone 1 NOR Leader 2 PIA +0.842 3 RUS +1.370 4 VER +2.105 5 LEC +0.611 6 ANT +3.420

The truth layer, replaying a real race

Fast is easy. True is the job.

The Dutch Grand Prix, as the feed told it. The pipe never missed a beat that weekend. The hard part was meaning: a lap counter that ticks before the start, a track that reads clear while the race is still stopped. This is how the truth layer reads the same signals now.

Race Control says Finished Toronto 11:15
  1. 08:06 Feed

    LapCount reads 1. SessionStatus is still Inactive.

    We say

    Scheduled. A lap counter is not a race.

  2. 09:03 Feed

    SessionStatus: Started.

    We say

    Running.

  3. 09:05 Feed

    SessionStatus: Aborted. Race control: RED FLAG.

    We say

    Suspended. The red flag stays on the record.

  4. 09:23 Feed

    TrackStatus: AllClear.

    We say

    Still suspended. A clear track is not a restart.

  5. 09:33 Feed

    SessionStatus: Started.

    We say

    Running again.

  6. 11:08 Feed

    SessionStatus: Finished.

    We say

    Finished. Radio and boards stop at the flag.

people
10A closed test group on the Dutch Grand Prix weekend, behind a test allowlist.
zero errors
23hThe live pipe’s first race weekend, start to finish.
recorded race
1Red flag, restart and chequered flag, now replayed as a test.
guesses
0Stale or missing data is said out loud, never filled in.

Run as a controlled test, not a public launch: a closed group on a test allowlist for the Dutch Grand Prix weekend, then small groups at the races after. Every fan-facing switch stays with a person.

What this could do for your business

Same engine. Your live data.

Swap the timing feed for any number that moves: sales, stock, trucks, turnstiles, booth scans. Keep the host, the truth layer, the guardrails and the chat. These are concepts to show the shape, not client work.

  • 01 Sales floorConcept

    Deals closed today

    37

    Where are we against target?

    At 84% with three hours left. The east team just passed the west.

  • 02 LogisticsConcept

    Deliveries on time

    96.2%

    Is the Mississauga drop on time?

    Eleven minutes late, traffic on the 401. The new ETA is 2:40.

  • 03 InventoryConcept

    Units live across stores

    18,240

    Size 10 in black, anywhere near Yonge?

    Two at Queen West, one at the Eaton Centre. Want one held?

  • 04 StadiumConcept

    Fans through the gates

    31,480

    Shortest food line near section 112?

    Concourse B, about three minutes. Gate C is fastest out after the game.

  • 05 Trade showConcept

    Booth scans today

    412

    Who should I meet in the next hour?

    Three people who scanned your booth are in Hall 2 now. Want an introduction?

  • 06 Yours

    Point it at your live data.

    If the number matters to someone in the moment, it can live in their chat, with the same guardrails.

    Talk to us

Illustrative concepts. Made-up numbers and messages, no client data.

Where this is going

From one community to a platform.

We are planning the multi-tenant version now: one engine for motorsport teams, tracks and series, each with its own fans, branding and data, a wallet pass as the credential and a back end that shows sponsors exactly who their activation reached. It is in planning, not live. The engine underneath is the one on this page.

We build this for you

Live data, in the chat your people already use.

  • The integration. Your feed, API or database, held open and merged into one state.
  • The truth layer. One answer to what is happening, so nothing contradicts the data.
  • The channel. WhatsApp with consent, opt-out, spend caps and a test mode built in.
  • The console. Live chats, a composer that previews before it sends, and alarms that page a person.
  • The proof. Real days recorded and replayed as tests before every change.

Start a project
like this.

AI built into your marketing: found by AI search, made faster, run smarter. Tell us where you are and where you need to be.