# TODO - ~~Reduce image size of `jayfield/dosbox-novnc` (currently ~2.3GB).~~ Done in two steps: 1. Merged the game download/extract steps and the unzip/smbclient install into a single layer (so the downloaded zips and the packages only needed to extract them no longer persist in the final image). 2.31GB -> 1.6GB. 2. Stopped baking the games into the image at all (927MB of that was just t7g's two CD ISOs). `run.sh` mounts a named volume (`dosbox-games`) so installed games persist across `--rm` restarts. 1.6GB -> ~690MB. Container now needs network access to `vlda-01` at runtime (not just build time) to install games. 3. Dropped the auto-download at container startup entirely. `scripts/setup_server.py` is a small stdlib-only HTTP server (started alongside Xvnc/fluxbox/websockify) that serves an HTML page on `${SETUP_PORT}` (`70${DISPLAY_NUM}`, published as `7099` by `run.sh`) listing every `*.zip` on the SMB share with an Installed/Install status per game; the user clicks "Install" to fetch+extract a specific game into `${GAMES_HOME}` on demand. - **Manifest-driven games + Start/Stop/Uninstall (test balloon, `stuntcar` only)**: games are no longer discovered from raw `*.zip` files on the share. `setup_server.py` now lists `*.json` manifests instead (one per game, e.g. `Games\dosbox\stuntcar.json`), each declaring `name`/`title`/`zip`/`start_cmd`. The web page grew Start/Stop/Uninstall buttons alongside Install, driven entirely by that manifest — nothing about a game's identity or how to run it is hardcoded in the image anymore. Only `stuntcar.json` exists on the share so far (as a deliberate pilot); `t7g` has no manifest yet and will not show up in the setup page until one is added (`t7g.json` with a `start_cmd` for its `dosbox-0.74-3.conf`). `game.sh`/`scripts/start_game.sh` (the old `docker exec`-based launch path, with its hardcoded `DOSBOX_VERSION`/`run.bat` convention) were intentionally left untouched for this pilot and now overlap with the new Start button — worth reconciling (or removing) once the manifest approach is rolled out to all games. - Create manifests for SCUMM engine games (Monkey Island, Day of the Tentacle, Indiana Jones, etc.). Note these are usually best run via ScummVM rather than raw DOSBox — `scummvm` isn't installed in the image yet, so this may need a Dockerfile change (add the `scummvm` package) alongside the manifests themselves, and each manifest's `start_cmd` would invoke `scummvm` with the right game-id instead of `dosbox run.bat -conf ...`. - Get game sound actually audible during play. `--device /dev/snd` is passed through and `alsa-utils` is installed, so DOSBox can write to an ALSA device inside the container, but VNC/noVNC only ever streams video, not audio — nothing currently carries that sound out to the browser. Target latency is a few tens of ms, not seconds — that rules out the "obvious" approach of a PulseAudio null sink piped through `ffmpeg` into a compressed (mp3/ogg) HTTP/Icecast-style stream consumed by an `