What it is
Riven is a media-automation tool built around a remote media provider. It watches Plex's request list (and other sources), sources matching files through the upstream catalogue, and traditionally builds tidy symlink trees that Plex points its libraries at.
Why I run it
The clean version of the remote-media → Plex pipeline is "Riven handles everything." Requests come in, Riven finds the right release, and Plex sees curated library trees with consistent naming. That's the design, and it works.
In practice, after a host migration I repointed Plex directly at the underlying zurg mount instead of Riven's symlink trees, and the playback experience got cleaner (fewer moving parts, no Riven-side metadata staleness). So Riven now runs, but isn't in the playback critical path — Plex sees the zurg mount directly. I keep Riven around for request handling and as an option if I want symlink-curated libraries again later.
How I use it
Mostly hands-off. The frontend and backend run as separate services. The mount Riven consumes is the same host-managed media mount Plex uses, provided by the host's rclone systemd service.
Setup notes
- Host: the media LXC.
- Reverse proxy: yes, but the proxied hostname is read-only. Riven's
ORIGINenv var only accepts one origin, and the reverse proxy hostname doesn't match the configured one, so settings POSTs fail through the proxy. The dashboard works for browsing; configuration changes use the internal-only upstream documented in the private runbook. - Backups: PBS captures the LXC;
settings.jsonin the config directory holds Riven's source-of-truth state. - Update cadence: manual.
Runbook
- Healthy looks like: backend health endpoint returns OK, frontend loads, the dashboard's "active jobs" view shows recent activity.
- Frontend stuck on "Connect to your backend": the backend URL is stored in browser localStorage. After a host change, the saved URL still points at the old host. Clear localStorage for the Riven frontend domain, reload, enter the current backend URL.
- Mount is empty inside the container: same stale-FUSE-FD pattern that affects Plex. Restart consumer containers so they pick up the new FUSE descriptor.
settings.jsonwas overwritten: Riven rewrites it on startup if it considers the file invalid. Always stop the container before editing, validate the JSON, then start. Otherwise your changes survive briefly and then disappear at the next restart.- Where logs live:
docker logs rivenfor the backend,docker logs riven-frontendfor the UI.