RomM
Beautiful, powerful, self-hosted rom manager and player
Alternative to: antstream arcade
4.2.0-beta.1
2025-09-07New Features
Console Mode
Look ma’, I’m on TV! The new console interface is designed for big screens and easy navigation with a controller or remote. It features a grid layout, large icons, and a simplified menu structure to enhance your gaming experience from the comfort of your couch. Launch it from the navigation bar or navigate directly to /console.
#2314
| Home |
|---|
| Gallery | Details |
|---|---|
Out-of-the-box PSP and DOS Emulation
Our programming wizard @adamantike cast a spell on the code base, and now PSP and DOS play is support out-of-the-box, no custom reverse proxy settings or browser launch arguments required! You’ll now see play buttons on supported games, though please note that performance is limited by the browser’s WASM engine, and performance will vary.
#2356 + #2376
Global EmulatorJS Config
The config.yml file now accepts a new emulatorjs section that allows you to set custom, per-core options and controls. Setting debug: true will print a list of available options for the current emulator core to the browser console, which you can then set in the settings block. The control block allows you to set a custom control mapping for each core. Both settings and control accept a default “core”, who’s value will be applied to all cores.
#2360
[!NOTE] Custom settings and controls are fully optional, and if not set, the emulator will use its own defaults.
# EmulatorJS per-core options
emulatorjs:
debug: true # Available options will be logged to the browser console when the emulator is started
cache_limit: null # Cache limit per ROM (in bytes, null is default)
settings:
parallel_n64: # Use the exact core name
vsync: disable
snes9x:
snes9x_region: ntsc
default: # These settings apply to all cores
fps: show
controls: # https://emulatorjs.org/docs4devs/control-mapping/
snes9x:
0: # Player 1
0: # IF USED, A MAPPING FOR EACH BUTTON MUST BE SET!
value: x # Mapping for keyboard
value2: BUTTON_2 # Mapping for connected controller
1:
value: y
value2: BUTTON_4
1: # Player 2
2: # Player 3
3: # Player 4
Incremental RetroAchievements Sync
A new scheduled task has been added to sync RetroAchievements progress for all users on a recurring basis. Enable the task by setting ENABLE_SCHEDULED_RETROACHIEVEMENTS_PROGRESS_SYNC=true in your environment variables. By default the task runs nightly, but you can customize that using the SCHEDULED_RETROACHIEVEMENTS_PROGRESS_SYNC_CRON variable.
[!NOTE] Achievements will only sync for users who have enabled RetroAchievements in their profile settings
#2325
WebP Image Task
Another scheduled task has been added to convert all uploaded images to the modern .webp format. WebP images are 5-10x smaller then JPG/PNG images with no loss of quality, leading to faster load times for cover art in galleries. Enable the task by setting ENABLE_SCHEDULED_CONVERT_IMAGES_TO_WEBP=true in your environment variables. By default the task runs nightly, but you can customize that using the SCHEDULED_CONVERT_IMAGES_TO_WEBP_CRON variable. We also recommend increasing the TASK_TIMEOUT environment variable if you have a large number of games.
#2334
Minor Changes
- Jump to previous/next game by @gantoine in https://github.com/rommapp/romm/pull/2330
- Add scheduled task to sync RetroAchievements progress by @adamantike in https://github.com/rommapp/romm/pull/2352
- Use dropzone and add button in upload modal by @gantoine in https://github.com/rommapp/romm/pull/2366
- Console UI improvements by @gantoine in https://github.com/rommapp/romm/pull/2377
- Add options to gunicorn call by @gantoine in https://github.com/rommapp/romm/pull/2322
WEB_SERVER_CONCURRENCY=2:WEB_SERVER_TIMEOUT=300:WEB_SERVER_KEEPALIVE=2:WEB_SERVER_MAX_REQUESTS=1000:WEB_SERVER_MAX_REQUESTS_JITTER=100:WEB_SERVER_WORKER_CONNECTIONS=1000:
Bug Fixes
- Invalidate fixture cache on file change by @adamantike in https://github.com/rommapp/romm/pull/2350
- Replace the default exit emulation button with a custom one by @mazkolain in https://github.com/rommapp/romm/pull/2353
- Fix single roms display on postgres by @gantoine in https://github.com/rommapp/romm/pull/2369
- Performance fixes for gallery slowdown on card hover by @gantoine in https://github.com/rommapp/romm/pull/2373
- Reload window when exiting emulatorjs on component unmounted by @gantoine in https://github.com/rommapp/romm/pull/2374
- getEjsControls should return null if no controls for core or default by @gantoine in https://github.com/rommapp/romm/pull/2378
- [ROMM-2375] Fix sanitizing file name on rename by @gantoine in https://github.com/rommapp/romm/pull/2380
- [ROMM-2344] Ignore RA manuals on scan by @gantoine in https://github.com/rommapp/romm/pull/2381
- Correctly mock async response.json() in unit tests by @adamantike in https://github.com/rommapp/romm/pull/2382
- Selecting collections should change background by @gantoine in https://github.com/rommapp/romm/pull/2383
- [ROMM-2039] Add special case for screenshots during scan by @gantoine in https://github.com/rommapp/romm/pull/2395
- [ROMM-2336] Config entry for EJS_CacheLimit by @gantoine in https://github.com/rommapp/romm/pull/2397
Other
- Create IGDB service adapter by @adamantike in https://github.com/rommapp/romm/pull/2345
- Add PlayBtn component to unify button logic by @adamantike in https://github.com/rommapp/romm/pull/2357
- Run vite dev server with HTTPS enabled by @gantoine in https://github.com/rommapp/romm/pull/2235
- Fix devcontainer launch by @MauGx3 in https://github.com/rommapp/romm/pull/2340
- Avoid loading external plugins for mdeditor by @gantoine in https://github.com/rommapp/romm/pull/2359
- Add prettier plugin to sort imports by @adamantike in https://github.com/rommapp/romm/pull/2358
- Replace usage of localStorage with vuewuse useLocalStorage by @gantoine in https://github.com/rommapp/romm/pull/2362
- Replace activeElement with type exact useActiveElement by @gantoine in https://github.com/rommapp/romm/pull/2365
- Set import order in prettierrc by @gantoine in https://github.com/rommapp/romm/pull/2361
- Replace window scroll listeners with reactive useWindowScroll by @gantoine in https://github.com/rommapp/romm/pull/2367
- Use modern useTemplateRef hook by @gantoine in https://github.com/rommapp/romm/pull/2368
- Add MetadataHandler’s is_enabled method by @adamantike in https://github.com/rommapp/romm/pull/2370
- Replace useWindowScroll with useScroll on document body by @gantoine in https://github.com/rommapp/romm/pull/2372
- Identify first party modules for isort by @adamantike in https://github.com/rommapp/romm/pull/2371
- Allow minor upgrades for backend dependencies by @adamantike in https://github.com/rommapp/romm/pull/2379
- Update emulatorjs and ruffle logos to high quality SVG versions by @gantoine in https://github.com/rommapp/romm/pull/2389
- Add and update platform icons by @gantoine in https://github.com/rommapp/romm/pull/2392
New Contributors
- @kodaxx made their first contribution in https://github.com/rommapp/romm/pull/2314
- @MauGx3 made their first contribution in https://github.com/rommapp/romm/pull/2340
- @mazkolain made their first contribution in https://github.com/rommapp/romm/pull/2353
Full Changelog: https://github.com/rommapp/romm/compare/4.1.6…4.2.0-beta.1