The match-day companion for the FIFA World Cup 26™ in Miami. Routes every fan to the right way into Hard Rock Stadium, in their language, and plugs them into the city's watch-party scene.
Getting 65,000 fans into Hard Rock Stadium is solved on paper and a disaster in practice.
The 2024 Copa América final at this exact stadium ended in a dangerous crowd crush. Miami hosts 7 World Cup matches (Jun 15 to Jul 18, 2026). The stadium sits in suburban Miami Gardens with no rail at the gates, no stadium parking, and a shuttle that is ticketholder-only. Most fans will not know any of that until they are already stuck in it.
Kickoff fixes the first mile.
Departure times are computed in code, never generated by an LLM.
The model only translates and fills a fixed template, so it can never hallucinate a wrong "leave by" time. Every fact (no parking, ticketholder-only shuttle, the 3.5h pre-match shuttle window, the Copa crush) ships with a tappable source link. When a judge asks "is this real?", the proof is one tap away.
The verified engine lives in reference/arrival_router.py (tested) and is ported 1:1 to lib/arrivalEngine.ts.
| Feature | What it does |
|---|---|
| Schedule | The 7 real Miami matches. Tap one to start. |
| Arrival plan | Where you are staying, then a ranked plan with a computed "leave by", shuttle / Metrorail / rideshare, an Uber deep link, and a red "no parking" hard-stop. |
| Live countdown | An honest, ticking "leave in 12 min" anchored to the real match clock. |
| Heat map | Watch parties and restaurants, hottest zones glowing, with Google and Apple Maps directions to the stadium and every venue. |
| Multilingual and voice | EN · ES · PT. Speak a query in Portuguese and the plan reads back in Portuguese. |
| Leave-by alerts | A real calendar reminder (.ics) that fires on match day. |
| Share and QR | Scan a code, and your exact plan loads, in your language, on someone else's phone. |
![]() The plan Leave by 4:10 PM |
![]() Match-day mode leave in 12 min |
![]() Heat map plus directions |
![]() Português same computed time |
![]() Scan to try it loads on your phone |
Scan to open Kickoff on your phone, or visit kickoff-brown-tau.vercel.app · jump straight to a plan in Portuguese, ?m=m3&o=Brickell&l=pt
Next.js 16 (App Router, Turbopack, fully static) · React 19 · TypeScript · Tailwind v4 · react-leaflet with leaflet.heat (CARTO dark tiles) · motion · the Web Speech API (STT and TTS) · qrcode.react · shipped on Vercel.
Design system, Aqua Departure Board: one electric-aqua accent for go, amber for urgency, coral for stop; Archivo display with Hanken Grotesk body; huge tabular departure-board numbers.
Demo-proof by design. Every byte the app needs is seeded: matches, venues, sources, playlists. No live scrape, no API call on shaky venue wifi. The map degrades to a filtered list if the tiles ever fail.
Run it locally
git clone https://github.com/ShawnMadadha/kickoff.git
cd kickoff
npm install
npm run dev # http://localhost:3000
npm run build # production build (static)
npm test # vitest, engine + countdown guardsRepo structure
kickoff/
├── app/ Next.js App Router (one static page)
├── components/ AppShell, Plan, Map, Voice, Schedule, ...
│ └── map/ Leaflet canvas + heat overlay (client-only)
├── lib/
│ ├── arrivalEngine.ts deterministic routing core (the moat)
│ ├── countdown.ts honest, anchored, never-negative countdowns
│ ├── i18n.ts EN/ES/PT dictionary (no translation API)
│ ├── calendar.ts real .ics with a match-day VALARM
│ └── directions.ts Google / Apple Maps hand-off
├── data/ seeded matches, venues, sources, playlists
└── reference/arrival_router.py the tested reference engine




