Getting Started with SchröDrive
SchröDrive is the ultimate media automation orchestrator for debrid services. Connect your debrid accounts, indexers, and media servers — then let SchröDrive handle everything automatically.
Part of the Schrödinger's Copy Stack
SchröDrive is the core orchestrator in the Schrödinger's Copy stack. Your media exists in superposition — cloud and local, cached and streamed, everywhere and nowhere — until SchröDrive observes it. Pair it with the SchroDrive Media Manager for intelligent local storage with hardware encoding.
Prerequisites
Docker & Docker Compose
Docker Engine 20.10+ and Docker Compose V2 for container deployment.
Debrid Service Account
At least one of: TorBox, RealDebrid, AllDebrid, Premiumize, Debrid-Link, Deepbrid, Offcloud, Put.io, MegaDebrid, Seedr, or PikPak.
Media Server
Plex, Jellyfin, or Emby for streaming your organised content library.
NVIDIA GPU + Drivers
Required only for Media Manager hardware encoding (NVENC). CPU encoding also supported.
NVIDIA Container Toolkit
Required for GPU passthrough to Docker containers. Only needed for Media Manager.
Indexer (Recommended)
Prowlarr or Jackett for automated content discovery and searching.
Installation — Docker Recommended
Docker is the recommended way to run SchröDrive. Single container, zero external databases.
Quick Docker Run
For a quick test, you can run SchröDrive with a single docker run command:
docker run -d \ --name schrodrive \ --restart unless-stopped \ -p 8978:8978 \ -p 3000:3000 \ -v /home/user/schrodrive/config:/app/config \ -v /mnt/schrodrive:/mnt/schrodrive:shared \ --cap-add SYS_ADMIN \ --device /dev/fuse \ --security-opt apparmor:unconfined \ -e PROVIDERS=torbox,realdebrid \ -e TORBOX_API_KEY=your_torbox_key \ -e RD_ACCESS_TOKEN=your_rd_token \ -e PLEX_URL=http://plex:32400 \ -e PLEX_TOKEN=your_plex_token \ -e TZ=Australia/Sydney \ ghcr.io/moderniselife/schrodrive:latestFUSE mounts require --cap-add SYS_ADMIN, --device /dev/fuse, and :shared mount propagation on volume mounts.
Docker Compose
For production deployments, use Docker Compose. Create a docker-compose.yml file:
1version: "3.9"23services:4 schrodrive:5 image: ghcr.io/moderniselife/schrodrive:latest6 container_name: schrodrive7 restart: unless-stopped8 ports:9 - "8978:8978"10 - "3000:3000"11 volumes:12 - ./config:/app/config13 - /mnt/schrodrive:/mnt/schrodrive:shared14 cap_add:15 - SYS_ADMIN16 devices:17 - /dev/fuse18 security_opt:19 - apparmor:unconfined20 environment:21 # ── Core ──22 - PROVIDERS=torbox,realdebrid23 - TZ=Australia/Sydney24 25 # ── Debrid API Keys ──26 - TORBOX_API_KEY=your_torbox_key27 - RD_ACCESS_TOKEN=your_rd_token28 29 # ── Media Server ──30 - PLEX_URL=http://plex:3240031 - PLEX_TOKEN=your_plex_token32 33 # ── Indexers ──34 - PROWLARR_URL=http://prowlarr:969635 - PROWLARR_API_KEY=your_prowlarr_key36 37 # ── Request Manager (Seerr / Overseerr / Jellyseerr) ──38 - SEERR_URL=http://seerr:505539 - SEERR_API_KEY=your_seerr_key40 41 # ── Services ──42 - RUN_MOUNT=true43 - RUN_WEBHOOK=true44 - RUN_POLLER=true45 - RUN_WEB_GUI=true46 healthcheck:47 test: ["CMD", "curl", "-f", "http://localhost:8978/health"]48 interval: 30s49 timeout: 10s50 retries: 351 start_period: 30sBuild a custom configuration tailored to your setup
Installation — Bare Metal
Run SchröDrive directly on your system using Bun.
Install with Bun
# Clone the repository$ git clone https://github.com/moderniselife/SchroDrive.git$ cd SchroDrive# Install dependencies$ bun install# Build the project$ bun run build# Run SchröDrive$ bun dist/index.js serveBare metal installation requires Bun to be installed on your system. You'll also need rclone installed separately for FUSE mount functionality.
Environment Variables (Bare Metal)
Create a .env file in the project root or export variables directly:
PROVIDERS=torbox,realdebridTORBOX_API_KEY=your_torbox_keyRD_ACCESS_TOKEN=your_rd_tokenPLEX_URL=http://localhost:32400PLEX_TOKEN=your_plex_tokenTZ=Australia/SydneyConfiguration
SchröDrive is configured entirely through environment variables. Below is the complete reference, organised by category.
| Variable | Default | Required | Description |
|---|---|---|---|
PORT | 8978 | Optional | Port for the HTTP API server (and Web GUI when RUN_WEB_GUI=true). |
PROVIDERS | torbox,realdebrid | Optional | Comma-separated list of enabled debrid providers (torbox, realdebrid, alldebrid, premiumize, debridlink, deepbrid, offcloud, putio, megadebrid, seedr, pikpak). Order is priority. |
ADD_STRATEGY | all | Optional | Strategy for adding content: "all" (add to every provider), "failover" (try first then fallback), "single" (first only). |
DATA_DIR | ./data | Optional | Directory for SQLite DB and blacklist. Overridden by DB_PATH if set. |
TOKEN_RESET_TIMEZONE | Australia/Sydney | Optional | Timezone for daily download-token reset (midnight). |
| Variable | Default | Required | Description |
|---|---|---|---|
TORBOX_API_KEY | — | Optional | API key for TorBox. Required if torbox is in PROVIDERS. |
TORBOX_API_BASE | https://api.torbox.app | Optional | Base URL for TorBox API. |
TORBOX_WEBDAV_URL | https://webdav.torbox.app | Optional | WebDAV endpoint for TorBox. |
TORBOX_WEBDAV_USERNAME | — | Optional | WebDAV username for TorBox. |
TORBOX_WEBDAV_PASSWORD | — | Optional | WebDAV password for TorBox. |
| Variable | Default | Required | Description |
|---|---|---|---|
RD_ACCESS_TOKEN | — | Optional | Access token for RealDebrid. Required if realdebrid is in PROVIDERS. |
RD_API_BASE | https://api.real-debrid.com/rest/1.0 | Optional | Base URL for RealDebrid API. |
RD_WEBDAV_URL | https://dav.real-debrid.com | Optional | WebDAV endpoint for RealDebrid. |
RD_WEBDAV_USERNAME | — | Optional | WebDAV username for RealDebrid. |
RD_WEBDAV_PASSWORD | — | Optional | WebDAV password for RealDebrid. |
| Variable | Default | Required | Description |
|---|---|---|---|
ALLDEBRID_API_KEY | — | Optional | API key for AllDebrid. |
ALLDEBRID_API_BASE | https://api.alldebrid.com/v4 | Optional | Base URL for AllDebrid API. |
ALLDEBRID_AGENT | schrodrive | Optional | User agent for AllDebrid API requests. |
ALLDEBRID_WEBDAV_URL | — | Optional | WebDAV endpoint for AllDebrid. |
ALLDEBRID_WEBDAV_USERNAME | — | Optional | WebDAV username for AllDebrid. |
ALLDEBRID_WEBDAV_PASSWORD | — | Optional | WebDAV password for AllDebrid. |
| Variable | Default | Required | Description |
|---|---|---|---|
DEBRIDLINK_API_KEY | — | Optional | API key for Debrid-Link. |
DEBRIDLINK_API_BASE | https://debrid-link.com/api/v2 | Optional | Base URL for Debrid-Link API. |
DEBRIDLINK_WEBDAV_URL | https://webdav.debrid.link | Optional | WebDAV endpoint for Debrid-Link. |
DEBRIDLINK_WEBDAV_USERNAME | — | Optional | WebDAV username for Debrid-Link. |
DEBRIDLINK_WEBDAV_PASSWORD | — | Optional | WebDAV password for Debrid-Link. |
| Variable | Default | Required | Description |
|---|---|---|---|
DEEPBRID_API_KEY | — | Optional | API key for Deepbrid. |
DEEPBRID_API_BASE | https://www.deepbrid.com/api | Optional | Base URL for Deepbrid API. |
DEEPBRID_WEBDAV_URL | — | Optional | WebDAV endpoint for Deepbrid. |
DEEPBRID_WEBDAV_USERNAME | — | Optional | WebDAV username for Deepbrid. |
DEEPBRID_WEBDAV_PASSWORD | — | Optional | WebDAV password for Deepbrid. |
| Variable | Default | Required | Description |
|---|---|---|---|
OFFCLOUD_API_KEY | — | Optional | API key for Offcloud. |
OFFCLOUD_API_BASE | https://offcloud.com/api | Optional | Base URL for Offcloud API. |
OFFCLOUD_WEBDAV_URL | — | Optional | WebDAV endpoint for Offcloud. |
OFFCLOUD_WEBDAV_USERNAME | — | Optional | WebDAV username for Offcloud. |
OFFCLOUD_WEBDAV_PASSWORD | — | Optional | WebDAV password for Offcloud. |
| Variable | Default | Required | Description |
|---|---|---|---|
PUTIO_OAUTH_TOKEN | — | Optional | OAuth token for Put.io. |
PUTIO_API_BASE | https://api.put.io/v2 | Optional | Base URL for Put.io API. |
PUTIO_WEBDAV_URL | https://webdav.put.io | Optional | WebDAV endpoint for Put.io. |
PUTIO_WEBDAV_USERNAME | — | Optional | WebDAV username for Put.io. |
PUTIO_WEBDAV_PASSWORD | — | Optional | WebDAV password for Put.io. |
| Variable | Default | Required | Description |
|---|---|---|---|
MEGADEBRID_API_KEY | — | Optional | API key for MegaDebrid. |
MEGADEBRID_API_BASE | https://www.mega-debrid.eu | Optional | Base URL for MegaDebrid API. |
| Variable | Default | Required | Description |
|---|---|---|---|
SEEDR_API_KEY | — | Optional | API key for Seedr. |
SEEDR_API_BASE | https://www.seedr.cc/rest | Optional | Base URL for Seedr API. |
SEEDR_WEBDAV_URL | https://dav.seedr.cc | Optional | WebDAV endpoint for Seedr. |
SEEDR_WEBDAV_USERNAME | — | Optional | WebDAV username for Seedr. |
SEEDR_WEBDAV_PASSWORD | — | Optional | WebDAV password for Seedr. |
| Variable | Default | Required | Description |
|---|---|---|---|
PIKPAK_USERNAME | — | Optional | Username for PikPak. |
PIKPAK_PASSWORD | — | Optional | Password for PikPak. |
PIKPAK_API_BASE | https://api-drive.mypikpak.com | Optional | Base URL for PikPak API. |
PIKPAK_WEBDAV_URL | — | Optional | WebDAV endpoint for PikPak. |
PIKPAK_WEBDAV_USERNAME | — | Optional | WebDAV username for PikPak. |
PIKPAK_WEBDAV_PASSWORD | — | Optional | WebDAV password for PikPak. |
| Variable | Default | Required | Description |
|---|---|---|---|
INDEXER_PROVIDER | auto | Optional | Which indexer to use: auto, prowlarr, jackett. |
PROWLARR_URL | — | Optional | URL for Prowlarr (e.g. http://prowlarr:9696). |
PROWLARR_API_KEY | — | Optional | API key for Prowlarr. |
JACKETT_URL | — | Optional | URL for Jackett (e.g. http://jackett:9117). |
JACKETT_API_KEY | — | Optional | API key for Jackett. |
| Variable | Default | Required | Description |
|---|---|---|---|
SEERR_URL | — | Optional | URL for Seerr/Overseerr/Jellyseerr. |
SEERR_API_KEY | — | Optional | API key for Seerr/Overseerr/Jellyseerr. |
SEERR_AUTH | — | Optional | Optional webhook auth header for Seerr. |
POLL_INTERVAL_S | 30 | Optional | Seerr poller interval in seconds. |
| Variable | Default | Required | Description |
|---|---|---|---|
PLEX_URL | — | Optional | URL for Plex (e.g. http://plex:32400). |
PLEX_TOKEN | — | Optional | Plex token. |
JELLYFIN_URL | — | Optional | URL for Jellyfin. |
JELLYFIN_API_KEY | — | Optional | API key for Jellyfin. |
EMBY_URL | — | Optional | URL for Emby. |
EMBY_API_KEY | — | Optional | API key for Emby. |
| Variable | Default | Required | Description |
|---|---|---|---|
MOUNT_BASE | /mnt/schrodrive | Optional | Base directory for FUSE mounts. /Volumes/SchroDrive on macOS. |
RCLONE_PATH | rclone | Optional | Path to rclone binary. |
MOUNT_OPTIONS | — | Optional | Full rclone mount options override. When empty, composed from MOUNT_*. |
WEBDAV_BRIDGE_ENABLED | true | Optional | Enable API-to-WebDAV bridge. |
WEBDAV_CACHE_TTL_S | 30 | Optional | Directory listing cache TTL. |
WEBDAV_DOWNLOAD_CACHE_TTL_S | 14400 | Optional | Download URL cache TTL (4h). |
| Variable | Default | Required | Description |
|---|---|---|---|
WEBDAV_MOUNTS_ENABLED | false | Optional | Enable external WebDAV mounting. |
WEBDAV_MOUNTS_FILE | /config/webdav.json | Optional | Path to JSON file for WebDAV mounts. |
WEBDAV_MOUNTS | — | Optional | Inline JSON array for WebDAV mounts (fallback). |
| Variable | Default | Required | Description |
|---|---|---|---|
RUN_MOUNT | false | Optional | Enable rclone FUSE mounts. |
RUN_WEBHOOK | true | Optional | Enable Seerr webhook listener. |
RUN_POLLER | false | Optional | Enable Seerr API poller. |
RUN_WATCHLIST_POLLER | false | Optional | Enable Plex/Jellyfin/Emby watchlist poller. |
RUN_DEAD_SCANNER_WATCH | false | Optional | Enable dead link scanner + 3-phase repair. |
RUN_ORGANIZER_WATCH | false | Optional | Enable media organiser (symlinks). |
ARR_BRIDGE_ENABLED | false | Optional | Enable fake qBittorrent bridge for *arr. |
RUN_WEB_GUI | false | Optional | Enable Next.js dashboard (port 3000). |
| Variable | Default | Required | Description |
|---|---|---|---|
ARR_BRIDGE_ENABLED | false | Optional | Enable the *arr bridge. |
ARR_BRIDGE_PORT | 8282 | Optional | Port for *arr bridge (qBittorrent API). |
| Variable | Default | Required | Description |
|---|---|---|---|
RD_DOWNLOAD_TOKENS | — | Optional | Additional RealDebrid tokens (comma-separated). |
TORBOX_DOWNLOAD_TOKENS | — | Optional | Additional TorBox keys. |
AD_DOWNLOAD_TOKENS | — | Optional | Additional AllDebrid keys. |
PM_DOWNLOAD_TOKENS | — | Optional | Additional Premiumize keys. |
DL_DOWNLOAD_TOKENS | — | Optional | Additional Debrid-Link keys. |
DB_DOWNLOAD_TOKENS | — | Optional | Additional Deepbrid keys. |
OC_DOWNLOAD_TOKENS | — | Optional | Additional Offcloud keys. |
PUTIO_DOWNLOAD_TOKENS | — | Optional | Additional Put.io tokens. |
MD_DOWNLOAD_TOKENS | — | Optional | Additional MegaDebrid keys. |
SEEDR_DOWNLOAD_TOKENS | — | Optional | Additional Seedr tokens. |
PIKPAK_DOWNLOAD_TOKENS | — | Optional | Additional PikPak tokens. |
External WebDAV Mounts New in v0.10.0
Mount third-party WebDAV servers as read-only FUSE filesystems. Configure mounts via a JSON file or inline environment variable. Mounts appear under /mnt/schrodrive/webdav/<name>/
Example webdav.json
Place this file at /config/webdav.json (or set WEBDAV_MOUNTS_FILE to a custom path):
1[2 {3 "name": "nas-media",4 "url": "https://nas.example.com/webdav/",5 "username": "admin",6 "password": "secret",7 "skipOrganiser": true8 },9 {10 "name": "seedbox",11 "url": "https://seedbox.example.com/webdav/",12 "username": "user",13 "password": "pass",14 "skipOrganiser": false15 }16]Inline fallback: If the JSON file is not found, SchröDrive falls back to the WEBDAV_MOUNTS environment variable, which accepts the same JSON array format.
Set skipOrganiser: true (default) to prevent the media organiser from processing pre-sorted content.
Integrations
Seerr (Overseerr / Jellyseerr)
Media request management. Webhook + API polling for automatic content acquisition. Seerr is the merged successor to Overseerr + Jellyseerr — all three are fully supported.
Prowlarr
Universal indexer manager. Centralise all your indexers in one place.
Jackett
API bridge for your favourite torrent indexers.
Plex
Stream your library. Automatic scanning, watchlist integration, and metadata.
Jellyfin
Free and open-source media system. Full library management support.
Emby
Personal media server with automatic library organisation.
Verify Installation
Health Check
Verify SchröDrive is running correctly with a health check:
$ curl http://localhost:8978/health# Expected response:# {"ok":true,"cloudLinksPreWarm":{"complete":true,"completedAt":"2026-08-15T10:00:00.000Z"}}Web GUI
Open your browser and navigate to the SchröDrive dashboard:
# Open in your browser$ open http://localhost:3000# Or with curl to verify the GUI is accessible$ curl -s -o /dev/null -w "%{http_code}" http://localhost:3000# Expected: 200You're all set!
SchröDrive is now running. Content will begin appearing in your media server as requests come in through Seerr or the Web GUI. Check the dashboard for real-time status and logs.