Rust libraries and a viewer for desktop and browser
2026-10-23, sixth session. The second milestone of the plan begins.
Three libraries
The Python decoders proved each format on every file. Now they are Rust crates:
pod-containerreads and writes the block container and the name strings.pixelsholds the colour formats the game uses: RGB555, RGB565, 8-bit palettes, BGRA and Windows bitmaps. Nothing in it is specific to POD, so it may move to GameFrame's shared crates later.pod-formatshas one module per format: menu images, stills, text tables, sound banks, texture blocks and the effect textures.
A test runs every reader over the player's own disc and checks the same counts the Python prototypes measured: 98 containers that encode back byte-identical, 146 images, 11 stills, 12 text tables, 82 sounds and 371 texture pages. The files never enter the repository. When they are not there, the test says so and skips, and a run pointed at an empty folder shows exactly that.
One viewer, two places
The viewer uses egui on wgpu and has no decoder of its own: it calls the crates. It lists the files by folder and shows each one as pictures with their sub-textures outlined, as text tables, as a list of sounds or as hex.
On the desktop it opens the disc's data folder and plays sounds. The same code compiles to WebAssembly. In the browser you drop the files onto the page and they are read there, never uploaded. Sound in the browser is still to come.
egui moved on since the last version I knew: an app now draws into a ui instead of a context, and dropped files arrive as handles that the browser reads asynchronously. The viewer was adapted from egui's own sources in the local cache.

The viewer built for the browser, with the files of the disc loaded from a local server. © Ubi Soft for the game's content; shown from our own viewer.
Next
Sound playback in the browser, and then the car models: the first 3D view, on the way to the track viewer.