OpenAI

OpenAI · Launch Video Breakdown: Hook, Pacing & Motion Design

GPT-5.3-Codex-Spark is now in research preview. You can just build things—faster.

AI AgentsLaunchFebruary 12, 2026@OpenAI
0:00 · The Hook · Dual Terminal Code Generation
0:00 / 0:00

Scene-by-scene timeline & spoken transcript

  1. The Hook

    Dual Terminal Code Generation

    “(No spoken dialogue — The audio track begins with a sustained, evolving pad sound, building anticipation.)”

    On screen
    OpenAI Codex (v0.100.0-alpha.1) model: gpt-5.3-codex medium /model to change directory: ~/code/spark-demos/snake-game Tip: New Try the Codex App with 2x rate limits until April 2nd. Run 'codex app' or visit https://chatgpt.com/codex > Build a simple HTML snake game. • Working (0s • esc to interrupt) > Run /review on my current changes ? for shortcuts 100% context left gpt-5.3-codex > OpenAI Codex (v0.100.0-alpha.1) model: gpt-5.3-codex-spark medium /model to change directory: ~/code/spark-demos/spark-snake-game Tip: New Try the Codex App with 2x rate limits until April 2nd. Run 'codex app' or visit https://chatgpt.com/codex > Build a simple HTML snake game. • Working (0s • esc to interrupt) > Improve documentation in @filename ? for shortcuts 100% context left gpt-5.3-codex-spark
    Camera
    Static, split-screen view comparing two terminal interfaces side-by-side.
    Motion
    Text typing animation, code generation, and UI element updates within the terminal windows.
  2. Product Reveal

    Real-time Code Execution & Game Play

    “(No spoken dialogue — A high-energy audio transition with a rising synth sweep and sub-bass impact leads into a rhythmic section with pizzicato synths and a driving sub-bass line.)”

    On screen
    OpenAI Codex (v0.100.0-alpha.1) model: gpt-5.3-codex medium /model to change directory: ~/code/spark-demos/snake-game Tip: New Try the Codex App with 2x rate limits until April 2nd. Run 'codex app' or visit https://chatgpt.com/codex > Build a simple HTML snake game. • Working (2s • esc to interrupt) > Run /review on my current changes ? for shortcuts 100% context left I'm going to scaffold a minimal browser-based Snake game in this workspace with index.html, style.css, and script.js, then quickly verify the files are wired correctly. Explored l list rg --files The directory is empty, so I'll create the three files from scratch and implement keyboard controls, score, restart, and wall/self collision logic. Preparing file creation (5s • esc to interrupt) Ran cat > index.html << 'EOF' <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Snake</title> <style> body { margin: 0; display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #282c34; font-family: 'Press Start 2P', cursive; color: #abb2bf; } #game-container { border: 2px solid #61afef; box-shadow: 0 0 15px rgba(97, 175, 239, 0.7); padding: 20px; border-radius: 8px; background-color: #21252b; text-align: center; } canvas { background-color: #282c34; display: block; margin: 0 auto 15px auto; border: 1px solid #3e4451; } button { background-color: #61afef; color: #282c34; border: none; padding: 10px 20px; margin: 0 5px; border-radius: 5px; cursor: pointer; font-family: 'Press Start 2P', cursive; font-size: 0.8em; transition: background-color 0.3s ease; } button:hover { background-color: #52a0e0; } #score-display { margin-bottom: 15px; font-size: 1.2em; } </style> </head> <body> <div id="game-container"> <div id="score-display">Score: 0</div> <canvas id="game" width="400" height="400"></canvas> <div> <button id="start-pause-button">Start / Pause</button> <button id="restart-button">Restart</button> </div> </div> <script> const canvas = document.getElementById('game'); const ctx = canvas.getContext('2d'); const gridSize = 20; let snake = [{ x: 10, y: 10 }]; let food = {}; let direction = { x: 0, y: 0 }; let score = 0; let gameOver = false; let gameInterval; let gameSpeed = 150; // milliseconds function generateFood() { food = { x: Math.floor(Math.random() * (canvas.width / gridSize)), y: Math.floor(Math.random() * (canvas.height / gridSize)), }; } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i = 0; i < snake.length; i++) { ctx.fillStyle = i === 0 ? 'green' : 'lime'; ctx.fillRect(snake[i].x * gridSize, snake[i].y * gridSize, gridSize, gridSize); } ctx.fillStyle = 'red'; ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize); } function update() { if (gameOver) return; const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y }; // Wall collision if ( head.x < 0 || head.x >= canvas.width / gridSize || head.y < 0 || head.y >= canvas.height / gridSize ) { gameOver = true; alert('Game Over! Score: ' + score); return; } // Self collision for (let i = 1; i < snake.length; i++) { if (head.x === snake[i].x && head.y === snake[i].y) { gameOver = true; alert('Game Over! Score: ' + score); return; } } snake.unshift(head); if (head.x === food.x && head.y === food.y) { score++; generateFood(); } else { snake.pop(); } draw(); } function startGame() { snake = [{ x: 10, y: 10 }]; direction = { x: 0, y: 0 }; score = 0; gameOver = false; generateFood(); clearInterval(gameInterval); gameInterval = setInterval(update, gameSpeed); } document.addEventListener('keydown', e => { switch (e.key) { case 'ArrowUp': if (direction.y === 0) direction = { x: 0, y: -1 }; break; case 'ArrowDown': if (direction.y === 0) direction = { x: 0, y: 1 }; break; case 'ArrowLeft': if (direction.x === 0) direction = { x: -1, y: 0 }; break; case 'ArrowRight': if (direction.x === 0) direction = { x: 1, y: 0 }; break; } }); document.getElementById('start-pause-button').addEventListener('click', () => { if (gameInterval) { clearInterval(gameInterval); gameInterval = null; document.getElementById('start-pause-button').textContent = 'Resume'; } else { gameInterval = setInterval(update, gameSpeed); document.getElementById('start-pause-button').textContent = 'Pause'; } }); document.getElementById('restart-button').addEventListener('click', startGame); startGame(); </script> </body> </html> -22 lines (no output) Ran cat > style.css << 'EOF' :root { color-scheme: light; } +65 lines (no output) Ran cat > script.js << 'EOF' const canvas = document.getElementById('game'); const ctx = canvas.getContext('2d'); const gridSize = 20; let snake = [{ x: 10, y: 10 }]; let food = {}; let direction = { x: 0, y: 0 }; let score = 0; let gameOver = false; let gameInterval; let gameSpeed = 150; // milliseconds function generateFood() { food = { x: Math.floor(Math.random() * (canvas.width / gridSize)), y: Math.floor(Math.random() * (canvas.height / gridSize)), }; } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i = 0; i < snake.length; i++) { ctx.fillStyle = i === 0 ? 'green' : 'lime'; ctx.fillRect(snake[i].x * gridSize, snake[i].y * gridSize, gridSize, gridSize); } ctx.fillStyle = 'red'; ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize); } function update() { if (gameOver) return; const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y }; // Wall collision if ( head.x < 0 || head.x >= canvas.width / gridSize || head.y < 0 || head.y >= canvas.height / gridSize ) { gameOver = true; alert('Game Over! Score: ' + score); return; } // Self collision for (let i = 1; i < snake.length; i++) { if (head.x === snake[i].x && head.y === snake[i].y) { gameOver = true; alert('Game Over! Score: ' + score); return; } } snake.unshift(head); if (head.x === food.x && head.y === food.y) { score++; generateFood(); } else { snake.pop(); } draw(); } function startGame() { snake = [{ x: 10, y: 10 }]; direction = { x: 0, y: 0 }; score = 0; gameOver = false; generateFood(); clearInterval(gameInterval); gameInterval = setInterval(update, gameSpeed); } document.addEventListener('keydown', e => { switch (e.key) { case 'ArrowUp': if (direction.y === 0) direction = { x: 0, y: -1 }; break; case 'ArrowDown': if (direction.y === 0) direction = { x: 0, y: 1 }; break; case 'ArrowLeft': if (direction.x === 0) direction = { x: -1, y: 0 }; break; case 'ArrowRight': if (direction.x === 0) direction = { x: 1, y: 0 }; break; } }); document.getElementById('start-pause-button').addEventListener('click', () => { if (gameInterval) { clearInterval(gameInterval); gameInterval = null; document.getElementById('start-pause-button').textContent = 'Resume'; } else { gameInterval = setInterval(update, gameSpeed); document.getElementById('start-pause-button').textContent = 'Pause'; } }); document.getElementById('restart-button').addEventListener('click', startGame); startGame(); </script> </body> </html> -175 lines (no output) I've finished implementation and I'm doing a quick sanity check of file contents and structure before handing it back. Explored l List ls -la Checking file presence and size (38s • esc to interrupt) Implemented a complete simple Snake game in: - index.html - style.css - script.js What it includes: - 20x20 grid canvas game - Arrow keys + WASD movement - Food spawning and growth - Wall/self collision game-over state - Score + persistent best score via localStorage > Run /review on my current changes ? for shortcuts 96% context left Snake Score: 20 Best: 70 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 30 Best: 70 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 40 Best: 70 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 50 Best: 70 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 60 Best: 70 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 70 Best: 70 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 80 Best: 80 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 90 Best: 80 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 100 Best: 100 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 110 Best: 110 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 120 Best: 120 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex Snake Score: 130 Best: 130 Start / Resume Pause Restart Game running. Use arrows or WASD. Tip: on desktop, restart to try a faster snake after 30 points. gpt-5.3-codex
    Camera
    Static, split-screen view. The right panel transitions from a terminal to a live, playable Snake game.
    Motion
    Seamless transition from code output to interactive game UI. The game itself features smooth, pixel-art style animation for the snake and food.
  3. Feature Teaser

    Comparative Performance & Iteration

    “(No spoken dialogue — Another significant high-energy transition occurs with a prominent riser and a powerful sub-bass drop/impact. The track then continues with a more intense, layered electronic texture.)”

    On screen
    OpenAI Codex (v0.100.0-alpha.1) model: gpt-5.3-codex medium /model to change directory: ~/code/spark-demos/snake-game Tip: New Try the Codex App with 2x rate limits until April 2nd. Run 'codex app' or visit https://chatgpt.com/codex > Build a simple HTML snake game. • Working (0s • esc to interrupt) > Run /review on my current changes ? for shortcuts 97% context left I'm going to scaffold a minimal browser-based Snake game in this workspace with index.html, style.css, and script.js, then quickly verify the files are wired correctly. Explored l list rg --files The directory is empty, so I'll create the three files from scratch and implement keyboard controls, score, restart, and wall/self collision logic. Preparing file creation (9s • esc to interrupt) Ran cat > index.html << 'EOF' <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Snake</title> <style> body { margin: 0; display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f0f0f0; font-family: 'Press Start 2P', cursive; color: #333; } #game-container { border: 2px solid #a0a0a0; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); padding: 20px; border-radius: 8px; background-color: #fff; text-align: center; } canvas { background-color: #e0e0e0; display: block; margin: 0 auto 15px auto; border: 1px solid #ccc; } button { background-color: #61afef; color: #fff; border: none; padding: 10px 20px; margin: 0 5px; border-radius: 5px; cursor: pointer; font-family: 'Press Start 2P', cursive; font-size: 0.8em; transition: background-color 0.3s ease; } button:hover { background-color: #52a0e0; } #score-display { margin-bottom: 15px; font-size: 1.2em; } </style> </head> <body> <div id="game-container"> <div id="score-display">Score: 0</div> <canvas id="game" width="400" height="400"></canvas> <div> <button id="start-pause-button">Start / Pause</button> <button id="restart-button">Restart</button> </div> </div> <script> const canvas = document.getElementById('game'); const ctx = canvas.getContext('2d'); const gridSize = 20; let snake = [{ x: 10, y: 10 }]; let food = {}; let direction = { x: 0, y: 0 }; let score = 0; let gameOver = false; let gameInterval; let gameSpeed = 150; // milliseconds function generateFood() { food = { x: Math.floor(Math.random() * (canvas.width / gridSize)), y: Math.floor(Math.random() * (canvas.height / gridSize)), }; } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i = 0; i < snake.length; i++) { ctx.fillStyle = i === 0 ? 'green' : 'lime'; ctx.fillRect(snake[i].x * gridSize, snake[i].y * gridSize, gridSize, gridSize); } ctx.fillStyle = 'red'; ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize); } function update() { if (gameOver) return; const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y }; // Wall collision if ( head.x < 0 || head.x >= canvas.width / gridSize || head.y < 0 || head.y >= canvas.height / gridSize ) { gameOver = true; alert('Game Over! Score: ' + score); return; } // Self collision for (let i = 1; i < snake.length; i++) { if (head.x === snake[i].x && head.y === snake[i].y) { gameOver = true; alert('Game Over! Score: ' + score); return; } } snake.unshift(head); if (head.x === food.x && head.y === food.y) { score++; generateFood(); } else { snake.pop(); } draw(); } function startGame() { snake = [{ x: 10, y: 10 }]; direction = { x: 0, y: 0 }; score = 0; gameOver = false; generateFood(); clearInterval(gameInterval); gameInterval = setInterval(update, gameSpeed); } document.addEventListener('keydown', e => { switch (e.key) { case 'ArrowUp': if (direction.y === 0) direction = { x: 0, y: -1 }; break; case 'ArrowDown': if (direction.y === 0) direction = { x: 0, y: 1 }; break; case 'ArrowLeft': if (direction.x === 0) direction = { x: -1, y: 0 }; break; case 'ArrowRight': if (direction.x === 0) direction = { x: 1, y: 0 }; break; } }); document.getElementById('start-pause-button').addEventListener('click', () => { if (gameInterval) { clearInterval(gameInterval); gameInterval = null; document.getElementById('start-pause-button').textContent = 'Resume'; } else { gameInterval = setInterval(update, gameSpeed); document.getElementById('start-pause-button').textContent = 'Pause'; } }); document.getElementById('restart-button').addEventListener('click', startGame); startGame(); </script> </body> </html> -22 lines (no output) Ran cat > style.css << 'EOF' :root { color-scheme: light; } +65 lines (no output) Ran cat > script.js << 'EOF' const canvas = document.getElementById('game'); const ctx = canvas.getContext('2d'); const gridSize = 20; let snake = [{ x: 10, y: 10 }]; let food = {}; let direction = { x: 0, y: 0 }; let score = 0; let gameOver = false; let gameInterval; let gameSpeed = 150; // milliseconds function generateFood() { food = { x: Math.floor(Math.random() * (canvas.width / gridSize)), y: Math.floor(Math.random() * (canvas.height / gridSize)), }; } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i = 0; i < snake.length; i++) { ctx.fillStyle = i === 0 ? 'green' : 'lime'; ctx.fillRect(snake[i].x * gridSize, snake[i].y * gridSize, gridSize, gridSize); } ctx.fillStyle = 'red'; ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize); } function update() { if (gameOver) return; const head = { x: snake[0].x + direction.x, y: snake[0].y + direction.y }; // Wall collision if ( head.x < 0 || head.x >= canvas.width / gridSize || head.y < 0 || head.y >= canvas.height / gridSize ) { gameOver = true; alert('Game Over! Score: ' + score); return; } // Self collision for (let i = 1; i < snake.length; i++) { if (head.x === snake[i].x && head.y === snake[i].y) { gameOver = true; alert('Game Over! Score: ' + score); return; } } snake.unshift(head); if (head.x === food.x && head.y === food.y) { score++; generateFood(); } else { snake.pop(); } draw(); } function startGame() { snake = [{ x: 10, y: 10 }]; direction = { x: 0, y: 0 }; score = 0; gameOver = false; generateFood(); clearInterval(gameInterval); gameInterval = setInterval(update, gameSpeed); } document.addEventListener('keydown', e => { switch (e.key) { case 'ArrowUp': if (direction.y === 0) direction = { x: 0, y: -1 }; break; case 'ArrowDown': if (direction.y === 0) direction = { x: 0, y: 1 }; break; case 'ArrowLeft': if (direction.x === 0) direction = { x: -1, y: 0 }; break; case 'ArrowRight': if (direction.x === 0) direction = { x: 1, y: 0 }; break; } }); document.getElementById('start-pause-button').addEventListener('click', () => { if (gameInterval) { clearInterval(gameInterval); gameInterval = null; document.getElementById('start-pause-button').textContent = 'Resume'; } }); document.getElementById('restart-button').addEventListener('click', startGame); startGame(); </script> </body> </html> -175 lines (no output) I've finished implementation and I'm doing a quick sanity check of file contents and structure before handing it back. Explored l List ls -la Checking file presence and size (38s • esc to interrupt) Implemented a complete simple Snake game in: - index.html - style.css - script.js What it includes: - 20x20 grid canvas game - Arrow keys + WASD movement - Food spawning and growth - Wall/self collision game-over state - Score + persistent best score via localStorage > Run /review on my current changes ? for shortcuts 96% context left Snake Score: 0 Best: 0 Use Arrow Keys or WASD. Press Space to restart after game over. gpt-5.3-codex Snake Score: 1 Best: 0 Use Arrow Keys or WASD. Press Space to restart after game over. gpt-5.3-codex
    Camera
    The left panel transitions to a different UI theme for the Snake game, while the right panel continues the game in its original theme. This highlights a comparison.
    Motion
    Simultaneous, contrasting UI updates and game states across the split screen, emphasizing the speed and flexibility of the AI agent.

Related AI Agents Product Launches

Explore all AI Agents launches →
OpenAI
Hook 9.2137.9M
OpenAIAI Agents

To ensure that artificial general intelligence benefits all of humanity

@OpenAI
Gopuff
Hook 9.277.6M
GopuffAI Agents

Gopuff introduces Go, an AI shopping assistant built with SpaceXAI: say what you need and the order is placed.

@gopuff
Elon Musk
Hook 9.263.3M
Elon MuskAI Agents

Iliad (Troy) trailer made by Grok Imagine 1.5, which was just released

@elonmusk