---
title: 'TTG RetroArch Store'
url: 'https://wiki.teletypegames.org/stores/ttg-retroarch-store'
markdown: 'https://wiki.teletypegames.org/stores/ttg-retroarch-store.md'
lang: en
date: '2026-08-17'
description: "ttg-retroarch-store puts the https://teletypegames.org catalog into RetroArch's library: two playlists with box art — Teletype Games - Commodore 64 and Teletype Games - TIC-80 — on desktop Linux, Windows, macOS, Android, Steam Deck or a handheld. This repository is only config.json and two wrapper…"
taxonomy:
  tag:
    - howto
---

# TTG RetroArch Store

> `ttg-retroarch-store` puts the <https://teletypegames.org> catalog into RetroArch's library: two playlists with box art — *Teletype Games - Commodore 64* and *Teletype Games - TIC-80* — on desktop Linux, Windows, macOS, Android, Steam Deck or a handheld. This repository is only `config.json` and two wrapper scripts; the logic is in the shared [RetroArch store engine](https://wiki.teletypegames.org/stores/warp-engine-retroarch-store).

**Repository:** <https://git.teletypegames.org/stores/ttg-retroarch-store>**Engine:** [WarpEngine RetroArch Store](https://wiki.teletypegames.org/stores/warp-engine-retroarch-store)**Batocera equivalent:** [TTG Batocera Store](https://wiki.teletypegames.org/stores/ttg-batocera-store)

# Install

```sh
curl -fsSL https://git.teletypegames.org/stores/ttg-retroarch-store/raw/branch/master/install.sh | sh
```

The installer fetches the engine, puts it and this config in `~/.local/share/warp-engine-store/ttg-retroarch/`, writes the `ttg-retroarch-store` launcher into `~/.local/bin`, prints the directories it resolved from your `retroarch.cfg`, and runs the first sync. Our `install.sh` only wraps the engine's: it downloads it (with retries) into a temporary directory of its own and runs it from there, so no stray `retroarch_store.py` or `warpstore.py` in `/tmp` can be installed instead of the forge's. **Restart RetroArch** to see the playlists — it builds its menu at startup.

Without the two cores the playlists still work, and RetroArch asks which core to use the first time. To lose 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 on exit, 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-retroarch/store.log 2>&1
```

# Uninstall

```sh
curl -fsSL https://git.teletypegames.org/stores/ttg-retroarch-store/raw/branch/master/uninstall.sh | sh
```

It removes the six games, the two playlists and their thumbnails, then the launcher and the store home. Close RetroArch first, for the same reason as a sync. `DRY_RUN=1` shows what would go; `KEEP_HOME=1` keeps `state.json` and the log for a reinstall.

Nothing of yours goes with it: content you put in the `teletypegames/` folder keeps its directory, a playlist that still holds an entry of yours is rewritten rather than deleted, and any `*.lpl.ttg-backup` is listed and left alone.

# What this store installs

| Catalog platform | Playlist | Core | Extension |
|---|---|---|---|
| [`c64`](https://wiki.teletypegames.org/platforms/c64) | Teletype Games - Commodore 64 | `vice_x64_libretro` (VICE x64) | `.prg` |
| [`plus4`](https://wiki.teletypegames.org/platforms/plus4) | Teletype Games - Commodore Plus/4 | `vice_xplus4_libretro` (VICE xplus4) | `.prg` |
| [`tic80`](https://wiki.teletypegames.org/platforms/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](https://wiki.teletypegames.org/projects/blessingofra), [Rabbit Scooter](https://wiki.teletypegames.org/projects/rabbitc64), [C64 Demo for Arok Party 2026](https://wiki.teletypegames.org/projects/c64-demo) |
| TIC-80 | [Definitely not an Impostor](https://wiki.teletypegames.org/projects/impostor), BombExpert, Mr Anderson's Adventure |

That is the cartridge half of the catalog. Our other games are native and web builds, which no libretro core runs; on a Batocera box they install as Ports through the [TTG Batocera Store](https://wiki.teletypegames.org/stores/ttg-batocera-store).

Everything lands under the `teletypegames/` subfolder of RetroArch's content directory, so a prune can never reach your own content. To change any of it, edit `~/.local/share/warp-engine-store/ttg-retroarch/config.json` — the full key reference is on the [engine's page](https://wiki.teletypegames.org/stores/warp-engine-retroarch-store).

# Onto an Android phone or a handheld

RetroArch on Android reads the same playlists, but Android cannot run Python, so the tree is rendered on a computer 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.** 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/
│   ├── retroarch_store.py, warpstore.py, config.json
│   └── state.json, catalog.json
└── (launcher: ~/.local/bin/ttg-retroarch-store)

<content_root>/teletypegames/c64/     blessingofra-2.0.0.prg, rabbit-1.0.0.prg, …
<content_root>/teletypegames/tic80/   impostor-1.0.tic, …
<playlists_dir>/Teletype Games - Commodore 64.lpl
<playlists_dir>/Teletype Games - TIC-80.lpl
<thumbnails_dir>/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

- **Does the VICE core auto-start a raw `.prg`**, or load and wait for `RUN`? If it waits, the fix is a core option or shipping `.d64`.
- **The Android push**, including whether scoped storage lets RetroArch read what `adb push` wrote.

Report back what happens — the design notes are in `devarea/RETROARCH_STORE.md`.

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Stores](https://wiki.teletypegames.org/stores.md)
- Previous: [TTG Batocera Store](https://wiki.teletypegames.org/stores/ttg-batocera-store.md)
- Next: [WarpEngine Batocera Store](https://wiki.teletypegames.org/stores/warp-engine-batocera-store.md)
