Skip to content

Releases: countgitmick/FreeTubePlusTabs

v0.24.10

Choose a tag to compare

@countgitmick countgitmick released this 01 Aug 01:19

Fixes

  • Comments load again. YouTube moved the avatar field inside each comment, and the bundled youtubei.js read the old field without a guard, so every comment request failed.
  • Long videos no longer stop with a session expired message. The player rebuilt YouTube's playback session token before it sent the token back, and it lost bytes in the process. YouTube could not place the session, refused to serve the stream, and answered the retry flood with an error.
  • The player follows the redirects that YouTube sends during playback. It dropped them before, and it kept asking the host that YouTube had just moved it away from.
  • Tabs, history, subscriptions and playlists are visible again. The app pinned its data directory to a path that holds no profile, so it opened empty while the real profile sat untouched beside it.
  • A background tab no longer rewrites the address of the active tab, and it no longer requests a channel as if the channel were a video.
  • The player no longer throws an error when a tab closes while a video still loads.
  • Videos with dubbed audio or with several audio languages no longer stall. The player truncated the identifier of those audio formats.
  • A thrown JavaScript error now reports itself as an exception. It appeared as a player error with no code before.

Build

  • The Nix build takes the Electron major version from package.json. The build restated that value before, the copy drifted, and the app then ran on an older Chromium than the one it targets.
  • The repository has a ./dev script. It starts the development server on NixOS, where a bare yarn dev cannot run.

v0.24.9

Choose a tag to compare

@countgitmick countgitmick released this 27 Jul 02:08

Fixes

  • Tab sessions restore on startup again, and are saved again — v0.24.8 misread every launch as a deep-link window, so the saved session was never read and never written
  • Video playback works again; PO token generation failed outright on v0.24.8
  • A stalled BotGuard VM no longer deadlocks PO token generation for the life of the process, which took all playback down until restart
  • A second window (Ctrl+N, tray, dock, --new-window) no longer overwrites the main window's saved tabs
  • The c captions shortcut toggles again, along with subtitles-on-by-default and chapter markers — all broken by an incomplete shaka-player v5 migration
  • Subscription caches are no longer blanked when a channel's latest feed entries contain no videos, or no shorts
  • Refreshing subscriptions no longer bypasses the fetch limiter, and user-initiated refreshes are paced to stay responsive on large subscription lists
  • The Live tab no longer opens one request per subscription simultaneously
  • yt-dlp-sourced videos carry publish dates, so they sort into the feed instead of collecting at the bottom
  • Channel avatars no longer render as stretched banner images
  • Hardware video decoding works again on systems whose Mesa has moved ahead of the pinned libva

Features

  • Chapter names now appear beside the timestamp in the seek bar tooltip

v0.24.8

Choose a tag to compare

@countgitmick countgitmick released this 26 Jul 22:54

Fixes

  • Fullscreen no longer exits when a background tab's player unmounts
  • Subscription "Feed Last Updated" now reports the last completed refresh
  • Removed the upstream FreeTube update-check banner

Features

Dependencies

  • All open security advisories resolved
  • youtubei.js 17.2.0, swiper 14, js-yaml 5, bgutils-js 4, electron 42.7.1

v0.24.7

Choose a tag to compare

@countgitmick countgitmick released this 14 Jun 03:20

Tab navigation fixes

Patch release fixing the modifier-click and tab behavior reported by @raindropsfromsky.

Fixes

  • Ctrl/Cmd+click on a video opens a background tab instead of a new window (#112, #113). Modifier clicks were falling through to the window-open handler; only middle-click had been wired to the tab layer.
  • Shift+click opens a new window with just that video (#116). Previously it cloned the current window's tabs and dropped the clicked video, because new windows restored the saved session over the deep link. Deep-linked windows are now ephemeral, so they neither restore nor overwrite the session.
  • New tabs clear the address bar (#111). The search bar now syncs to the active tab.

Packaging

  • The app's packaged name changed from FreeTube + Tabs to FreeTubePlusTabs. Newer electron-builder rejects the + character when building AppImages, which was blocking releases. Your existing settings, history, subscriptions, and playlists are preserved (the data directory is unchanged).

CI

  • calibreapp/image-actions bump (#152).

v0.24.6

Choose a tag to compare

@countgitmick countgitmick released this 20 Apr 02:21

Security + dependency roll-up

Patch release bundling 10 Dependabot updates that landed on development since v0.24.5, plus two infra fixes.

Security fixes

  • dompurify 3.3.3 → 3.4.0 (#46) — sanitizer behind the v-safer-html directive used throughout the renderer. Closes the open Dependabot alert.
  • electron 41.2.0 → 41.2.1 (#58) — picks up upstream Chromium security patches for non-Nix builds. Nix builds track nixpkgs' electron.

Runtime deps

  • shaka-player 5.0.10 → 5.1.0 (#57) — perf improvements and bug fixes. Verified no API changes affect the custom SABR manifest parser, MP4/WebM segment-index parsers, or EBML metadata parser.
  • marked 18.0.0 → 18.0.2 (#54)
  • @fortawesome/vue-fontawesome 3.1.3 → 3.2.0 (#52)

Dev tooling

  • eslint 10.2.0 → 10.2.1 (#50)
  • stylelint group, 3 packages (#51)
  • webpack group, 2 packages (#53)
  • lefthook 2.1.5 → 2.1.6 (#56)
  • globals 17.4.0 → 17.5.0 (#55)

CI

  • github/codeql-action 4.35.1 → 4.35.2 (#49)
  • actions/cache 5.0.4 → 5.0.5 (#48)
  • calibreapp/image-actions (#47)
  • fix(ci): correct AppImage filename in build.yml — fork had inherited upstream FreeTube- naming; now matches productName FreeTube + Tabs in line with release.yml.

Infra

  • fix: add --ozone-platform=wayland to the Electron wrapper — correct native rendering on Wayland sessions.

Notes

  • Everything in v0.24.5 is included.
  • flake.nix npmDepsHash updated for the new lockfile.
  • Nix/NixOS users pulling freetubeplustabs from the Gitea flake get these changes via nix flake update; no binary download required.

v0.24.5

Choose a tag to compare

@countgitmick countgitmick released this 14 Apr 04:41

Security patch release

Fixes

  • Bumps follow-redirects 1.15.6 → 1.16.0 (#45)
    • Closes the open Dependabot alert "follow-redirects leaks Custom Authentication Headers to Cross-Domain Redirect Targets" (medium severity)
    • Upstream fix adds a sensitiveHeaders option and input sanitization
    • follow-redirects is a dev-only transitive dependency; no runtime behavior changes

Notes

  • Everything in v0.24.4 is included.
  • flake.nix npmDepsHash updated for the new lockfile.

This release exists because v0.24.4 was tagged before the security fix landed on development.

v0.24.4

Choose a tag to compare

@countgitmick countgitmick released this 14 Apr 03:59

What changed

Linux startup flags

  • Adds VA-API command-line switches (AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder,VaapiIgnoreDriverChecks) and enable-gpu-rasterization at startup on Linux. Previously these were only set by the Nix flake's wrapper, so portable and Flatpak builds ran without them. Whether hardware decode actually engages depends on the host having a working libva + driver stack — verify via chrome://gpu.
  • Adds --ozone-platform-hint=auto on Linux when no explicit ozone-platform switch was passed, so Chromium can pick Wayland or X11 from WAYLAND_DISPLAY instead of relying on the launcher.
  • Logs a warning if powerSaveBlocker.isStarted() returns false after start(). Some Wayland compositors no-op the request silently.

MediaSession / MPRIS

  • Installs play, pause, seekbackward, seekforward, seekto, and stop action handlers on the video element in the Shaka player wrapper.
  • Calls navigator.mediaSession.setPositionState on every timeupdate (skipped for live streams where duration is Infinity).
  • Cleans these handlers up in onBeforeUnmount.
  • Pre-existing metadata, playbackState, and previoustrack/nexttrack integration is unchanged.

Tab system

  • Idle suspension now unmounts the inner component (v-if) instead of toggling display: none (v-show). The previous behavior left Shaka, watchers, and timers running indefinitely. The route is preserved in Vuex, so reactivating an idle tab triggers a fresh remount and reload.
  • Normal tab switching (between non-idle tabs) still uses v-show to preserve component state.
  • resolvedComponentCache in TabContent.vue is now an LRU bounded at 50 entries; previously it grew without eviction.
  • persistTabs retry logic replaced: persistRetried boolean → persistAttemptCount + exponential backoff schedule (200ms, 500ms, 1000ms, give up after 3). On giveup, surfaces a toast via helpers/utils.showToast.
  • persistTabsImmediate is now async and awaits the upsert so beforeunload callers can wait on it.

Tab bar

  • Wheel handler in FtTabBar.vue now coalesces deltaY into a single requestAnimationFrame callback per frame instead of mutating scrollLeft once per wheel tick.

Security / IPC

  • dbTabs IPC: preload now checks the action against an ALLOWED_TAB_DB_ACTIONS set before invoking. Defense in depth — the main handler already had a switch-default reject. Payload shape normalized to {action, data} to match the other db handlers.
  • setPermissionCheckHandler now rejects when details.embeddingOrigin is set and is not a FreeTube URL.
  • setPermissionRequestHandler now rejects when details.requestingUrl is set and is not a FreeTube URL.

Flatpak manifest

  • Adds explicit --talk-name=org.freedesktop.portal.{Desktop,OpenURI,FileChooser,Settings} to finish-args.
  • Inline comment block describing the steps needed to migrate from "unpack release zip" to "build from source" using flatpak-node-generator. flake.nix is the working build reference.

FreeTube + Tabs v0.24.3

Choose a tag to compare

@countgitmick countgitmick released this 28 Mar 23:33

What's New

Fix: Channel sort dropdown restored

YouTube renamed their internal renderer types for channel page filter chips (feedFilterChipBarRendererchipBarViewRenderer), breaking the sort dropdown (Latest / Popular / Oldest) on channel Videos, Shorts, and Live tabs. This release patches youtubei.js at build time to support both old and new renderer types with a unified fallback chain.

Other changes

  • fix: Update transitive deps for security vulnerabilities
  • fix: Revert --no-zygote flag that broke Electron on NixOS
  • fix: Fullscreen improvements — delegate Escape to browser native behavior, proper cleanup on unmount, tab bar hidden during fullscreen
  • chore: Move yaml-eslint-parser to devDependencies

NixOS

Update your flake input to this release's commit and rebuild.

FreeTube + Tabs v0.24.2

Choose a tag to compare

@countgitmick countgitmick released this 25 Mar 07:14

FreeTube + Tabs v0.24.2

Architecture

  • Unified tab operations — consolidated scattered tab transition handlers into a single composable with serialized execution, preventing race conditions
  • IPC hardening — renderer→main IPC calls now strip Vue reactive Proxies at the boundary, validate all incoming data, and support timeout and abort signals. Added Content Security Policy with correct connect-src for production
  • Deduplicated view logic — extracted shared route guard, backend fetch fallback, and watcher patterns; net reduction of ~230 lines across Channel, Watch, and player components

Bug Fixes

  • Fix back/forward navigation within same tab — pressing back/forward after navigating between videos did nothing; the tab executor was silently suppressing route change reactions during intra-tab history navigation
  • Fix tab drag crash — dragging tabs could throw; now shows media playing state in tab icon
  • Fix Vue lifecycle errors during tab close — deferred tab removal until navigation settles, preventing null-instance errors
  • Fix Shaka player DOM and listener leaks — player elements and event listeners were accumulating over time
  • Fix progress bar lingering on abort — subscription feeds now clean up the progress bar when fetch is aborted
  • Fix IPC serialization errors — Vue reactive objects sent over IPC caused DataCloneError in multiple code paths; fixed at the IPC boundary layer
  • Fix will-navigate handler timing — deferred handler until after initial page load to prevent interference with Electron's loadURL()
  • Fix refresh button disappearance — resolved layout regression; matched nav button sizing consistently
  • Fix arrow button state — back/forward arrows now reactively derive enabled/disabled from the tab's history index
  • Fix refresh widget timestamp — "Last updated" timestamps now update continuously
  • Fix tab bar layout gaps — removed hover gap at start of tab bar and closed visual gap between sidebar and tab bar
  • Fix subscription cache timestamps — date comparison now handles JSON-serialized values correctly
  • Fix PO token generation — relaxed validation to accept channel IDs and removed overly strict context type check

CI/CD

  • Nix build workflow — added GitHub Actions workflow to verify the NixOS flake builds on every push and PR

Docs

  • Rewritten CONTRIBUTING.md — updated for fork identity and workflow

Install

NixOS (flake):

nix run github:countgitmick/FreeTubePlusTabs

Other platforms: Download the appropriate asset below for your OS and architecture.

FreeTube + Tabs v0.24.1

Choose a tag to compare

@countgitmick countgitmick released this 23 Mar 21:56

FreeTube + Tabs v0.24.1

New Features

  • ESC exits fullscreen — pressing Escape now exits native fullscreen in the video player
  • Faster player controls fade — controls and cursor hide in 0.5s after mouse stops (down from Shaka's default 3s idle timer), with 0.3s fade animation
  • Sticky tab bar — tab bar stays pinned at the top when scrolling page content
  • Refresh Tab in context menu — right-click a tab to refresh it (soft refresh for active tabs)
  • Refresh widget moved to TopNav — cleaner layout via Teleport

Bug Fixes

  • Fix Vue lifecycle errors during tab refresh — removed key-based component destruction that caused emitsOptions/parentNode null errors
  • Fix tab scroll position save/restore — routerView is now the scroll container when tabs are enabled, fixing previously broken scroll persistence
  • Fix search errors on route transitions — guard against empty/undefined query params
  • Fix SABR 401 errors — auto-reload instead of format fallback
  • Fix multi-tab SABR conflicts — per-stream scheme registry prevents cross-tab interference
  • Fix Shaka player and SponsorBlock console errors
  • Fix RSS feed 404 console spam — route requests through main process
  • Fix active tab highlight color — use color-mix instead of broken primary-color-rgb
  • Revert custom Wayland fullscreen — removed IPC-based fullscreen override and opacity workaround; uses upstream browser Fullscreen API (Wayland surface unmap glitch is a Chromium upstream issue)

Install

NixOS (flake):

nix run github:countgitmick/FreeTubePlusTabs

Other platforms: Download the appropriate asset below for your OS and architecture.