Build a Local Game Library with EmulationStation
🤖 Researched and drafted automatically from the official docs, and reviewed before publishing. Commands are taken from the source projects — but always sanity-check before running anything on your own hardware.
Game Pass locks you into monthly payments for games you can’t keep. EmulationStation gives you a clean, controller-friendly front-end to manage and play games you actually own on your own hardware. This is a straightforward setup guide for Linux or Windows.
What You’re Building
EmulationStation is a graphical launcher that sits in front of emulators—it handles the menus, controller input, and game discovery so you don’t have to hunt through folders. You provide the ROMs (legally obtained from games you own or public domain titles), configure which emulators to use, and EmulationStation does the rest.
Prerequisites
You need:
- A Linux machine (Debian/Ubuntu, Fedora, or Raspberry Pi) or Windows PC
- At least 2 GB free disk space for the application and ROMs
- A USB controller or keyboard for input
- The actual emulator binaries installed separately (SNES, NES, Genesis emulators, etc.—EmulationStation launches them but doesn’t include them)
Step 1: Install Build Dependencies
EmulationStation compiles from source. Install the required libraries.
On Debian/Ubuntu:
sudo apt-get install libsdl2-dev libfreeimage-dev libfreetype6-dev libcurl4-openssl-dev rapidjson-dev \
libasound2-dev libgles2-mesa-dev build-essential cmake fonts-droid-fallback libvlc-dev \
libvlccore-dev vlc-bin
On Fedora:
sudo dnf install SDL2-devel freeimage-devel freetype-devel curl-devel \
alsa-lib-devel mesa-libGL-devel cmake \
vlc-devel rapidjson-devel
Optional: Install libpugixml-dev (Debian) or pugixml-devel (Fedora) for XML parsing, though EmulationStation has a built-in fallback.
Step 2: Clone and Build EmulationStation
Clone the RetroPie fork with submodules, then compile.
git clone --recursive https://github.com/RetroPie/EmulationStation.git
cd EmulationStation
cmake .
make
This produces the emulationstation binary. The build takes 5–15 minutes depending on your hardware.
For Raspberry Pi 4 or newer (Bullseye OS and later):
cmake -DUSE_MESA_GLES=On .
make
If you’re on an older Pi with legacy Broadcom drivers, install libraspberrypi-dev before running cmake.
Step 3: Create Configuration Directories
EmulationStation stores config in ~/.emulationstation/. Create it:
mkdir -p ~/.emulationstation
Step 4: Write Your es_systems.cfg
This XML file tells EmulationStation which systems you have and where to find ROMs. Create ~/.emulationstation/es_systems.cfg:
cat > ~/.emulationstation/es_systems.cfg << 'EOF'
<?xml version="1.0"?>
<systemList>
<system>
<name>snes</name>
<fullname>Super Nintendo Entertainment System</fullname>
<path>~/roms/snes</path>
<extension>.smc .sfc .SMC .SFC</extension>
<command>snesemulator %ROM%</command>
</system>
<system>
<name>nes</name>
<fullname>Nintendo Entertainment System</fullname>
<path>~/roms/nes</path>
<extension>.nes .NES</extension>
<command>nesemulator %ROM%</command>
</system>
</systemList>
EOF
Replace snesemulator and nesemulator with the actual emulator commands on your system (e.g., snes9x, mednafen, retroarch). The %ROM% tag is replaced with the full path to the selected game.
Critical: Each system must have at least one ROM file in its <path> directory, or EmulationStation will ignore it on startup.
Step 5: Create ROM Directories
mkdir -p ~/roms/snes ~/roms/nes ~/roms/genesis
Place your legally obtained ROM files in the corresponding folders. Only files matching the <extension> list will appear.
Step 6: Configure Input Devices
Launch EmulationStation for the first time:
./emulationstation
You’ll be prompted to configure input. Hold a button on your controller or press a key on your keyboard, then follow the on-screen prompts to map buttons (A, B, Start, Select, etc.). Some inputs can be skipped by holding a button for a few seconds.
The configuration is saved to ~/.emulationstation/es_input.cfg. You can reconfigure anytime by pressing Start in the menu and selecting “CONFIGURE INPUT.”
If your controller stops working, delete es_input.cfg to reset the input config on next launch.
Step 7: Add Emulator Binaries to Your PATH
Make sure the emulator commands in your es_systems.cfg are actually available. For example, if you use snes9x:
which snes9x
If it’s not found, install it or add its directory to your PATH:
export PATH=$PATH:/path/to/emulator/bin
Add this to your ~/.bashrc to make it permanent.
Step 8: Run EmulationStation
./emulationstation
You’ll see your configured systems in the menu. Navigate with your controller or arrow keys, select a game, and it launches in the configured emulator.
Press F4 to exit (as long as ES hasn’t frozen).
Optional: Install as a Systemd Service
To run EmulationStation on boot, create a systemd unit file:
sudo tee /etc/systemd/system/emulationstation.service > /dev/null << 'EOF'
[Unit]
Description=EmulationStation
After=network.target
[Service]
Type=simple
User=YOUR_USERNAME
ExecStart=/path/to/emulationstation
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
Replace YOUR_USERNAME and /path/to/emulationstation with your actual username and the full path to the binary. Then:
sudo systemctl daemon-reload
sudo systemctl enable emulationstation
sudo systemctl start emulationstation
Security Note
Keep EmulationStation on your LAN only. Don’t expose it to the public internet—it’s a local-only tool. If you must access it remotely, use a VPN back to your home network.
Is It Worth It?
Yes, if you want to own your games instead of renting them. EmulationStation is lightweight, stable, and works on anything from a Raspberry Pi to a full desktop. You get a clean, controller-friendly interface without ads, forced updates, or subscription reminders. The upfront time investment (compiling, configuring ROMs, setting up emulators) pays off the first time you realize you can play your entire retro library offline, on your own hardware, forever.
Gear used in this build
* Affiliate links — I earn a small commission at no cost to you. It's gear I use and would genuinely recommend. See the full disclosure.
Related video
New self-hosted AI & homelab shorts, daily.
Subscribe on YouTubeRelated guides
Control a Dumb AC Unit with ESP32 and ESPHome
Wire an ESP32 to your window AC's remote control pins, then command it over your LAN using ESPHome. No Wi-Fi remote needed, total cost under $35.
Self-host Kubernetes: escape the cloud tax
Run Kubernetes on your own hardware to replace managed cloud services. Deploy and scale containerized apps without paying AWS, Azure, or GCP monthly bills.
Archive YouTube channels with yt-dlp on bare metal
Set up automated YouTube video downloads on a homelab server using yt-dlp. Build a self-hosted archive that respects creators and keeps your content offline.