commit 48aeeebaf7401763ea96d06547d7e6e9a91d6254 Author: Zsolt Tasnadi Date: Mon Aug 17 18:00:33 2026 +0200 The Teletype Games store for RetroArch Config plus a wrapper installer; all the logic is in the shared engine, warp-engine-retroarch-store. Two playlists — Commodore 64 and TIC-80 — carrying the six released and archived cartridges in the catalog, 233 KB in total. That is the cartridge half of what we publish. The rest are native and web builds, which no libretro core runs; on a Batocera box those install as Ports through ttg-batocera-store instead. Co-Authored-By: Claude Opus 5 (1M context) diff --git a/README.md b/README.md new file mode 100644 index 0000000..df85e03 --- /dev/null +++ b/README.md @@ -0,0 +1,134 @@ +# ttg-retroarch-store — the Teletype Games store for RetroArch + +Puts the catalog into RetroArch's library: two +playlists — *Teletype Games - Commodore 64* and *Teletype Games - TIC-80* — with +box art, on any machine RetroArch runs on. + +This repository is only the store definition — `config.json` plus a wrapper +installer. All the logic lives in the shared engine, +[`warp-engine-retroarch-store`](https://git.teletypegames.org/tools/warp-engine-retroarch-store), +which works with any WarpEngine-based site; this is just the Teletype Games +configuration of it. + +## Install + +```sh +curl -fsSL https://git.teletypegames.org/tools/ttg-retroarch-store/raw/branch/master/install.sh | bash +``` + +Or from a checkout of this repo: + +```sh +./install.sh +``` + +The installer fetches the engine, drops it and this config in +`~/.local/share/warp-engine-store/ttg/`, writes the `ttg-retroarch-store` +launcher into `~/.local/bin`, prints the directories it resolved from your +`retroarch.cfg`, and runs the first sync. **Restart RetroArch** to see the +playlists — it builds its menu at startup. + +If the two cores are not installed, the playlists still work and RetroArch asks +which core to use the first time. To be rid of the prompt: +*Online Updater ▸ Core Downloader ▸ **VICE x64** and **TIC-80***, then sync again. + +## Use + +```sh +S=~/.local/bin/ttg-retroarch-store + +$S paths # where things go, and whether the cores are there +$S list # compatible catalog entries; * installed, ^ update available +$S sync # download everything new, refresh the playlists +$S sync blessingofra # just one title (never prunes) +$S -n sync # dry run +$S remove c64demo # uninstall +``` + +Close RetroArch before syncing: it writes its playlists back when it exits, so a +sync underneath a running instance can be undone. The store refuses rather than +lose the work. + +Keep it current from `crontab`: + +``` +0 * * * * ~/.local/bin/ttg-retroarch-store sync >>~/.local/share/warp-engine-store/ttg/store.log 2>&1 +``` + +## What this store installs + +| Catalog platform | Playlist | Core | Extension | +| --- | --- | --- | --- | +| `c64` | Teletype Games - Commodore 64 | `vice_x64_libretro` (VICE x64) | `.prg` | +| `tic80` | Teletype Games - TIC-80 | `tic80_libretro` (TIC-80) | `.tic` | + +Statuses `released` and `archived`, whole catalog, no owner filter — **six titles, +233 KB in total** as measured on 2026-08-17: + +| Playlist | Titles | +|---|---| +| Commodore 64 | Blessing of Ra, Rabbit Scooter, C64 Demo for Arok Party 2026 | +| TIC-80 | Definitely not an Impostor, BombExpert, Mr Anderson's Adventure | + +That is the cartridge half of the catalog. Our other games are native builds and +web builds, and no libretro core runs those — on a Batocera box they install as +Ports instead, see +[`ttg-batocera-store`](https://git.teletypegames.org/tools/ttg-batocera-store). + +Everything lands under the `teletypegames/` subfolder of RetroArch's content +directory, so a prune can never reach content you put there yourself. To change +any of it, edit `~/.local/share/warp-engine-store/ttg/config.json` — the full key +reference is in the engine's README. + +## Onto an Android phone or a handheld + +RetroArch on Android reads the same playlists, but Android cannot run Python, so +the tree is rendered here and copied over: + +```sh +$S export /tmp/ra-ttg \ + --target-prefix /storage/emulated/0/RetroArch \ + --target-libretro-dir /data/data/com.retroarch.aarch64/cores \ + --core-suffix _android.so +adb push /tmp/ra-ttg/. /storage/emulated/0/RetroArch/ +``` + +Both cores are published for Android arm64-v8a and armeabi-v7a, so the games do +run there — but **this path has not been tried on a device yet.** If the playlists +do not show up, check the phone's own paths: + +```sh +adb shell cat /storage/emulated/0/RetroArch/retroarch.cfg | grep _directory +``` + +## Where things land + +``` +~/.local/share/warp-engine-store/ +├── ttg/ +│ ├── retroarch_store.py, warpstore.py, config.json +│ └── state.json, catalog.json +└── (launcher: ~/.local/bin/ttg-retroarch-store) + +/teletypegames/c64/ blessingofra-2.0.0.prg, rabbit-1.0.0.prg, … +/teletypegames/tic80/ impostor-1.0.tic, … +/Teletype Games - Commodore 64.lpl +/Teletype Games - TIC-80.lpl +/Teletype Games - Commodore 64/Named_Boxarts/Blessing of Ra.png +``` + +`playlists_dir`, `thumbnails_dir` and the cores folder come from your +`retroarch.cfg` — they are not always where you would guess, so `paths` prints +what was resolved and where each answer came from. + +## Not yet verified on real hardware + +The engine has been exercised end to end (download, playlists, thumbnails, prune, +uninstall, Android export), but two things need a real run: + +- **Does the VICE core auto-start a raw `.prg`**, or does it load and wait? If it + waits, the fix is a core option or shipping `.d64` instead. +- **The Android push**: the paths above, and whether scoped storage lets RetroArch + read what `adb push` wrote. + +Report back what happens — the design notes are in `devarea/RETROARCH_STORE.md`. diff --git a/config.json b/config.json new file mode 100644 index 0000000..453a957 --- /dev/null +++ b/config.json @@ -0,0 +1,59 @@ +{ + "store": { + "id": "ttg", + "name": "Teletype Games", + "base_url": "https://teletypegames.org", + "api": { + "catalog": "/api/software", + "download": "/api/download" + } + }, + + "paths": { + "retroarch_dir": null, + "playlists_dir": null, + "thumbnails_dir": null, + "libretro_dir": null, + "content_root": null, + "subfolder": "teletypegames", + "target_prefix": null + }, + + "playlist": { + "name_template": "{store} - {label}", + "write_crc32": true, + "thumbnail_kinds": ["Named_Boxarts", "Named_Titles", "Named_Snaps"] + }, + + "catalog": { + "statuses": ["released", "archived"], + "owner_id": null, + "only": [], + "exclude": [] + }, + + "platforms": { + "c64": { + "label": "Commodore 64", + "kind": "cartridge", + "ext": ".prg", + "core": { "file": "vice_x64_libretro", "name": "VICE x64" }, + "enabled": true + }, + "tic80": { + "label": "TIC-80", + "kind": "cartridge", + "ext": ".tic", + "core": { "file": "tic80_libretro", "name": "TIC-80" }, + "enabled": true + } + }, + + "behavior": { + "prune": true, + "timeout": 30, + "insecure": false, + "refuse_while_running": true, + "convert_images": true + } +} diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..1d35ffd --- /dev/null +++ b/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# Install the Teletype Games store into this machine's RetroArch. +# +# bash <(curl -fsSL https://git.teletypegames.org/tools/ttg-retroarch-store/raw/branch/master/install.sh) +# +# All the work is done by the engine's installer; this only says which store. +set -euo pipefail +ENGINE_RAW_BASE="${ENGINE_RAW_BASE:-https://git.teletypegames.org/tools/warp-engine-retroarch-store/raw/branch/master}" +export STORE_CONFIG="${STORE_CONFIG:-https://git.teletypegames.org/tools/ttg-retroarch-store/raw/branch/master/config.json}" +curl -fsSL "$ENGINE_RAW_BASE/install.sh" | bash