Documentation

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.

Required

Debrid Service Account

At least one of: TorBox, RealDebrid, AllDebrid, Premiumize, Debrid-Link, Deepbrid, Offcloud, Put.io, MegaDebrid, Seedr, or PikPak.

Required

Media Server

Plex, Jellyfin, or Emby for streaming your organised content library.

Required

NVIDIA GPU + Drivers

Required only for Media Manager hardware encoding (NVENC). CPU encoding also supported.

Optional

NVIDIA Container Toolkit

Required for GPU passthrough to Docker containers. Only needed for Media Manager.

Optional

Indexer (Recommended)

Prowlarr or Jackett for automated content discovery and searching.

Optional

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:

terminal
bash
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:latest

FUSE 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:

docker-compose.yml
yaml
1version: "3.9"
2
3services:
4 schrodrive:
5 image: ghcr.io/moderniselife/schrodrive:latest
6 container_name: schrodrive
7 restart: unless-stopped
8 ports:
9 - "8978:8978"
10 - "3000:3000"
11 volumes:
12 - ./config:/app/config
13 - /mnt/schrodrive:/mnt/schrodrive:shared
14 cap_add:
15 - SYS_ADMIN
16 devices:
17 - /dev/fuse
18 security_opt:
19 - apparmor:unconfined
20 environment:
21 # ── Core ──
22 - PROVIDERS=torbox,realdebrid
23 - TZ=Australia/Sydney
24
25 # ── Debrid API Keys ──
26 - TORBOX_API_KEY=your_torbox_key
27 - RD_ACCESS_TOKEN=your_rd_token
28
29 # ── Media Server ──
30 - PLEX_URL=http://plex:32400
31 - PLEX_TOKEN=your_plex_token
32
33 # ── Indexers ──
34 - PROWLARR_URL=http://prowlarr:9696
35 - PROWLARR_API_KEY=your_prowlarr_key
36
37 # ── Request Manager (Seerr / Overseerr / Jellyseerr) ──
38 - SEERR_URL=http://seerr:5055
39 - SEERR_API_KEY=your_seerr_key
40
41 # ── Services ──
42 - RUN_MOUNT=true
43 - RUN_WEBHOOK=true
44 - RUN_POLLER=true
45 - RUN_WEB_GUI=true
46 healthcheck:
47 test: ["CMD", "curl", "-f", "http://localhost:8978/health"]
48 interval: 30s
49 timeout: 10s
50 retries: 3
51 start_period: 30s
Use the Docker Compose Generator

Build a custom configuration tailored to your setup

Installation — Bare Metal

Run SchröDrive directly on your system using Bun.

Install with Bun

terminal
bash
# 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 serve

Bare 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:

.env
bash
PROVIDERS=torbox,realdebrid
TORBOX_API_KEY=your_torbox_key
RD_ACCESS_TOKEN=your_rd_token
PLEX_URL=http://localhost:32400
PLEX_TOKEN=your_plex_token
TZ=Australia/Sydney

Configuration

SchröDrive is configured entirely through environment variables. Below is the complete reference, organised by category.

VariableDefaultRequiredDescription
PORT8978OptionalPort for the HTTP API server (and Web GUI when RUN_WEB_GUI=true).
PROVIDERStorbox,realdebridOptionalComma-separated list of enabled debrid providers (torbox, realdebrid, alldebrid, premiumize, debridlink, deepbrid, offcloud, putio, megadebrid, seedr, pikpak). Order is priority.
ADD_STRATEGYallOptionalStrategy for adding content: "all" (add to every provider), "failover" (try first then fallback), "single" (first only).
DATA_DIR./dataOptionalDirectory for SQLite DB and blacklist. Overridden by DB_PATH if set.
TOKEN_RESET_TIMEZONEAustralia/SydneyOptionalTimezone for daily download-token reset (midnight).
VariableDefaultRequiredDescription
TORBOX_API_KEYOptionalAPI key for TorBox. Required if torbox is in PROVIDERS.
TORBOX_API_BASEhttps://api.torbox.appOptionalBase URL for TorBox API.
TORBOX_WEBDAV_URLhttps://webdav.torbox.appOptionalWebDAV endpoint for TorBox.
TORBOX_WEBDAV_USERNAMEOptionalWebDAV username for TorBox.
TORBOX_WEBDAV_PASSWORDOptionalWebDAV password for TorBox.
VariableDefaultRequiredDescription
RD_ACCESS_TOKENOptionalAccess token for RealDebrid. Required if realdebrid is in PROVIDERS.
RD_API_BASEhttps://api.real-debrid.com/rest/1.0OptionalBase URL for RealDebrid API.
RD_WEBDAV_URLhttps://dav.real-debrid.comOptionalWebDAV endpoint for RealDebrid.
RD_WEBDAV_USERNAMEOptionalWebDAV username for RealDebrid.
RD_WEBDAV_PASSWORDOptionalWebDAV password for RealDebrid.
VariableDefaultRequiredDescription
ALLDEBRID_API_KEYOptionalAPI key for AllDebrid.
ALLDEBRID_API_BASEhttps://api.alldebrid.com/v4OptionalBase URL for AllDebrid API.
ALLDEBRID_AGENTschrodriveOptionalUser agent for AllDebrid API requests.
ALLDEBRID_WEBDAV_URLOptionalWebDAV endpoint for AllDebrid.
ALLDEBRID_WEBDAV_USERNAMEOptionalWebDAV username for AllDebrid.
ALLDEBRID_WEBDAV_PASSWORDOptionalWebDAV password for AllDebrid.
VariableDefaultRequiredDescription
PREMIUMIZE_API_KEYOptionalAPI key for Premiumize.
PREMIUMIZE_API_BASEhttps://www.premiumize.me/apiOptionalBase URL for Premiumize API.
PREMIUMIZE_WEBDAV_URLhttps://webdav.premiumize.meOptionalWebDAV endpoint for Premiumize.
PREMIUMIZE_WEBDAV_USERNAMEOptionalWebDAV username for Premiumize.
PREMIUMIZE_WEBDAV_PASSWORDOptionalWebDAV password for Premiumize.
VariableDefaultRequiredDescription
DEEPBRID_API_KEYOptionalAPI key for Deepbrid.
DEEPBRID_API_BASEhttps://www.deepbrid.com/apiOptionalBase URL for Deepbrid API.
DEEPBRID_WEBDAV_URLOptionalWebDAV endpoint for Deepbrid.
DEEPBRID_WEBDAV_USERNAMEOptionalWebDAV username for Deepbrid.
DEEPBRID_WEBDAV_PASSWORDOptionalWebDAV password for Deepbrid.
VariableDefaultRequiredDescription
OFFCLOUD_API_KEYOptionalAPI key for Offcloud.
OFFCLOUD_API_BASEhttps://offcloud.com/apiOptionalBase URL for Offcloud API.
OFFCLOUD_WEBDAV_URLOptionalWebDAV endpoint for Offcloud.
OFFCLOUD_WEBDAV_USERNAMEOptionalWebDAV username for Offcloud.
OFFCLOUD_WEBDAV_PASSWORDOptionalWebDAV password for Offcloud.
VariableDefaultRequiredDescription
PUTIO_OAUTH_TOKENOptionalOAuth token for Put.io.
PUTIO_API_BASEhttps://api.put.io/v2OptionalBase URL for Put.io API.
PUTIO_WEBDAV_URLhttps://webdav.put.ioOptionalWebDAV endpoint for Put.io.
PUTIO_WEBDAV_USERNAMEOptionalWebDAV username for Put.io.
PUTIO_WEBDAV_PASSWORDOptionalWebDAV password for Put.io.
VariableDefaultRequiredDescription
MEGADEBRID_API_KEYOptionalAPI key for MegaDebrid.
MEGADEBRID_API_BASEhttps://www.mega-debrid.euOptionalBase URL for MegaDebrid API.
VariableDefaultRequiredDescription
SEEDR_API_KEYOptionalAPI key for Seedr.
SEEDR_API_BASEhttps://www.seedr.cc/restOptionalBase URL for Seedr API.
SEEDR_WEBDAV_URLhttps://dav.seedr.ccOptionalWebDAV endpoint for Seedr.
SEEDR_WEBDAV_USERNAMEOptionalWebDAV username for Seedr.
SEEDR_WEBDAV_PASSWORDOptionalWebDAV password for Seedr.
VariableDefaultRequiredDescription
PIKPAK_USERNAMEOptionalUsername for PikPak.
PIKPAK_PASSWORDOptionalPassword for PikPak.
PIKPAK_API_BASEhttps://api-drive.mypikpak.comOptionalBase URL for PikPak API.
PIKPAK_WEBDAV_URLOptionalWebDAV endpoint for PikPak.
PIKPAK_WEBDAV_USERNAMEOptionalWebDAV username for PikPak.
PIKPAK_WEBDAV_PASSWORDOptionalWebDAV password for PikPak.
VariableDefaultRequiredDescription
INDEXER_PROVIDERautoOptionalWhich indexer to use: auto, prowlarr, jackett.
PROWLARR_URLOptionalURL for Prowlarr (e.g. http://prowlarr:9696).
PROWLARR_API_KEYOptionalAPI key for Prowlarr.
JACKETT_URLOptionalURL for Jackett (e.g. http://jackett:9117).
JACKETT_API_KEYOptionalAPI key for Jackett.
VariableDefaultRequiredDescription
SEERR_URLOptionalURL for Seerr/Overseerr/Jellyseerr.
SEERR_API_KEYOptionalAPI key for Seerr/Overseerr/Jellyseerr.
SEERR_AUTHOptionalOptional webhook auth header for Seerr.
POLL_INTERVAL_S30OptionalSeerr poller interval in seconds.
VariableDefaultRequiredDescription
PLEX_URLOptionalURL for Plex (e.g. http://plex:32400).
PLEX_TOKENOptionalPlex token.
JELLYFIN_URLOptionalURL for Jellyfin.
JELLYFIN_API_KEYOptionalAPI key for Jellyfin.
EMBY_URLOptionalURL for Emby.
EMBY_API_KEYOptionalAPI key for Emby.
VariableDefaultRequiredDescription
MOUNT_BASE/mnt/schrodriveOptionalBase directory for FUSE mounts. /Volumes/SchroDrive on macOS.
RCLONE_PATHrcloneOptionalPath to rclone binary.
MOUNT_OPTIONSOptionalFull rclone mount options override. When empty, composed from MOUNT_*.
WEBDAV_BRIDGE_ENABLEDtrueOptionalEnable API-to-WebDAV bridge.
WEBDAV_CACHE_TTL_S30OptionalDirectory listing cache TTL.
WEBDAV_DOWNLOAD_CACHE_TTL_S14400OptionalDownload URL cache TTL (4h).
VariableDefaultRequiredDescription
WEBDAV_MOUNTS_ENABLEDfalseOptionalEnable external WebDAV mounting.
WEBDAV_MOUNTS_FILE/config/webdav.jsonOptionalPath to JSON file for WebDAV mounts.
WEBDAV_MOUNTSOptionalInline JSON array for WebDAV mounts (fallback).
VariableDefaultRequiredDescription
RUN_MOUNTfalseOptionalEnable rclone FUSE mounts.
RUN_WEBHOOKtrueOptionalEnable Seerr webhook listener.
RUN_POLLERfalseOptionalEnable Seerr API poller.
RUN_WATCHLIST_POLLERfalseOptionalEnable Plex/Jellyfin/Emby watchlist poller.
RUN_DEAD_SCANNER_WATCHfalseOptionalEnable dead link scanner + 3-phase repair.
RUN_ORGANIZER_WATCHfalseOptionalEnable media organiser (symlinks).
ARR_BRIDGE_ENABLEDfalseOptionalEnable fake qBittorrent bridge for *arr.
RUN_WEB_GUIfalseOptionalEnable Next.js dashboard (port 3000).
VariableDefaultRequiredDescription
ARR_BRIDGE_ENABLEDfalseOptionalEnable the *arr bridge.
ARR_BRIDGE_PORT8282OptionalPort for *arr bridge (qBittorrent API).
VariableDefaultRequiredDescription
RD_DOWNLOAD_TOKENSOptionalAdditional RealDebrid tokens (comma-separated).
TORBOX_DOWNLOAD_TOKENSOptionalAdditional TorBox keys.
AD_DOWNLOAD_TOKENSOptionalAdditional AllDebrid keys.
PM_DOWNLOAD_TOKENSOptionalAdditional Premiumize keys.
DL_DOWNLOAD_TOKENSOptionalAdditional Debrid-Link keys.
DB_DOWNLOAD_TOKENSOptionalAdditional Deepbrid keys.
OC_DOWNLOAD_TOKENSOptionalAdditional Offcloud keys.
PUTIO_DOWNLOAD_TOKENSOptionalAdditional Put.io tokens.
MD_DOWNLOAD_TOKENSOptionalAdditional MegaDebrid keys.
SEEDR_DOWNLOAD_TOKENSOptionalAdditional Seedr tokens.
PIKPAK_DOWNLOAD_TOKENSOptionalAdditional 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):

webdav.json
json
1[
2 {
3 "name": "nas-media",
4 "url": "https://nas.example.com/webdav/",
5 "username": "admin",
6 "password": "secret",
7 "skipOrganiser": true
8 },
9 {
10 "name": "seedbox",
11 "url": "https://seedbox.example.com/webdav/",
12 "username": "user",
13 "password": "pass",
14 "skipOrganiser": false
15 }
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

Request Manager

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.

Indexer

Prowlarr

Universal indexer manager. Centralise all your indexers in one place.

Indexer

Jackett

API bridge for your favourite torrent indexers.

Media Server

Plex

Stream your library. Automatic scanning, watchlist integration, and metadata.

Media Server

Jellyfin

Free and open-source media system. Full library management support.

Media Server

Emby

Personal media server with automatic library organisation.

Verify Installation

Health Check

Verify SchröDrive is running correctly with a health check:

terminal
bash
$ 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:

terminal
bash
# 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: 200

You'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.