Releases: TheBadFella/Pinchflat-NGX
Release list
Release 2026.9.28 - Source Import and Download Fixes
This release fixes download failures and source creation friction, and adds text-file source import. SQLite and PostgreSQL images are published for linux/amd64 and linux/arm64.
- SQLite:
ghcr.io/thebadfella/pinchflat-ngx:2026.9.28(latest) - PostgreSQL:
ghcr.io/thebadfella/pinchflat-ngx:2026.9.28-postgres(latest-postgres)
Sources
- New Source selects the first available media profile. Cloning a source keeps its selected profile. (#72)
- Import sources from a text file with one URL per line. The result shows which entries were added, rejected, or repeated. (#73)
Downloads and PostgreSQL
- Staged downloads finish when yt-dlp returns null subtitle or thumbnail metadata, and the moved video is saved at its final path. (#64)
- PostgreSQL stores the full yt-dlp error for unavailable videos without failing while recording the download error. (#74)
- Jobs can broadcast before the web endpoint starts without failing. A failed yt-dlp update leaves the working executable in place. (#66)
Docker and maintenance
- GHCR images are retained by the package cleanup job. (#65)
- Docker builds no longer make a redundant yt-dlp update request that hit GitHub's API rate limit. (#77)
- Bump the application version to
2026.9.28.
Dependency updates
PR #63 refreshed:
- Containers and CI: Node 25, Docker Buildx 4.4.1, and Build Push 7.4.0.
- Frontend: Alpine.js 3.17.3 and Prettier 3.9.8.
- Elixir app: Phoenix 1.8.14, LiveView 1.2.12, LiveDashboard 0.9.1, and Oban 2.24.1.
- Other Elixir packages: Mox, OpenApiSpex, Swoosh, and tzdata.
Verification
- Hosted lint and test jobs passed with SQLite and PostgreSQL; PostgreSQL migration tests passed.
- The Docker release workflow built both database variants for amd64 and arm64 and published the manifests.
- Both amd64 images pulled locally and reported
pinchflat 2026.9.28. The published SQLite image passed its health check and served the Sources page.
Commit Range
- Previous release:
2026.9.19 - This tag:
2026.9.28 - Compared range:
2026.9.19...2026.9.28
Release 2026.9.19 - Rebrand to Pinchflat-ngx, Brand Assets, and Gallery
Rebrand to Pinchflat-ngx
PinchYT has officially been rebranded to Pinchflat-ngx across the entire application, UI, documentation, and container release pipelines.
⚠️ Container Image Migration Notice
Please update your docker-compose.yml or container run commands to migrate to the new image name:
- SQLite (Default):
image: ghcr.io/thebadfella/pinchflat-ngx:latest
- PostgreSQL:
image: ghcr.io/thebadfella/pinchflat-ngx:latest-postgres
Note
For backward compatibility, images are dual-published to ghcr.io/thebadfella/pinchyt for this release so existing deployments are not disrupted. Your existing data directories, database files, and config mounts remain 100% compatible.
Highlights in This Release
-
Brand Identity & AMOLED Theme:
- New Material 3 AMOLED loop monogram logo, dark favicon, and scalable SVG brand assets stored under
docs/assets/brand/. - Responsive expanded and collapsed brand header navigation
- Updated sidebar with direct links to the Pinchflat-ngx Wiki.
- New Material 3 AMOLED loop monogram logo, dark favicon, and scalable SVG brand assets stored under
-
Interface Gallery & Channel Artwork:
- High-resolution UI captures for the Dashboard, Sources Table, Sources Poster Grid, Source Details, Channel Discovery, and System Diagnostics.
- Poster grid and source detail headers now display full YouTube channel artwork.
-
PostgreSQL & Production Improvements:
- Enhanced PostgreSQL 18 in-app database backups and retention management.
- Multi-architecture container builds supporting both
linux/amd64andlinux/arm64.
Release 2026.9.18 - HEAD Probe Optimization and Sources Query Improvements
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This release includes performance improvements for uptime/health probes and the Sources view, resolving log noise and excessive database queries. Use the versioned tags below, or latest / latest-postgres once the Docker workflow finishes.
- SQLite:
ghcr.io/thebadfella/pinchyt:2026.9.18 - PostgreSQL:
ghcr.io/thebadfella/pinchyt:2026.9.18-postgres
Performance and Health Probes
- HEAD Probe Fast-Path:
HEAD /requests now return HTTP 200 immediately without running database aggregations or rendering views, stopping uptime monitors (HomepagesiteMonitor, Uptime Kuma, reverse proxies) from executing database query bursts every few seconds. - Sources Query Optimization:
Sources.list_sources()is now only queried for JSON requests, avoiding redundant database lookups when rendering the Sources HTML view (which is handled byIndexTableLive). - Monitoring Toggle Safety: Form changesets in
SourceEnableToggleare isolated to%{enabled: ...}on update events to prevent preloaded structs from triggering Ecto casting errors.
Maintenance
- Bump the application version to
2026.9.18.
Verification
- Automated test added in
test/pinchflat_web/controllers/page_controller_test.exsvalidatingHEAD /responses. - Full ExUnit test suite passed with 86 tests and 0 failures.
- Prettier,
mix format, and Credo passed with 0 issues.
Commit Range
- Previous release:
2026.9.14 - This tag:
2026.9.18 - Compared range:
2026.9.14...2026.9.18
Release 2026.9.14 - Source Library, Channel Discovery, and PostgreSQL
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This is the production release of the source, download, discovery, and PostgreSQL work that landed after 2026.9.6. It replaces the 2026.9.11-beta prerelease. Use the versioned tags below, or latest / latest-postgres once the Docker workflow finishes.
- SQLite:
ghcr.io/thebadfella/pinchyt:2026.9.14 - PostgreSQL:
ghcr.io/thebadfella/pinchyt:2026.9.14-postgres
Screenshots
These are from a local SQLite install. PostgreSQL backup screens show the SQLite image's unavailable state.
Sources table and poster grid
Source detail
Channel Discovery
PostgreSQL backups in Settings
Sources and library
- Sort Home history by Upload Date, Indexed At, or Downloaded At without resetting the active tab, filters, or pagination.
- Switch the Sources page between the existing table and a poster grid. Filters, sort, and pagination stay shared.
- Source detail pages show counts for Downloaded, Pending, Failed, Prevented, and Skipped, and group the current media page by upload year.
- Lock a source name or description so metadata refresh cannot overwrite it. Unlocking does not immediately restore fetched values.
- Set a custom source poster from a local upload or a URL (JPEG, PNG, WebP). Removing it restores fetched artwork.
- When creating a source, choose Automatic, Channel, Playlist, or Video. Automatic keeps current URL detection. An explicit type is checked against the URL instead of being silently converted.
Channel Discovery
- A Discovery page suggests channels from local description mentions and from featured channels on sources you already have.
- Scanning stays off until you enable it in Settings. Accept opens the normal New Source form.
- The page uses the same app shell as the rest of the UI.
Downloads and availability
- Store the availability yt-dlp reports during indexing and refresh (public, unlisted, members-only, private). Missing or unknown values stay empty and do not stop indexing.
- Each source can choose whether to download public/unlisted media and members-only media. Private media stays blocked. Existing sources keep their current download behavior.
- Failed and prevented items keep a durable reason: manual, policy, or error, plus whether a failure is transient or permanent. Retry Now follows normal retry rules; Force Retry can attempt a permanent failure.
- YouTube rate limits and similar bot-challenge responses are not treated as permanent download blocks.
- A source can override the YouTube player client passed to yt-dlp. Default keeps the existing command.
- Optional bgutil-compatible PO-token provider via
POT_PROVIDER_URL. Disabled installs keep the current container layout and yt-dlp arguments. DOWNLOAD_STAGING_PATHfinishes a download on local disk, then transfers complete files to the media library. If unset, downloads still go straight to the library.
PostgreSQL
- SQLite remains the
latestimage. A separate PostgreSQL image is published aslatest-postgresand<version>-postgres. There is no automatic copy from an existing SQLite database. - The PostgreSQL image can create custom-format
pg_dumpbackups from Settings. SQLite images show this as unavailable. Dumps are database state only; they do not include media files. - PostgreSQL deployments use PostgreSQL 18 by default, including client tools and the documented data volume path. Existing PostgreSQL 16 volumes are not compatible as-is.
Maintenance
- Bump the application version to
2026.9.14. - Follow-up UI and policy fixes after the first cut of this work, including source library layout, Channel Discovery in the app shell, and download error classification.
latestis SQLite-only. PostgreSQL images uselatest-postgresand<version>-postgres.- The Sources page no longer returns HTTP 400 for sources that already have stored metadata.
Verification
- Automated coverage for this work shipped with the merges on
masterafter2026.9.6, including pull requests #55, #56, #57, #58, #59, and #60. - Screenshots were taken against the running Docker UI on SQLite. Live PostgreSQL dumps, a real OIDC provider, and live yt-dlp discovery scans were not re-run for this tag.
Commit Range
- Previous release:
2026.9.6 - This tag:
2026.9.14 - Compared range:
2026.9.6...2026.9.14
Release 2026.9.6 - OIDC Sign-In and a New Documentation Home
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This release adds optional OpenID Connect sign-in, gives the project README a focused Material 3 refresh, and moves detailed setup and operations guidance into the public wiki.
OIDC Single Sign-On
- Add optional OIDC/OAuth 2.0 login using the authorization code flow with PKCE, state, and nonce validation.
- Support provider discovery, configurable scopes, client authentication methods, display names, and redirect URIs.
- Protect browser sessions with encrypted cookies, safe return paths, and LiveView disconnects on logout.
- Keep feeds and route-token access compatible with existing clients. Public API and health-check routes remain public by design.
- Add an end-to-end setup guide for Authentik and other standards-compliant OIDC providers in the PinchYT wiki.
Special thanks to @TomRoyls, PinchYT's first community contributor, for proposing and implementing the initial OIDC flow and its test coverage in #37.
README and Wiki
- Rebuild the README as a concise Material 3 project landing page without losing the complete list of additions over upstream Pinchflat.
- Launch the public wiki with focused guides for installation, environment variables, OIDC, upgrades and rollback, backups and restore, diagnostics, and PinchYT-specific features.
- Add clearer links to the web UI, instance-local API documentation, support channels, and operational guides.
Maintenance
- Refresh Elixir, frontend, and Docker workflow dependencies through #36.
- Add repository-specific contributor guidance, verification workflows, and UI smoke-test data for maintainers.
- Bump the application version to
2026.9.6.
Verification
- GitHub Actions completed the full project checks successfully.
- All 1,547 tests passed.
- README links, rendered Markdown, the hero artwork, and every published wiki page were checked after publication.
Commit Range
- Previous release:
2026.8.21 - New release:
2026.9.6 - Compared range:
2026.8.21...2026.9.6
Release 2026.8.21 - ARM64 Docker Images
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This release restores multi-platform Docker images so PinchYT is easier to run across more self-hosted systems.
ARM64 Docker Images
I've seen users forking PinchYT just to add ARM64 builds, so I thought I'd add those builds directly.
- Published release and version tags now include both
linux/amd64andlinux/arm64images. - Docker automatically selects the correct architecture when pulling a multi-platform tag.
- ARM64 builds run natively on GitHub's ARM64 runners and support 64-bit ARM systems, including Raspberry Pi devices running a 64-bit OS.
Documentation
- Add a README section describing the GHCR image location, supported architectures, and the difference between
latestand pinned version tags.
Commit Range
- Previous release:
2026.8.17 - New release:
2026.8.21
Release 2026.8.17 - yt-dlp Settings, Failed Downloads, and Version Status
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This release covers changes after 2026.8.14 and focuses on Settings controls for yt-dlp, failed-download recovery, sidebar version status, and a cleaner Docker Compose layout.
Highlights
Settings & yt-dlp
- Add a Settings editor for extra yt-dlp base config options (the same flags you would put in a yt-dlp config file).
- Add Settings search so notifications, extractor, cookies, and yt-dlp options are easier to find.
- Expose yt-dlp download, index, and metadata worker limits in Settings. Compose
YT_DLP_*_WORKER_CONCURRENCYenv vars still override the UI when set.
Downloads & Retries
- Add a Failed tab on Home with retry-all and per-item retry from history and source tables.
- Keep cookies on forced retries even when livestream prechecks are skipped.
Interface & Diagnostics
- Add a sidebar status card for PinchYT (Latest, or the installed version with an update warning) and the configured yt-dlp policy (Stable, Nightly, Frozen, Until stable, or a pinned version).
- Keep Diagnostics integrity tools usable on small screens.
Docker & Operations
- Move Compose files into
docker/and add a rootcompose.yamlinclude sodocker compose upstill works from the repo root. - Continue installing FFmpeg from yt-dlp/FFmpeg-Builds
latest(master builds, currently FFmpeg 9.x). That feed does not publish a separaten9.0tarball yet.
Maintenance & Dependencies
- Update Phoenix LiveDashboard from
0.8.7to0.9.0. - Update Alpine.js from
3.15.12to3.16.1. - Update Prettier from
3.9.5to3.9.6. - Update GitHub Actions
actions/checkoutfrom7.0.0to7.0.1. - Update GitHub Actions
docker/login-actionfrom4.4.0to4.6.0.
Commit Range
- Previous release:
2026.8.14 - New release:
2026.8.17 - Compared range:
2026.8.14..2026.8.17
Release 2026.8.14 - File Reconciliation and Database Maintenance
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This release covers changes after 2026.7.2 and focuses on file reconciliation, safe database maintenance, downloader and indexing reliability, and framework updates.
Highlights
File Reconciliation & Media Server Compatibility
- Add File Reconciliation Engine (Local, Online, and Full sync modes) to move, rename, and backfill media and sidecars without re-downloading media.
- Add live progress tracking, parallel background asset backfills, and interrupted-run crash recovery during reconciliation apply.
- Switch episode thumbnail filenames from
<basename>-thumb.jpgto<basename>.jpgfor immediate, out-of-the-box Plex compatibility alongside Jellyfin and Kodi.
Database Maintenance & Diagnostics
- Add safe database compaction (SQLite
VACUUM) with free disk space checks and background job queue pausing to eliminate lock contention. - Add scheduled monthly automatic database compaction.
- Add on-demand SQLite integrity checks directly from the Diagnostics UI.
- Add Queue Diagnostics controls to reset, requeue, or delete failed, stuck, or discarded Oban jobs.
- Add non-blocking exponential retry backoff with jitter to eliminate thundering herd retries on transient errors.
Download & Indexing Controls
- Add per-tab channel indexing (
/videos,/shorts,/streams) so--break-on-existingnever misses newly published Shorts or Streams. - Add Source Index Cutoff Date with automatic forced re-indexing when a cutoff date is widened.
- Add dual SponsorBlock category selection (independent mark vs remove category lists).
- Add option to exclude YouTube AI-upscaled / super-resolution format streams (
ignore_youtube_super_resolution). - Add robust JSON response decoding to prevent unhandled decoder errors on malformed responses.
- Add cookie file management for uploading, pasting, and inspecting cookies directly from the web UI.
- Add independent concurrency settings separating download worker limits from indexing worker limits.
Interface & Design Polish
- Modernize UI across all views with 100% adherence to Material Design 3 semantic tokens and surface foundations.
- Add global 12h / 24h clock display preference.
Maintenance & Dependencies
- Update Phoenix from
1.8.8to1.8.11. - Update Phoenix LiveView from
1.2.5to1.2.9. - Update Ecto from
3.14.0to3.14.2. - Update Oban from
2.23.0to2.23.1. - Update Swoosh from
1.26.2to1.27.0. - Update Prettier from
3.9.4to3.9.5. - Update GitHub Actions
docker/login-actiontov4.4.0.
Commit Range
- Previous release:
2026.7.2 - New release:
2026.8.14 - Compared range:
2026.7.2..2026.8.14
Release 2026.7.2 - Queue Diagnostics and Download Controls
Important
Personal Fork Disclaimer: PinchYT is maintained as a personal fork of Pinchflat for continued development and day-to-day self-hosted use.
This release covers changes after 2026.6.6 and focuses on operational visibility, safer download behavior, and more complete settings controls.
Highlights
Queue Diagnostics
- Add a Queue Diagnostics page for inspecting Oban jobs by state.
- Move app/runtime information into diagnostics so operations details live together.
- Add controls to reset or cancel individual jobs and clear discarded queues.
Download And Indexing Controls
- Add settings for yt-dlp update policy, including nightly, nightly-until-stable, and pinned behavior.
- Add yt-dlp version lookup and update management helpers.
- Add YouTube API key testing from Settings.
- Add cookies file management for uploading, pasting, inspecting, and clearing the shared cookies file.
- Add a setting to ignore unavailable, private, removed, or members-only media instead of retrying indefinitely.
- Surface unavailable and auto-skipped media as distinct statuses in the Other tab.
Reliability Fixes
- Fix indexing reschedule behavior so it can override unique Oban options instead of deduplicating against an executing job.
- Fix NFO aired dates to render as plain dates.
- Pass
force: truethrough redownload flows where needed. - Update Oban worker uniqueness state handling for the new
:suspendedstate. - Improve source metadata error handling and related tests.
Interface And Data Polish
- Label binary byte sizes with IEC units such as
KiB,MiB, andGiB. - Fix source table Size values so they remain correct after re-sorting.
- Clarify metadata and NFO toggle labels in the media profile form.
- Add README coverage for the new settings, status, and diagnostics features.
Maintenance
- Update Phoenix from
1.8.7to1.8.8. - Update Phoenix LiveView from
1.1.28to1.2.3. - Update Oban from
2.22.1to2.23.0. - Update Finch from
0.21.0to0.22.0. - Update Credo from
1.7.18to1.7.19. - Update Prettier from
3.8.3to3.8.4. - Configure Dependabot for automated dependency updates across supported ecosystems.
Commit Range
- Previous release:
2026.6.6 - New release:
2026.7.2 - Compared range:
2026.6.6..2026.7.2
Release 2026.6.6 - Single-Video Sources, Selective Playlists, and Material 3 UI
Important
Personal Fork Disclaimer: This fork is maintained for personal use and to continue development while the upstream project remains the canonical source.
Note
I was previously running this as a fork of another fork, and finally decided to attach it directly to the original canonical app!
Features Included in this Fork
Sources
- Single Video Sources: Add one-off YouTube video URLs directly as sources, not just channels and playlists.
- Selective Playlist Downloads: Delay playlist downloads, review indexed items, and choose exactly what to fetch from the Selection flow.
- Stronger Source Controls: Manage sources faster with clearer automatic vs delayed indicators plus inline and dropdown start, pause, and stop actions.
- Faster Source Actions: New inline notification links and direct source delete controls make routine source management quicker.
- Per-Source Folder Routing: Send each source into its own folder with a picker for existing folders and template-aware output routing.
Interface
- Material 3 AMOLED Theme: A darker, more opinionated visual layer with Material-inspired spacing, surfaces, controls, and hierarchy.
- Native Tailwind v4 Pipeline: Shared theme tokens and the native Tailwind v4 asset pipeline make the refreshed UI more consistent and maintainable.
- Cleaner Form UX: Better toggles, custom selects, clearer source/profile editing states, and improved source creation guidance.
- Collapsible Sidebar: Desktop navigation can collapse for a denser, more focused layout.
- Broader Mobile Polish: Source, job, and history views have improved responsive layouts for smaller screens.
Downloads
- Cookie Management UI: Upload, paste, and inspect the shared
cookies.txtfile directly from the app. - Download Speed Visibility: See live download speed in the jobs dashboard and media tables.
- Smarter Retry Behavior: Retry flows clear stale errors properly and keep task state more accurate.
- Nightly yt-dlp Builds: Track newer yt-dlp builds for faster compatibility with upstream extractor changes.
Operations
- Extra Diagnostics: More structured logging around source creation, indexing, enqueueing, and skipped downloads.
- Ongoing Fork Tweaks: Small workflow, UI, and reliability improvements that are useful in self-hosted daily use.




