homelabprivacy

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 YouTube

Related guides

← All guides