MORE_STORES gains a line under the finished desktop item, REPO_REFACT the repo and a log entry — including the two things worth remembering: the engine grew `--json` so a window could drive it without parsing prose, and the app doubles as the Windows installer because `curl … | sh` does not exist there. check-repos.sh is green at 52. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
21 KiB
Milyen további store-okat érdemes csinálni
Készült 2026-08-16-án, a warp-engine-batocera-store szétválasztása után. A kérdés: a batocera-store mintájára milyen más gazdaplatformra tudnánk store-t adni.
2026-08-18: újramérés a doksi végén. Két store és a kiemelt közös mag után a kérdés újra feltéve — új jelöltekkel (Pegasus, Lutris), egy korrekcióval (az ES-DE nem drop-in, a Steam alá van becsülve), és egy méréssel, ami az egész listát átrendezi: a katalógus 8/15-e
demovagydevelopment, tehát a store-ok ma 7 címet látnak. Az alábbi lefedettségi számok a demókat is beszámolják.
A mérés, ami átrendezi a kérdést
A katalógus legfrissebb kiadásaiban (15 szoftver) ennyi asset van (2026-08-17-i mérés):
| Asset | Hány szoftvernél | Ki használja ma |
|---|---|---|
html |
11 | senki — a publikus oldal lejátssza, de nincs könyvtár |
win_x64 |
9 | senki |
linux_x64 |
9 | senki |
linux_arm64 |
1 | a batocera-store (arch-illesztéssel) |
cartridge |
7 | a batocera-store |
win_x86 |
4 | senki |
mac_x64 |
3 | senki |
docs / source |
3 / 3 | a publikus oldal |
mac_universal |
2 | senki |
Platformonként:
| Platform | Elérhető assetek |
|---|---|
| c64 | cartridge (4) |
| tic80 | cartridge, html, source, docs, win_x64, linux_x64, mac_x64 (3) |
| ebitengine | html, win_x86, win_x64, linux_x64 (3) |
| godot | html, win_x86, win_x64, linux_x64, mac_universal (1) |
| love | html, win_x64, linux_x64, mac_universal (1) |
| phaser | html (2) |
| bevy | html (1) |
A tanulság: a batocera-store csak a cartridge-et fogyasztja, tehát a katalógus 7/15 részét. A legelterjedtebb asset-fajtánk, a webes build, egyetlen store-ban sem szerepel. Nem az a szűk keresztmetszet, hogy kevés store van — hanem hogy a meglévő a katalógus felét ott hagyja.
0. Előfeltétel mindenhez: ARM Linux buildek — kész
(2026-08-16-án megoldva; az alábbi indoklás megmaradt, mert a 3. és 4. pont erre épül.)
Akkori állapot: a build-mátrixunkban nem volt Linux ARM asset. A ReleaseAsset::KINDS ezt tartalmazza:
cartridge source html docs
win_x86 win_x64 linux_x86 linux_x64
mac_x64 mac_arm64 mac_universal
Van mac_arm64, de linux_arm64 és linux_armhf nincs — a linux_x86 pedig szerepel a listán, csak épp semmi nem gyárt bele.
Ez azért döntő, mert a Batocera nem csak x86_64-en fut: Raspberry Pi-n, Odroidon és a kézikonzolokon ARM-on megy. Egy linux_x64 bináris ezeken feltelepül, de nem indul el — ami rosszabb, mint ha nem is ajánlanánk fel. Ugyanez blokkolja az 1. pont legérdekesebb célpontjait: a muOS, ArkOS és JELOS kézikonzolok szinte mind ARM-osak.
Amiért a mai store hordozható: a cartridge architektúra-független (adat egy emulátornak), ezért mind a 7 cím megy minden Batocera gépen.
Teendő, sorrendben:
linux_arm64(és ha kell,linux_armhf) felvétele aKINDS-be és a platformokci_platformsmátrixába.- Cross-build a pipeline-okban. A legkönnyebb az ebitengine (Go:
GOARCH=arm64), utána a bevy (Rust cross toolchain) és a godot (van ARM export template); a LÖVE a legnehezebb, ott ARM futtatókörnyezet kell. - A motor architektúra-felismerése (
uname -m→x86_64/aarch64/armv7l), és csak az illeszkedő asset telepítése.
0b. linux_* → Batocera ports — kész
(2026-08-17-én megvalósítva a motorban.) A ROM-rendszerek mellett van egy második telepítési mód: install: "port" esetén a zip kicsomagolódik, és egy .sh indító kerül a Ports rendszerbe. A payload a ports/.data/<subfolder>/ alá megy — a pont rejti el az ES elől —, az indító pedig egy normál almappába, amit az ES ugyanúgy pásztáz, mint bármely más rendszerét.
Számokban, a mai assetekkel:
| Gép | Lefedettség (mérve 2026-08-17) |
|---|---|
| x86_64 Batocera | 13/15 |
| ARM Batocera | 9/15 — és nő, ahogy a repók újrafutnak az ARM pipeline-nal |
A kimaradó kettő a phaserdemo és a trickster-tiles: mindkettő csak html-t
ad, natív binárisuk nincs, tehát ezekhez böngésző kell — natív store soha nem
fogja őket kiszolgálni.
Ugyanez a keret adja az interaktív ES-menüt is (ports bejegyzések gamelist-metaadattal).
Új store-ok, sorrendben
1. ES-családú store-ok
(A 2026-08-18-i szakasz ezt pontosítja: az ES-DE nem drop-in — máshonnan olvassa a gamelisteket, mint ahová a Batocera-adapter ír.)
RetroPie, Recalbox, ES-DE, és a kézikonzolos disztrók (muOS, ArkOS, JELOS). Ugyanaz a gamelist.xml + ROM-mappa modell, amire a motor már generikus: gyakorlatilag paths.roms_root, rendszernév-leképezés és egy másik telepítő kell. A legtöbb elérés a legkevesebb munkáért. Az ES-DE Windowson és macOS-en is fut, tehát asztali elérést is ad mellékesen.
Fontos megkötés: a kézikonzolok jóformán mind ARM-osak, és a RetroPie is Pi-n fut. Cartridge-dzsel ezek azonnal kiszolgálhatók, natív játékkal viszont csak a 0. pont ARM buildjei után.
2. Asztali store — warp-engine-desktop-store
A per-OS zipeket telepíti egy helyi könyvtárba, és indítót csinál hozzá (.desktop, Start menü bejegyzés, .app). Ma 8 szoftvert szolgálna ki, és a CI-lefedettséggel nő. Ez a legnagyobb valóban új képesség: asztali gépre ma semmilyen utunk nincs.
Kész (2026-08-18). stores/warp-engine-desktop-store + stores/ttg-desktop-store.
Két telepítési mód: app (a per-OS zip kicsomagolva, menü-bejegyzéssel) és web
(a kiszolgált böngészős build oldalát megnyitó bejegyzés) — utóbbi azért, mert a
html asset nem letölthető archívum, hanem egy kiszolgált könyvtár. A kettő
visszaesési sorrendben van, ezért egy natív build nélküli cím is bekerül a menübe:
gépenként 10 cím (a demókkal). macOS-en végigmérve és a játékok valóban
elindítva; Linux és Windows valódi gépen még nincs kipróbálva.
Grafikus kliens hozzá (2026-08-18): stores/warp-engine-desktop-gui, Electron-ablak a CLI fölé. Ezért kapott a motor --json-t. Egyben a Windows-telepítő is, mert ott a curl … | sh nem opció — store nélkül az app maga tölti le a motort.
3. Steam-könyvtár
A shortcuts.vdf-be írva a játékaink megjelennek a Steam könyvtárban borítóval — és ezzel a Steam Decken is. A letöltést a 2. pontról örökli, tehát ráépül, nem mellé megy. Bevált technika, a Heroic és a Lutris is ezt teszi.
4. RetroArch playlistek
.lpl JSON playlist platformonként. A cartridge-eket sokkal nagyobb közönségnek adja, mint a Batocera: Android, asztali gépek, konzolok. Kis formátum, kevés munka.
Kész (2026-08-17). Terv és mérések: RETROARCH_STORE.md. Három repó:
engines/warpstore (a kiemelt közös mag), stores/warp-engine-retroarch-store
(motor), stores/ttg-retroarch-store (a mi store-unk). A Batocera-motor ugyanabban
a körben átült a közös magra. Hátra van: valódi gépen kipróbálni, hogy a
VICE-mag magától indítja-e a .prg-t, és hogy az Android adb push útvonalai
állnak-e. Ott mérve: mind a két mag (vice_x64, tic80) elérhető minden célon, Androidon is; a playlist-könyvtár nem feltétlenül a RetroArch alapkönyvtárában van, tehát a retroarch.cfg kötelező olvasmány; a borító csak PNG lehet, amin az impostor GIF-je ma elhasal; leírást a .lpl nem tud. A motor egyetlen valódi új képessége az út-átírás (stage_root / target_prefix), ami az Androidot és a 2. pont asztali store-ját egyszerre szolgálja.
5. BBS store
A bbs/bbs-server-be, a saját rubbs-unkra épülve. Bármelyik asset-fajtát tudja adni letöltésként, és ez az egyetlen a listán, amit rajtunk kívül senki nem tudna lemásolni — márkaérték, nem csak elérés.
6. Csomagkezelők
Homebrew tap és Scoop bucket: brew install ttg/tap/rabbitroller. Kevés munka, és nem kell hozzá launchert írni; a 2. pont csomagolására épül.
7. Webes könyvtár / PWA
(2026-08-18: levéve — a html-t az asztali store, a Pegasus és az ES-DE viszi el egy indítóval; lásd a doksi végét.)
A html assetek megvannak, de ez van a legnagyobb átfedésben a mostani publikus oldallal, ezért a legkisebb határhasznú — annak ellenére, hogy ez a legelterjedtebb assetünk.
Amit nem javaslok
- itch.io — az az ő katalógusuk, nem a miénk; nem store-t adnánk, hanem feltöltenénk.
- Flatpak / Snap — nehéz átvezetés és felülvizsgálat kevés extra elérésért.
- Önálló Android APK — nagy munka; a RetroArch úton (4. pont) az android elérés majdnem ingyen megvan.
A minta
Mind ugyanaz a forma: olvasd a WarpEngine katalógust → írd a gazdaplatform saját könyvtárformátumát. A warp-engine-batocera-store szétválasztásával ezt már megalapoztuk. Ha a közös rész — katalógus-lekérés és gyorsítótár, kiadásválasztás (dev- kihagyás, asset-egyeztetés), state.json, borítókép, prune-védelem saját almappával — egy helyen marad, akkor egy új store valóban csak egy adapter plusz egy config.
Egy dolog viszont nem tartozik az adapterbe, hanem a közös részbe: az architektúra-illesztés. A gazdaplatform megmondja, milyen gépen fut (uname -m, Windows/macOS esetén a megfelelő megfelelője), és a motornak ehhez kell asset-fajtát választania. Ez a 0., 1. és 2. pontnak egyaránt kell, tehát egyszer, jó helyen érdemes megírni.
A közös rész 2026-08-17-én kiemelve: engines/warpstore, egyetlen fájl, amit mindkét motor a telepítéskor letölt. Benne a katalógus és gyorsítótára, a kiadásválasztás, a state.json, a borító-letöltés, az atomikus írás és a törlés-őr — plusz az architektúra-illesztés, ami a második adapter miatt resolve_for_host-tá bővült: nem csak az arch, hanem az os is kulcs lehet, mert egy libretro mag fájlneve OS-enként más. Egy új store innentől valóban egy adapter plusz egy config.
A javasolt sorrend
— kész (2026-08-16). Azlinux_arm64a build-mátrixbaebitengineés abevygyártja; agodot-hoz a játék repójában kell ARM export preset, a LÖVE-hoz nincs upstream ARM AppImage, a TIC-80exportparancsának meg nincs ARM célja. Abevydemo1.0.0 márlinux_arm64-et is ad.Architektúra-illesztés a motorba— kész (2026-08-17). Akindés azextlehet architektúra-leképezés*tartalékkal; a felismert arch látszik alistés aconfigkimenetében.aarch64-en végigpróbálva: az ARM csomagot tölti le, és a benne lévő bináris valóban AArch64.— kész (2026-08-17).linux_*→ Batocera portsinstall: "port";aarch64-en végigpróbálva: telepítés, idempotens újraszinkron, eltávolítás a 106 MB-os payloaddal, és a névtér-védés is (idegen.dataútra mutató bejegyzést elutasít). Hátra van: bekapcsolni attg-batocera-storeconfigjában, és valódi gépen kipróbálni, hogy a natív játékok tényleg elindulnak-e.RetroArch playlistek— kész (2026-08-17), a közös mag kiemelésével együtt. LásdRETROARCH_STORE.md. Hátra van: a VICE.prg-autostart és az Android-út valódi gépen.- ES-családú store-ok (1.) — a motor itt már majdnem kész, és a
warpstoreóta az adapter tényleg csak a gazdaplatform írása.
Amit valódi gépen kell ellenőrizni
A 2. és 3. pont azon áll vagy bukik, hogy a per-OS zipjeink önmagukban futtathatók-e: van-e hiányzó függőség Linuxon, és mit szól hozzá a macOS aláírás-ellenőrzése egy nem jegyzett binárishoz. Erről a katalógus nem árulkodik, csak egy próba.
Újramérés és új jelöltek — 2026-08-18
Két store és a kiemelt közös mag után újra feltéve a kérdés. A formátum-állítások alább vagy a gépen mérve, vagy a hivatkozott dokumentációból ellenőrizve vannak; ahol nem sikerült ellenőrizni, az külön ki van írva.
A mérés, ami megint átrendezi a kérdést: a status
A doksi eddigi lefedettségi számai (13/15, 9/15) a demókat is beszámolják. A
store-ok viszont alapból nem: mindkettő configjában catalog.statuses: ["released", "archived"]. A mai katalógus 15 bejegyzése így oszlik:
status |
Darab | Store-ban látszik ma |
|---|---|---|
released + archived |
7 | ✔ |
demo |
6 | ✘ |
development |
2 | ✘ |
Ugyanaz a lefedettség a kétféle szűréssel:
| Amit a gazdaplatform enni tud | Minden status | Csak released+archived |
|---|---|---|
cartridge |
7 | 6 |
html |
11 | 4 |
| bármilyen natív (win/linux/mac) | 9 | 4 |
cartridge + natív |
13 | 6 |
mindent, html-lel együtt |
15 | 7 |
A tanulság: a szűk keresztmetszet ma nem a store-ok száma és nem is az
asset-fajta, hanem az, hogy a katalógus 8/15-e demo vagy development. Egy
harmadik store nulla új tartalmat ad — csak új gépeket.
És hogy a demo státusz melyik store-t érinti, az nem érzésre kitalálható, ezért
kimérve (catalog.statuses bővítése mit ad):
| Store-fajta | ma | + "demo" |
+ "development" |
|---|---|---|---|
| cartridge (Batocera ROM-út, RetroArch) | 6 | 6 (+0) | 7 (+c64-demo) |
| asztali, natív | 4 | 9 (+5) | 9 (+0) |
asztali, natív vagy html |
4 | 10 (+6) | 11 (+trickster-tiles) |
A meglévő két store-on tehát a demók engedélyezése semmit nem változtat:
egyetlen cartridge-címünk sem demo. A 7. cartridge-cím a c64-demo, ami
development — vagyis befejezetlen, azt épp nem akarjuk kiadni.
A demo kérdés ezért nem a mai store-ok kapcsolója, hanem az asztali store
előfeltétele: demók nélkül az asztali store 4 címmel indulna, velük 10-tel. Ez
dönti el, hogy megéri-e megírni. A REPO_REFACT.md szerint a demo státusz épp
azt jelenti, hogy „nem önálló termék" — tehát terméki döntés, nem technikai.
Az html kérdése: nem webes könyvtár kell hozzá, hanem indító
A html a legelterjedtebb assetünk (11/15), és továbbra sincs fogyasztója. A 7.
pont ezt „webes könyvtár / PWA"-ként vette fel, és ezért lett a legkisebb
határhasznú. A mérések szerint viszont máshol van a válasz.
Batocerán nincs. Ellenőrizve: a BUA böngésző-bejegyzései Flatpak/AppImage
alapúak, a Batocera Flatpak-támogatása pedig dokumentáltan x86_64-only — ARM-on,
tehát Pi-n és a kézikonzolokon, nincs böngésző. A html a Batocera-store számára
zsákutca; ezt a ttg-batocera-store README-jében is érdemes kimondani, hogy más
ne próbálja.
Asztali gépen viszont majdnem ingyen van, mert ott van böngésző. Amelyik
gazdaplatform bármilyen parancsot el tud indítani, az a html-t is tudja:
| Gazdaplatform | Mivel indítja a html-t |
Ellenőrizve |
|---|---|---|
| Lutris | web runner (lutris/runners/web.py létezik) |
✔ a forrásfában |
| Pegasus | per-game launch/command felülírás, tetszőleges parancs |
✔ a dokumentációban |
| ES-DE | ~/ES-DE/custom_systems/es_systems.xml, saját parancs |
✔ a USERGUIDE-ban |
| asztali store (2. pont) | .desktop / .lnk / .app, ami xdg-open-t hív |
— |
Vagyis a html a 2. pont asztali store-jába tartozik egy második
telepítési módként (ahogy Batocerán a port lett a rom mellé), nem egy külön
webes store-ba. Ez a 7. pontot gyakorlatilag leveszi a listáról.
Új jelöltek, amik eddig nem voltak a listán
Pegasus Frontend — a legjobb új jelölt
Sima szöveges metadata.txt: collection + game blokkok, per-game
launch/command felülírás, {file.path} behelyettesítéssel, developer,
release, rating mezők. Windows, macOS, Linux, Raspberry Pi és Android —
egy adapter, ami mind a három asset-fajtánkat viszi: cartridge (emulátort indít),
natív (közvetlenül), html (böngészőt). A formátum egyszerűbb, mint a
gamelist.xml, és nincs benne olyan csapda, mint a RetroArch bináris/PNG-kényszere.
ES-DE — de nem drop-in, ahogy az 1. pont sejteti
Az 1. pont az ES-családot egy tételként kezeli, „a motor már generikus" felkiáltással. A USERGUIDE ezt két ponton megcáfolja:
- A gamelisteket nem a ROM-mappából olvassa, hanem a központi
~/ES-DE/gamelists/fából — a ROM-fában lévőket alapból figyelmen kívül hagyja. A mi Batocera-adapterünk pontosan oda ír, ahonnan az ES-DE nem olvas. - A
pathtagben kötelező a./prefix (a mi merge-ünk szerencsére már így írja).
Cserébe többet ad, mint a Batocera: fut Linuxon, macOS-en, Windowson, Androidon,
Haikun és Steam Decken, és custom_systems/es_systems.xml-ben saját rendszert lehet
definiálni tetszőleges indító paranccsal — tehát nála is megvan a html-út.
Az adapter tehát nem a Batocera-adapter újrahasznosítása, hanem egy testvére:
ugyanaz a metaadat-formátum, más útmodell.
Lutris — egy Linux-asztali gépen elvileg 15/15
Ellenőrizve: a Lutris-installer lehet tisztán lokális YAML, weboldal nélkül
(lutris -i /path/to/file.yaml), a kulcsok a gyökérben, minden más a script
alatt, $SCRIPTDIR-rel relatív fájlokra. A runnerek között ott van a linux
(natív), a web (böngésző) és a wine — vagyis egy Lutris-store a html-t, a
Linux-natívot és akár a Windows-buildeket is fel tudja tenni ugyanabba a
könyvtárba. Ez a legnagyobb elméleti lefedettség a listán.
A minta viszont más: nem mi írjuk a könyvtárformátumot, hanem generálunk egy
telepítőt és meghívjuk a Lutrist. Kevesebb kontroll (a prune-hoz a Lutris saját
adatbázisát kellene bántani), de a state.json-unk így is tudja, mit tettünk fel.
LaunchBox és Playnite — nem tudtam ellenőrizni
Mindkettő nagy Windows-közönség, és mindkettőnél elakadtam:
- LaunchBox: a játéklista
Data/Platforms/<Platform>.xml-ben van, de a séma nincs dokumentálva (a közösség visszafejtette), és az alkalmazás maga is újraírja a fájlt. Egy valódi telepítés nélkül nem érdemes tervezni rá. - Playnite: a hivatalos út egy C#/.NET library plugin, nem egy adatfájl — ez kilóg a „stdlib Python + egy fájl" mintánkból. A dokumentációt nem sikerült elérnem (403), tehát ez is nyitott kérdés.
Egyik sem javasolt a Pegasus és az ES-DE előtt.
Korrekció a meglévő listához: a Steam alá van becsülve
A 3. pont szerint „a letöltést a 2. pontról örökli, tehát ráépül" — a letöltést igen, a formátum viszont a listán a legkellemetlenebb:
- A
shortcuts.vdfbináris VDF, nem szöveg:appid(4 bájt little-endian),AppName,Exe,StartDir,LaunchOptions. - Az
appidaz exe és a név CRC32-jéből számolt érték, a legfelső bit beállítva — és ez azappida borítóképek fájlneve is (userdata/<id>/config/grid/<appid>p.png). - Ha a fájl hibás, a Steam indulás után törli; ha a felhasználó a Steam UI-ból vesz fel egy nem-Steam játékot, felülírja, amit írtunk. Írás után Steam-újraindítás kell.
- A
userdata/<id>ág felhasználónként más, tehát felderítés is kell hozzá.
Bináris formátumot írni stdlib Pythonból megoldható, de ez nem „kevés munka", és egy elrontott fájl a felhasználó teljes nem-Steam listáját viszi. A 3. pont ezért a 2. pont után és önálló körben való, nem mellékesként.
Az újrarendezett sorrend
- Döntés a demókról — 0 kód, de nem a mai store-okról szól: azokon nem
változtat semmit (nincs
demostátuszú cartridge-ünk). Az asztali store értelmét dönti el: 4 cím demók nélkül, 10 velük. Ezért ez a 2. pont előfeltétele, nem önálló nyereség. - Asztali store (2. pont) — változatlanul a legnagyobb valóban új képesség,
most már azzal, hogy a
htmlis bele tartozik egy második telepítési módként. Ez teszi elérhetővé a katalógus 15/15-ét (a demókkal együtt). - Pegasus — egy adapter, ami mind a három asset-fajtát viszi öt platformra, köztük Androidra, szöveges formátumban. A legjobb arány a listán.
- ES-DE — ugyanaz a metaadat-formátum, más útmodell; desktop + Android + Steam Deck. Az 1. pont maradéka (RetroPie, Recalbox, kézikonzolok) ezután jön, mert azok a Batocera-adapterhez állnak közelebb.
- Steam (3.) — a 2. pontra épül, de önálló körben, a bináris formátum miatt.
- BBS store (5.) — változatlanul a márkaérték-tétel, nem elérés-tétel.
- Csomagkezelők (6.) — a 2. pont csomagolására épül.
Webes könyvtár / PWA(7.) — levehető: ahtml-t a 2., 3. és 4. pont viszi el, ez pedig a publikus oldallal fedne át.
Amit valódi gépen kell ellenőrizni (bővítve)
A korábbi kettő (per-OS zipek önmagukban futtathatók-e; macOS-aláírás) mellé:
- Pegasus: elolvassa-e a generált
metadata.txt-t Androidon is, és mit tesz alaunchparanccsal ott (Android-on nincs shell úgy, ahogy asztalon). - ES-DE: a
~/ES-DE/gamelists/fába írt metaadat és acustom_systemsegyütt működik-e, illetve mit lát az ES-DE Android-kiadása. - Lutris: a
lutris -ifut-e fejetlenül (headless), vagy GUI-t nyit — ez dönti el, hogy egy szinkron automatizálható-e. - LaunchBox / Playnite: van-e egyáltalán írható formátum. Egy telepítés megválaszolja; addig ne tervezzünk rájuk.