Overview
Discover what makes RomM powerful
RomM is a self‑hosted web application that transforms raw ROM files into a fully enriched, searchable library. From a technical standpoint it performs **metadata ingestion**, **artwork retrieval**, and **in‑browser emulation** while exposing a RESTful API for external tooling. The core engine is built in **Node.js (TypeScript)**, with a **React** front‑end that communicates over WebSocket for real‑time updates. Data is persisted in a **PostgreSQL** database, and the application ships with optional **Redis** caching for high‑volume queries. This stack gives developers a familiar JavaScript ecosystem while keeping performance and scalability in mind.
Backend
Frontend
Database
Emulation
Overview
RomM is a self‑hosted web application that transforms raw ROM files into a fully enriched, searchable library. From a technical standpoint it performs metadata ingestion, artwork retrieval, and in‑browser emulation while exposing a RESTful API for external tooling. The core engine is built in Node.js (TypeScript), with a React front‑end that communicates over WebSocket for real‑time updates. Data is persisted in a PostgreSQL database, and the application ships with optional Redis caching for high‑volume queries. This stack gives developers a familiar JavaScript ecosystem while keeping performance and scalability in mind.
Architecture
- Backend – Express‑based API written in TypeScript, leveraging NestJS conventions for modularity. The service layer is split into scanners, metadata providers, and emulation controllers. Each provider (IGDB, Screenscraper, MobyGames) is wrapped in a dedicated SDK module that handles rate‑limiting and OAuth flows.
- Frontend – React + Redux Toolkit with a responsive design powered by Tailwind CSS. The UI communicates via GraphQL (Apollo Client) for flexible queries and subscriptions, enabling instant library updates when a new ROM is added.
- Database – PostgreSQL stores game records, platform definitions, and user permissions. The schema is normalized but includes JSONB columns for dynamic metadata (e.g., achievements, DLC lists).
- Emulation – RomM embeds EmulatorJS and RuffleRS, allowing games to be played directly in the browser without external plugins. The emulator modules are loaded lazily through Webpack code‑splitting, reducing initial bundle size.
Core Capabilities
- Metadata API – Endpoints
/api/metadata/:platform/:idexpose enriched data, including cover art URLs, release dates, and platform‑specific tags. Developers can hook into this API to build custom dashboards or analytics tools. - Webhooks – RomM emits events (
game_added,scan_completed) that external services can subscribe to via HTTP POST. This is ideal for CI pipelines that need to trigger backups or sync operations when the library changes. - Plugin System – A pluggable architecture allows third‑party modules to register new scanners or exporters. Plugins are isolated in separate NPM packages and loaded at runtime through a simple dependency injection container.
- Custom Tagging – Filenames can include structured tags (
[RPG],[HD]) which are parsed by the scanner and stored as searchable attributes. This feature is exposed to developers through the/api/tagsendpoint.
Deployment & Infrastructure
RomM ships as a Docker Compose stack, but the service can also be deployed on any Node.js‑capable host. The Docker image is built on a lightweight Alpine base, keeping the footprint under 200 MB. For production use, the following components are recommended:
| Component | Recommendation |
|---|---|
| Database | PostgreSQL 15+, preferably with WAL archiving for point‑in‑time recovery |
| Cache | Redis 7.x to cache heavy metadata queries |
| Reverse Proxy | Nginx or Caddy for TLS termination and HTTP/2 support |
| CI/CD | GitHub Actions can build the image; Helm charts are available for Kubernetes deployments |
The application is horizontally scalable by running multiple API instances behind a load balancer. Since the database is the single source of truth, all replicas must share the same PostgreSQL cluster.
Integration & Extensibility
Developers can extend RomM in several ways:
- SDKs – A TypeScript SDK is available on npm (
romm-sdk) that wraps all public endpoints, making it trivial to write scripts for bulk metadata updates or automated scans. - Custom Scanners – By implementing the
ScannerInterface, a new module can parse non‑standard ROM directories or integrate with proprietary naming conventions. - OAuth Providers – RomM supports SSO via OAuth2; developers can plug in their own identity provider (e.g., Keycloak) by configuring the
authmiddleware. - Webhooks – Built‑in support for GitHub Actions, Slack notifications, or custom HTTP endpoints allows seamless integration into existing workflows.
Developer Experience
The project follows strict semantic‑versioning and publishes release notes on GitHub. The documentation is hosted at docs/, providing comprehensive guides for API usage, plugin development, and deployment scenarios. Community support is active on Discord and GitHub Discussions; contributors benefit from a clear code‑style guide, automated linting via ESLint/Prettier, and a CI pipeline that enforces type‑safety.
Use Cases
- Retro Game Collectors – Automatically scan a shared NAS drive, enrich the library with IGDB data, and expose a web portal for family members.
- Educational Institutions – Deploy RomM on campus servers to provide a controlled environment for classic game research, with fine‑grained user permissions.
- Game Developers – Use RomM’s metadata API to generate asset lists for indie releases, or integrate the emulator into a continuous‑integration pipeline that tests ROM compatibility.
- Hardware Vendors – Embed the RomM web UI into handheld devices (e.g., muOS) to give users a native game browsing experience without installing additional software.
Advantages
- Open Source & AGPL‑3.0 – Full control over data and the
Open SourceReady to get started?
Join the community and start self-hosting RomM today
Related Apps in other
Immich
Self‑hosted photo and video manager
Syncthing
Peer‑to‑peer file sync, no central server
Strapi
Open-source headless CMS for modern developers
reveal.js
Create stunning web‑based presentations with HTML, CSS and JavaScript
Stirling-PDF
Local web PDF editor with split, merge, convert and more
MinIO
Fast, S3-compatible object storage for AI and analytics
Weekly Views
Repository Health
Information
Tags
Explore More Apps
Superdesk
Digital newsroom platform for end‑to‑end news creation and distribution
ghstats
Self-hosted data-analysis
qBittorrent
Open‑source BitTorrent client with a clean, µTorrent‑like UI
ActivityWatch
Track your time privately, automatically and cross‑platform
EGroupware
Open source online office for secure, sovereign collaboration
Lemmy
Decentralized link aggregator and forum
