A minimal Linux distribution built for emulation. AstralEmu strips the base system down to the essentials and layers on optimized emulators, a dynamic performance manager, and a clean EmulationStation DE frontend — everything tuned for your specific hardware.
┌──────────────────────────────────────────────────┐
│ EmulationStation DE │ ← Custom theme
├──────────┬──────────┬───────────┬────────────────┤
│ XFCE │ Plasma │ Kodi │ Waydroid │ ← Optional services
│ │ Mobile │ │ │ (one at a time)
├──────────┴──────────┴───────────┴────────────────┤
│ Performance Manager (per-emu) │ ← CPU/GPU/RAM tuning
├──────────────────────────────────────────────────┤
│ Emulators + RetroArch (daily builds) │ ← LTO=thin + jemalloc
├──────────────────────────────────────────────────┤
│ Ubuntu / Debian / Arch Linux / Universal Blue │ ← Minimal base image
└──────────────────────────────────────────────────┘
The build system is a GitHub Actions workflow that dynamically manages every axis of the build matrix:
- Services — Which optional services to bundle (XFCE, Plasma Mobile, Kodi, Waydroid)
- Source image — Ubuntu, Debian, Arch, or Universal Blue base
- Export format — Raw, compressed, flashable images
- Filesystem shrink — Automatic image compaction
- CPU architecture — ARM64, x86_64, and device-specific targets
- Schedule — Full rebuild every 24 hours
AstralEmu maintains its own APT, DNF, and Pacman repositories, hosted on astralemu-packages. Every standalone emulator and RetroArch core is rebuilt daily from source with:
- Architecture-specific compilation — Packages are built targeting the exact CPU features of each supported device
- LTO=thin — Link-time optimization for smaller, faster binaries
- jemalloc — Replaces the default allocator for better memory performance
- Hardware dependencies — Device-specific packages for embedded targets (RK3588, etc.)
See the astralemu-packages README for repo setup instructions.
Each hardware target gets a dedicated performance package that dynamically adjusts system parameters when an emulator or service launches:
| Parameter | What it does |
|---|---|
| CPU governor | Switches between powersave, performance, schedutil per emulator |
| GPU governor | Adjusts GPU frequency scaling |
| RAM governor | Tunes memory controller frequency |
| Overclock / Underclock | Per-emulator CPU, GPU, and RAM clock targets |
| CPU pinning | Assigns emulator processes to specific cores (big.LITTLE aware) |
| Power safety | Automatically limits clocks on battery or low-power adapters |
All of this happens transparently — the user just launches a game.
AstralEmu enforces a single-service model:
- ES-DE is the default and always-running frontend
- When the user launches an optional service (XFCE, Kodi, Plasma Mobile, Waydroid), ES-DE stops
- When the optional service exits, ES-DE restarts automatically
This guarantees that only one graphical service runs at any time, maximizing available resources.
| Base | Update method |
|---|---|
| Universal Blue | Native rpm-ostree image-based updates |
| Ubuntu / Debian / Arch | Reproduced atomic-style update flow mirroring the UBlue model |
Updates are seamless and happen in the background.
- Download the image for your device from the releases page
- Flash it to your SD card or eMMC
- Boot and play
Full setup guides and device compatibility are available on the documentation site.
Contributions are welcome — whether it's adding support for a new device, packaging an emulator, improving the performance profiles, or working on the documentation. Check out the Discussions to get started.