Skip to content

codingncaffeine/Emutastic-For-Linux

Repository files navigation

Emutastic

Emutastic for Linux

License: GPL v3

A native Linux port of Emutastic — a multi-system emulator frontend inspired by OpenEmu, rebuilt on .NET 10 + Avalonia (the original is Windows/WPF/.NET 8). Games are organized by console in a clean library interface. Emulation is handled by libretro cores loaded at runtime — no cores are bundled.

The goal is a 1:1 clone: aesthetically and functionally identical to the Windows app, with only the platform plumbing swapped underneath (WPF → Avalonia, Direct3D/Vulkan → OpenGL/Vulkan, WASAPI → SDL3, XInput → SDL3 gamepad, Win32 core loading → dlopen).

Visit emutastic.com → for a visual tour of the app, or grab the latest release directly.

For current status and per-release changes, see the releases page.

Legal notice: This project is a frontend only. It does not include, distribute, or facilitate the acquisition of any copyrighted software, ROM images, BIOS files, or other proprietary system files. You are solely responsible for ensuring you have the legal right to use any software you load.


Requirements

  • A modern 64-bit Linux desktop (developed on Debian 13 / KDE Plasma, X11 or Wayland)
  • Runtime libraries (most desktops already have these; the .deb declares them): libsdl3-0 (audio + controllers), libegl1/libgl1 + Mesa drivers (game rendering), ffmpeg (recording encodes), libx11-6 + libfontconfig1 (UI), ICU (libicu7x). Recommended: libvlc5 + vlc-plugin-base (video snap previews). Optional: libvulkan1 (only the legacy in-process presenter uses it; the default OpenGL path doesn't)
  • libretro core .so files (downloadable in-app — Preferences → Cores)
  • Optional: DAT files for ROM identification (Preferences → Cores / Extras)

The published .deb bundles the .NET 10 runtime (self-contained), so no separate .NET install is needed.


Supported Systems

36 systems across 11 manufacturers (click to expand)
System Tag Core (priority order) BIOS
NES NES nestopia → quicknes → fceumm No
Famicom Disk System FDS nestopia disksys.rom
SNES SNES snes9x → bsnes No
Nintendo 64 N64 mupen64plus_next → parallel_n64 No
GameCube GameCube dolphin No
Game Boy GB mgba → gambatte → sameboy No
Game Boy Color GBC mgba → gambatte → sameboy No
Game Boy Advance GBA mgba Optional
Nintendo 3DS 3DS azahar No
Nintendo DS NDS desmume → melonds No
Virtual Boy VirtualBoy mednafen_vb No
Genesis / Mega Drive Genesis genesis_plus_gx → picodrive No
Sega CD / Mega CD SegaCD genesis_plus_gx Region BIOS
Sega 32X Sega32X picodrive No
Sega Saturn Saturn mednafen_saturn → kronos → yabause Region BIOS
Master System SMS genesis_plus_gx → picodrive No
Game Gear GameGear genesis_plus_gx No
SG-1000 SG1000 genesis_plus_gx No
Dreamcast Dreamcast flycast No
PlayStation PS1 mednafen_psx_hw → mednafen_psx Region BIOS
PlayStation 2 PS2 pcsx2 Required
PSP PSP ppsspp No
TurboGrafx-16 TG16 mednafen_pce → mednafen_pce_fast No
TurboGrafx-CD TGCD mednafen_pce → mednafen_pce_fast syscard3.pce
Neo Geo Pocket NGP mednafen_ngp No
Neo Geo Pocket Color NGPC mednafen_ngp No
Neo Geo NeoGeo geolith neogeo.zip + aes.zip
Neo Geo CD NeoCD geolith neogeo.zip + aes.zip + neocdz.zip
Arcade Arcade fbneo + mame2003-plus No
Atari 2600 Atari2600 stella No
Atari 7800 Atari7800 prosystem No
Atari Jaguar Jaguar virtualjaguar No
ColecoVision ColecoVision gearcoleco → bluemsx No
Vectrex Vectrex vecx No
3DO 3DO opera panafz10.bin
Philips CD-i CDi same_cdi No

Cores are downloaded from the Linux libretro build servers (buildbot.libretro.com/nightly/linux/x86_64) on demand — same core lineup as upstream, as .so instead of .dll.


BIOS Files

Place BIOS files in ~/.local/share/Emutastic/System/ (or PortableData/System/ next to the executable in portable mode). The app also checks each system's ROM folder.

BIOS file details by system

Sega CDbios_CD_U.bin (USA), bios_CD_E.bin (Europe), bios_CD_J.bin (Japan)

Sega Saturn — Beetle Saturn: sega_101.bin (JP v1.00), mpr-17933.bin (JP v1.01), mpr-17941.bin (USA/EU v1.01).

PlayStation — USA: scph5501.bin, scph1001.bin, scph7001.bin. Europe: scph5502.bin. Japan: scph5500.bin

PlayStation 2 — any valid 4 MB dump in the pcsx2/bios/ subfolder (e.g. ps2-0230a-20080220.bin USA, ps2-0230e-20080220.bin Europe, ps2-0230j-20080220.bin Japan)

TurboGrafx-CD — Any of: syscard3.pce, syscard2.pce, syscard1.pce

3DO — Any of: panafz10.bin, panafz1j.bin, goldstar.bin

Famicom Disk Systemdisksys.rom


ROM Import

Drag and drop ROMs onto the library or use Import ROMs. The app detects the console from file extension, cleans the title, and hashes the ROM. For ambiguous formats (.chd, .iso, .cue, .bin), a SHA1 lookup against DAT files is attempted first — if no match, a console picker is shown. .zip is handled by the .NET BCL; .7z/.rar/.tar/.gz via SharpCompress (no native dependency).

Multi-disc games are auto-bundled into a single library entry via an .m3u playlist.


Features

Themes (Dark / Light / OLED / Midnight + a visual editor) · automatic artwork & metadata (OpenVGDB + libretro thumbnails, optional ScreenScraper) · SDL3 controller support with analog-stick-as-D-pad · RetroAchievements (unlock toasts with a full appearance editor, hardcore mode, Achievements tab with trophy case + activity heatmap, friends with unlock feeds + leaderboard toasts, CHD support) · screenshots & gameplay recording (x264) · GitHub cloud sync (below) · disc swapping (L3 + Start) · per-game notes · game manuals (auto-download) · cheats (+ cheat database import) · core options · save states with screenshots · play-time tracking · ROM hacks (IPS/BPS/UPS soft-patching — original ROM untouched) · video shaders (7 built-ins + the downloadable libretro GLSL pack) · bezels & Vectrex overlays · turbo buttons · in-app updates.

(Shader note: the Windows app runs the libretro slang pack through librashader; librashader ships no Linux binaries, so this port runs the libretro GLSL pack — the same shader library — through a built-in OpenGL preset chain.)

(See the upstream Emutastic wiki for per-feature detail — behavior is intended to match. Diagnostic logs live in the Logs/ folder of the data directory and match the wiki's Log Files guide, with one delta: controller-diag.log is in Logs/ too, not next to the executable.)


Cloud Sync

Sign in with your GitHub account (Preferences → Backups — device flow, no password stored) and your battery saves + game library sync through a private repository on your account.

How it works (click to expand)

Saves pull automatically before a game launches and upload when the session ends (configurable: on game close / every 15 minutes / manual), or sync everything on demand with Sync Now.

  • Cross-platform — the same repository serves the Windows app and this port: save on one machine, pick up on the other. Battery saves are keyed by ROM hash, so both installs must import the same ROM files.
  • Shared or per-PC — by default every PC shares one emutastic-saves repository, so your saves and library follow you between machines. Toggle "Make this PC unique" and that machine backs up to its own emutastic-saves-<hostname> repository instead — other machines never read or write it.
  • Optional encryption — AES-256-GCM with a passphrase you choose; the same passphrase is required on every PC that shares the repository.
  • The library database syncs last-writer-wins. If you run established libraries on two machines, take a backup (Back Up Now) before your first sync on each.

Sync activity is logged to Logs/cloudsync.log.


Folder Layout

Follows the XDG Base Directory spec:

~/.config/Emutastic/             config.json
~/.local/share/Emutastic/        (or your custom data folder)
    library.db
    DATs/                        (No-Intro / Redump DATs — downloadable in-app)
    Cores/                       (libretro core .so files — downloadable in-app)
    System/                      (BIOS files)
    Saves/ (SRAM) / Save States/ / Screenshots/ / Recordings/ / Artwork/ / Manuals/ / Cheats/ / Themes/ / Logs/ / ...

Installing & updating

Two release artifacts per version (built by packaging/build-release.sh), each bundling a quick-start README.txt:

  • emutastic_<ver>_amd64.deb — system install (/usr/lib/emutastic, emutastic on PATH, desktop entry). Portable mode is not available on a .deb install (the install dir is root-owned); data lives in ~/.local/share/Emutastic.
  • Emutastic-<ver>-linux-x64.tar.gz — self-contained; extract anywhere writable and run ./Emutastic. For a fully portable setup, touch portable.txt beside the executable (details in the bundled README).

In-app updates (Preferences → About): the app checks the latest GitHub release and, when newer, offers Update Now — tarball installs self-replace and relaunch (your portable.txt and PortableData/ are untouched); .deb installs download the package and install it via a system authorization prompt (pkexec dpkg -i), then relaunch. Development builds (run from bin/Release) update via git pull instead.

Portable mode

Drop an empty portable.txt next to the executable or launch with --portable, and everything lives in PortableData/ beside the executable — config, library, saves, screenshots, recordings, artwork, BIOS, libretro cores, and imported ROMs. Move the folder to a USB stick and run it on any Linux PC; paths are stored relative to PortableData/ so the install travels intact.


Building

Requires the .NET 10 SDK and Avalonia 12.

Three native libraries build automatically from vendored sources via MSBuild targets: libwlpresent.so (the Wayland game window — an own xdg_toplevel + EGL/GL presenter, the path that hits a clean windowed 60 fps), librcheevos.so (RetroAchievements, pinned v11.6.0 with an ABI-check harness), and libchdr.so (CHD disc images, built with CMake). Building from source therefore needs the C toolchain + CMake + Wayland/OpenGL development packages:

sudo apt install build-essential pkg-config cmake libwayland-dev libegl-dev libgl-dev libx11-dev libpng-dev
git clone git@github.com:codingncaffeine/Emutastic-For-Linux.git
cd Emutastic-For-Linux
dotnet build src/Emutastic.slnx -c Release

These -dev packages are only needed to build from source — they ship the headers the shim is compiled against. End users running a packaged release (.deb or tarball) don't need them: the compiled libwlpresent.so is bundled in the package. If the dev packages are missing the managed build still succeeds, but the native game window won't be produced.


Credits

Emulation is handled by libretro cores maintained by their upstream authors — Emutastic bundles none of them; the in-app core manager downloads them from the libretro build servers on demand. The lineup is unchanged from upstream (Nestopia, snes9x, mGBA, Genesis Plus GX, Mednafen/Beetle, Dolphin, PPSSPP, PCSX2 (LRPS2), Flycast, FBNeo, MAME 2003-Plus, and more) — see the upstream Emutastic credits for the full per-core author list. Please support those projects directly.

Frameworks & libraries (the Linux port swaps several of the Windows ones):

Library Purpose License
Avalonia Cross-platform UI (replaces WPF) MIT
SDL3 Audio output + controllers (replaces NAudio/WASAPI + XInput) Zlib
SharpCompress .7z/.rar/.tar/.gz import (replaces SevenZipExtractor) MIT
Microsoft.Data.Sqlite Library database MIT
CommunityToolkit.Mvvm MVVM MIT
rcheevos RetroAchievements client MIT
libchdr CHD format reader BSD 3-Clause
LibVLCSharp In-app video playback LGPL-2.1
libretro shaders downloadable GLSL shader presets (run by a built-in GL chain) per-shader (see repo)

Controller illustrations from OpenEmuControllerArt (BSD 3-Clause; not affiliated with OpenEmu). Bezels from The Bezel Project. Inspired by OpenEmu for macOS. Full license texts in NOTICES.txt.

This is a community Linux port of Emutastic by the same author.


License

GNU General Public License v3.0

About

Native Linux port of Emutastic — a multi-system emulator frontend using libretro cores (Avalonia/.NET)

Resources

License

GPL-3.0, Unknown licenses found

Licenses found

GPL-3.0
LICENSE
Unknown
LICENSE-CONTROLLER-ART.txt

Stars

Watchers

Forks

Packages

 
 
 

Contributors