A deterministic, self-healing project staging system that manages libraries and targets.
1.5K
Self-hosted Docker app that syncs projects from libraries to storage-limited target devices (e.g. a Steam Deck or mini PC). It copies files from your source libraries to a target, enforcing a configurable storage limit with automatic LRU eviction.
Create a docker-compose.yml:
services:
rotato:
image: hoholabs/rotato:latest
container_name: rotato
ports:
- "7777:7777"
volumes:
- rotato_data:/data
- /path/to/your/library:/mnt/my_library
- /path/to/your/target:/mnt/my_target
restart: unless-stopped
volumes:
rotato_data:
Then run:
docker compose up -d
Open http://localhost:7777 in your browser.
| Mount | Purpose |
|---|---|
/data | Persistent database — always use a named volume here |
/mnt/* | Mount your library folders and target devices here — name them whatever you like |
You can add as many libraries and targets as you need — just add more volume entries and register them in the UI.
Rotato checks whether a target device is online before syncing to it. When you add a target in the UI, Rotato tries to create the sentinel file automatically — so if the device is already mounted and writable, it just works.
If you need to create it manually (e.g. for a device added before v0.2.0, or one that was offline when registered), place an empty file called .rotato_available at the root of the target mount:
touch /path/to/your/target/.rotato_available
If this file is missing, Rotato will show the target as OFFLINE and skip it. This lets it gracefully handle devices that are off or disconnected.
hoholabs/rotato:latest7777 → 7777/mnt/user/appdata/rotato, Container path /data/mnt/... container path you choose)http://your-unraid-ip:7777To set a cover image for a project, place an image file named __cover (any extension) in the root folder of the project:
My Project/
__cover.jpg ← cover image
game.exe
...
Rotato will use this image as the project's tile artwork in the UI.
Click a project tile to queue it. Queued and in-progress items appear in the queue popover (click the worker status chip in the top bar).
From the queue popover you can:
If a copy is interrupted (container restart, network hiccup, etc.), Rotato resumes from where it left off on the next worker pass — it doesn't restart from scratch.
Click the ❤ pin icon on any project that's already on the target to pin it. Pinned projects:
Rotato tracks whether libraries and targets are reachable:
Content type
Image
Digest
sha256:bf2aba642…
Size
84.1 MB
Last updated
7 months ago
docker pull hoholabs/rotato