MSE is a multi-system emulator frontend written in C11. Emulator cores are plugins loaded at runtime. The frontend owns the window, the GPU and the UI, and is built on SDL3 and Dear ImGui (through cimgui).
- Pluggable backends. Each system is a shared library the frontend loads at startup.
- Game library with metadata and cover art, cached in SQLite.
- Lua scripting. Backends can ship their own ImGui panels and in-game overlays, written in LuaJIT.
- Debugging tools: CPU, PPU and memory viewers, cheats, and TAS movie playback.
- Built-in profiler (F9) and a console for commands and cvars (F10 or
`).
| Component | What it is | Source |
|---|---|---|
| libmse | The library that backends and the frontend share: backend loading, cvars, console, input, game library. | RileyWebb/libmse (submodule at libmse/) |
| cNES | Nintendo Entertainment System backend. See its README. | backends/cnes/ |
| Windows | Linux | |
|---|---|---|
| Compiler | GCC via MinGW-w64 | GCC |
| Generator | MinGW Makefiles |
Makefiles (default) or Ninja |
| Build type | RelWithDebInfo |
RelWithDebInfo |
Use GCC. CI builds only with GCC on both platforms, so it's the only compiler we know works. Clang and MSVC may work but aren't tested.
You also need:
- Git
- CMake 4.1 or newer
- On Linux, the X11/Wayland development packages and the Vulkan headers. The CI workflow lists the exact packages.
CMake fetches the other dependencies (SDL3, cimgui, cimplot, LuaJIT, SQLite, minizip-ng, stb and a few Lua libraries) while it configures, so the first configure takes a while.
git clone --recursive https://github.com/RileyWebb/mse
cd mse
# or, in an existing clone:
git submodule update --init --recursive
# Windows (MinGW-w64)
cmake -B build -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=RelWithDebInfo
# Linux
cmake -B build -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build buildEverything is built into bin/, which is also the directory to run from:
cd bin
./mse [options] [rom]mse --help lists the command-line options. Any cvar can be set at startup
with --set name=value.
ctest --test-dir build # everything
ctest --test-dir build -LE slow # skip the long AccuracyCoin run| Key | Action |
|---|---|
| F5 | Pause / resume |
| F9 | Profiler |
F10 or ` |
Console |
| F11 | Fullscreen |
mse/
├── libmse/ shared library (git submodule → RileyWebb/libmse)
│ ├── include/libmse/ public headers; everything here is prefixed libmse_
│ ├── src/ backend loader, cvars, console, input, library, profiler
│ └── data/lua/ metadata scraper, cover art, cvar helpers
├── frontend/ the mse application
│ ├── src/ SDL3 + cimgui UI, input, library view, console
│ ├── lua/ Lua UI API that backend panels are written against
│ ├── tests/ headless tests, including panel_smoke.lua
│ └── cmake/ SDL, cimgui and LuaJIT fetch scripts
├── backends/
│ └── cnes/ NES backend
│ ├── src/ CPU, PPU, APU, mappers, plus backend.c (plugin glue)
│ ├── include/cNES/ core headers; external/ holds the debug ABI the UI uses
│ ├── data/lua/ panels (ui/), overlays (overlays/), per-game scripts (games/)
│ └── tests/ test ROM suites, headless runner and baselines
├── data/ fonts, shaders and LUA_API.md
├── bin/ build output and runtime working directory
└── .github/workflows/ CI
A new backend goes in its own folder under backends/. It builds as a shared
library into bin/, where the frontend finds it at startup.
To write code for the project, read AGENTS.md first. It covers naming, comments and header conventions.
The progress of each backend is tracked in its own README (cNES).
- Runtime-loaded backend plugins
- Game library with SQLite cache
- Metadata scraping and cover art
- Lua panels and in-game overlays
- Console and cvars
- Profiler
- Controller configuration
- All dependencies fetched by CMake
- Automatic backend updates
MIT. See LICENCE.
MSE uses SDL3, Dear ImGui, LuaJIT, SQLite and other open-source projects, along with two fonts. CREDITS lists them all, with their authors and licences. Each backend credits its own resources in its folder, for example cNES.