openjutsu
One-click character swap for videos: an open-source, local Higgsfield Genjutsu alternative built on ComfyUI and MiniMax H3, with FLUX.3 Klein relighting.
I leveled up with AI the way gaming did, just a lot faster. A playable music video by By Ian Ginn, inspired by the Deputy's Maximalists.
MediaTypeScript · JavaScriptGitHub @trmytelabsOnlineOwner 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
Next Level: a three-minute music video you can play. Five generations of games, from a retro-3D arcade to a synthwave VR finale, with a full CI/CD pipeline to a Docker deploy.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Next Level is a three-minute music video you can play, made by Ian Ginn as a weekend project to learn by building. It was inspired by the Deputy's Maximalists music-video call (Government of Alberta) and is not an application to the program. Five generations of games stand for how he leveled up with AI, the same way gaming did, just a lot faster: from first prompts in a retro arcade to full development in a synthwave VR finale. The song, the stages and the end card all tell that story.Read the full README ↗Next Level is a three-minute music video you can play, made by Ian Ginn as a weekend project to learn by building. It was inspired by the Deputy's Maximalists music-video call (Government of Alberta) and is not an application to the program. Five generations of games stand for how he leveled up with AI, the same way gaming did, just a lot faster: from first prompts in a retro arcade to full development in a synthwave VR finale. The song, the stages and the end card all tell that story.
Math.random; seek(t) rebuilds every stage from scratch, so any moment replays exactly. That is what makes a three-minute game testable.main publish it to GHCR and deploy it to a VPS through an SSH key locked to one command, with a health check, automatic rollback, and a final check that the live site serves the new commit.| Stage | Chapter | How you play the lyrics |
|---|---|---|
| ARCADE | FIRST PROMPTS | A retro-3D vector crawl. Each lyric line flies in as voxel words; shoot pixels off them. |
| 32-BIT | LEARNING TO ASK | A platformer you steer yourself. "?" blocks release each line when hit from below; bricks break, coins wait in arcs over pits, caterpillars patrol. |
| 3D CONSOLE | DIRECTING AGENTS | A racer on a Blender-built speedway. One overhead gate per line; drive under it in the lit lane. |
| MOBILE | WORKING FROM ANYWHERE | A one-thumb flyer on a phone. Words hang on signs in the pipe gaps while notifications arrive. |
| VR | FULL DEVELOPMENT | A synthwave saber lane. Word blocks fly in on the beat; one saber follows your mouse or finger, and an AI co-pilot builds the arena from what you cut. |
| Arcade · first prompts. The words are the targets. | 32-bit · learning to ask. Lines hide in "?" blocks. |
| 3D console · directing agents. One gate per line. | Mobile · working from anywhere. Words in the pipe gaps. |
| VR · full development. Cut words become the arena. | End card. Source code and patch notes, one click away. |
There are five secrets, one per stage, for players who go exploring. Find all five for a different ending. The autopilot never finds them.
The "AI" in the finale is scripted, not live: every playthrough is deterministic and every build lands on the beat.
The soundtrack is Press Start, written to the story and produced with Suno. The game does not assume a tempo or length: it follows whichever song is loaded.
public/songs/<id>/ holds the audio and a map.json: tempo, duration, and the second each of the 40 lyric lines starts. ?song=<id> picks a song (?song=none runs the original 128 BPM layout with a generated score).tools/song/analyze.py <id> measures duration, tempo and the first beat from the audio (ffmpeg plus a pure-Python onset autocorrelation).tools/song/align.py <id> times the lyrics with faster-whisper: word timestamps from speech-to-text, aligned to the lyric sheet with a Needleman-Wunsch alignment. Press Start matched 339 of 352 words.?song=<id>, press T at the start of each lyric line, then Y to save map.json.Lyrics and the Suno brief live in LYRICS.md.
| Input | Action |
|---|---|
| A / D or Left / Right | Move, steer |
| W or Up | Jump |
| S or Down | Down (you will know when) |
| Space | Fire, jump |
| Mouse (finale) | Moves the saber |
| Q | Autopilot: when idle / on / off |
| M | Sound on / off |
| L | Lyric captions on / off |
| G | Graphics tier high / low (reloads at the same moment; phones default to low) |
| P or Escape | Pause |
| 1 to 5 | Jump to a stage |
Phones: in landscape a thumb stick sits left of the game and the action button right of it (labelled per stage); upright, both sit under the game like a handheld. In the finale either pad is a trackpad for the saber.
npm install
npx vite
Open http://localhost:5173/nextlevel/ (add ?q=high or ?q=low to force a graphics tier). npm run build type-checks and writes the static site to dist/.
node tools/test/run.mjs --url http://localhost:5173/nextlevel/
The harness drives the deterministic simulation through window.ETM in headless Edge with software WebGL: page errors, NaN state, stage boundaries, the run reaching the end, and the case files in tools/test/cases/ (gameplay, autopilot coverage, lyric timing, controls, the end card, the secrets). 65 checks on desktop; --mobile --controls adds an iPhone landscape and portrait pass, 97 checks. The harness runs the original 128 BPM layout, so its expectations do not move when the song changes.
| Flag | Effect |
|---|---|
--era N | One stage only (1 to 5) |
--from A --to B | A bar range (--chunk S sets the step in seconds) |
--controls | Keyboard, touch pads and settings keys |
--mobile | iPhone landscape and portrait layout checks |
--q low | Low graphics tier |
Screenshot regression: node tools/test/visual/snap.mjs compares frames against tools/test/visual/baseline/ (--update accepts them). node tools/test/docshots.mjs regenerates the screenshots in this README. In a browser console, ETM.seek(seconds); ETM.step(seconds); ETM.render(); ETM.probe() drives the same simulation by hand.
.github/workflows/ci-cd.yml runs on GitHub-hosted runners:
Dockerfile and a smoke test of the image, run read-only with every Linux capability dropped, as in production.main: the image goes to ghcr.io/trmytelabs/nextlevel:<commit sha>.production environment: an SSH key that is forced to a single command asks the server to run deploy-app nextlevel <sha>. That pulls the image, starts it, waits for its /health check and rolls back automatically if it never gets healthy.The image serves dist/ with Caddy on port 8080 as an unprivileged user, on a read-only filesystem (deploy/container.Caddyfile holds the Content-Security-Policy, security headers and caching rules). On the VPS, the host's own Caddy terminates HTTPS with a Cloudflare origin certificate and only accepts connections from Cloudflare; DNS for patchnotes.ca is on Cloudflare. Pull requests from forks get no secrets and a read-only token, and never publish or deploy.
pages.yml also publishes every push to main to https://trmytelabs.github.io/nextlevel/. deploy/wp/ holds a Docker Compose setup and backup / restore scripts for moving a WordPress site onto the same server.
index.html holds the markup, CSS and HUD and loads src/boot.ts, which applies the song map before the stages load. Every stage exposes the same init / update / draw / onBeat / on8th / onLine surface, and seek(t) rebuilds every stage's state from scratch at any moment.
| File | Role |
|---|---|
src/boot.ts | Loads public/songs/<id>/map.json and applies it, then loads the game |
src/core.ts | Constants, ERAS, LYRICS, the song-map timeline (applySongMap, cb), seeded RNG, input (keys, touch pads), quality tier |
src/main.ts | Transport, demo mode, compositing, transitions, HUD, captions, patch notes panel, the window.ETM test hook |
src/song.ts | The song as master clock, offset nudge, tap-to-time |
src/startgl.ts | The voxel synthwave title screen |
src/era1.ts, src/era1gl.ts | Arcade crawl and its Three.js voxel renderer |
src/era2.ts | Platformer (fixed-tick physics, planning autopilot, secret room) |
src/era3.ts, src/era3gl.ts | Racer simulation and its Three.js speedway |
src/era4.ts | Phone flyer |
src/era5.ts, src/era5gl.ts, src/synthkit.ts | Saber lane, its renderer and end card, procedural towers / palms / car / fireworks |
src/eggs.ts | The five secrets |
src/patchnotes.ts | The in-game patch notes |
src/crt.ts | CRT pass for the retro stages |
src/music.ts | Generated score, used only with ?song=none |
The simulation is deterministic: seeded hashes, never Math.random, in sim code. tools/blender/*.py build the cars, speedway scenery and finale kit headlessly into public/models/.
docs/notes/ keeps the working notes and reviews written while building it (they describe earlier builds). LYRICS.md has the lyrics and the Suno brief, and tools/test/CASES.md the test-case spec.
public/textures/LICENSE.txt)