feat: hide the YouTube Playables shelf, release v1.19.0 #53

Merged
richard merged 1 commit from feat/hide-playables-shelf into main 2026-08-18 00:31:12 +02:00
Owner

Summary

YouTube injects a "YouTube Playables" shelf — a row of browser mini-games — into the feed. It is not video content and nothing in CleanWatch matched it, so it survived every existing filter.

  • New setting hidePlayablesShelf (Home & Feeds → Homepage), on by default, next to the other injected-shelf toggles. Localized in EN/NL/DE/FR; the hint notes that the /playables page itself still works if you go there yourself.
  • block.css: the shelf is a plain ytd-rich-shelf-renderer with no distinguishing attribute (unlike Shorts' [is-shorts]), so the rule anchors on the game card element (ytd-mini-game-card-view-model) and on the /playables link in the shelf header. The whole ytd-rich-section-renderer is hidden so no empty grid slot is left behind, matching the membership/premium shelf rules; the loose card selectors cover the same cards appearing outside a rich section.
  • defaults.js: PLAYABLES_SHELF_SELECTOR mirrors the CSS and is registered in AUDITED_SELECTORS as playablesShelf (optional, since a clean feed may not carry the shelf), so a YouTube rename shows up in __CW_AUDIT_SELECTORS__() instead of failing silently.

Release v1.19.0

  • manifest.json + package.json → 1.19.0 — a new user-facing feature, so a minor bump, matching 1.18.0. package-lock.json had drifted at 1.16.0 and now tracks.
  • Rebuilt website/downloads/cleanwatch-latest.zip, byte-identical to the store package: 30 files, manifest at the zip root, no test/, node_modules/ or website/ leakage.

Test plan

  • npm test — 74/74 pass (jsdom was simply not installed locally, which is why two suites appeared to fail before npm install)
  • Settings page renders the new row with its label and hint, via the page-load harness
  • Selectors checked against the live shelf markup: the section, its shelf and its cards match; a neighbouring rich-section and an ordinary feed item do not
  • Load unpacked on youtube.com and confirm the shelf is gone with no empty grid slot, and returns when the toggle is off

🤖 Generated with Claude Code

## Summary YouTube injects a **"YouTube Playables"** shelf — a row of browser mini-games — into the feed. It is not video content and nothing in CleanWatch matched it, so it survived every existing filter. - New setting `hidePlayablesShelf` (**Home & Feeds → Homepage**), **on by default**, next to the other injected-shelf toggles. Localized in EN/NL/DE/FR; the hint notes that the `/playables` page itself still works if you go there yourself. - `block.css`: the shelf is a plain `ytd-rich-shelf-renderer` with no distinguishing attribute (unlike Shorts' `[is-shorts]`), so the rule anchors on the game card element (`ytd-mini-game-card-view-model`) and on the `/playables` link in the shelf header. The whole `ytd-rich-section-renderer` is hidden so no empty grid slot is left behind, matching the membership/premium shelf rules; the loose card selectors cover the same cards appearing outside a rich section. - `defaults.js`: `PLAYABLES_SHELF_SELECTOR` mirrors the CSS and is registered in `AUDITED_SELECTORS` as `playablesShelf` (optional, since a clean feed may not carry the shelf), so a YouTube rename shows up in `__CW_AUDIT_SELECTORS__()` instead of failing silently. ## Release v1.19.0 - `manifest.json` + `package.json` → 1.19.0 — a new user-facing feature, so a minor bump, matching 1.18.0. `package-lock.json` had drifted at 1.16.0 and now tracks. - Rebuilt `website/downloads/cleanwatch-latest.zip`, byte-identical to the store package: 30 files, manifest at the zip root, no `test/`, `node_modules/` or `website/` leakage. ## Test plan - [x] `npm test` — 74/74 pass (jsdom was simply not installed locally, which is why two suites appeared to fail before `npm install`) - [x] Settings page renders the new row with its label and hint, via the page-load harness - [x] Selectors checked against the live shelf markup: the section, its shelf and its cards match; a neighbouring rich-section and an ordinary feed item do not - [ ] Load unpacked on youtube.com and confirm the shelf is gone with no empty grid slot, and returns when the toggle is off 🤖 Generated with [Claude Code](https://claude.com/claude-code)
YouTube injects a "YouTube Playables" shelf — a row of browser mini-games —
into the feed. It is not video content and nothing in CleanWatch matched it,
so it survived every existing filter.

- New setting `hidePlayablesShelf` (Home & Feeds -> Homepage), ON by default,
  next to the other injected-shelf toggles. Localized in EN/NL/DE/FR with a
  hint noting the /playables page itself is untouched.
- block.css: the shelf is a plain ytd-rich-shelf-renderer with no
  distinguishing attribute (unlike Shorts' [is-shorts]), so the rule anchors
  on the game card element (ytd-mini-game-card-view-model) and on the
  /playables link in the shelf header. The whole ytd-rich-section-renderer is
  hidden so no empty grid slot is left behind, matching the membership/premium
  shelf rules; the loose card selectors cover the same cards appearing outside
  a rich section.
- defaults.js: PLAYABLES_SHELF_SELECTOR mirrors the CSS and is registered in
  AUDITED_SELECTORS as `playablesShelf` (optional, since a clean feed may not
  carry the shelf), so a YouTube rename shows up in __CW_AUDIT_SELECTORS__()
  instead of failing silently.
- Verified against the live markup: the section, its shelf and its cards match;
  a neighbouring rich-section and an ordinary feed item do not.

Release v1.19.0
- manifest.json + package.json -> 1.19.0. A new user-facing feature, so a minor
  bump, matching 1.18.0. package-lock.json had drifted at 1.16.0 and now tracks.
- Rebuilt website/downloads/cleanwatch-latest.zip, byte-identical to the store
  package: 30 files, manifest at the zip root, no test/, node_modules/ or
  website/ leakage.

74 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
richard deleted branch feat/hide-playables-shelf 2026-08-18 00:31:12 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
365DevNet/CleanWatch!53
No description provided.