Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ jobs:

- name: Run deterministic local gate
env:
FIREFOX_BINARY: ${{ steps.firefox.outputs.firefox-path }}
FIREFOX_LANGPACK_DIR: ${{ runner.temp }}/firefox-langpacks
run: npm run test:local:offline

Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,31 @@

All notable changes to YT re:Watch will be documented in this file.

## [5.2.1] - 2026-09-04

### Added

- Added Channels sorting by name, date followed, latest upload, activity, and last
checked, with a direction toggle and a remembered selection. Defaults to name A–Z.

### Fixed

- Fixed subscription scanning getting stuck behind low-activity channels and
repeatedly blinking its status without downloading videos.
- Made **Reload videos** check all followed channels outside failure backoff or
an active scan, update the visible list, and report failed or deferred checks.
- Debounced feed and popup search by 300 ms, with immediate Enter and clear actions.
- Repaired obsolete 30-day RSS error schedules when the feed scheduler starts.
- Recognize frequent uploads throughout the day, promote busy channels immediately,
and require a quiet period before gradually lowering their activity class.
- Added **Check for new videos** to each followed channel, with updated activity,
next-check timing, and results. **Log** now reads the latest stored scan records.

### Security

- Updated development dependencies `fast-uri` to 3.1.7 and `@humanfs/node` to
0.16.8, addressing five Dependabot alerts in URI handling and recursive file copying.

## [5.2.0] - 2026-09-01

### Added
Expand Down
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ YT re:Watch keeps its history inside your browser profile. It works while you sw
- **Experimental AI-label handling:** optionally badges, dims, or hides videos that YouTube itself discloses as made with AI.
- **Local channel follows:** follow or unfollow channels inside re:Watch without changing a YouTube account subscription.
- **Local feed:** public channel RSS builds a cached Home, chronological Subscriptions, and Shorts inventory.
- **Channels management:** review followed channels, import subscriptions from Google Takeout, and explicitly restore channels kept in the Ignored list after a local unfollow.
- **Channels management:** sort followed channels, check individual channels for new uploads, review scan logs, import subscriptions from Google Takeout, and restore channels kept in the Ignored list after a local unfollow.
- **Local search:** searches saved history, cached feed videos, and channels without sending the typed query to YouTube.
- **History, Watch Later, and local playlists:** keep viewing records, saved YouTube playlist links, and extension-managed playlists in one full-page interface.
- **Private analytics:** watch time, completion, hourly/daily activity, top channels, skipped channels, and unfinished long videos are calculated locally.
Expand Down Expand Up @@ -47,7 +47,7 @@ The full feed page contains:
| **Analytics** | Locally calculated watch statistics and insights |
| **Settings** | Appearance, retention, feed timing, imports, backup/restore, and reset controls |

Home and Subscriptions render stable 50-card pages as you scroll. Subscriptions retains its selected upload-date or detection-date ordering through **Reload view** and **Show**. Checking for new videos is separate from reloading the current local view, so a background scan does not unexpectedly replace or reorder visible cards. When uploads are found, re:Watch offers a deliberate **Show** action.
Home and Subscriptions render stable 50-card pages as you scroll. Subscriptions retains its selected upload-date or detection-date ordering through **Reload videos**, **Refresh**, and **Show**. **Reload videos** checks followed channels and updates the visible list; channels in failure backoff or already being scanned are deferred. **Refresh** redraws saved records. Background discoveries appear through a **Show** action so they do not unexpectedly replace visible cards.

The compact popup and full-page interface show the installed extension version beside the re:Watch icon, making it easier to identify the active build when reporting a problem.

Expand All @@ -66,6 +66,10 @@ You can add channels by:

A local unfollow stops future scans and removes that channel's cached feed inventory without deleting independent watch history. re:Watch records the choice locally. A later import reports that channel as ignored instead of silently following it again; the user can review it in **Channels → Ignored** and explicitly follow it again.

Channels defaults to **Name A–Z**. Choose **Date followed**, **Latest upload**, **Activity**, or **Last checked**, and use the direction button to reverse the order. The selection is remembered across page reloads. **Check for new videos** checks only that channel and updates its activity and next-check time; **Log** opens its latest recorded RSS attempts. [See the Channels guide](./docs/detailed_guide.md#channels) for sorting details and deferred checks.

Activity is recalculated from observed uploads after successful checks. Strong recent activity promotes a channel promptly; downgrades require a quiet period. Feed and popup search wait 300 ms after typing stops, while Enter and clearing the field act immediately.

The feed is best-effort discovery rather than a mirror of a signed-in YouTube account. Public RSS may not represent membership, age-restricted, region-restricted, removed, or otherwise unavailable videos. YouTube applies its own access rules when a video is opened.

## Playlists in v5.2
Expand Down
Binary file modified docs/assets/guide/feed-channels.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-subscriptions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## v5.2.1 — 4 September 2026

- Added Channels sorting by name, date followed, latest upload, activity, and last
checked. The selected order and direction are remembered; the default is name A–Z.
- Fixed stalled subscription downloads and continuously blinking scan status.
- **Reload videos** now checks followed channels and updates the visible list,
while preserving failure backoff and reporting failed or deferred checks.
- Added a 300 ms debounce to feed and popup search. Enter and clearing remain immediate.
- Repair old 30-day RSS error delays and recognize channels with frequent daily
uploads, promoting activity promptly and downgrading only after a quiet period.
- Added a per-channel **Check for new videos** action in Channels. Activity and
scheduling refresh after a check, and **Log** always loads current scan records.
- Updated development dependencies `fast-uri` to 3.1.7 and `@humanfs/node` to
0.16.8 to address five Dependabot alerts in URI handling and recursive file copying.

## v5.2.0 — 1 September 2026

- Added experimental **AI-labeled video handling** with Off, Badge, Dim, and
Expand Down
2 changes: 2 additions & 0 deletions docs/code-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ Files named `feed*.js` power the extension feed page:
- `feed-subscription-import.js`, `feed-subscriptions-view.js`,
`feed-subscribe-results.js`, and `feed-channel-view.js`: canonical local
subscription acquisition and channel surfaces.
`feed-subscriptions-view.js` also owns the remembered Channels sort, per-channel
manual checks, and fresh reads of the RSS attempt log.
- `feed-playlists-view.js`, `feed-playlist-import.js`,
`feed-history-view.js`, `feed-analytics.js`, `feed-settings.js`, and
`feed-backup.js`: individual feed sections and profile portability.
Expand Down
38 changes: 34 additions & 4 deletions docs/detailed_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,11 @@ Home uses stable 50-card pages. Moving between pages does not duplicate cards or

Subscriptions is the complete inventory of regular cached uploads. Choose
upload-date or detection-date ordering; the selection remains active through
**Reload** and **Show**. The view also uses stable 50-card pages.
**Reload videos**, **Refresh**, and **Show**. The view also uses stable 50-card pages.

### Reload videos, Refresh, and Show

- **Reload videos** scans eligible followed channels and updates cached feed records. The status beside it reports progress, scheduling, and outcomes.
- **Reload videos** checks followed channels and updates the visible list, even when their normal check time is still in the future. It includes low-activity channels and preserves the selected ordering. Channels in failure backoff or already being scanned are deferred; the status reports checked, failed, and deferred counts.
- **Refresh** renders current local storage again without starting a feed request.
- **Show** reloads the complete Subscriptions inventory after a scan or subscription-import handoff and retains its selected ordering.

Expand All @@ -76,6 +76,8 @@ The interface renders cached data before initialization work completes, so an ex

Search matches locally saved history and cached feed records. It does not send the query to YouTube and cannot discover a video that the extension has never stored.

Feed and popup searches run after a 300 ms pause in typing. Press Enter to search immediately. Clearing the field takes effect immediately and cancels a pending search.

### Card actions

Video menus provide local actions such as more or less from a channel, hide, subscribe or unsubscribe, Watch Later, and playlist-reference actions where applicable. Following state is matched by canonical YouTube channel identity so the card does not offer **Subscribe** for a channel already followed locally.
Expand Down Expand Up @@ -124,12 +126,40 @@ The **Watch Later** sidebar view orders saved videos newest first. Each row open

## Channels { #channels }

![The re:Watch Channels tab showing channels followed locally by the extension.](assets/guide/feed-channels.png)
![The re:Watch Channels tab with sorting, per-channel checks, activity, next-check times, and RSS logs.](assets/guide/feed-channels.png)

*Channels manages follows owned by re:Watch, not by the YouTube account.*
*Sort local follows and check each channel's uploads, activity, and scan history.*

Follow a channel from a supported YouTube channel/watch surface, a re:Watch video menu, or the Channels controls. You can also import subscriptions in Settings. re:Watch canonicalizes channel IDs and avoids duplicate follows.

### Sort followed channels

Use **Sort channels** and the direction button above the list. The default is **Name A–Z**, and the selected field and direction survive navigation and page reloads.

| Sort | Initial direction | Meaning |
| --- | --- | --- |
| Name | A–Z | Channel name, with natural number ordering |
| Date followed | Newest first | When the channel was added to re:Watch |
| Latest upload | Newest first | Most recent upload observed by re:Watch |
| Activity | Most active first | Observed publishing frequency; ties use latest upload first |
| Last checked | Oldest first | Most recent check attempt, including failed attempts; never-checked channels come first |

Missing upload dates and unknown activity are placed last in either direction. These controls apply to followed channels; the Ignored tab keeps its own list.

### Check one channel and inspect its log

Select **Check for new videos** on a channel card. The button shows that the check is running, then the card reports the result. A successful check refreshes its latest upload, recalculates activity, and sets the next check time. Newly discovered uploads are available through **Show**.

The action checks only that channel and bypasses its normal successful-check interval. Failure backoff and an existing scan can still defer it. Use **Reload videos** in the feed to check all followed channels.

**Log** loads the latest stored RSS attempts whenever it opens, including timestamps, HTTP status or failure code, and available details. An empty log means no RSS attempts have been recorded yet; it does not confirm a successful check.

### Activity and next-check timing

Activity is based on observed uploads, rather than the channel's lifetime video count. A busy recent upload pattern can raise its activity level immediately. Frequent uploads spread throughout a day are recognized even when the RSS sample covers less than a day; a short bulk-upload burst alone does not establish that cadence. Lower activity requires a quiet period and changes gradually.

Version 5.2.1 also removes obsolete 30-day delays left by older RSS 404 handling when the scheduler starts. It preserves independent failure backoff and running checks. If a frequently publishing channel still looks stale, use **Check for new videos** and review **Log**.

### Ignored channels

Unfollowing an imported/local channel can create a tombstone. Future imports skip that channel instead of silently restoring it. When one or more tombstones exist, an **Ignored** internal tab appears under Channels.
Expand Down
18 changes: 14 additions & 4 deletions docs/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,25 @@ From public RSS uploads cached for channels followed in re:Watch. Home arranges
that local inventory; Subscriptions can order it by upload date or by when
re:Watch detected it.

### What is the difference between Check, Reload, and Show?
### What is the difference between Reload videos, Refresh, and Show?

- **Check** scans eligible channel feeds and updates local records.
- **Reload** redraws from local storage without starting a scan.
- **Reload videos** checks all followed channels and updates the visible list. It bypasses normal successful-check intervals, but defers channels in failure backoff or already being scanned. Its result reports checked, failed, and deferred counts.
- **Refresh** redraws from local storage without starting a scan.
- **Show** reloads the full Subscriptions inventory while retaining its selected upload-date or detection-date order.

For one channel, open **Channels** and select **Check for new videos**. A successful check recalculates its activity and next-check time. **Log** opens its latest recorded RSS attempts.

### How are channels sorted?

Channels defaults to **Name A–Z**. You can choose **Date followed**, **Latest upload**, **Activity**, or **Last checked**, and reverse the direction. Your selection is remembered across reloads. Activity ties use the latest upload first; Last checked, oldest first puts never-checked channels first. [Full sorting details](detailed_guide.md#sort-followed-channels).

### Why can a busy channel look inactive or have an old last-upload date?

Activity and latest-upload dates reflect uploads re:Watch has observed. They can lag while checks fail or are deferred. **Check for new videos** refreshes the evidence and **Log** shows recent results. Strong recent activity promotes a channel promptly; lowering activity requires a quiet period. Version 5.2.1 also repairs obsolete 30-day delays from older RSS 404 handling when the scheduler starts.

### Does feed search query YouTube?

No. It searches only local history and cached feed records.
No. It searches only local history and cached feed records. Feed and popup searches wait for a 300 ms pause in typing; Enter and clearing the field take effect immediately.

### How many videos are on a page?

Expand Down
8 changes: 6 additions & 2 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ YT re:Watch keeps a private, account-independent YouTube history in your browser
| Subscriptions | Shows cached subscription videos ordered by upload or detection time |
| Shorts | Separates watched Shorts from ordinary history |
| Watch Later | Keeps videos explicitly saved for later, independently of a YouTube account |
| Channels | Manages local follows and reviewable ignored-channel records |
| Channels | Sorts local follows, checks individual channels, and shows scan logs and ignored-channel records |
| Analytics | Summarizes local activity, watch time, completion, and channel patterns |
| Playlist references | Saves links to YouTube playlists without importing their members |
| Local playlists | Creates and manages extension-owned playlists without changing YouTube account playlists |
Expand Down Expand Up @@ -45,16 +45,20 @@ and Settings.

The feed renders cached local records first.

- **Reload videos** scans eligible followed channels and updates cached feed records.
- **Reload videos** checks followed channels and updates the visible list, including channels whose normal check is scheduled for later. Failure backoff and checks already in progress are respected; the result reports checked, failed, and deferred channels.
- **Refresh** rebuilds the visible view from local storage without starting a network scan.
- **Show** reloads the complete subscription inventory after a scan or import handoff while preserving the selected upload-date or detection-date order.

In **Channels**, use **Check for new videos** for a single channel. A successful check updates its upload history, activity, and next-check time. **Log** shows the latest recorded RSS attempts.

Public YouTube RSS feeds provide new uploads. re:Watch does not use OAuth, mutate the user's YouTube subscriptions, or perform remote search.

## Local subscriptions and ignored channels

A re:Watch subscription belongs only to the current browser profile. Following or unfollowing a channel does not change the signed-in YouTube account.

Sort followed channels by **Name**, **Date followed**, **Latest upload**, **Activity**, or **Last checked**. The default is Name A–Z; your selected field and direction are remembered. [See the Channels guide](detailed_guide.md#channels) for the ordering rules.

When an imported channel was previously removed, re:Watch keeps a tombstone so later imports do not silently add it again. If such records exist, **Channels → Ignored** appears and lets you restore or permanently forget them. The tab stays hidden when there is nothing to review.

## Playlist behavior
Expand Down
8 changes: 4 additions & 4 deletions docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@ assigned to a release version.
When a planned release becomes testable, development builds may use semantic
pre-release versions such as:

- `v5.2.0-alpha.1` for incomplete developer testing;
- `v5.2.0-beta.1` for broader testing of mostly complete behavior;
- `v5.2.0-rc.1` for an intended release candidate;
- `v5.2.0` for the stable release.
- `v5.2.1-alpha.1` for incomplete developer testing;
- `v5.2.1-beta.1` for broader testing of mostly complete behavior;
- `v5.2.1-rc.1` for an intended release candidate;
- `v5.2.1` for the stable release.

Every pre-release should state what is incomplete, list known limitations and
data risks, explain any backup requirements, and provide a feedback channel.
Expand Down
Loading