Repository navigation
Releases
romi edge (4104db5)
The newest romi, built from main at 4104db5 on 2026-11-06. It moves with every change, between releases, so it may have bugs a release doesn't. For something steadier, take the latest release.
romi v0.6.4
Logging in to RetroAchievements is now all it takes to see your achievements, and Neo Geo games have their real names.
Fixes
- Being logged in is enough to see your achievements. Unlocks worked with just a login, and showed in the notice over the game, but the achievements screen and details pane also needed a username in the config and a web API key. Without those, they had nothing from RetroAchievements and didn't say why. They now read your progress with your login, and refresh when you log in and after a game. A web API key is optional: it adds your awards (mastered, beaten) and the dates you earned things, which the login can't see.
- Unlocks waiting to be sent go when romi opens, for someone with only a login. Before, that needed a web API key too.
- Neo Geo games show their titles.
2020bbis now 2020 Super Baseball, and the BIOS no longer shows up as a game. There's nothing to change in your config, and no need to runromi initagain.
New
- Log in from inside romi. RetroAchievements at the bottom of Options logs in and out, with an on-screen keyboard for a controller. If RetroArch is logged in, romi offers to use its login, with no password to type.
romi checksays when Ghostty'sbackground-bluris on. It adds a lot of input lag to games: about 45 ms measured at 4K.romi-couchnow turns it off too.
Install
With Rust 1.90 or newer, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.6.4-x86_64-linux.tar.gz
install -Dm755 romi-v0.6.4-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.6.3...v0.6.4
romi v0.6.3
Flatpak RetroArch's folders are used now, and romi says so plainly over SSH.
Fixes
- A Flatpak RetroArch counts as RetroArch. Its cores were already found, but its saves, BIOS files, core options and remaps weren't used, and
romi initacted as if there was no RetroArch. When it's the only RetroArch on the machine, romi now shares its folders under~/.var/app/org.libretro.RetroArch/config/retroarch. A RetroArch installed on the machine itself still wins. A config that's already there isn't changed: to switch yours, point"bios_dirs"at that folder'ssystem, remove"saves_dir", and move any files over. - Over SSH, A starts the emulator and says why. A session from Ghostty or kitty passed along a
TERMthat said it could show games, but frames can't reach a terminal on another machine. Play in romi in a game's menu will still try. romi run --load-stateworks with PPSSPP. A state loaded too early could leave the picture black for hundreds of frames, so PPSSPP now gets two seconds first. Other cores don't wait.
Install
With Rust 1.90 or newer, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.6.3-x86_64-linux.tar.gz
install -Dm755 romi-v0.6.3-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.6.2...v0.6.3
romi v0.6.2
A proper welcome, and save states that leave your game's buttons alone.
Highlights
- A first run with a welcome. With no config, romi opens on a title screen with the logo, asks where your ROMs are, and shows what it found before writing anything. If RetroArch is installed, it also asks whether to share its folders or keep to romi's own. A controller works too, though it can only take the folder offered, not type one. Options → Title screen at start brings the title screen back each time romi opens, if you'd like it for your setup.
- Save states move to the Guide button. While a game plays in romi, it's now Guide+R to save, Guide+L to load, Guide+Down to undo the last load, and Guide+Left and Right to change slot. Games never see Guide, so Select and the d-pad are all theirs. Outside a game, Guide does what it did. This replaces the Select combos from 0.6.0. Options → Save state button (
"state_button") picksguide,selectoroff, which leaves the keyboard's F2, F4, F3, F6 and F7. A controller without a Guide button uses Select. Steam's overlay can also react to Guide.
Fixes
- Games played in romi are recorded now. Since A began playing games in romi, they'd been missing from Recently Played, play time, the stats and
romi status, and hooks didn't run for them. Play time from before this release can't be recovered, as it was never written down. If you haveon_launchoron_exithooks, they now run for games played in romi too, so check any that act on a game's window: the window is romi's. - romi reads RetroArch's BIOS folder from
system_directoryin its settings, rather than assuming the usual one, when it makes a new config.
Install
With Rust 1.90 or newer, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.6.2-x86_64-linux.tar.gz
install -Dm755 romi-v0.6.2-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.6.1...v0.6.2
romi v0.6.1
Mostly for anyone setting romi up for the first time: this comes from following the README on clean installs of Ubuntu 24.04 and Fedora 43.
Setting up
- More cores count. The built-in system list wanted one core per system, so Ubuntu's Snes9x was "no emulator installed" because it wasn't bsnes-hd. It now takes the common others (Snes9x, Gambatte, Nestopia, VBA-M, PicoDrive and more) after its first choice.
- RetroArch that's never been opened. Ubuntu's core packages install RetroArch, and its folders don't exist until it's first opened, so cores got no system folder at all. A new config now makes it.
- Where to get a core.
romi initandromi checknow point to distro packages and libretro's nightly builds, instead of only sayingneeds: mgba_libretro.so. - Rust 1.90 or newer is now stated in the README and in the crate. Ubuntu 24.04's Rust is too old and fails with
feature edition2024 is required; rustup gets a current one.
Fixes
romi run <file>picks the right system. It took the first system that listed the file's extension, so a Dreamcast.chdwent to Genesis Plus GX and failed, and a PlayStation game could "run" in it. A file now belongs to the system whose ROM folder it's in, or a folder named after a system, or the only system that takes its extension. If it still can't tell, it lists them and exits with 65, and--systemsays which. A script that passes a loose.chdor.isowith neither--systemnor--corewill now get that exit code instead of a guess.- No more offering an emulator that isn't there. With a core and no RetroArch, a game's menu still offered
retroarch · mgba. It's gone from the menu, andromi playnow plays those games through the core, in Ghostty or kitty. - Signals during
romi run --livestop the game as Esc does: it saves, and the terminal is put back.
Install
With Rust 1.90 or newer, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.6.1-x86_64-linux.tar.gz
install -Dm755 romi-v0.6.1-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.6.0...v0.6.1
romi v0.6.0
Save states are here, and romi no longer needs RetroArch's folders.
Highlights
-
Save states while you play. Each game has ten slots and remembers which one it was last on.
On a controller On a keyboard Select+R F2 Save to the current slot Select+L F4 Load the current slot Select+Down F3 Undo the last load, or undo that undo Select+Left, Select+Right F6, F7 Change slot On a controller, R, L and those d-pad directions don't reach the game while Select is held, but Select itself does, and there's no way to turn the combos off yet, so games that use Select as a held button may notice.
-
RetroArch's format, in romi's folder. States are compressed the way RetroArch compresses them, so a state can be copied between the two, but romi keeps its own in
~/.local/share/romi/statesso neither writes over the other. States belong to the core that made them, and often to its version. -
Your in-game save is looked after. Loading a state can take back the game's in-game save, as it does in RetroArch, on cores that keep it in the state. romi tells you when that happens and keeps the last five saves it replaced.
-
Achievements carry over. A state remembers how far along the game's achievements were. Unlocks are still softcore.
-
A folder of its own. When romi makes a new config on a machine with no RetroArch, BIOS files, in-game saves and downloaded cores go in
~/.local/share/romi. Installing RetroArch later doesn't move them. If you already have a config, nothing changes, and the setup docs say how to move if you'd like to. -
romi checksays where things go: the folders it's using for BIOS files, saves and states. -
romi run --save-stateand--load-statelet a scripted run skip to the part it's testing, with--achievementstoo.
Fixes
- PSP games often wouldn't start, with "the core crashed while starting", and stopping one while it was still booting crashed romi. PPSSPP finishes booting as it unloads, and needed its OpenGL context for that.
romi runreports its own result. A core that crashed as it unloaded could give scripts the wrong exit code and hide the reason a run failed. A run no longer unloads its core.
Still missing: rewind, hardcore achievements and Vulkan renderers. 3D and states have only been tested on one laptop so far, so reports from other GPUs are welcome. PPSSPP can refuse to save a state while a game is still booting; trying again a moment later should work.
Install
With Rust, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.6.0-x86_64-linux.tar.gz
install -Dm755 romi-v0.6.0-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.5.1...v0.6.0
romi v0.5.1
A small release, so that a terminal that can't show games no longer looks broken.
Fixes
- Terminals that can't show games. A used to start a game inside romi in any terminal, which left a blank panel in foot, garbage in Alacritty and Konsole, and a black screen in WezTerm, with no message. Games only show in Ghostty and kitty, so anywhere else, tmux and zellij included, A now starts the game in its emulator and says why. Play in romi in a game's menu will still try, for a terminal that turns out to be able to show it.
- More folders found without ES-DE.
romi initnow knows FinalBurn Neo, and the folder namessegacd,megacd,mameandlynx. - PS2 BIOS. A BIOS in LRPS2's own folder now counts, as well as one in PCSX2's.
romi check
- It says which terminal it's in and whether games show there.
- It says how many libretro cores it found and where, or everywhere it looked if it found none.
- It says when LRPS2 has no BIOS.
- Without ES-DE, it and
romi initname what a system needs to run, rather than what "ES-DE knows".
On Arch, docs/ps2.md now points to the AUR's libretro-lrps2-git for the PS2 core.
Install
With Rust, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.5.1-x86_64-linux.tar.gz
install -Dm755 romi-v0.5.1-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.5.0...v0.5.1
romi v0.5.0
Playing games in your terminal stops being an experiment in this release. A now plays a game inside romi by default, the DS, GameCube, Wii and PS2 join the systems that can, and you no longer need RetroArch: romi only needs the libretro core. The README lists all 25 systems and the core each one uses.
Highlights
- More systems in romi. New since 0.4.0: DS (touch the screen with the mouse), GameCube, Wii (played with a Wii Remote and Nunchuk on your pad) and PS2.
- PS2 through LRPS2, PCSX2's libretro core, which you add yourself. Play! is the fallback if it's all you have, but it runs far fewer games and isn't recommended. Two LRPS2 bugs still show on the nightly (Burnout 3's races and ATV Offroad Fury 2 when upscaled); fixes are written but haven't landed there yet.
- A plays in romi. A (or Enter) plays a game in romi when it can, and Play with in the game's menu starts its emulator. Options → A plays turns that round.
- No RetroArch needed.
romi initandromi checknow count a core on its own, so thelibretro-*packages or libretro's nightly builds are enough. If you do have RetroArch, romi still uses its cores, BIOS folder, options and remaps, and saves carry on in either. - Controls. Remap a game's buttons, or its system's, from its menu. RetroArch's remaps are followed, and each controller gets a player of its own.
- More from RetroAchievements. Progress towards achievements that count up, challenges under way, badges and rich presence all show while you play. PS2 games earn them too (
.isoand.cue, not.chdyet), and unlocks the server hasn't taken are kept and sent later. GameCube and Wii discs are now matched, but an unlock hasn't been seen live on them yet. Unlocks are still softcore. - Your own covers. Drag an image onto the terminal from Add art… in a game's menu.
- A better first run.
romi initfinds games in wrapper folders and folders with spaces in their names. Without ES-DE, it now knows NES, PSP, Lynx, Atari 7800, Game Gear, Master System and Wii. - Core options in romi's config.
"core_options"sets them for a system or a game, without touching RetroArch's files. - A logo, by Andrea Reyes.
Fixes
- bsnes-hd leaked 230 MB with each game played. It now stays loaded between games.
- Mesen, the NES core, crashed as it started. Cores are now initialized before they're given callbacks, as RetroArch does.
- Ape Escape gets the DualShock it needs.
- Long system names are shortened so the game count stays visible.
- Shared memory left behind by killed runs is swept up.
Still missing: save states, rewind, hardcore achievements and Vulkan renderers. 3D has only been tested on one laptop so far (a Radeon 890M with Mesa, and an RTX 4060 for PS2), so reports from other GPUs are welcome.
Install
New: romi is on crates.io. With Rust, a C compiler and the headers for udev and ALSA:
cargo install --locked romi
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.5.0-x86_64-linux.tar.gz
install -Dm755 romi-v0.5.0-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. There's also an edge build of main, rebuilt after every change that passes the tests.
Full changelog: v0.4.0...v0.5.0
romi v0.4.0
3D comes to playing games inside romi. Dreamcast, NAOMI, N64 and PlayStation games now play in the middle of the launcher, drawn sharp at about the size they're shown. Games also run more smoothly in the panel than before.
3D systems in romi
Cores that draw with the GPU now work in romi: Flycast (Dreamcast, NAOMI), Mupen64Plus-Next (N64) and Beetle PSX HW (PlayStation). romi gives them an OpenGL context with no window, on the GPU your screen is plugged into, and reads each frame back to show it like any other. This is new, and so far it has only been tried on AMD with Mesa; reports from other GPUs are welcome.
- The same settings as RetroArch. Cores get the core options RetroArch has for them and for the game, so a game plays the same in both.
- Controllers. Sticks and analog triggers work, and every port has a pad plugged in (Flycast plugs in no memory card without one). A game that's played with the stick no longer has the stick also working as the d-pad.
- Sharp 3D. 3D is drawn at about the size the panel shows it, up to 960 lines (1280×960), rather than at 640×480 scaled up. Scanlines and the CRT mask stay at the console's 240 lines, as on a TV.
"sharp_3d": false, or Options → Sharp 3D, draws at RetroArch's setting instead, which is left as it is. - Black borders cropped. Most N64 games draw inside a black border a CRT's edges hid. Once a game has drawn for a couple of seconds, romi shows only the part it draws in.
"crop_borders", or Options → Crop borders, turns it off. - A smooth start. Cores run their first frames, muted, behind the launch animation, so Flycast's slow first frames (it compiles its shaders) no longer stutter the game as it comes on.
Vulkan renderers (ParaLLEl-RDP, and Flycast's and Beetle's Vulkan modes) aren't supported yet; a game set to use one in RetroArch won't start in romi.
Smoother play
- Frames go to the terminal as soon as they're made, and are handed over evenly spaced, rather than whenever the launcher's loop came round. They used to reach the terminal 12 to 22 ms apart; now it's 15.5 to 18.5, as close to 60 fps as the terminal allows.
- Frames drawn with the GPU are read back without waiting for it. With the game big on a 4K screen, waiting for the GPU took most of a frame, and the game fell behind its sound. 3D games now hold 60 fps there, at the cost of one frame's delay.
ROMI_FRAME_LOG=frames.csvrecords when each frame was made, sent and read by the terminal, and how often the sound ran dry, with a summary. It's for finding out why a game plays unevenly.ROMI_CORE_LOGkeeps what a core says.
Fixes
- Stopping a game played with bsnes-hd crashed romi.
- Cores that print to the terminal no longer scroll the launcher.
Install
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later). They need libudev and ALSA's libasound, which nearly every desktop already has, and libEGL for 3D games.
tar -xzf romi-v0.4.0-x86_64-linux.tar.gz
install -Dm755 romi-v0.4.0-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. To build from source, see the README.
Full changelog: v0.3.0...v0.4.0
romi v0.3.0
Playing games inside romi grows up in this release. Games played in romi now get a launch animation, keep their saves, earn RetroAchievements and can look like an old screen. There are also prebuilt binaries for the first time.
Playing in romi
Open a game's menu (o) and pick Play in romi to play it in the middle of the launcher. It needs a terminal with Kitty graphics: Ghostty, or kitty.
- Launch animation. A wireframe of the system builds itself out of lines in your terminal's colors, then the camera dives into its screen as the game starts there. Game Boy, Game Boy Color and GBA games get a Game Boy, NES and SNES games an old TV with the console in front, arcade and Neo Geo games an upright cabinet, and everything else the TV. The game's file name picks how it builds and its color. Any key or button skips it, and
"launch_animation"turns it off or picks the colors. - Saves. In-game saves go in RetroArch's save folder under the same names, so a game saved in romi carries on in RetroArch and back. romi writes the save within a second of the game saving, and never writes over a save it couldn't read.
- RetroAchievements. Log in once with
romi achievements login, which keeps a token, not your password. Achievements unlock as you play, with a notice and the achievement's badge over the game. Unlocks are softcore. - Screen filters.
"screen_filter"gives the picture scanlines, a CRT's phosphor mask or an LCD grid. romi draws them itself, so they look the same in every terminal. - Rounded corners.
"corner_radius"rounds the picture's corners like an old TV, with the terminal's background showing through.
The launcher
- An options panel in the menu for volume, rounded corners, the launch animation, covers, title screens, the accent color, borders and the confirm button. Changes take effect at once and are saved into
config.json, changing only that value, so your comments and layout stay as they were. - The config reloads when it's saved, including files it includes. A config that doesn't parse is reported and the old one kept.
- Steam games get genres, a year, player counts and covers from Steam's store, through
romi scrape, with no API key.
Fixes
- Achievements could turn off for a whole session when a dropped connection made a login fail. romi now tries again, and
ROMI_RA_LOGsays why a request failed. - A notice drawn over a game no longer shifts the picture to its right.
Install
Prebuilt binaries for x86_64 and aarch64 Linux are below. They run on glibc 2.35 and newer (Ubuntu 22.04, Debian 12, Fedora 36 and later), and need libudev and ALSA's libasound, which nearly every desktop already has.
tar -xzf romi-v0.3.0-x86_64-linux.tar.gz
install -Dm755 romi-v0.3.0-x86_64-linux/romi ~/.local/bin/romi
On Arch, build the package with makepkg -si in packaging/arch. To build from source, see the README.
Full changelog: v0.2.0...v0.3.0