One-liner: A CLI + SDK that lets a developer scaffold, dev-loop, and deploy Gemini-powered games on Meta Ray-Ban Display in three commands. Built live at the Google I/O Hackathon today. Two demo games + one bonus example ship in the repo — all prototyped today and refactored to depend on the framework.
Timings assume a single operator + a live Pixel + a live pair of Display glasses. Speed dial is set to "Stage" (slowest) on any example UIs.
0:00 — Hook. "Smart-glasses just opened up. Building games for the Meta Ray-Ban Display is a stack of plumbing — bridge, SSE, deep-link, tunnel, every Gemini surface wired by hand. We built the framework that erases that stack. Three commands. Watch."
0:15 — Live scaffold. Terminal up, fresh shell.
npx gdk create demo-game --template adventure
cd demo-game && cp .env.example .env # pre-edited with the key
npx gdk devWithin ~10 seconds the terminal prints: bridge URL, tunnel URL, deep-link, a giant scannable QR. "That QR is the install. The bridge holds the Gemini key. The tunnel is HTTPS — required by the glasses."
0:45 — Phone scan → glasses. Scan with Pixel, Meta AI app opens → "Add Web App" → Add → glasses HUD lights up: rune-portal scene + three glowing doors. "That image was painted by Nano Banana."
1:00 — Pinch. Pinch the Neural Band. The HUD shows "the agents are painting your world…" → ~16s later a brand-new scene + three new doors. "Every door is a fresh image, generated on demand. Pure creative — not an image analyzer."
1:20 — Tour the framework while the next scene paints. Pull up the repo in the editor:
src/bridge/server.mjs— 350 lines. HTTP + SSE + static + per-game routes. Zero game logic.src/tools/managed-agent.mjs— the wrapper that makes a managed agent a one-liner with persistent threads and trace capture.templates/adventure/omni.config.mjs— 90 lines. This is the entire game. AdefineGamecall with two route handlers. The framework does everything else.
"The thing you just installed on the glasses was generated from this 90-line file."
1:50 — Cut to PulseBlade (second demo). Open examples/pulseblade/ in the editor side-by-side with the running game. "Same framework. Different mechanic. Flash designs the level structure in JSON, Lyria scores the backing track, a managed-agent director publishes a balancing note that streams to a judge console." Show the level designer prompt + the captured Lyria audio bytes + the director SSE event in the network tab. "Same bridge, same SSE, same tunnel. Different game."
2:30 — Pivot to PROMPT ARENA (the managed-agents money shot). Open examples/prompt-arena/data/traces/m_emberton.json in the editor. Scroll. "This is a real captured trace. The managed agent reads files, lists files, writes Python — there it is, code_execution_call, the actual code — and then runs it in its remote sandbox — code_execution_result, the stdout. That's the hatchery pattern. Eight monsters, eight agents, eight sandbox sessions. Each one tunes itself before fighting." Scroll through the bracket UI if time allows.
2:50 — The turn. "Framework, two demo games, one bonus example, all built today. Three managed-agent patterns — director, world-balancer, hatchery — proven in code. The framework is the moat: any developer can ship a glasses game tomorrow with the same one-liners."
2:55 — Provenance. "Public repo: github.com/sidkandan/GeminiDisplayKit. First commit at event start. Every line of the framework — and the example games — was written today. PROVENANCE.md has the file-by-file ledger."
| Time | Shot |
|---|---|
| 0–8s | hook + the gdk create / dev terminal moment, QR appears |
| 8–20s | phone scan → glasses HUD lights up → rune-portal scene |
| 20–35s | pinch → Nano Banana paints the next world (the visual wow) |
| 35–48s | the PROMPT ARENA hatchery trace — the managed agent writing & running code in a sandbox (the managed-agents prize shot) |
| 48–55s | PulseBlade quick clip — level JSON appearing, Lyria audio playing |
| 55–60s | tagline + "built today, public repo" callout |
See docs/video-script.md for the shot-by-shot version.
-
.envfile inexamples/omni-odyssey/,examples/pulseblade/,examples/prompt-arena/— each with a validGEMINI_API_KEY -
npm installalready run in framework root AND inexamples/omni-odysseyandexamples/pulseblade -
.venvalready set up inexamples/prompt-arena(Python venv +pip install -r requirements.txtif present, otherwisepip install google-genai flask python-dotenv) - One
gdk devrehearsal — ensure cloudflared brings up a tunnel within 10s (re-run if it fails the first time, the trycloudflare API is intermittent) - Pixel + glasses paired and the Meta AI app pre-opened
- PROMPT ARENA:
.venv/bin/python run_demo.py --hatchran once sodata/tournament.jsonis the frozen "golden" snapshot (cached strategies + sprites + audio) - OMNI-ODYSSEY:
node scripts/prewarm-odyssey.mjsran once soexamples/omni-odyssey/assets/intro.mp4(Veo cinematic) +opening-scene.jpgexist - Browser zoom on the laptop set to 125% so the terminal QR is scannable from 4 feet
- Speed selector on PROMPT ARENA set to "Stage"
See scripts/demo-day.sh for the automatable parts of this checklist.
| Question | Answer |
|---|---|
| "What did you actually build today?" | The framework — src/, bin/, templates/. And the example games. Public repo, first commit at event start: git log --reverse --format='%h %ci %s' | head -3. The full file-by-file ledger is PROVENANCE.md. |
| "Is this an image analyzer?" | No. See docs/anti-pattern-defense.md. The framework is provider-agnostic infrastructure; the games are creative (Nano Banana paints, Lyria composes, managed agents direct). Where we accept images (the optional Hint-giver pattern), it's as one input to a game-mechanic agent, not as "describe what's in this picture as a service." |
| "How is this managed agents, not just API calls?" | Open examples/prompt-arena/data/traces/m_emberton.json — a real captured interaction.steps array including code_execution_call and code_execution_result. Server-side code execution + persisted state, not one completion. |
| "Who would use this?" | Any developer with Display Web App access. The platform is brand new. There's no equivalent framework. |
| "Why one framework instead of multiple separate game submissions?" | The framework is the multiplier-impact pitch. Each demo individually is one game; the framework is the means to ship hundreds. |
| "Why is Prompt Arena Python and the rest JavaScript?" | Prompt Arena was prototyped earlier in the day as a standalone project; it's preserved verbatim as the bonus example for the code-execution trace evidence. A future refactor wraps its Flask server in an omni.config.mjs. The framework intentionally doesn't dictate language. |
- Primary:
npx gdk devin front of the judges — fresh scaffold, fresh tunnel, fresh QR. The CLI is the moat; show it working from zero. - Tunnel fails (trycloudflare intermittent): re-run the same command — it succeeds on retry in our testing. Otherwise fall back to (3).
- Network dies during the live scaffold: switch to the pre-warmed
examples/omni-odyssey/running ongdk dev --no-tunnelagainst localhost on the operator's laptop — point at the running browser-tab HUD instead. - Hard net failure: play the 1-minute recorded video and walk through
examples/prompt-arena/data/traces/m_emberton.jsonin the editor (offline, captured artifacts).