Our arcade cabinet and the lab gaming stations all run Batocera Linux, and for a long time every machine carried the same pile of manual tweaks: copied game folders, hand-edited configs, a theme dropped into the right directory. We finally did what we should have done from the start and turned the whole setup into a proper distribution: GameEdu Projects, a Batocera-based build with its own package repositories, utility packages, theme and branding.
Why we chose Batocera
The retro-gaming OS space is crowded, and we tried most of it before settling:
- RetroPie: the Raspberry Pi classic, endlessly tweakable, but it is a layer over Raspbian and x86 machines are an afterthought
- Recalbox: Batocera's older sibling, polished and beginner-friendly, but more closed and slower to pick up new systems
- Lakka: the official RetroArch OS, tiny and fast, but bare RetroArch without a couch-friendly frontend is a hard sell for kids
- Lutris: a superb game manager and launcher, but it expects a full desktop Linux underneath; we wanted an appliance, not a desktop
- EmuDeck: great on a Steam Deck, but it is an installer for SteamOS rather than an OS we can flash onto lab hardware
- ChimeraOS: a console-like Steam machine OS where retro systems are an add-on, not the core
Batocera ended up the only one that treats both x86 boxes and Raspberry Pis as first-class citizens, boots straight into EmulationStation, updates as a single image, and stays easy to rebrand and repackage. Exactly the foundation a custom distribution needs.
Why our own distro?
Stock Batocera is excellent, but it is built for one person's living room. A lab full of machines needs the same image everywhere: the same games, the same controller mappings, the same network setup, and no surprises after a reflash. Baking everything into a distro means a new machine is ready the moment the flash finishes, and an update is one command instead of an afternoon of copying files around.
Our own package repos
The heart of the build is a set of pacman-style package repositories: batocera-public-games for freeware and open-source titles, batocera-ported-games for native Linux ports, and batocera-private-games for licensed content that stays inside the lab. Every game ships as a package with its metadata and artwork in .PKGINFO, so installs, updates and removals work like any other package manager. The game library on this site is generated from the very same repositories, so the website and the machines can never drift apart.
Utility packages
Next to the games live the utility packages: a WireGuard profile that connects each box to the lab network (see our VPN guide), a connector for our self-hosted RetroAchievements server so unlocks and leaderboards keep working without the public internet, kiosk-mode defaults that keep students out of system settings, and automatic save-state policies so a session can continue exactly where it stopped.
Themes
The EmulationStation theme matches the look of this site: dark panels, neon cyan accents and the GameEdu logo, with per-platform views that surface the same cover art the website uses. It is one theme package, versioned and updated like everything else in the build.
Splash images
And then the small things that make a build feel finished: a custom boot splash, per-system splash screens shown while a game loads, and matching controller diagrams. They ship as one package too, so rebranding the whole fleet for an event takes minutes, not an evening with a USB stick.
GameEdu Projects now powers the arcade cabinet and the station fleet. If you want to build something similar, start with our Batocera flashing guide and the story of making the arcade cabinet.