BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
A short film you star in, directed by your voice. Describe a scene from memory, direct yourself on camera, and find out you were never the witness.
GamesTypeScript · CSSGitHub @adityabrabbOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A short film you star in, directed by a voice, built entirely by voice with Wispr Flow.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A short film you star in, directed by your voice.
I never typed a line of this project. Every prompt, every design change and every bug report was dictated with Wispr Flow straight into Claude Code, and Claude Code wrote all the code. The only physical keys I touched were the Wispr Flow hotkey and Enter. The whole build was screen-recorded with Wispr Flow visible.
The game fits the tool: the better you can describe what's in front of you, the better you score. Say what you saw. See Built by voice for how it went, phase by phase.
Made for the Hacker House Goa 2026 × Wispr Flow challenge.Read the full README ↗A short film you star in, directed by your voice.
Play it: https://say-what-you-saw.vercel.app
Demo video: https://www.youtube.com/watch?v=H2Rsgv2QPtY
Build timelapse: https://youtu.be/q9XUI_J4O8g
🎙️ Built entirely by voice with Wispr Flow
I never typed a line of this project. Every prompt, every design change and every bug report was dictated with Wispr Flow straight into Claude Code, and Claude Code wrote all the code. The only physical keys I touched were the Wispr Flow hotkey and Enter. The whole build was screen-recorded with Wispr Flow visible.
The game fits the tool: the better you can describe what's in front of you, the better you score. Say what you saw. See Built by voice for how it went, phase by phase.
Made for the Hacker House Goa 2026 × Wispr Flow challenge.
Say What You Saw is a film that plays in your browser, and you're the lead. A washed-up film director (the site itself) narrates, interrupts and roasts you the whole way through.
Then credits, a downloadable photo strip, and a 37-second trailer auto-edited from your session.
The look is film noir: an evidence file, near-black charcoal, aged paper, typewriter type and one blood-red accent. The tone is funny and roasty, and the roasts only ever target what you said, never your face, body, age or identity.
| Time | What you'll see |
|---|---|
| 0:00 | Pure black. Click and a projector clicks on, the film flickers, a 5-to-1 leader counts down, and a beam of dust assembles "Say What You Saw" out of particles. Say or type "roll camera". |
| 0:10 | "Who's starring tonight?" You give your name; it goes on a card and later on your poster and credits. |
| 0:15 | Act I · The Witness. A target scene flashes for 2 to 5 seconds. You get 30 seconds to describe it. The director reviews the footage, your scene is rebuilt from your words, and the two are laid side by side with the misses and inventions circled in red. The director roasts you, quoting what you said. |
| 0:30 | (First visit only) a fake Act 2.5: NOT FOUND (404), a "budget cuts" apology and a 10-second Memory+ ad you can only skip on the second click. |
| 0:35 | Act II · The Director's Stage. Your camera is cut out and relit. Say "Put me on a rooftop at night with neon rain" and the shot eases there over a second. Say "freeze" to take a shot. |
| 0:50 | After the fourth shot the frame freezes. The tab becomes "Suspect Detected", fake error windows pile up, there's a second of glitch, the twist is typed out and the frame shatters into 80 shards that reassemble into your wanted poster. A GUILTY stamp slams down. |
| 1:00 | Rolling credits with your scores, your best line, your alias and crime, the photo strip, and a button to watch your trailer. |
A Select scene button in the corner jumps to any scene: the opening, cast, every act, the break and ad, the verdict, the credits and the trailer. Every page load, a refresh included, starts back at the opening (your name is kept). A corner mute silences all sound.
The page starts black because browsers only allow sound after a gesture. After your click, a projector clicks on, a motor whirs and a quiet drone hums, all synthesised with Web Audio (there are no audio files). The title is built from about 4,000 particles in a three.js projector beam, which loads lazily and falls back to a plain CSS title card without WebGL, with reduced motion or if it is slow.
"Roll camera" accepts loose matches ("role camera", "action", "start") because Wispr Flow dictates into the box, and there's a button for people who don't use it.
/recall)Recall is never altered by the film. Its gameplay, timings, pools and scoring are identical standalone or inside the film; the film only listens through report-only hooks.
The generator is a language model, but the judge is not. Scoring is plain code (lib/score.ts), so the same two scenes always get the same score.
1. Match objects. Every target object is paired with at most one of your objects, greedily, in this priority order:
A different kind of thing only stands in for the original if the colour or name is exactly right, so a pink star never passes for a red circle.
2. Weight each match by confidence. The right thing in the right colour gets full weight. The right shape in the wrong colour gets about a quarter. All other credit is scaled by this weight, so a random guess can't collect points everywhere.
3. Score five categories, 20 points each (total 100):
| Category | What it checks |
|---|---|
| Objects & count | Matched objects vs. everything in both scenes (an F1 score). Misses and made-up extras cost points. |
| Colour | The same colour family (or the same icon) is full credit, a neighbouring shade or related icon is partial. |
| Position | Mostly relative layout: is A still above or left of B? Plus a little for absolute placement. |
| Size | Ratio of sizes. Within 15% is full marks. |
| Motion | The same kind of motion (move, fade, grow, orbit) in the same direction. A still scene only earns these points for things you actually remembered. |
Things you didn't mention count as zero everywhere, so naming half the scene can't score more than about half. Your total over all rounds is your Witness score, and it travels into the verdict and the credits.
/director)MediaPipe selfie segmentation produces a person mask at 256×144 and face landmarks locate the head top, forehead, eyes, nose, mouth, chin and cheeks. Everything is composited in one WebGL2 pass, back to front:
Adaptive quality: the render loop watches its own frame time. If it can't hold 30 fps for three seconds, the shader switches to a lite path (single-tap blur, plain mask edge, no grain, leaks, teeth or edge wrap) and stays there for the shot. Tracking resolution adapts the same way.
The whole look is one small settings object with clamped ranges (background, grade, light, grain, leaks, overlays). The model never returns a whole shot, only a patch: a partial change such as { "light": { "angle": 180, "color": "#ffb060" } }. The route /api/direct:
The client eases every patch in over one second, so the picture never freezes while a model thinks. A synthwave frame is drawn over the live view only; captured shots stay clean.
Director mode has 25 photo backgrounds, 15 of them moody, dark, cinematic ones, each tagged with mood and time of day so the model can pick the right one ("Put me on top of a rooftop at night."). Every photo's title, photographer, licence and URL is in public/backgrounds/credits.md.
The charge sheet comes from /api/verdict, which receives text only. Each exhibit must quote something you really said and no two can be the same line; if the model is down, a funny local charge is built from your own words.
Credits roll your name, scores, best line, every direction as a numbered scene, the photo strip, your alias and crime, the crew and the photo credits. You can download the strip, share or download a credits card (a 4:5 image with your title, scores and poster), play again, or watch your trailer.
The trailer is 37 seconds, auto-edited from your session on a 1280×720 canvas in a 2.39:1 letterbox:
Four title lines are written by the model (/api/trailer, text only, with funny house fallbacks), and a score of risers, braams and a sub drop is generated live with Web Audio. MediaRecorder captures the canvas and audio into a downloadable file (see limitations).
Every line of commentary comes from one character, an arrogant, washed-up film director. After each Recall answer and each direction he fires one short line that quotes you, shown as a typewriter subtitle ("THE DIRECTOR"). /api/roast requires the line to quote a real word you said and rejects anything about looks, body, age or identity; if the model fails, over 80 built-in roasts take over. He interrupts between Recall rounds ("Interruption. Round 2. Try not to embarrass yourself."), and stays quiet during the opening, Act III and Recall's countdown, flash and describe phases. Right-click opens a film-style action menu, and anyone who opens dev tools finds a detective's note in the console.
Recall waits on one model call, the one that turns your description into a scene, so it's built to be quick and to always answer:
google/gemini-2.5-flash-lite first (about a second), with a 10-second timeout.gemini-flash-lite-latest) gets 6 seconds.A healthy round goes from "Submit" to a score in about two seconds, and an identical description is answered from a 10-minute cache.
/studio.app/ the film (/), /recall, /director, /studio, and the API routes
/api/generate description -> scene (Recall, Studio)
/api/direct director line -> shot-settings patch
/api/verdict case file -> charge sheet (Act III)
/api/roast one director roast line
/api/trailer four trailer title lines
components/film/ the film shell: Film, Opening, Cards, Break, Verdict, Credits, Trailer, DirectorHost
components/ RecallGame, HowToPlay, SceneRenderer, director/DirectorStage, Studio…
lib/ scene schema, engine, scoring, generation, providers, offline engines, sounds
lib/director/ shot settings, WebGL renderer, tracking, overlays, grades, photo strip
lib/verdict/ charge schema, prompt, wanted poster, three.js shatter
lib/trailer/ canvas renderer, Web Audio score, recorder, narration
lib/roast/ the director: roast schema, house roasts, host queue
public/ neon icon sprite, background photos, credits.md
scripts/ build-icons.mjs (icon sprite), smoke.mjs (whole-film test)
GRAND_PLAN.md the roadmap, phase by phase, with a progress log
You need Node.js 20.9+, an OpenRouter API key (https://openrouter.ai/keys) and a free Gemini API key (https://aistudio.google.com/apikey) as the backup.
git clone https://github.com/adityabrabb/say-what-you-saw.git
cd say-what-you-saw
npm install
Create .env.local in the project root:
# Main AI provider
OPENROUTER_API_KEY=sk-or-v1-your-key-here
# Backup (free tier): used if OpenRouter fails, times out or runs out of credits
GEMINI_API_KEY=your-gemini-key-here
Optional overrides (the defaults are good):
# OPENROUTER_FAST_MODEL=google/gemini-2.5-flash-lite # Recall's fast model
# GEMINI_FAST_MODEL=gemini-flash-lite-latest # Recall's fast backup
# OPENROUTER_MODEL=google/gemini-2.5-flash # Studio and other long generations
# GEMINI_MODEL= # Studio's preferred Gemini model
.env.local is git-ignored; a template is in .env.example. Then:
npm run dev
Open http://localhost:3000 and click the black screen to roll the film.
Without any keys, everything still runs. Recall, the director's roasts, shot patches, the verdict and the trailer lines fall back to offline engines (Recall marks its scenes OFFLINE BUILD), so the whole film stays playable.
For a production check run npm run build && npm start. To play the whole film with real clicks, run the production server on port 3100 and then npm run smoke (needs Chrome).
Deploying: the project is linked to this GitHub repo, so a push to main deploys to Vercel. Set OPENROUTER_API_KEY and GEMINI_API_KEY under Project → Settings → Environment Variables.
MediaRecorder on a canvas stream, tested in Chrome and Edge. Where it isn't supported (older Safari, some mobile browsers) the trailer still plays but is watch-only with no download button.public/backgrounds/credits.md.This project was built by voice. Every prompt was dictated into Claude Code with Wispr Flow, from the first line of the first screen to the last bug report. Claude Code wrote the code; I never typed any.
How it worked:
How it was built, in phases (the full log is in GRAND_PLAN.md):
The only physical keys were the Wispr Flow hotkey and Enter to send a prompt. Say what you saw.