Skip to content

Process Management API#

The Process Management endpoints handle launching, stopping, restarting, and tracking subprocesses managed by DUMB.


Lifecycle flow#

%%{ init: { "flowchart": { "curve": "basis" } } }%%
flowchart TD
    A([Start or restart request])
    B{Endpoint}
    C[Start core service<br/>/process/start-core-service]
    D[Start or restart service<br/>/process/start-service or /process/restart-service]
    E[Validate + persist config]
    F[Run setup hooks]
    G{Port conflict?}
    H[Adjust ports + save]
    I[Launch process]
    J([Status + logs])

    A ==> B
    B -- Core service --> C
    B -- Single service --> D
    C ==> E
    E ==> F
    F ==> G
    G -- Yes --> H
    G -- No --> I
    H ==> I
    D ==> F
    I ==> J

Endpoints#

GET /process/processes#

Returns all configured processes, including enabled status, version, repo URL, and sponsorship URL.

Example Response:#

{
  "processes": [
    {
      "name": "rclone w/ RealDebrid",
      "process_name": "rclone w/ RealDebrid",
      "enabled": true,
      "config": { "enabled": true, "...": "..." },
      "version": "1.65.1",
      "key": "rclone",
      "config_key": "rclone",
      "repo_url": "https://rclone.org",
      "sponsorship_url": "https://rclone.org/sponsor/"
    }
  ]
}

GET /process#

Fetch details about a specific process.

Required Query Parameter:#

  • process_name (string)

Optional Query Parameter:#

  • scope (string): runtime (default) or all
    • runtime returns runtime/configured hard dependencies
    • all additionally includes soft linkage edges (for example optional Zilean integrations)
  • response includes parallel_groups metadata to describe concurrent prerequisite/dependent stages around the selected service

Example Response:#

{
  "process_name": "rclone w/ RealDebrid",
  "config": { "enabled": true, "...": "..." },
  "version": "1.65.1",
  "config_key": "rclone"
}

POST /process/start-service#

Starts a specific process.

Request Body:#

{
  "process_name": "rclone w/ RealDebrid"
}

Example Response:#

{
  "status": "Service started successfully",
  "process_name": "rclone w/ RealDebrid"
}

POST /process/stop-service#

Stops a running process.

Request Body:#

{
  "process_name": "rclone w/ RealDebrid"
}

POST /process/restart-service#

Restarts a running process.

Request Body:#

{
  "process_name": "rclone w/ RealDebrid"
}

GET /process/service-status#

Gets the current status of a process.

Example Response:#

{
  "process_name": "rclone w/ RealDebrid",
  "status": "running"
}

POST /process/start-core-service#

Starts one or more core services and all required dependencies. This is used during onboarding.

The core_services field can be a single object or an array. The name can be the config key (e.g., riven_backend) or a display name (e.g., Riven).

Request Body Examples:#

{
  "core_services": {
    "name": "riven_backend",
    "debrid_service": "RealDebrid",
    "debrid_key": "abc123",
    "service_options": {}
  },
  "optional_services": ["zilean", "pgadmin", "riven_frontend"]
}
{
  "core_services": {
    "name": "decypharr",
    "debrid_service": "RealDebrid",
    "debrid_key": "abc123",
    "service_options": {
      "decypharr": {
        "mount_type": "dfs",
        "mount_path": "/mnt/debrid/decypharr"
      }
    }
  },
  "optional_services": []
}
{
  "core_services": {
    "name": "cli_debrid",
    "debrid_service": "RealDebrid",
    "debrid_key": "abc123",
    "service_options": {
      "phalanx_db": { "enabled": true }
    }
  },
  "optional_services": ["zilean"]
}
{
  "core_services": {
    "name": "plex_debrid",
    "debrid_service": "RealDebrid",
    "debrid_key": "abc123",
    "service_options": {
      "rclone": { "log_level": "DEBUG" },
      "zurg": { "port": 9194 }
    }
  },
  "optional_services": []
}

Example Response:#

{
  "results": [
    {"service": "riven_backend", "status": "started"},
    {"service": "decypharr", "status": "started"}
  ],
  "errors": []
}

Notes

  • Dependencies like Zurg or rclone are created using templates and attached to the calling core service.
  • Optional services such as pgadmin, zilean, pulsarr, traefik_proxy_admin, or cloudflared are started only if included.
  • debrid_key is injected into Zurg or Decypharr as needed.
  • service_options can override config values such as log_level, port, or enabled.
  • Any startup errors appear in the errors list.

GET /process/core-services#

Returns the available core services, their dependencies, and default service options (used by onboarding).


GET /process/dependency-graph#

Returns backend-resolved dependency relationships for a specific process, including:

  • static core dependencies (with instance-scoped matching for rclone/zurg)
  • inferred links from core_service/core_services
  • inferred links from wait_for_url/wait_for_dir entries (including localhost port matching)
  • inferred links from wait_for_mounts by matching required mount paths to provider service mount points
  • rclone provider links (zurg_enabled, decypharr_enabled, key_type=nzbdav) to reflect WebDAV provider dependencies directly
  • non-core hard dependency map for service-specific startup requirements (for example riven_frontend -> riven_backend, zilean -> postgres, pgadmin -> postgres)
  • conditional startup dependencies from the backend startup ordering logic -- config-aware dependencies like tautulli -> plex (when plex is enabled), prowlarr -> sonarr/radarr (when those arrs are enabled), neutarr -> sonarr (when sonarr has use_neutarr enabled), etc. For instance-scoped services (rclone, zurg), conditional deps are filtered per-instance so that only the specific associated instances are shown (for example, a rclone instance with zurg_enabled only shows its own zurg instance, not zurg instances belonging to other rclone configurations)
  • documented integration links (soft linkage, scope=all only) -- for example seerr -> sonarr/radarr request routing
  • per-process status state used by the frontend dependency graph panel
  • dependency_truth_table describing the 12 dependency signal types and whether each is treated as hard dependency vs linkage
  • signals array on each row/edge identifying which detection signals established the relationship (for example ["core_service_map"], ["rclone_provider_zurg", "conditional_startup_map"])

Required Query Parameter:#

  • process_name (string)

Example Response (shape):#

{
  "process_name": "Seerr Main",
  "config_key": "seerr",
  "context": { "mode": "core", "key": "seerr", "core": { "key": "seerr", "name": "Seerr", "dependencies": [] } },
  "scope": "runtime",
  "startup_order": [{ "key": "seerr", "label": "Seerr", "state": "running" }],
  "dependency_rows": [],
  "dependent_rows": [],
  "linked_outgoing_rows": [{ "process_name": "Plex Media Server", "key": "plex", "label": "Plex Media Server", "state": "running" }],
  "linked_incoming_rows": [],
  "nodes": [{ "id": "Seerr Main", "process_name": "Seerr Main", "key": "seerr", "label": "Seerr Main", "state": "running" }],
  "edges": [{ "source": "Seerr Main", "target": "Plex Media Server", "signals": ["wait_for_url"], "strength": "hard_runtime" }],
  "parallel_groups": [{ "id": "pre_core", "label": "Parallel prerequisites", "type": "parallel", "members": ["PostgreSQL", "Rclone w/ Riven"] }],
  "updated_at": "2026-02-11T18:45:00Z"
}

GET /process/optional-services#

Returns optional services. You can pass core_service and optional_services query params to tailor the list.


POST /process/symlink-repair#

Runs symlink target rewrites for service symlink trees (Decypharr, NzbDAV, CLI Debrid, Riven).

Use this endpoint when mount paths change and existing symlink targets need to be rewritten.

Request Body:#

{
  "dry_run": true,
  "include_broken": true,
  "presets": ["decypharr_beta_consolidated"],
  "roots": ["/mnt/debrid/decypharr_symlinks", "/mnt/debrid/clid_symlinks"],
  "root_migrations": [
    {
      "from_root": "/mnt/debrid/decypharr_symlinks",
      "to_root": "/mnt/debrid/combined_symlinks"
    }
  ],
  "overwrite_existing": false,
  "copy_instead_of_move": false,
  "rewrite_rules": [
    {
      "from_prefix": "/mnt/debrid/old",
      "to_prefix": "/mnt/debrid/new"
    }
  ],
  "backup_path": "/config/symlink-repair/manifest.json"
}

Behavior#

  • dry_run: true scans and reports without changing symlinks.
  • dry_run: false rewrites matching symlinks in place.
  • process_name is optional but recommended for async runs/job lookup.
  • Provide at least one of: presets, rewrite_rules, root_migrations.
  • root_migrations moves symlink entries from one symlink tree to another while preserving relative paths. This is intended for individual-root to combined-root migrations.
  • overwrite_existing controls behavior when a destination symlink already exists during root migration.
  • copy_instead_of_move (root migration mode) creates destination symlinks and keeps source symlinks in place.
  • If roots is omitted, backend defaults are used: /mnt/debrid/decypharr_symlinks, /mnt/debrid/nzbdav-symlinks, /mnt/debrid/combined_symlinks, /mnt/debrid/clid_symlinks, and riven_backend.symlink_library_path when configured.
  • backup_path is written only for non-dry-run operations with changes.

Example Response:#

{
  "dry_run": true,
  "scanned_symlinks": 2451,
  "changed": 312,
  "moved": 120,
  "copied": 0,
  "skipped_unchanged": 2139,
  "errors": [],
  "changes": []
}

POST /process/symlink-repair-async#

Queues symlink repair as a background job and returns immediately.

Use GET /process/symlink-job-status (or /process/symlink-job-latest) to track completion.

Response (example)#

{
  "status": "queued",
  "job_id": "76d1a3bd35f84e3fab0cc39f81246849",
  "operation": "symlink_repair"
}

POST /process/symlink-manifest/backup#

Creates a standalone snapshot manifest of symlink entries for later restore.

Request Body:#

{
  "backup_path": "/config/symlink-repair/snapshots/latest.json",
  "roots": ["/mnt/debrid/decypharr_symlinks", "/mnt/debrid/clid_symlinks"],
  "include_broken": true
}

Behavior#

  • Writes a manifest containing link_path + target entries.
  • If roots is omitted, backend default symlink roots are used.
  • Used by the internal DUMB scheduler when symlink_backup_enabled is set on supported services.
  • Scheduled runs can prune older manifests when symlink_backup_retention_count is greater than 0.

POST /process/symlink-manifest/backup-async#

Queues a standalone snapshot backup as a background job and returns immediately.

Response (example)#

{
  "status": "queued",
  "job_id": "8e9fd0fbe88d4a6fbb2f3f77b2a3f8c1",
  "operation": "symlink_manifest_backup"
}

Returns status/result for background symlink jobs.

Query Params#

  • job_id (required)

Response fields#

  • status: queued, running, completed, or error
  • result: operation payload when completed
  • error: error payload when failed
  • created_at, updated_at, started_at, finished_at timestamps (when available)

Returns the latest symlink job for a process/operation (optionally only active jobs).

Query Params#

  • process_name (required)
  • operation (optional, default symlink_manifest_backup)
  • active_only (optional, default true)

POST /process/symlink-manifest/restore#

Restores symlinks from a previously generated snapshot manifest.

Request Body:#

{
  "manifest_path": "/config/symlink-repair/snapshots/latest.json",
  "dry_run": true,
  "overwrite_existing": false,
  "restore_broken": true
}

Behavior#

  • dry_run: true previews restore actions without writing.
  • overwrite_existing controls whether existing paths are replaced.
  • restore_broken controls whether entries with currently missing targets are restored.

Compares a snapshot manifest against current filesystem state and returns projected restore outcomes.

Query Params#

  • manifest_path (required)
  • overwrite_existing (optional, default false)
  • restore_broken (optional, default true)
  • sample_limit (optional, default 50, max 200)

Behavior#

  • Uses the same overwrite/missing-target rules as restore.
  • Returns projected counts (projected_restored, skipped categories, errors).
  • Returns sample_changes with representative actions (create, overwrite, skip_*) for quick review before apply.

POST /process/symlink-manifest/restore-async#

Queues restore as a background job and returns immediately.

Use GET /process/symlink-job-status (or /process/symlink-job-latest) to track completion.

Returns current symlink-backup scheduler state for a service.

Lists backup manifests that match the current service symlink_backup_path template.

Lists files from the directory of a provided manifest_path (defaults to /config/symlink-repair/snapshots/latest.json directory).

Use this to populate manifest pickers in the Snapshot tab for quick restore/overwrite selection.

POST /process/symlink-backup/reschedule#

Rebuilds symlink-backup schedule state from current service config.

Request Body:#

{
  "process_name": "Decypharr"
}

GET /process/capabilities#

Returns backend capabilities and feature flags. Used by the frontend to determine available features.

Example Response:#

{
  "optional_only_onboarding": true,
  "optional_service_options": true,
  "manual_update_check": true,
  "seerr_sync": true,
  "auto_update_start_time": true,
  "symlink_repair": true,
  "symlink_repair_async": true,
  "symlink_manifest_backup": true,
  "symlink_manifest_backup_async": true,
  "symlink_job_status": true,
  "symlink_job_latest": true,
  "symlink_manifest_restore": true,
  "symlink_manifest_restore_async": true,
  "symlink_manifest_compare": true,
  "symlink_backup_schedule": true,
  "symlink_backup_manifest_list": true,
  "symlink_manifest_file_list": true
}
Field Description
optional_only_onboarding Whether onboarding can skip core service selection
optional_service_options Whether optional service options are exposed for onboarding
manual_update_check Whether manual update check/install routes are available
seerr_sync Whether Seerr sync feature routes are available
auto_update_start_time Whether anchored auto-update start time is supported
symlink_repair Whether /process/symlink-repair is available
symlink_repair_async Whether /process/symlink-repair-async is available
symlink_manifest_backup Whether /process/symlink-manifest/backup is available
symlink_manifest_backup_async Whether /process/symlink-manifest/backup-async is available
symlink_job_status Whether /process/symlink-job-status is available
symlink_job_latest Whether /process/symlink-job-latest is available
symlink_manifest_restore Whether /process/symlink-manifest/restore is available
symlink_manifest_restore_async Whether /process/symlink-manifest/restore-async is available
symlink_manifest_compare Whether /process/symlink-manifest/compare is available
symlink_backup_schedule Whether scheduled symlink backup status/reschedule routes are available
symlink_backup_manifest_list Whether /process/symlink-backup-manifests is available
symlink_manifest_file_list Whether /process/symlink-manifest-files is available

Important Notes

  • All process names are matched against the entries defined in dumb_config.json.
  • Most process commands are defined as arrays and are managed with subprocess handling inside Python.