As an Amazon Associate, SpecPicks earns from qualifying purchases. See our review methodology.
Build a RetroPie Handheld in 2026: A Complete Step-by-Step Guide
By SpecPicks Editorial · Published April 21, 2026 · Last verified April 21, 2026 · 16 min read
Commercial retro handhelds have gotten extremely good over the past few years — the Retroid Pocket 5, Anbernic RG556, AYN Odin 2 all deliver emulation experiences that were unthinkable a decade ago. They've also gotten expensive ($200–$400), opaque (closed Android firmwares), and locked to whatever ROM management approach the vendor decided to ship. A DIY RetroPie handheld solves all three problems for around $110 in parts, a weekend of work, and access to a filesystem you fully control.
This guide walks through a specific build: a Raspberry Pi 4 (2GB is enough, 4GB is comfortable), a 5" HDMI LCD, an Adafruit PowerBoost 1000 charger, a 2500 mAh Li-Po battery, arcade-style pushbuttons wired to the Pi's GPIO, a 3D-printed enclosure, and RetroPie 4.8+ on a 64GB microSD card. We've built three of these over the last two years; the instructions below are the version we wish we'd had on build #1.
Why a Pi 4 instead of a Pi 5? Two reasons: the Pi 5 draws enough current under load that the PowerBoost 1000's 1A output path can't keep up (the PowerBoost is rated for 1A continuous from a single-cell Li-Po; the Pi 5 peaks at 1.7A), and the Pi 4 emulates every system up through PSP and Dreamcast just fine with the right RetroPie scrapers. If you want a Pi 5 handheld, you'll need the larger PowerBoost 5V/2.5A module and a larger battery — we'll note that variant below.
Key takeaways
- Skill level: Intermediate — requires soldering, comfort with Linux CLI, 3D printing access (local library, Printables service, or your own printer).
- Build time: 6–10 hours spread over a weekend.
- Total cost: ~$110 excluding 3D printing and ROMs.
- Emulation ceiling: PS1, N64, Dreamcast, PSP all playable. Saturn is hit-or-miss. GameCube is a no.
- Battery life: ~3.5 hours of emulation on a 2500 mAh pack, ~5 hours on idle menus.
Tools you'll need
- Soldering iron (temperature-controlled, 350°C)
- Rosin-core solder (0.6mm lead-free or leaded — either fine)
- Wire strippers and flush cutters
- Helping hands or a PCB vise
- Multimeter (any cheap one)
- Small Phillips and hex drivers (M2 / M2.5)
- Computer for writing RetroPie to SD and SSH'ing into the Pi
- 3D printer or access to one (STL files linked below)
- Hot glue gun (for securing the display ribbon and battery)
Bill of materials
| Part | Qty | ASIN | Approx. price |
|---|---|---|---|
| Raspberry Pi 4 4GB | 1 | B07TC2BK1X | $55 |
| 5" HDMI IPS LCD (800×480, resistive touch) | 1 | B0B8S9DYQC | $39 |
| Adafruit PowerBoost 1000 Charger (ADA2465) | 1 | B01BMRBTH2 | $19 |
| 3.7V 2500 mAh Li-Po battery (JST-PH connector) | 1 | Amazon search | $12 |
| Arcade joystick + encoder kit (USB) | 1 | B07D2FP9YY | $22 |
| Retro-Bit Legacy 16 wireless controller (optional) | 1 | B08ZFDSMGQ | $24 |
| GIGASTONE 64GB microSD (Class 10) | 1 | B07RPVH4QQ | $10 |
| Armor case for Pi 4 with heatsinks | 1 | B07VWM4J4L | $14 |
| 22 AWG hookup wire (red/black/mixed) | 1 spool | Amazon search | $10 |
| M2.5 standoff + screw kit | 1 | Amazon search | $8 |
| Micro-HDMI to HDMI adapter (short, angled) | 1 | Amazon search | $6 |
| 3D-printed enclosure (filament cost) | 1 | Printables link below | ~$4 |
Total: ~$110 (ROMs not included — bring your own, legally).
For the 3D-printed enclosure, we recommend the "GameGirl Pi4 Handheld" remix on Printables — 6 printed parts in PLA, 14 hours total print time on a stock Ender 3 V3. The Adafruit PiGRRL 2 printables also work but are designed for the smaller Pi 3 — dimensions need adjustment.
Pi 5 variant notes
If you insist on a Pi 5 build: swap the PowerBoost 1000 for a PowerBoost 500C+ at higher current or a Pimoroni UPS PIco HAT, use a larger battery (3.7V 5000 mAh minimum), and expect ~2 hours of battery life under load. The 3D-printed shell needs about 3mm more depth to accommodate the Pi 5's different header layout.
Step 1: Flash RetroPie and boot on a monitor first
Before you solder anything, get the software working on a bench. This is the step people skip and regret.
- Download the latest RetroPie image for Pi 4 from
retropie.org.uk/download. As of April 2026 the current release is 4.8.9 (Debian Bookworm based). - Flash to the 64GB microSD using Raspberry Pi Imager — pick "Use custom" and browse to the
.img.gzyou downloaded. - In Imager's advanced options (Ctrl+Shift+X), enable SSH and pre-configure Wi-Fi. This saves a keyboard dance later.
- Insert the SD card into the Pi 4, connect HDMI to a monitor, connect the arcade encoder USB cable, connect power via the official Pi 4 PSU (15W, USB-C).
- On first boot, RetroPie launches EmulationStation and prompts you to configure a controller. Hold any button on the arcade encoder until the config wizard activates, then map all inputs. The wizard walks you through every button; if you miss a button press and hold any button for 1 second to skip.
- From the RetroPie main menu, set up Wi-Fi (or confirm the Imager config worked), then enable the SSH service (
RetroPie Setup → Configuration / tools → SSH → Enable). - SSH in from your computer (
ssh pi@retropie.local, default passwordraspberry) and update withsudo apt update && sudo apt full-upgrade -y.
Verify at this point: the Pi boots into RetroPie, the arcade encoder is recognized, the display works at 800×480, and you can SSH in. If any of those fail, fix them on the bench before moving to the enclosure.
Step 2: Configure the 5" HDMI LCD resolution
The 800×480 display needs a /boot/firmware/config.txt tweak to avoid black bars and to match EmulationStation's output:
hdmi_group=2
hdmi_mode=87
hdmi_cvt=800 480 60 6 0 0 0
hdmi_drive=1
disable_overscan=1
framebuffer_width=800
framebuffer_height=480
Reboot (sudo reboot) and RetroPie will come back at native 800×480. If you see black bars, verify disable_overscan=1 is set and hdmi_group=2 not 1 (the LCD reports itself as DMT/PC, not CEA/TV).
Step 3: Test the PowerBoost and battery off the bench
Before committing the PowerBoost into the enclosure, verify the charge-while-play and low-battery behaviors:
- Solder the Li-Po battery's JST-PH connector to the PowerBoost's BAT pads if not already attached (most 2500 mAh packs ship with the correct connector).
- Solder two wires from the PowerBoost's 5V and GND output pads to a spare USB-A breakout or a cut-up USB cable you'll connect to the Pi's GPIO 5V rail (pins 2/4 for +5V, pins 6/9/14/20 for GND). Do not use the Pi's USB-C input — the PowerBoost's voltage regulation is good but not better than the Pi's onboard regulator, and the USB-C input expects a PD handshake the PowerBoost doesn't do.
- Plug a USB-C cable from a 5V/2A adapter into the PowerBoost's charge input. The orange LED should light (charging).
- Disconnect the charger. Connect the PowerBoost's 5V output to the Pi's GPIO 5V/GND pins. The Pi should boot normally. Measure the 5V rail at the GPIO — should read 5.10–5.25V under light load.
- Under full emulation load (run
stress-ng --cpu 4in an SSH session), the 5V rail should drop to no less than 4.85V. If it droops below 4.7V, your battery is too discharged or your hookup wire is undersized — swap to 18AWG for the PowerBoost→GPIO path. - Let it run on battery. Note the PowerBoost's low-battery LED — it lights below ~3.4V cell voltage, at which point you have roughly 15 minutes of playtime left.
Do not skip the load test. An undersized 5V path will produce mysterious crashes during emulation that are very annoying to debug after everything is screwed into the shell.
Step 4: 3D-print the enclosure
While you're testing software, print the shell. The GameGirl Pi4 Handheld parts:
- Front shell (with display cutout, D-pad cutouts, 4 face button holes, 2 shoulder button holes)
- Rear shell (with Pi 4 port cutouts, speaker grille, battery compartment)
- D-pad
- Face button caps (×4)
- Shoulder button caps (×2)
- Battery door
Print settings we've found work well on PLA:
- Layer height: 0.2mm
- Walls: 3 perimeters
- Infill: 20% gyroid
- Supports: Tree, 45° overhang threshold
- Brim: 5mm (prevents corner lift on the front shell)
Total filament: ~220g, ~14 hours on an Ender 3 V3. Print front shell first, alone, with extra care — it's the piece that shows surface quality.
Step 5: Wire the arcade-style controls to GPIO
The USB encoder from the arcade kit works out of the box, but you'll probably want some buttons wired directly to GPIO for compactness. RetroPie + gpiozero + a small Python daemon makes this trivial:
- Install the GPIO mapper:
sudo apt install -y python3-gpiozero - Create
/home/pi/buttons.py:
from gpiozero import Button
from signal import pause
import uinput
events = [
uinput.BTN_SOUTH, # A
uinput.BTN_EAST, # B
uinput.BTN_WEST, # X
uinput.BTN_NORTH, # Y
uinput.BTN_TL, # L shoulder
uinput.BTN_TR, # R shoulder
uinput.BTN_START,
uinput.BTN_SELECT,
]
device = uinput.Device(events, name='retro-handheld-buttons')
# GPIO pin -> button event
pins = {
17: uinput.BTN_SOUTH,
27: uinput.BTN_EAST,
22: uinput.BTN_WEST,
23: uinput.BTN_NORTH,
24: uinput.BTN_TL,
25: uinput.BTN_TR,
16: uinput.BTN_START,
20: uinput.BTN_SELECT,
}
buttons = []
for pin, event in pins.items():
b = Button(pin, pull_up=True, bounce_time=0.02)
b.when_pressed = lambda e=event: device.emit(e, 1)
b.when_released = lambda e=event: device.emit(e, 0)
buttons.append(b)
pause()
- Enable
uinputin kernel:echo 'uinput' | sudo tee -a /etc/modules-load.d/uinput.conf - Add to startup via systemd:
# /etc/systemd/system/retro-buttons.service
[Unit]
Description=Retro handheld GPIO buttons
After=multi-user.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/buttons.py
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now retro-buttons.service
The Pi will now appear as a virtual HID device to EmulationStation. In RetroPie Setup → Configure Input Device, map the virtual controller's buttons to the expected retro-handheld layout.
Physical wiring: one wire from each button to its GPIO pin (17, 27, 22, 23, 24, 25, 16, 20), and all buttons' common side to GND (any Pi GND pin). 22AWG hookup wire is fine; don't overcomplicate it.
Step 6: Final assembly
Order matters. Do it in this exact sequence:
- Secure the Pi 4 in its armor case into the rear shell with M2.5 screws. Leave the heatsinks on — the shell has cutouts for them.
- Route the micro-HDMI to HDMI adapter and HDMI cable to the LCD. Test boot at this stage; if video doesn't show, the adapter is often seated wrong.
- Hot-glue the LCD into the front shell's display cutout. Run the LCD's 5V input to the PowerBoost's output (most 5" LCDs accept 5V via USB or JST).
- Attach the PowerBoost to the rear shell with M2 standoffs (print the mount holes into the shell or use Command strips for a reversible install).
- Install the battery in the battery compartment with double-sided foam tape — Li-Po packs don't like rigid mounting that can compress them.
- Wire buttons through the front shell into the GPIO header as configured in step 5.
- Connect the LCD ribbon/HDMI to the Pi, connect the arcade USB encoder (if used) to a USB port.
- Mate the front and rear shells. Four M2.5 screws through the corner bosses, tighten evenly. Do not overtorque — the 3D-printed bosses will strip.
Power on. EmulationStation should boot, the LCD should show the menu, the buttons should work.
Common pitfalls
Crashing during SNES or PS1 emulation but not N64. Almost always a 5V undersupply. Swap to 18AWG wire between PowerBoost and Pi GPIO; if that doesn't fix it, your battery is degraded or the PowerBoost is failing to deliver its full 1A output.
Display flickers on HDMI. The ribbon-style HDMI adapters some kits ship with have reliability issues. Switch to a proper short micro-HDMI→HDMI cable and the problem goes away.
Controller config wizard skips buttons. If you hold a button for more than 1 second during mapping, RetroPie assumes you want to skip that input. Tap, don't hold. If you screwed up the mapping, RetroPie Setup → Configure Input Device → Redetect re-runs the wizard.
Battery charges but doesn't power the Pi. PowerBoost's default is "load shares with charger" — if the charge current is too low, the Pi gets under-voltage. Use a 5V/2A or higher charger for the PowerBoost's charge input.
WiFi drops during intense emulation. This is a Pi 4 thermal issue. The Wi-Fi radio shares a thermal zone with the CPU. Add a small PWM fan if you're going to use Wi-Fi while emulating PSP or Dreamcast.
No sound. HDMI audio on most 5" LCDs is analog-only via a 3.5mm out. Either use that with an external amp, or force audio to the Pi's 3.5mm jack via sudo raspi-config → Audio → Force 3.5mm.
Frequently asked questions
How long does the battery last on a 2500 mAh pack? Roughly 3.5 hours under sustained emulation load (GBA or SNES; more demanding emulators like N64 or PSP drop this to 2.5–3 hours). Idle at EmulationStation menus stretches to ~5 hours. If you want longer runtime, a 5000 mAh pack in the same physical footprint is available and will roughly double battery life — but requires a larger enclosure variant.
Can I use a Raspberry Pi 5 instead? Yes, but with caveats: the PowerBoost 1000 cannot deliver the Pi 5's 1.7A peak current. You'll need a PowerBoost 500C in the higher current configuration, a Pimoroni UPS PIco HAT, or a larger 5V/2.5A+ Li-Po power module. Battery life drops to ~2 hours. Expect to modify the 3D-printed shell for the Pi 5's slightly different port layout and more demanding cooling.
What emulators actually work on a Pi 4? NES, SNES, Genesis, Master System, Game Boy / GBC / GBA: flawless. PS1: flawless with PCSX-ReARMed. N64: most games with Mupen64Plus-Next; some (GoldenEye, Perfect Dark, Conker) are imperfect. Dreamcast: Redream works surprisingly well. PSP: PPSSPP plays most 2D and low-3D titles. Saturn: emulation is viable but slow — 60% of games hit full speed. GameCube and anything newer: no, use a Pi 5 with GC-specific forks or a different SoC entirely.
Where do I legally get ROMs? From your own legally-owned cartridges via a retro dumping device (Retrode, GB Operator, Open Source Cartridge Reader), or by purchasing the Legacy/Classic re-release editions on modern platforms and extracting your legally-owned copies. ROMs are outside the scope of this guide; we don't link to sites that host them.
Does the Pi need cooling in a handheld shell? Yes, especially for N64 or PSP emulation. The Pi 4 without cooling will hit its 80°C throttle point in 3–5 minutes of sustained N64 emulation. The armor case's passive heatsinks are the bare minimum; adding a small 20mm 5V fan (PWM-controlled via the Pi's GPIO) reduces thermal events to essentially zero. In the GameGirl Pi4 shell there's a vent pattern specifically sized for a 20mm fan.
Sources
- RetroPie Official Documentation — authoritative installation and configuration reference.
- Adafruit PowerBoost 1000 Learn Guide — power path, charge logic, real-world current limits.
- Jeff Geerling — Pi handheld power stability — Pi power rail undersupply diagnostics and 5V rail testing.
- Printables — GameGirl Pi4 Handheld — STL files and print settings.
- r/raspberry_pi — DIY handheld megathread — ongoing community build discussion.
Related guides
- Raspberry Pi 5 8GB Review (2026)
- Magic Mirror 2 Smart Home Hub Build
- PiKVM Build Guide
- Best Raspberry Pi Alternatives in 2026
— SpecPicks Editorial · Last verified April 21, 2026
