Install the native Linux builds as Ports

Cartridges were under half the catalog; the rest are native builds no
emulator can boot. Batocera runs Linux and its Ports system takes .sh
launchers, so ebitengine, bevy, godot and love now map to ports with a
per-architecture kind: linux_x64 on x86_64, linux_arm64 where a build
exists. Where it does not, the engine skips the title naming the
architecture rather than installing a binary that cannot start.

Verified end to end against the live catalog with a local roms root:
on aarch64 rabbitroller is skipped for want of a linux_arm64 asset, on
x86_64 it unpacks under ports/.data/teletypegames/ with an executable
bit and a working launcher.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 20:01:28 +02:00
co-authored by Claude Opus 5
parent 85f45baabf
commit 5062e0da63
2 changed files with 52 additions and 44 deletions
+38 -43
View File
@@ -78,10 +78,16 @@ alone.
## What this store installs ## What this store installs
Cartridges go to their emulator's ROM folder, native builds to **Ports**:
| Catalog platform | Asset kind | Batocera system | Extension | | Catalog platform | Asset kind | Batocera system | Extension |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `c64` | `cartridge` | `c64` (VICE) | `.prg` | | `c64` | `cartridge` | `c64` (VICE) | `.prg` |
| `tic80` | `cartridge` | `tic80` | `.tic` | | `tic80` | `cartridge` | `tic80` | `.tic` |
| `ebitengine` | `linux_x64` / `linux_arm64` | `ports` | `.zip` |
| `bevy` | `linux_x64` / `linux_arm64` | `ports` | `.zip` |
| `godot` | `linux_x64` | `ports` | `.zip` |
| `love` | `linux_x64` | `ports` | `.zip` |
Statuses `released` and `archived`, whole catalog, no owner filter. Everything Statuses `released` and `archived`, whole catalog, no owner filter. Everything
lands under the `teletypegames/` subfolder of each system, so a prune can never lands under the `teletypegames/` subfolder of each system, so a prune can never
@@ -89,54 +95,39 @@ reach ROMs you put there yourself. To change any of it, edit
`/userdata/system/batocera-store/ttg/config.json` on the box — the full key `/userdata/system/batocera-store/ttg/config.json` on the box — the full key
reference is in the engine's README. reference is in the engine's README.
## Native games as Ports — experimental ## Native games as Ports
Cartridges are all this store installs by default, which is a little under half Cartridges are a little under half the catalog; the rest of our games are native
the catalog: the rest of our games are native builds, and an emulator cannot Linux builds, and no emulator boots those. Batocera runs Linux, so they are
boot those. The engine can install them through Batocera's **Ports** system installed through its **Ports** system instead: the zip is unpacked under
instead, but it is off here on purpose — **nobody has yet confirmed on real `ports/.data/teletypegames/`, and the launcher EmulationStation lists is
hardware that the games start**, and each one is a 30100 MB download rather `ports/teletypegames/<name>.sh`, which `cd`s into the program's directory before
than a few kilobytes. running it. They appear under *Ports ▸ Teletype Games*, and `remove` takes the
unpacked program with it.
To try it, add platform entries to Each one is a 30100 MB download rather than the few kilobytes of a cartridge.
`/userdata/system/batocera-store/ttg/config.json` on the box:
```json **The build has to match the box.** Batocera runs on x86_64 mini-PCs as much as
"platforms": { on the Raspberry Pi and the ARM handhelds, and a native binary only starts on the
"ebitengine": { architecture it was built for. The engine detects the architecture — `list` and
"system": "ports", `config` both report it — and picks the asset for it; where there is none the
"install": "port", title is skipped with a message naming the architecture, rather than installing
"kind": { "x86_64": "linux_x64", "aarch64": "linux_arm64" }, something that cannot start:
"ext": ".zip",
"enabled": true ```
}, skipped rabbitroller: no 'linux_arm64' asset in any release
"godot": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64" }, "ext": ".zip", "enabled": true },
"love": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64" }, "ext": ".zip", "enabled": true },
"bevy": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64", "aarch64": "linux_arm64" },
"ext": ".zip", "enabled": true }
}
``` ```
Then `/userdata/system/batocera-store/ttg-store sync`. The games appear under `ebitengine` and `bevy` build for both `linux_x64` and `linux_arm64`; `godot` and
*Ports ▸ Teletype Games*; `remove` takes the unpacked program with it. `love` are x86_64-only for now — a Godot ARM export needs a preset in the game
repo, and LÖVE has no upstream ARM runtime. `tic80` has an ARM problem too, but
it is installed as a cartridge, which is data for an emulator and runs anywhere.
`phaser` ships only a web build, so it is not mapped at all.
**Mind the architecture.** Only the platforms listed with an `aarch64` entry Statuses still apply, and they are what keeps this small today: most of our
above have ARM builds today — on a Raspberry Pi or a handheld the others are native titles are `demo`, which is not in `catalog.statuses`. On x86_64 the only
skipped with a message naming the architecture, rather than installing something native game that currently installs is `rabbitroller`. Add `"demo"` to
that cannot start. `godot`, `love` and `tic80` have no ARM build at all yet: a `catalog.statuses` on the box to get the rest.
Godot ARM export needs a preset in the game repo, LÖVE has no upstream ARM
runtime, and TIC-80's exporter has no ARM target.
With everything that can be enabled turned on, the coverage measured on
2026-08-17 was **13 of 15** titles on x86_64 and **9 of 15** on ARM. The two that
stay out either way are `phaserdemo` and `trickster-tiles`: they ship only a web
build.
Report back what happens on a real box — that is the missing piece before this
becomes the default.
## Where things land ## Where things land
@@ -150,5 +141,9 @@ becomes the default.
/userdata/roms/c64/teletypegames/ blessingofra-2.0.0.prg, rabbit-1.0.0.prg, … /userdata/roms/c64/teletypegames/ blessingofra-2.0.0.prg, rabbit-1.0.0.prg, …
/userdata/roms/c64/teletypegames/images/ blessingofra.png, … /userdata/roms/c64/teletypegames/images/ blessingofra.png, …
/userdata/roms/c64/gamelist.xml our entries merged in /userdata/roms/c64/gamelist.xml our entries merged in
/userdata/roms/ports/Teletype Games Store.sh
/userdata/roms/ports/Teletype Games Store.sh the store itself
/userdata/roms/ports/teletypegames/ rabbitroller.sh, …
/userdata/roms/ports/teletypegames/images/ rabbitroller.png, …
/userdata/roms/ports/.data/teletypegames/ the unpacked programs
``` ```
+14 -1
View File
@@ -28,7 +28,20 @@
"platforms": { "platforms": {
"c64": { "system": "c64", "kind": "cartridge", "ext": ".prg", "enabled": true }, "c64": { "system": "c64", "kind": "cartridge", "ext": ".prg", "enabled": true },
"tic80": { "system": "tic80", "kind": "cartridge", "ext": ".tic", "enabled": true } "tic80": { "system": "tic80", "kind": "cartridge", "ext": ".tic", "enabled": true },
"ebitengine": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64", "aarch64": "linux_arm64" },
"ext": ".zip", "enabled": true },
"bevy": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64", "aarch64": "linux_arm64" },
"ext": ".zip", "enabled": true },
"godot": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64" },
"ext": ".zip", "enabled": true },
"love": { "system": "ports", "install": "port",
"kind": { "x86_64": "linux_x64" },
"ext": ".zip", "enabled": true }
}, },
"behavior": { "behavior": {