Problem: node and cross-cutting narratives lived at the repo root
(containers/, vms/, infrastructure/, host .md files), interleaved with the
machine-readable substrate.
Change:
- Move containers/ -> knowledge/wiki/containers/, vms/ -> knowledge/wiki/vms/,
infrastructure/ -> knowledge/wiki/infrastructure/, hosts/{hubris,strong}.md ->
knowledge/wiki/hosts/, infrastructure/references/ -> knowledge/sources/references/,
GLOSSARY.md -> knowledge/GLOSSARY.md.
- Add knowledge/{index.md,log.md,sources/index.md} scaffolding.
- Rewrite all relative links repo-wide via a path-resolving mapper (inbound +
outbound + between-moved-files), including .hermes/, runbooks, operations,
investigations, plans, README, AGENTS.
- Repoint inventory.yaml doc_page fields and regenerate hosts/*.yaml (which
embed doc_page); update oikos/gen-topology.py output path, candidate doc
paths, and footer links; update code-comment doc paths.
Substrate untouched in place: inventory.yaml, hosts/*.yaml (regenerated,
idempotent), oikos/ code, mcp/, secrets/, bin/.
Verification:
- Logical broken-link set identical to pre-move baseline (net 128 -> 127; the
topology regen fixed one, introduced none). Remaining are pre-existing refs
to destroyed/archived nodes, out of scope for this move.
- gen-topology.py --check exit 0 (in sync); cards carry knowledge/wiki/ doc paths.
- build_host_files.py idempotent; all inventory doc_page targets resolve.
- MCP contract verified: get_page/search_docs/get_changelog resolve moved pages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.7 KiB
134 — romm
Self-hosted ROM manager (RomM). Browse, search, and play your retro game library from the browser. Runs on Docker Compose with a MariaDB sidecar.
At a glance
- Hostname:
romm - IP:
192.168.8.249/28(static, vmbr1 on strong) - Privilege: privileged
- Resources: 1 core / 2 GiB RAM / 16 GiB rootfs (Debian 13, ludo-lvm)
- Mounts:
/mnt/media_local→/mnt/library - Public hostname:
roms.hubris.network
Service / port map
| Service | Listen | Notes |
|---|---|---|
| RomM | 192.168.8.249:80 |
HTTP (Caddy terminates TLS) |
| MariaDB | internal only | Sidecar in the same compose stack |
Compose
Located at /opt/romm/docker-compose.yml. Key points:
- Image:
rommapp/romm:latest - DB sidecar:
mariadb:latestwith healthcheck - ROM library:
/mnt/library/roms→/romm/library(writable) - Resources (covers, etc.): Docker named volume
romm_resources→/romm/resources - Saves/states:
/opt/romm/assets→/romm/assets - Config:
/opt/romm/config→/romm/config - Auth key: auto-generated, stored in
/opt/romm/.env
Environment (/opt/romm/.env):
DB_ROOT_PASSWD/DB_PASSWD— MariaDB credentialsDB_USER=romm-user/DB_NAME=rommROMM_AUTH_SECRET_KEY— auto-generated
ROM library structure
RomM expects /mnt/library/roms/<platform>/<game>/<rom>. Create platform
directories as needed:
/mnt/media_local/roms/
├── gba/
│ └── Pokemon - Emerald/
│ └── Pokemon Emerald.gba
├── snes/
│ └── Super Mario World/
│ └── Super Mario World.sfc
└── psx/
└── Final Fantasy VII/
└── Final Fantasy VII.bin
Media permissions
The /mnt/media_local/roms directory is owned root:media with mode 2775
(setgid). New files inherit the media GID (10000). The LXC is privileged so
no idmap block is needed — in-container UID/GID matches the host. Docker
containers within the LXC run as-is (read-only mount).
Related
- Strong host
- Caddy (121) —
roms.hubris.network → 192.168.8.249:80 - DNS (107) —
roms.hubris.network A 192.168.8.175 - Media permissions
- RomM docs
Changelog
2026-07-05 — provisioned
LXC 134 created on strong (Debian 13, privileged, 192.168.8.249/28).
Docker + Compose installed. RomM stack deployed at /opt/romm/.
Created /mnt/media_local/roms with setgid media:GID=10000 mode 2775.
Caddy roms.hubris.network → 192.168.8.249:80.
DNS roms A 192.168.8.175 added to Technitium.
Hubris /32 route for .249 added to 50-strong-route.