-
Notifications
You must be signed in to change notification settings - Fork 0
Configuration Differences
This page covers the differences between Pinchfork and the upstream Pinchflat project. If you're running upstream Pinchflat and considering a migration, or if you're referencing the upstream wiki for documentation on base features, this is what's changed.
Base features — sources, media profiles, Jellyfin/Plex/Kodi integration, SponsorBlock, RSS feeds, Apprise, lifecycle scripts, custom yt-dlp options — are unchanged. Only the backend infrastructure and the fork-specific additions documented here differ.
| Variable | Default | Notes |
|---|---|---|
DATABASE_URL |
— |
Required. Postgres connection string: ecto://user:pass@host/db. Replaces the upstream DATABASE_PATH. |
POOL_SIZE |
10 |
Postgres connection pool size. |
YT_DLP_VERSION |
stable |
Controls yt-dlp update behavior: stable, nightly, master, pinned/none to disable updates, or a specific version string like 2025.12.08. |
LOCALTEMP |
— | Set to true to enable local temp staging for network-mount downloads. See Local Temp Staging. |
| Variable | Reason |
|---|---|
DATABASE_PATH |
SQLite-only. Replaced by DATABASE_URL. |
JOURNAL_MODE |
SQLite WAL workaround for network shares. Not applicable — use LOCALTEMP instead. |
Upstream Pinchflat uses SQLite with Oban.Engines.Lite. Pinchfork replaces both:
- SQLite → PostgreSQL. Requires a Postgres sidecar container (see Installation).
-
Oban.Engines.Lite→Oban.Engines.Basic. The Postgres-native Oban engine resolves write contention and crash loops that occur under load with the SQLite engine.
All SQLite-specific query syntax has been rewritten for Postgres (IFNULL → COALESCE, DATETIME() → interval arithmetic, regexp_like → ~, etc.). Full-text search is migrated from SQLite FTS5 to a Postgres tsvector column with a GIN index and trigger-maintained updates.
The Oban.Plugins.Lifeline plugin is enabled with a 30-minute rescue window. Any job that gets stuck in executing state after a crash or container restart is automatically moved back to retryable and re-queued. Upstream Pinchflat does not include this plugin.
Each source has two new fields not present in upstream:
-
Download public videos (default: on) — controls whether videos with
availability: publicare downloaded. -
Download members-only videos (default: off) — controls whether
subscriber_only,premium_only, andneeds_authvideos are downloaded. Requires cookies to be configured for the source.
Unlisted and private videos are always skipped regardless of these settings.
A new Video Client dropdown controls which yt-dlp player client is used per source. Cookie-incompatible client choices are blocked at save time if the source also has cookies or members-only downloads enabled. See SABR Bypass and PO Tokens.
Three new fields on media items not present in upstream:
-
availability— captured from yt-dlp at index time. Values:public,unlisted,subscriber_only,premium_only,needs_auth,private. -
error_type— set during download failures. Values:transient(will retry),permanent(setsprevent_download: true, stops retrying). Permanent failures include: video unavailable, removed, private, members-only, age-restricted, geo-blocked, and premium-only errors. -
download_prevented_reason— records why a download was prevented:permanent_error,manual,user_script, or a policy reason (policy_public/policy_members/policy_other). Surfaced on the media-item page.
The YT_DLP_VERSION environment variable controls how yt-dlp updates itself on container startup. Upstream Pinchflat always updates to the latest stable release. Pinchfork lets you pin to a specific version or disable updates entirely — useful for stability on production setups.
The Settings page includes a one-click button to validate your YouTube API key against a known public playlist. The result (checkmark or error with reason) is shown inline for a few seconds. Upstream Pinchflat requires checking container logs to verify an API key works.
The bgutil POT provider yt-dlp plugin is baked into the Pinchfork image. Adding the bgutil sidecar container is all that's required for PO tokens to work — no manual plugin download or volume mount. See SABR Bypass and PO Tokens.