Skip to content

feat: integrate local subscription feed - #99

Merged
EdinUser merged 16 commits into
mainfrom
integrate/local-feed-main
Aug 9, 2026
Merged

feat: integrate local subscription feed#99
EdinUser merged 16 commits into
mainfrom
integrate/local-feed-main

Conversation

@EdinUser

@EdinUser EdinUser commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Summary

This PR delivers the stable YT re:Watch v5 local-feed release. It expands the extension from a popup-centered history tracker into a complete local YouTube companion with explicit local subscriptions, public RSS-backed discovery, account-independent history and progress, channel management, analytics, backup/restore, and matched Chrome and Firefox coverage.

Supersedes #97 and is based on the original local-feed implementation by @tannery495. The original contributor commit remains in this branch ancestry and should be preserved by merging this PR with a merge commit.

User-facing changes

Local subscriptions and feed

  • Adds explicit local channel follows that never change the active YouTube account.
  • Adds public RSS-backed Home and chronological Subscriptions views.
  • Adds stable 50-card pagination without duplicates or mid-scroll reranking.
  • Adds local search across saved history, cached feed videos, and channels without remote YouTube search.
  • Adds local channel pages and bounded public metadata enrichment.
  • Adds local Follow and Unfollow actions to supported YouTube surfaces, re:Watch video menus, and Channels.
  • Adds Google Takeout subscription import with explicit added, existing, invalid, ignored, and initialization outcomes.

Clear feed controls

  • Separates Check for new videos from Reload view.
  • Keeps the visible cached inventory stable while a scan runs.
  • Adds Show as an explicit handoff to the complete chronological subscription inventory.
  • Renders cached inventory before initialization work completes.
  • Ensures opening Home regenerates only local ranking and does not start a Home-owned request.

Channels and ignored imports

  • Stores canonical subscriptions by YouTube channel ID.
  • Adds durable local-unsubscribe tombstones so a later import does not silently restore a removed channel.
  • Adds Following and conditional Ignored internal tabs under Channels.
  • Hides the Ignored tab when there is nothing to review.
  • Adds restore and forget actions for ignored channels.
  • Links import results from Settings and the popup directly to ignored-channel review.

History, progress, Shorts, and YouTube integration

  • Improves saved-position restoration across player replacement, ads, playlists, SPA navigation, and Firefox media handoffs.
  • Fixes reused-player identity races during Shorts navigation.
  • Updates watched overlays and available duration badges from local metadata.
  • Keeps History Remove and three-dot controls stable during incremental progress and metadata updates.
  • Improves local subscription matching across channel IDs, handles, and known titles.
  • Strengthens captured and live overlay behavior across channel, playlist, watch, recommendation, and dynamically inserted YouTube layouts.

Playlist references and Watch Later

  • Treats saved YouTube playlists as outbound references with available metadata.
  • Opens the original playlist on YouTube without background member hydration.
  • Retains per-playlist and global history-pause behavior.
  • Keeps extension-managed local playlists outside the stable v5 contract.

Analytics

  • Moves the maintained analytics experience into the full feed page.
  • Restores Top Skipped Channels and Longest Unfinished Videos.
  • Adds switchable Top Channels metrics for watch time and video count.
  • Retains completion, daily activity, hourly activity, Continue Watching, and summary metrics.
  • Aligns hourly chart columns to the same visual baseline as Watch activity.
  • Keeps analytics local and reconstructable from local history.

Backup, restore, and reset

  • Adds canonical local subscriptions and local-unsubscribe tombstones to backup and restore.
  • Deduplicates restored subscriptions by canonical channel ID.
  • Keeps restore merge-based and compatible with older supported backup fields.
  • Preserves v5 IndexedDB data during the v5-to-v6 tombstone-store migration.
  • Separates history-only clearing from full reset.
  • Makes Reset all data clear history, playlist references, deletion markers, canonical subscriptions, feed inventory, sync state, Home impressions, scheduler runs, tombstones, settings, and cached extension state.

Architecture and privacy boundaries

  • Uses one canonical local feed inventory and one bounded RSS scheduler.
  • Persists initialization, eligibility, retry, lease, and maintenance state per channel.
  • Keeps history separate from feed inventory while using it for watched presentation and local ranking.
  • Requests public RSS and channel metadata with browser credentials omitted.
  • Performs local search only.
  • Adds no OAuth flow, re:Watch account, cloud synchronization, remote search service, or YouTube-account mutation.
  • Keeps playlist member hydration and extension-managed playlists outside v5.

Browser support and release packaging

  • Maintains separate Chrome and Firefox manifests and unpacked builds.
  • Verifies release directory and archive parity.
  • Covers representative packaged surfaces in English, Bulgarian, German, Spanish, and French.
  • Adds equivalent deterministic Chrome and Firefox contracts for subscriptions, tombstones, imports, pagination, refresh semantics, analytics, playlists, backup, and IndexedDB migration.
  • Separates deterministic offline release gates from live YouTube canaries so external markup, consent, experiments, and anti-bot behavior do not make local release tests random.

Documentation and marketplace preparation

  • Rewrites the README, changelog, user guide, FAQ, troubleshooting, technical reference, build guide, testing guide, roadmap, and contributor documentation for v5.
  • Adds a dedicated privacy and data guide.
  • Adds Discord alongside the existing community and Telegram support links.
  • Adds Chrome plain-text and Firefox limited-Markdown marketplace copy.
  • Adds deterministic fictional-data marketplace screenshots for both browsers at 1280x800.
  • Adds a repeatable npm run marketplace:screenshots generator.

Deliberate v5 limits

  • Local follows are not YouTube account subscriptions.
  • The feed is best-effort public RSS discovery, not a mirror of a signed-in YouTube account feed.
  • Search does not discover remote YouTube videos.
  • Saved playlists are references and do not import their member videos.
  • There is no automatic cross-device synchronization; Backup and Restore provide manual portability.
  • YT re:Watch is not a network-anonymity or tracker-blocking tool.

Verification

The final branch passed:

  • npm run test:local:offline
    • 262 Jest tests passed; 9 tests skipped by their declared conditions.
    • Chromium packaged runtime: 8 passed.
    • Chromium captured/static extension coverage: 25 passed; the explicitly live permission canary was skipped in the offline command.
    • Firefox extension lint: 0 errors, 0 notices, 0 warnings.
    • Firefox smoke, captured overlays, and packaged feed suites passed.
  • npm run lint
  • npm run docs:safety
  • npm run docs:build
  • npm run marketplace:screenshots
  • git diff --check

Live YouTube, RSS, channel-metadata, and permission checks remain available separately through npm run test:canary.

Attribution and review

@tannery495 — thank you for the original local-feed implementation. It provided the foundation for this integration and remains represented in the commit history. Review of the final subscription, feed, and channel behavior is welcome.

Recommended merge method: Create a merge commit so the original contributor commit and the integration history remain visible.

tannery495 and others added 16 commits July 26, 2026 13:56
- preserve timestamp restoration across YouTube player replacement, media handoffs, and SPA navigation, with focused Chromium and Firefox diagnostics

- persist canonical local follows from page controls and channel context menus, resolve handle-only identities, and expose visible per-playlist history controls

- localize static and dynamic feed views in English, Bulgarian, German, Spanish, and French with shared plural, number, relative-time, and fallback helpers

- remove unreferenced locale entries and validate merged catalogs, placeholders, runtime consumers, and UTF-8 translations

- make Chrome and Firefox packaging include the complete feed runtime, recreate build trees and versioned archives, and keep Firefox locale paths store-compatible

- expand unit, integration, Chromium, and Firefox coverage for feed startup, subscriptions, overlays, playlists, storage, and media-transition restores

This is an integration checkpoint for the remaining pre-deployment work, not the final v5 release-candidate commit.
- update Babel core and source-map helpers beyond the reported arbitrary-file-read range

- refresh web-ext, addons-linter, Firefox profile, runner, ZIP, YAML, URI, glob, and shell parsing dependencies to patched compatible releases

- retain latest web-ext 10.6.0 and image-size 2.0.2; the remaining image parser denial-of-service advisories have no patched upstream release and affect development linting only

- keep production dependencies audit-clean and preserve the current Firefox build and lint workflow
Remove the retired in-extension YouTube search and playlist hydration paths, preserve canonical subscriptions across backup and restore, and tighten packaged permissions and artifact cleanup.\n\nAdd matched Chrome and Firefox release/canary coverage and refresh the public documentation and roadmap for the stabilized V5 scope.
- preserve the existing documentation structure and navigation while adding screenshot-backed popup and feed guidance
- generate deterministic fictional extension screenshots during every local and CI documentation build
- run both destinations through one staged, strict, macros-enabled MkDocs builder
- verify the complete site and all screenshot artifacts before the unchanged deployment handoff
- reject machine-specific paths, private infrastructure details, and credential patterns from documentation sources
Defer saved-position restoration while YouTube is playing an ad, then resume through the existing media-transition path after the main video becomes available.

Synchronize Chromium and Firefox playlist identity checks, remove fragile fresh-profile timing assumptions, and make Chromium consent handling detect, solve, and verify the YouTube consent surface.

Add deterministic long-ad restore coverage and verify the complete Chromium and Firefox E2E suites.
Implement ignored-channel review, pagination, analytics, refresh scheduling, and backup improvements.

Expand deterministic and live Chromium/Firefox coverage, including stable consent and Shorts SPA tracking.
@EdinUser EdinUser self-assigned this Aug 9, 2026
@EdinUser
EdinUser merged commit 6c10795 into main Aug 9, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants