zurg-public: a self-hosted WebDAV front end for a Real-Debrid library
A self-hosted Real-Debrid webdav server you can use with Infuse. Together with rclone it can mount your Real-Debrid torrent library into your filesystem and load it to Plex or Jellyfin.
At a glance
- What is it?
- zurg-public is a self-hosted WebDAV server that exposes a Real-Debrid torrent library as files, which rclone mounts into a filesystem for Plex or Jellyfin. The public release covers Real-Debrid only, and the newer backends live behind a sponsorship.
- Who is it for?
- zurg-public fits a self-hoster who already pays for Real-Debrid, wants the library mounted as a filesystem for Plex or Jellyfin, and is willing to run a rclone container with SYS_ADMIN and access to /dev/fuse. It does not fit anyone who needs TorBox, AllDebrid or Usenet support from the public release, since those backends are only in the sponsored nightly, and it does not fit a deployment where the licence question matters, because the repository lists no licence.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 17 days ago.
- What is it written in?
- Mainly PowerShell, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A WebDAV server over a debrid account
zurg is a self-hosted WebDAV server written from scratch, and the public repository holds the release plus a quick-start bundle containing config.yml, docker-compose.yml, rclone.conf and the Plex update scripts. The binaries themselves live in the GitHub Releases, which is worth knowing before you start looking for source. The job it does is narrow. A Real-Debrid account holds torrents you have added, and those torrents contain files you want Plex or Jellyfin to index as if they sat on a local disk. zurg translates between the two worlds: it exposes the library over WebDAV at localhost:9999, with a dashboard at localhost:9999/config/, and rclone then mounts that WebDAV share into a directory. The README also points at Infuse, which can talk to a WebDAV server directly and does not need the rclone step at all. The audience is therefore people running a media server at home who have already chosen a debrid service and want the library to behave like a mounted drive.
rclone does the mounting, and its flags decide what Plex sees
The compose file shows the architecture as two services. The zurg service serves WebDAV on port 9999 and mounts the config file, the Plex update script and a named volume for data. The rclone service is a separate container from the rclone/rclone image that mounts the zurg share onto /mnt/zurg with the FUSE device added and SYS_ADMIN capability granted, plus an unconfined AppArmor profile. The command line is the interesting part, because each flag maps to a behaviour Plex will notice:
command: "mount zurg: /data --allow-other --allow-non-empty --dir-cache-time 10s --vfs-cache-mode full"The zurg remote is mounted at /data, which the compose file maps to /mnt/zurg on the host. The 10 second directory cache means rclone does not re-list the remote on every directory read, which is what makes the mount cheap enough to leave running. The full VFS cache mode means file contents are cached locally rather than streamed, which is what lets Plex seek inside a file. There is also a healthcheck on the zurg service that curls localhost:9999/http/version.txt, and the rclone service waits for that healthcheck to pass before starting, so a broken server does not produce a mounted but empty directory.
Dead torrents are repaired when content is requested
The README claims that zurg guarantees the library is always available because of its repair abilities: dead links are detected on demand when content is accessed and repaired automatically, with no background polling of the Real-Debrid API. That design has two consequences worth understanding. First, there is no recurring scan against the API, which keeps request volume down and means the repair cost is paid only when someone actually watches the broken item. Second, the guarantee is conditional on the replacement being available, since a torrent whose content cannot be sourced again is a problem zurg cannot solve. The same section argues that a Plex scanner stuck on a file, which can freeze Plex entirely, should not happen because zurg does a comprehensive check on whether a torrent is dead. The README suggests you can look for stuck scanners with ps aux --sort=-time | grep "Plex Media Scanner". Separately, changes in your library are said to appear instantly, which is bounded in practice by the rclone directory cache discussed above.
Five steps to a mounted library with Docker
The README documents a short path from a clone to a browsable library. You clone the repository, put your Real-Debrid token into config.yml, create the mount point, start the compose stack and list the result:
git clone https://github.com/debridmediamanager/zurg-public.git
sudo mkdir -p /mnt/zurg
docker compose up -d
time ls -1R /mnt/zurgAfter the token is in config.yml, a config edit is applied with docker compose restart zurg. If you prefer the binary rather than containers, the same repository ships a command line tool with the same name. Running it with no arguments creates a default config and downloads ffprobe and rclone into a bin directory:
./zurg # creates config.yml, downloads bin/ffprobe + bin/rclone
# edit config.yml → add your Real-Debrid token
./zurg # starts the server on http://localhost:9999For Docker users there is a shortcut. The TOKEN environment variable, or RD_TOKEN, auto-creates a config on first run, and PORT overrides the configured port, so the config file can be skipped entirely if you prefer to pass the token as an environment variable. The utility also carries housekeeping subcommands, including download-requirements to fetch ffprobe and rclone into a directory and update the config paths, network-test for a connectivity check, clear-downloads to remove all unrestricted links in the account, clear-torrents to remove all torrents, and version to print the running build.
The stable image name and the compose file disagree
Two image names appear in the documentation and the repository, and picking the wrong one costs you time. The README pulls the testing image:
docker pull ghcr.io/debridmediamanager/zurg-testing:latest
# or pin the release
docker pull ghcr.io/debridmediamanager/zurg-testing:v1.0.0It explains that the image name is still zurg-testing from before the repository was renamed to zurg-public, that it is the current and correct image for stable releases, and that :latest on it always points at the newest one. The docker-compose.yml in the repository, on the other hand, uses ghcr.io/debridmediamanager/zurg-public:latest. The same README also documents a separate ghcr.io/debridmediamanager/zurg:latest image, which belongs to the private nightly repository. Check which image your compose file actually references before pulling, and prefer pinning a version tag over :latest if you care about reproducibility.
What the public release does not include
Several things sit behind a paywall or a platform limit. The nightly builds are date-stamped as YYYY.MM.DD.HHMM-nightly and carry work that has not landed in a stable release, including backends beyond Real-Debrid: TorBox, AllDebrid and Usenet. Reaching them requires an active sponsorship on GitHub Sponsors or Patreon, linked to the GitHub account through the gatekeeper site, and access is removed if the sponsorship lapses. Until access is granted, the private repository answers 404 rather than a permission error, which the README explains is what a private repository looks like to an account that cannot see it. The public release therefore means Real-Debrid only, whatever the project description hints at. Windows users need WinFsp and one extra rclone flag, with the details in WINDOWS.md. The licence field on the repository is empty, and the LICENSE.txt file listed in the tree is the only licence reference, so treat the terms as unclear until you have read it. The repository also carries a README note that the full documentation lives in the project wiki, including a Config page and a version history page.
Editorial conclusion
zurg-public fits a self-hoster who already pays for Real-Debrid, wants the library mounted as a filesystem for Plex or Jellyfin, and is willing to run a rclone container with SYS_ADMIN and access to /dev/fuse. It does not fit anyone who needs TorBox, AllDebrid or Usenet support from the public release, since those backends are only in the sponsored nightly, and it does not fit a deployment where the licence question matters, because the repository lists no licence. Verify first that the image you pull matches your compose file, since the README names zurg-testing as the stable image while the compose file in the repository points at zurg-public, then confirm that the 10 second directory cache in the rclone command meets your freshness needs. The last push was on 2026-10-06 and the current stable release is v1.0.0 from 2026-08-09.
Frequently asked questions
What does zurg-public do and what does it need?
It is a self-hosted WebDAV server written from scratch that exposes a Real-Debrid torrent library as files, which rclone can mount into a filesystem for Plex or Jellyfin. It requires a Real-Debrid account with an API token, and rclone and ffprobe are downloaded automatically on first run if they are not already installed.
How do I run zurg with Docker?
Clone the repository, add your token in config.yml, create the mount point with sudo mkdir -p /mnt/zurg, then run docker compose up -d. A web server starts at localhost:9999 with the dashboard at localhost:9999/config/, and you can list the mounted library with time ls -1R /mnt/zurg.
Which Docker image should I use for the stable release?
The README names ghcr.io/debridmediamanager/zurg-testing as the current and correct image for stable releases, explaining that the name predates the rename to zurg-public, and it can be pinned to a tag such as v1.0.0. Note that the docker-compose.yml in the repository references ghcr.io/debridmediamanager/zurg-public:latest, so check which one your stack actually pulls.
Does zurg support TorBox, AllDebrid or Usenet?
Those backends are described as part of the nightly builds, which carry work not yet in a stable release and require an active sponsorship on GitHub Sponsors or Patreon. The public release covers Real-Debrid.
How does zurg handle dead links in the library?
The README states that dead links are detected on demand when content is accessed and repaired automatically, with no background polling of the Real-Debrid API required. A torrent whose content cannot be sourced again is not something the repair path can fix.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/debridmediamanager-zurg-public)Was this useful?