Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
8a09772
fix: tune default flight feel for less hyperspeed and easier steering
mraxai Jun 14, 2026
a168aa9
feat: in-browser, serverless LLM pilot + voice co-pilot
mraxai Jun 14, 2026
08962f2
feat: open-ended goal-driven companion (roam/go-to/collect/race/hover)
mraxai Jun 14, 2026
672569e
feat: give the LLM companion live, in-browser terraform powers
mraxai Jun 14, 2026
734a31d
feat: add Supertonic-3 as a third in-browser voice for the co-pilot
mraxai Jun 14, 2026
f3c9eea
feat: default the co-pilot voice to Supertonic-3 in English
mraxai Jun 14, 2026
2626cb2
fix: only one autonomous driver may steer at a time
mraxai Jun 14, 2026
c7552df
fix: unlock the AudioContext on the Talk gesture so neural TTS is aud…
mraxai Jun 14, 2026
a5779d7
chore: add commit-history page tooling and rebuild dist
mraxai Jun 14, 2026
640a503
fix: anchor the sun and moon to the camera so they sit at infinity
mraxai Jun 15, 2026
de5845d
feat: sun-aware sky glow for believable sunrise/sunset and aerial light
mraxai Jun 15, 2026
448ba25
feat: switchable flat/round world shape (camera-relative curvature)
mraxai Jun 15, 2026
1560b01
feat: curve the ocean with the world (shared curvature uniforms)
mraxai Jun 15, 2026
d413113
feat: curve the forest with the world (rigid per-tree drop)
mraxai Jun 15, 2026
4b74b1c
feat: curve landmarks with the world + fix beacons, fly-through and q…
mraxai Jun 15, 2026
489717b
feat: let the voice companion flip the world between flat and round
mraxai Jun 15, 2026
627cc46
fix: tune world density — fewer landmarks, more mana, no pointless pi…
mraxai Jun 15, 2026
aa3f7e5
feat: give the companion world-DJ powers (trees, mana, landmarks, clo…
mraxai Jun 15, 2026
6ef7e4c
feat: voice control of planet tightness (setCurveRadius) and live sea…
mraxai Jun 15, 2026
cea217a
fix: place copilot world edits in view and report them in plain words
mraxai Jun 15, 2026
fcdda39
fix: make the voice loop fail loudly — Kokoro dtype, brain timeout, T…
mraxai Jun 15, 2026
d4972b5
feat: in-UI Agent/LLM settings menu, no auto-race, Kokoro fallback
mraxai Jun 15, 2026
68405cb
feat: typeable settings fields + save/load the planet
mraxai Jun 15, 2026
6d228a6
fix: race rings and mana orbs ride the curved world (no more floaters)
mraxai Jun 15, 2026
c7832f4
feat: declutter settings into an Agent tab + toggles; mobile toasts t…
mraxai Jun 15, 2026
758bcbb
feat: compress settings to 3 tabs (Race / Agent / Flight)
mraxai Jun 15, 2026
6cfffc7
fix: keep moon, stars and sun inside the camera far plane (they were …
mraxai Jun 15, 2026
7e8096c
fix: keep the sun's apparent size correct after pulling it inside the…
mraxai Jun 15, 2026
49b7828
feat: genie world-authoring system — conjure, import, fly, all by voice
mraxai Jun 16, 2026
45da284
feat: cesium aircraft repo + play all part-animation clips
mraxai Jun 16, 2026
84c79b9
feat: ground-roam (walk/run + SPACE sprint, land-only) and document t…
mraxai Jun 16, 2026
cd7446b
chore: stop tracking dist and generated history artifacts
mraxai Jul 3, 2026
0682802
fix: harden the Opus-era systems — lifecycle, disposal, arbitration, …
mraxai Jul 3, 2026
71449e9
feat: rescue the Morricone soundtrack — seeded themes, real twang, sa…
mraxai Jul 3, 2026
16a87e5
feat: give the soundtrack a song form — A theme, building bridge, tru…
mraxai Jul 3, 2026
addf95e
perf(agents): route each agent to the cheapest model that can do its job
claude Aug 8, 2026
b490e57
feat(agents): offer a local model server before a paid API
claude Aug 9, 2026
cb80fc2
feat(agents): discover Higgs on :9000, ahead of the third-party servers
claude Aug 9, 2026
5b9622e
fix(agents): stop the local-server scan racing engine start-up
claude Aug 9, 2026
40f7feb
fix(play): send Content-Length so `npm run play` can load assets
claude Aug 9, 2026
14f3065
fix(ci,agents): full history for the Pages build, pinned CDN imports
claude Sep 4, 2026
69c1175
feat(ui): Copilot Console — a persistent chat surface for the voice c…
claude Sep 4, 2026
a16288c
refactor(agents): voice becomes a provider, and the OS voice becomes …
claude Sep 4, 2026
269dea4
feat(agents): hands-free listening with semantic endpointing, and a V…
claude Sep 4, 2026
14f7380
feat(ui): one-tap music mute, Agent-first tabs, and a Talk-only Agent…
claude Sep 4, 2026
da15563
docs: document the voice co-pilot in the README
claude Sep 4, 2026
e832b74
fix(ui): stop the settings panel overflowing the viewport on phones
claude Sep 4, 2026
d1b462d
feat(agents): free LLM providers replace the paid API in the Brain pi…
claude Sep 4, 2026
b6615ec
feat(agents): discover Apple's fm serve, and default it to the model …
claude Sep 4, 2026
b24ea9f
fix(agents): apply world ops in order, and stop claiming edits that f…
claude Sep 4, 2026
1107fc5
fix(agents): salvage truncated model JSON instead of reading it aloud
claude Sep 4, 2026
02d78d3
feat(agents): learn which free models are unusable and stop offering …
claude Sep 4, 2026
a6d8fbc
fix(genie): resolve catalogue names the way they're typed, not the wa…
claude Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
# match-screenshots-to-commits.mjs reads `git log --all`; the default
# shallow checkout gives it one commit, so every history card would
# render "No nearby commit found".
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 20
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,16 @@ node_modules/
.env.local
.env.DS_Store

# Build output — CI (pages.yml) builds fresh; never commit dist
dist/

# Generated by scripts/match-screenshots-to-commits.mjs and build-history-page.mjs on every build
scripts/screenshot-commit-mapping.json
scripts/screenshot-commit-mapping.md
public/history.html

# Claude Code session-local artifacts
.playwright-mcp/
.claude/settings.local.json
.claude/pre-session-backup.patch
.claude/scheduled_tasks.lock
Expand Down
53 changes: 50 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

SkyBloom is a cozy browser flying game and a small benchmark for human-vs-agent racing. Fly a magic carpet through an infinite procedural world, press **R** to start a seeded 12-gate time trial, save local replays, race your best ghost, or let the bundled SimpleBot fly through the same public Agent API a researcher would use.

You can also just talk to it. A co-pilot listens, answers out loud, flies you to landmarks and
reshapes the world on request — against a local model server, your own API key, or fully
on-device. It runs in the page; there is no server of ours in the loop.


![SkyBloom screenshot](https://github.com/dusterbloom/skybloom/blob/main/screenshots/image.png)

Expand All @@ -18,10 +22,9 @@ The research loop is visible in-game through the Race Panel:

- **Start Race** creates a seeded 12-gate course.
- **Load Ghost** loads the best local replay for that seed.
- **Run SimpleBot** starts the reference agent through `window.agentAPI`.
- **Export JSON** downloads an honest benchmark result with `courseSeed`, `worldSeed`, `finalTimeMs`, `splits`, `pilot`, fairness config, replay samples, optional action log, build version, and `verificationStatus`.

Quick SimpleBot run from DevTools:
The bundled SimpleBot reference agent flies through the same public `window.agentAPI` a researcher would use — no panel button, drive it from DevTools:

```js
const { SimpleBot } = await import('/src/agents/SimpleBot.js');
Expand All @@ -31,10 +34,41 @@ bot.start();

More detail: [docs/BENCHMARK.md](docs/BENCHMARK.md), [docs/AGENT_QUICKSTART.md](docs/AGENT_QUICKSTART.md), and [docs/AGENT_API.md](docs/AGENT_API.md).

## Talk to the Carpet

Open the menu and press **Talk**. A chat panel appears — type at it or speak to it, both go to
the same conversation. It answers out loud and acts: *take me to the crystal formation*,
*raise a mountain ahead*, *make it sunset*, *let me fly the fox*, *make the music epic*.

Pick a brain in the Agent tab:

| Brain | Cost | Notes |
|---|---|---|
| Groq | Free tier | Needs a Groq API key (the panel links to where you get one). Model list is fetched live from Groq once the key is entered. |
| OpenRouter | Free tier | Needs an OpenRouter API key (the panel links to where you get one). The model dropdown is filtered to the `:free` models only — the ones that actually cost nothing. |
| Local server | Free, no key | Any OpenAI-compatible endpoint. LM Studio, Jan, Ollama, llama.cpp and vLLM are detected on their default ports and offered before you are asked for anything. |
| Apple FM | Free, no key | macOS 26+ with `fm serve` running (`localhost:1976`) — auto-detected like the other local servers, no key, no model to download. Two models: `pcc` is the default here — fast and consistently accurate — but it is a call to Apple's Private Cloud Compute, not your Mac; `system` runs fully on-device but measured noticeably less reliable and about 2x slower. |
| On-device | Free, no key | WebLLM on WebGPU. Offline once the weights are cached. |

Every key is scoped to the brain it was issued for — a key saved for Groq is never sent to
OpenRouter, or vice versa. A meter in the panel counts calls, tokens and cost, so the model
routing is checkable rather than claimed.

Speech uses the browser's own engines, so nothing downloads by default and the reply starts
immediately — on macOS that is the same speech stack Siri uses. Kokoro and Supertonic-3 are
opt-in neural voices that fetch weights on first use.

Set **Listen** to hands-free and the mic stays open across turns, ending each one when you
sound finished rather than on a fixed timer, so it stops cutting you off mid-sentence. Press
**V** to talk, or to interrupt the co-pilot while it is speaking.

Typing works in every browser. Speech needs the Web Speech API — Chrome or Safari; Firefox has
no speech recognition, and there the chat panel is the whole feature.

## Play

1. Open the deployed site or run locally.
2. Press **Play** for free flight, **Race 12 gates** to start a race after loading, or **Run SimpleBot** to watch the reference agent.
2. Press **Play** for free flight, or **R** once flying to start a seeded 12-gate race.
3. Fly through the lit ring to start the race clock.
4. Follow the next-gate beacon until all 12 gates are passed.
5. Finish to save a local replay, then load the ghost and race it.
Expand All @@ -52,6 +86,7 @@ Controls:
| **1-4 / E** | Select / cast spell |
| **M** | Toggle map |
| **R** | Start a race when not already racing |
| **V** | Talk to the co-pilot, or interrupt it mid-sentence |

Tip: diving trades altitude for speed. The first race is meant to be readable: follow the gold gate and beacon, use the Race Panel for status, and load a ghost after a clean finish.

Expand All @@ -61,6 +96,10 @@ Tip: diving trades altitude for speed. The first race is meant to be readable: f
- Seeded 12-gate time trials with local splits, best times, replay storage, and ghost playback.
- Agent API with information/action/tempo fairness constraints: `observe()`, `act()`, `startRace()`, replay/ghost helpers, config, WebSocket transport, and result export.
- Reference SimpleBot that uses only `window.agentAPI`.
- Voice co-pilot: speech or typing into one conversation, a spoken reply, and an intent it acts
on. Runs entirely in the page against Groq, OpenRouter, a local server, or an on-device model,
with per-task model routing and a token/cost meter.
- **Creative "genie" API** (`window.worldAPI`) — a separate, non-fairness godmode surface: conjure shapes and animated rigs, import real models from curated repos (flapping birds, propeller planes), fly any of them or **roam as an animal on the ground**, persist everything in a catalogue, and reshape terrain/sky. Speakable by voice or a small LLM. See [docs/AGENT_API.md](docs/AGENT_API.md#creative-mode-the-genie-windowworldapi).
- Optional socket.io multiplayer co-presence for casual local experimentation.
- GitHub Pages workflow, CI build check, local smoke script, and one-command local launcher.

Expand All @@ -73,6 +112,14 @@ Tip: diving trades altitude for speed. The first race is meant to be readable: f
- GitHub Pages is static hosting. It runs the game, races, ghosts, SimpleBot, and browser Agent API, but it does not host the socket.io multiplayer server.
- External local agents from a Pages tab may need `wss://`; for `ws://localhost` research, use a local dev/preview page.
- Mobile should load and fly, but the research panel is intentionally compact rather than a full mobile leaderboard UI.
- Speech recognition is the browser's, not ours. Chrome sends microphone audio to Google's
servers, Safari on macOS uses on-device dictation, and Firefox has none. Only the on-device
brain paired with the OS voice keeps a whole turn local.
- A Groq or OpenRouter key typed into the settings lives in this browser's localStorage and goes
straight from the page to that provider — each key is scoped to the brain it was saved for, so
a Groq key is never sent to OpenRouter or back. Fine for your own key; never use a shared one.
- The co-pilot's world edits go through `window.worldAPI`, which is deliberately outside the
fairness constraints. Reshaping terrain mid-race does not produce a comparable benchmark run.

## Run Locally

Expand Down
76 changes: 0 additions & 76 deletions dist/assets/MaterialSystemIntegration-CnfDoB_F.js

This file was deleted.

Loading
Loading