Skip to content

A 105-second tour video, made from the launcher's own frames - #54

Merged
8 commits merged into
mainfrom
video-refresh
Nov 10, 2026
Merged

8 commits merged into
mainfrom
video-refresh

Conversation

@tarikbc

@tarikbc tarikbc commented Nov 9, 2026 •

Copy link
Copy Markdown
Owner

A 105-second tour of ZyperOS for the README, zyperos.com and creators. Every screen in it is drawn by the launcher itself, on a sample library with the games' real box art, inside the Pixel 2 model. It is cut to Leap by nene, one of ZyperOS's own menu music tracks: every scene lasts whole bars, and the big moments land on its sections.

The tour's poster

What it shows

Time Bar Beat
0:00 0 Your whole retro library: the PlayStation shelf flying past
0:04 3 On in 2 seconds: the real boot into the home, beside a plain loading panel for stock firmware (30 to 40 s)
0:10 7 Every system in pixel art
0:13 9 Box art it finds itself: N64's shelf, the Scraper fetching
0:18 12 Search any game, then A starts Sonic 2
0:23 15 Starts the moment you press A
0:24 16 Turn it off: POWER, the power-off, POWER, and the same game frame 2 s later
0:30 20 Video snaps: the bar fills and Symphony of the Night's cover turns into its real snap
0:33 22 Quick save, quick load
0:36 24 Every control, in the game
0:40 26 Pick a game's cover
0:43 28 Wi-Fi File Transfer: the device beside the page on a laptop and a phone
0:50 33 Or over the USB cable
0:55 36 No Wi-Fi around? The hotspot and the PIN page
0:58 38 An empty card shows you how: its two ways in
1:01 40 Drop your games in: File Transfer on the device and the page
1:04 42 And they're on the shelf: Zyper cheers the new games
1:07 44 Keeps going while you play
1:10 46 System Update, 1.0.1 to 1.0.2
1:13 48 Battery care: held at 85%, Time Left
1:16 50 Storage
1:20 52 Light and dark, side by side
1:23 54 RetroAchievements
1:26 56 MP4 and its lock
1:29 58 PortMaster
1:32 60 Nintendo DS: screen layouts and Game Language
1:35 62 Eight languages
1:38 64 A first start that asks
1:41 66 zyperos.com, and the music credit

How it is made

  • video/footage/takes.py runs the host build (make native) headless. Live takes press buttons through video/rec/rec.c, a small library loaded with DYLD_INSERT_LIBRARIES: it answers SDL's clock with the frames drawn, writes every frame to ffmpeg at 60 a second, and delivers the presses, so the motion is the launcher's own. Shot takes use the launcher's own --shot pictures (the in-game menu, the power-off, the charging screen, the first start, the video snap's bar and turn). The launcher does not change; rec.c and snapsub.c are only in video/.
  • The video snap: the host has no Muse to decode a snap, so video/rec/snapsub.c gives --snap's turn the frames of a real snap in place of the test picture, one a shot. It is Symphony of the Night's ScreenScraper snap from my card, kept outside the repository; SNAP_SOURCE swaps it (video/README.md).
  • The boot race uses my own timing: ZyperOS starts in about 2 s, stock firmware in 30 to 40. Stock's side is a plain loading panel and a timer, nothing of its interface.
  • The File Transfer page is res/readme/portal*.png, the page drawn in headless Chrome by tools/readme-shots.py.
  • The covers come from the libretro-thumbnails sets, cached in ~/Library/Caches/zyperos-readme-art and never committed. The games and their art belong to their owners.
  • Remotion composes it. video/src/music.ts holds the track; video/src/timeline.ts lays the scenes on its bars. Leap is exactly 156 BPM, a 104-bar loop; the tour runs from bar 0 to two beats past bar 68, the phrase end before a break, fading there.
  • Music: Leap by nene (CC0), credited on the end card. The presses play the launcher's own interface sounds. video/LICENSES.md has every menu track's tempo and sections.

Files

  • site/zyperos-tour.mp4 (13 MB, 1920x1080, 30 fps, H.264, -16 LUFS) and site/zyperos-tour.jpg, in the #tour section of site/index.html.
  • res/readme/tour-poster.jpg, linked from the README to zyperos.com/#tour.
  • Both embeds sit in their own <!-- tour-video --> blocks.

Not shown

  • Gameplay: no ROMs, so a game's frame is its libretro screenshot.
  • The side lights and MENU+START: the host build has no lights and nothing to draw for them.

make check passes.

video/ makes it. footage/takes.py runs the host build headless on a sample
card with the games' real box art (libretro-thumbnails, cached outside the
repository) and records it: live takes press buttons through rec/rec.c, a
small library loaded with DYLD_INSERT_LIBRARIES that drives SDL's clock by
the frames drawn and writes every frame to ffmpeg at 60 a second, and shot
takes step the launcher's own --shot pictures for screens the host cannot
reach. Nothing in the launcher changes, and rec.c is not in its build.

Remotion puts the footage in the Pixel 2 model, straight on, beside the
site's own words, cut on the beat of The Arplands by LordZintick (CC0), one
of ZyperOS's menu music tracks, with the launcher's own interface sounds on
the presses.

site/zyperos-tour.mp4 (11 MB, 1080p, -16 LUFS) and its poster go on
zyperos.com in a new #tour section, and the README links its poster there.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Deploying zyperos with  Cloudflare Pages  Cloudflare Pages

Latest commit: 31f6e06
Status: ✅  Deploy successful!
Preview URL: https://4113fb40.zyperos.pages.dev
Branch Preview URL: https://video-refresh.zyperos.pages.dev

View logs

Tarik found v1 slow and missing much of ZyperOS. v2 is 24 short beats of 2 to
5 seconds on The Arplands from its drums, navigation played at 1.5 to 2x,
the device whipping in and springing between poses, punch-ins on what
matters, and labels that rise word by word on the beat.

New footage, all the launcher's own: the Scraper fetching covers, the quick
save and load pop-ups, Wi-Fi File Transfer beside the page in a laptop and a
phone, a computer on the USB cable, the hotspot, the transfer ring over a
game, System Update from 1.0.1, Charge Limit and Time Left, MP4's lock, the
DS screen rows and Game Language, the empty card, light and dark side by
side, and MENU in all eight languages.
@tarikbc tarikbc changed the title A tour video, made from the launcher's own frames A 75-second tour video, made from the launcher's own frames Nov 9, 2026
Tarik's note on v2: slow it down about 20%. Every beat holds a quarter
longer, rounded to whole beats of the music, so cuts stay on the grid; the
navigation speed-ups are a fifth lower (2x to 1.6x, 1.5x to 1.2x); the
springs, label words and whips are eased a little. Scenes, order, labels and
the music are as they were. A check in Root.tsx now stops a render whose
scene would run past the end of its footage.
@tarikbc tarikbc changed the title A 75-second tour video, made from the launcher's own frames A 95-second tour video, made from the launcher's own frames Nov 9, 2026
…deo snaps

Tarik picked Leap by nene (CC0, res/bgm) and asked for the motion to follow
it. Leap is exactly 156 BPM, a 104-bar loop; every scene now lasts whole bars
of it and sits on its sections: the full band for the opening, the power off
and on in the first break, back in the game on a downbeat, the video snap
turning on the next, the in-game menu in the calm bars, light and dark on the
theme's return at bar 52, and the end two beats past bar 68, the phrase end,
fading there.

Three new beats, all the launcher's own frames: the boot animation into the
home in 2 s beside a plain loading panel for stock firmware's 30 to 40 (my
own timing); POWER in a game, the power-off, POWER and the same frame 2 s
later; and a cover's bar filling and turning into its video snap, which the
host draws with rec/snapsub.c giving --snap's turn a frame of the snap.

The music is one setting, src/music.ts, and LICENSES.md has every menu
track's tempo and sections. The web file stays well under 25 MB (12 MB).
@tarikbc tarikbc changed the title A 95-second tour video, made from the launcher's own frames A 105-second tour video, made from the launcher's own frames Nov 9, 2026
…raper snap

The snap is from my card, 2 s into its clip, played frame by frame where the launcher turns the cover; the clip stays outside the repository (video/README.md, A real video snap).
Tarik found the old 'no games yet' beat too short. Now it is six bars after the hotspot: the empty home and its two ways in, the games dropping in over File Transfer, and Zyper's cheer held at its height so it can be read. The bars came from Battery, MP4, PortMaster and the first start, so light and dark still lands on bar 52 and the end on bar 68.
@tarikbc tarikbc closed this pull request by merging all changes into main in 24ed6a2 Nov 10, 2026
@tarikbc
tarikbc deleted the video-refresh branch November 10, 2026 00:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant