A powerful, cross-platform ROM management tool designed for retro gaming enthusiasts who value clean, canonical libraries.
romman helps you manage your retro game collection by comparing your local files against official catalogues (DAT files). It prioritises correctness and user control, allowing you to identify missing games, eliminate duplicates, and keep only the "best" version of every title.
- Hash-First Matching: Uses SHA1 (preferred) and CRC32 (fallback) to identify ROMs regardless of filename.
- Catalogue Focused: Uses standard DAT files as the source of truth for your library.
- Preferred Selection: Deterministic rules select the best release (e.g., Europe > World > USA) and highest stable revision.
- Audit & Cleanup: Generates explicit cleanup plans for duplicates; no files are moved or deleted without your approval.
- Multiple Interfaces:
- CLI: Feature-complete command-line interface for batch operations.
- TUI: Interactive terminal UI for browsing your collection and library status.
- Web: (In Development) Modern web interface for management.
romman-lib/: Core logic, database schema, and scanner.romman-cli/: The authoritative command-line tool.romman-tui/: Interactive Terminal UI built with Bubble Tea.romman-web/: Frontend management interface.
- Go 1.21+
- SQLite3
- Make (optional, for convenience)
Build all interfaces using the top-level Makefile:
make build-allBinaries will be available in the bin/ directory.
-
Import a System Catalogue:
./bin/romman dat import path/to/megadrive.dat
-
Add a Local Library:
./bin/romman library add "Sega Genesis" /path/to/roms genesis -
Scan and Match:
./bin/romman library scan "Sega Genesis" -
Browse in TUI:
./bin/romman-tui
romman integrates with IGDB to fetch game metadata and download boxart.
Obtain your Client ID and Secret from the Twitch Developer Console.
export IGDB_CLIENT_ID="your_client_id"
export IGDB_CLIENT_SECRET="your_client_secret"Scrape metadata for a specific release ID (requires a valid database ID):
romman scrape <release_id>Or bulk scrape an entire library:
romman library scrape "My Library"The metadata and boxart will be available in the Web UI.
ROM Manager includes built-in support for structured logging and OpenTelemetry tracing.
Structured logs are enabled by default using Go's slog. You can configure the log format (text/json) and level in .romman.yaml.
OpenTelemetry tracing is supported for long-running operations like DAT imports and library scans.
- Start Jaeger (for local visualization):
docker compose -f docker-compose.jaeger.yml up -d
- Run with Tracing:
Set the
OTEL_EXPORTER_OTLP_ENDPOINTenvironment variable to point to your Jaeger/OTLP collector:export OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 ./bin/romman library scan "My Library"
- View Traces: Open http://localhost:16686 to browse spans and performance data.
Run tests across the workspace:
make test[License Type, e.g., MIT]