C:\STUDIOLO\USES\ROMS
ROMs for RomM
Years of ROM collecting leave the same game on three disks under three names, zipped or not, next to cue sheets that no longer match their bins. RomM wants one folder per platform with exact slugs and full No-Intro or Redump names. Studiolo identifies every dump by its content and builds that folder without touching the originals.
Originals
C:\EMU\SNES\
smetroid.zip
D:\PSX\ridge\
rr.cue
Track01.bin
Track02.bin
Read-only, untouched
RomM
romm/
library/roms/snes/
Super Metroid (Japan, USA).zip
library/roms/psx/Ridge Racer (Europe)/
Ridge Racer (Europe).cue
Ridge Racer (Europe) (Track 01).bin
Ridge Racer (Europe) (Track 02).bin
The layout RomM expects
ROMS.TXT
Identified by content, not by name
Every file is hashed once, with CRC32, MD5 and SHA1 kept alongside for No-Intro and Redump DAT matching. Inside a ZIP, member checksums are read from the central directory without decompressing. A file called smetroid.zip still becomes Super Metroid (Japan, USA), with the region and revision tags RomM parses.
Games, not files
A cue sheet and its bins form one item and land together in a folder named after the game, with part names taken from the DAT so the cue still finds its tracks. An item appears in the library only when every part is present; a game missing a track stays out instead of showing up broken.
Hardlinks, never moves
Files on the same filesystem as the library are hardlinked. Files on other disks are copied once into a cache, verified against their hash, and hardlinked from there. The originals are never moved, renamed or written.
RomM keeps its history
RomM keys its data by path, so each game keeps the path it was given until you migrate it on purpose. Rule changes show a plan of adds, renames and removals before anything happens, and after an apply Studiolo asks RomM to rescan only the platforms that changed.
Handhelds go through RomM
RomM's own clients already sync games and saves to handhelds. Studiolo feeds RomM and leaves that job to them.
STUDIOLO.YAML
targets:
- id: romm
layout: romm
destination: /data/views/romm
method: hardlink
profile: posix
filter: "domain == 'rom' && identified && complete"
notify:
kind: romm
url: http://romm:8080
token_env: ROMM_TOKEN
From the M1 spec: one YAML file for the whole deployment.