Browsing a code project by voice
error
What went wrong
Error: mux failed: [mp3 @ 0x55c367a2da00] Failed to find two consecutive MPEG audio frames.
[in#8 @ 0x55c367a3b100] Error opening input: Invalid data found when processing input
Error opening input file /work/20261008173210-38d740/audio/jarvis-3.mp3.
Error opening input files: Invalid data found when processing input
at ChildProcess.<anonymous> (file:///stage/server.mjs:333:85)
at ChildProcess.emit (node:events:514:28)
at maybeClose (node:internal/child_process:1141:16)
at ChildProcess._handle.onexit (node:internal/child_process:306:5)
Turns
You "Open qodebase."
Jarvis Opened the qodebase website. You can explore public projects like Calculator, 2048, Tetris, Focus timer, Tip split and To-do, or fork and modify one of them using an AI agent.
You "Open the timer project."
Jarvis Opened the focus timer project. On qodebase, fork it to make it yours and ask agents for changes. It runs as a one-file app that counts against the clock even when the tab is in the background.
You "What is this project about?"
Jarvis It's a one-file focus timer that lets you pick 5, 15, 25 or 50 minute sessions, start a countdown, and get a chime and a break when it finishes.
You "Show me the code."
Jarvis Here is the source code for the focus timer: html <!doctype html <html lang="en" <head <meta charset="utf-8" <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" <titleFocus timer</title <style :root { --bg: ffffff; --fg: 1b1a1d; --dim: 6f6c75; --ring: ebe8ef; --acc: b2452f; --chip: f3f1f5; } @media (prefers-color-scheme: dark) { :root { --bg: 121113; --fg: ecebee; --dim: a19ea7; --ring: 29272c; --acc: ef7a5f; --chip: 1e1c20; } } { box-sizing: border-box; } html, body { margin: 0; height: 100%; background: var(--bg); color: var(--fg); font: 17px/1.4 system-ui, sans-serif; } main { height: 100dvh; max-width: 480px; margin: 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 28px; padding: 16px; } .presets { display: flex; gap: 8px; } .presets button { border: 0; border-radius: 8px; padding: 10px 14px; background: var(--chip); color: var(--fg); font: 500 15px system-ui, sans-serif; } .presets button[aria-pressed=true] { background: var(--acc); color: fff; } .dial { position: relative; width: min(72vw, 300px); aspect-ratio: 1; } svg { width: 100%; height: 100%; transform: rotate(-90deg); } circle { fill: none; stroke-width: 10; } .track { stroke: var(--ring); } .bar { stroke: var(--acc); stroke-linecap: round; transition: stroke-dashoffset 0.3s linear; } .time { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 56px; font-variant-numeric: tabular-nums; } .go { border: 0; border-radius: 12px; width: 180px; height: 56px; background: var(--acc); color: fff; font: 600 18px system-ui, sans-serif; } .reset { border: 0; background: none; color: var(--dim); font: 15px system-ui, sans-serif; padding: 8px; } </style </head <body <main <div class="presets" id="presets" <button data-m="5"5 min</button<button data-m="15"15 min</button<button data-m="25" aria-pressed="true"25 min</button<button data-m="50"50 min</button </div <div class="dial" <svg viewBox="0 0 120 120"<circle class="track" cx="60" cy="60" r="52"/<circle class="bar" id="bar" cx="60" cy="60" r="52"/</svg <div class="time" id="time"25:00</div </div <button class="go" id="go"Start</button <button class="reset" id="reset"Reset</button </main <script const C = 2 Math.PI 52; const bar = document.getElementById('bar'), $time = document.getElementById('time'), $go = document.getElementById('go'); bar.style.strokeDasharray = C; let total = 25 60, left = total, endAt = null, tick = null; const fmt = (s) = ${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}; function draw() { $time.textContent = fmt(left You can also open it for preview here:
You "Thanks, Jarvis."
Jarvis You're welcome.
What it cost
| container memory | $0.0032 |
| container disk | $0.0002 |
| container cpu max | $0.0064 |
| chat | $0.0019 |
| tts | $0.099 |
| stt | $0.0006 |
| Total | $0.112 |
List prices of 2026-10-08, before Workers Paid's included monthly usage. Container CPU is an upper bound (it is billed on actual use). The container ran 159 s; the model was called 13 times (@cf/zai-org/glm-4.7-flash).
The workflow
What the voice says, what Jarvis is told, and what is checked: qodebase-browse.json (opens github.com).
Stage log
[
{
"ts": "2026-10-08T17:32:30.132Z",
"module": "stage",
"event": "listening",
"port": 8080,
"ai": "http://ai.arena"
},
{
"ts": "2026-10-08T17:32:37.475Z",
"module": "stage",
"event": "user_lines_ready",
"id": "20261008173210-38d740",
"n": 5,
"ms": 5564
},
{
"ts": "2026-10-08T17:32:39.886Z",
"module": "stage",
"event": "cdp_attach",
"port": 19223,
"url": "http://127.0.0.1:8080/phone",
"title": ""
},
{
"ts": "2026-10-08T17:32:40.223Z",
"module": "stage",
"event": "cdp_attach",
"port": 19222,
"url": "about:blank",
"title": "about:blank"
},
{
"ts": "2026-10-08T17:32:47.430Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 1,
"name": "open_url",
"args": {
"url": "https://qodebase.app/"
},
"ok": true
},
{
"ts": "2026-10-08T17:32:58.300Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 1,
"name": "read_page",
"args": {},
"ok": true
},
{
"ts": "2026-10-08T17:33:23.048Z",
"module": "stage",
"event": "turn",
"id": "20261008173210-38d740",
"n": 1,
"said": "Open qodebase.",
"heard": "Open codebase.",
"tools": [
{
"name": "open_url",
"args": {
"url": "https://qodebase.app/"
},
"ok": true
},
{
"name": "read_page",
"args": {},
"ok": true
}
],
"reply": "Opened the qodebase website. You can explore public projects like Calculator, 2048, Tetris, Focus timer, Tip split and To-do, or fork and modify one of them using an AI agent.",
"latency": 22.5,
"url": "https://qodebase.app/",
"verdict": {
"pass": true,
"why": "as expected"
}
},
{
"ts": "2026-10-08T17:33:29.269Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 2,
"name": "open_url",
"args": {
"url": "https://qodebase.app/p/forq/timer"
},
"ok": true
},
{
"ts": "2026-10-08T17:33:30.184Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 2,
"name": "read_page",
"args": {},
"ok": true
},
{
"ts": "2026-10-08T17:33:57.236Z",
"module": "stage",
"event": "turn",
"id": "20261008173210-38d740",
"n": 2,
"said": "Open the timer project.",
"heard": "Open the timer project.",
"tools": [
{
"name": "open_url",
"args": {
"url": "https://qodebase.app/p/forq/timer"
},
"ok": true
},
{
"name": "read_page",
"args": {},
"ok": true
}
],
"reply": "Opened the focus timer project. On qodebase, fork it to make it yours and ask agents for changes. It runs as a one-file app that counts against the clock even when the tab is in the background.",
"latency": 17.9,
"url": "https://qodebase.app/p/forq/timer",
"verdict": {
"pass": true,
"why": "as expected"
}
},
{
"ts": "2026-10-08T17:34:19.360Z",
"module": "stage",
"event": "turn",
"id": "20261008173210-38d740",
"n": 3,
"said": "What is this project about?",
"heard": "What is this project about?",
"tools": [],
"reply": "It's a one-file focus timer that lets you pick 5, 15, 25 or 50 minute sessions, start a countdown, and get a chime and a break when it finishes.",
"latency": 8.5,
"url": "https://qodebase.app/p/forq/timer",
"verdict": {
"pass": true,
"why": "as expected"
}
},
{
"ts": "2026-10-08T17:34:24.154Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 4,
"name": "open_url",
"args": {
"url": "https://qodebase.app/p/forq/timer/code/"
},
"ok": true
},
{
"ts": "2026-10-08T17:34:25.344Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 4,
"name": "read_page",
"args": {},
"ok": true
},
{
"ts": "2026-10-08T17:34:27.951Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 4,
"name": "click",
"args": {
"text": "index.html"
},
"ok": true
},
{
"ts": "2026-10-08T17:34:28.840Z",
"module": "stage",
"event": "tool",
"id": "20261008173210-38d740",
"turn": 4,
"name": "read_page",
"args": {},
"ok": true
},
{
"ts": "2026-10-08T17:34:40.125Z",
"module": "stage",
"event": "turn",
"id": "20261008173210-38d740",
"n": 4,
"said": "Show me the code.",
"heard": "Show me the code.",
"tools": [
{
"name": "open_url",
"args": {
"url": "https://qodebase.app/p/forq/timer/code/"
},
"ok": true
},
{
"name": "read_page",
"args": {},
"ok": true
},
{
"name": "click",
"args": {
"text": "index.html"
},
"ok": true
},
{
"name": "read_page",
"args": {},
"ok": true
}
],
"reply": "Here is the source code for the focus timer: html <!doctype html <html lang=\"en\" <head <meta charset=\"utf-8\" <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,viewport-fit=cover\" <titleFocus timer</title <style :root { --bg: ffffff; --fg: 1b1a1d; --dim: 6f6c75; --ring: ebe8ef; --acc: b2452f; --chip: f3f1f5; } @media (prefers-color-scheme: dark) { :root { --bg: 121113; --fg: ecebee; --dim: a19ea7; --ring: 29272c; --acc: ef7a5f; --chip: 1e1c20; } } { box-s