YT Engagement Verdict version history - 11 versions
YT Engagement Verdict by denali42
YT Engagement Verdict version history - 11 versions
Be careful with old versions! These versions are displayed for testing and reference purposes.You should always use the latest version of an add-on.
Latest version
Version 1.2.3
Released Aug 16, 2026 - 36.56 KBWorks with firefox 140.0 and laterv1.2.3
Bug fixes:
Fixed likes (and views, comments) from a previous video carrying over to the next video during SPA navigation
Root cause: the scrape had no concept of stale data — YouTube reuses DOM nodes asynchronously during navigation, so video A's engagement counts could be accepted as video B's during the transition window
Fix: attempt() now gates on ytd-watch-flexy[video-id="${videoId}"] before accepting any scraped snapshot — the same deterministic mechanism used by Return YouTube Dislike. If the stamp doesn't match the current video, the scrape retries within the existing 40×500ms budget
Fixed scrapeLikes() returning 0 on failure instead of null — a scrape failure was silently corrupting the verdict by collapsing the like rate to zero, flipping almost any video to View Botted or Hot Garbage
Removed dead unreachable genuine-0-likes branch from scrapeLikes()
Removed dead selector from selectors.json (v1.0.4) — ytd-segmented-like-dislike-button-renderer #top-level-buttons ytd-toggle-button-renderer:first-child button matched nothing in either current YouTube DOM structureSource code released under MIT License
Older versions
Version 1.2.2
Released Aug 16, 2026 - 36.41 KBWorks with firefox 140.0 and laterv1.2.2
Bug fix:
Fixed comments showing zero on cold browser load when comments are enabled and already visible in the viewport
Root cause: IntersectionObserver was armed with threshold: 0.1 — on elements taller than the viewport (the full comments section), this threshold is unreachable when the element is already on screen, so the observer fired once, reported non-intersecting, and never fired again (W3C Intersection Observer issue #124)
Fix: changed threshold to 0 — any visible pixel triggers the observer, including on initial delivery when already in view
Also fixed a silent dead-end where neither #comments #count nor ytd-comments-header-renderer existed at arm time — now falls back to observing #comments itselfSource code released under MIT License
Version 1.2.1
Released Aug 15, 2026 - 36.25 KBWorks with firefox 140.0 and laterv1.2.1
Security
Replaced hardcoded API key with per-install UUID for telemetry authentication (v1.1.6)
UUID generated via crypto.randomUUID() on first report, persisted to storage.local
No secrets in the distributed package — nothing to leak, nothing to rotate
Worker now validates UUID format only via /^[0-9a-f-]{36}$/i
Architecture
Unified Firefox and Chrome under a single MV3 codebase — chrome/ subdirectory eliminated
background.js now declares both service_worker and scripts for maximum Firefox compatibility — uses service worker when supported, falls back to scripts when extensions.backgroundServiceWorker.enabled is off (Firefox beta/some stable builds)
Programmatic content script injection via tabs.onUpdated — removed content_scripts from manifest to prevent double injection
Bug fixes
Fixed stale comment count carrying over when navigating between videos — lastResult now explicitly cleared on every navigation event
Fixed const YTVerdict redeclaration error — background script now checks if scripts are already loaded before injecting; fires yt-navigate-finish to trigger a clean reset if they are
Fixed injection TOCTOU race — injectingTabs Set serializes concurrent tabs.onUpdated events per tab; single .finally() guarantees cleanup on success and failure
Fixed extension not loading on cold browser start without Ctrl+F5 — tabs.onUpdated approach replaces fragile document_idle timing dependency
Fixed typeof Reporter !== 'undefined' — missing or broken reporter.js no longer crashes the widget
Fixed comment count lifecycle — retryTimer, retryCount, and commentObserver all torn down cleanly on navigation; observer callbacks bail if currentVideoId has changed
Fixed genuine 0-comment videos spinning the full retry budget — retry loop now only retries while comments === null, not comments === 0
Fixed 4/4 Legit on Fire rendering green — bar color now derived from percentage not absolute data-score; CSS updated to match
Fixed redundant barColor() in popup — now uses verdict.color from the scoring engine directly
Fixed insertCSS firing even when script injection failed — CSS now chained after script sequence
Fixed window.close() leaving users on a blank tab — redirects to YouTube if close is refused
Fixed stale Chrome-port references in CONTRIBUTING.md — updated to reflect MV3 unification
Performance
Eliminated full-page querySelectorAll fallback scans in scrapeViews() and scrapeComments() — return null on selector failure, let retry loop handle it
Narrowed comment observer — IntersectionObserver scroll trigger replaced 300ms blind interval poll; MutationObserver now watches just the count element with no characterData
URL poller early returns on unchanged and non-watch URLs — zero DOM work when idle
Robustness
safeQuery() wraps every document.querySelector() call — malformed remote selectors log [YTEV] Bad selector and fall through instead of throwing and killingSource code released under MIT License
Version 1.1.6
Released Aug 15, 2026 - 34.92 KBWorks with firefox 140.0 and laterv1.1.6
Security:
Replaced hardcoded API key with per-install UUID for telemetry authentication
UUID generated via crypto.randomUUID() on first report, persisted to storage.local
No secrets in the distributed package — nothing to leak, nothing to rotate
Worker now validates UUID format only; old static key path removed entirelySource code released under MIT License
Version 1.1.5
Released Aug 15, 2026 - 34.8 KBWorks with firefox 140.0 and laterv1.1.5
Bug fixes:
Fixed stale comment count and verdict carrying over when navigating between videos
Root cause: tabs.onUpdated was re-injecting all scripts on every navigation, but since the previous scripts were still alive in the page context, the const redeclarations failed silently — leaving run() never called and the old data on screen
Fix: background script now checks if scripts are already loaded in the tab before injecting. If they are, it fires yt-navigate-finish to trigger a clean navigation reset instead of re-injecting. If they aren't, it does a fresh injection as before
Applies to both Firefox and Chrome/Edge buildsSource code released under MIT License
Version 1.1.4
Released Aug 15, 2026 - 34.77 KBWorks with firefox 140.0 and laterv1.1.4
Bug fixes:
Fixed stale comment count carrying over from a previous video when navigating to videos with lazy-loaded comments
Root cause: lastResult was never cleared on navigation, so if the comment scraper timed out on the new video before comments loaded, the widget could render with data from the previous video
Fix: lastResult is now explicitly set to null on every navigation event, and the widget is removed immediately — ensuring a clean slate before each new video scores
Applies to both Firefox and Chrome/Edge buildsSource code released under MIT License
Version 1.1.3
Released Aug 15, 2026 - 34.76 KBWorks with firefox 140.0 and laterv1.1.3
Bug fixes:
Fixed extension crashing and disappearing from the screen due to a redeclaration of const YTVerdict error
Root cause: both the manifest's content_scripts declaration and the background script's tabs.onUpdated injection were running simultaneously, causing all scripts to be injected twice
Fix: removed content_scripts from both Firefox and Chrome manifests — injection is now handled exclusively by the background script, eliminating the conflict
Applies to both Firefox and Chrome/Edge buildsSource code released under MIT License
Version 1.1.2
Released Aug 15, 2026 - 34.83 KBWorks with firefox 140.0 and laterv1.1.2
Fixed extension not displaying on cold browser load without requiring Ctrl+F5
Background script now programmatically injects content scripts when a YouTube watch page finishes loading, bypassing content script timing issues on first browser launchSource code released under MIT License
Version 1.1.1
Released Aug 14, 2026 - 34.23 KBWorks with firefox 140.0 and laterv1.1.1
Bug fixes:
Fixed extension not displaying on cold browser load — previously required a Ctrl+F5 hard refresh to show the widget on a fresh browser session
Extension now watches for YouTube's video title element to appear in the DOM before running, ensuring it works correctly on first load without user intervention
Applies to both Firefox and Chrome/Edge builds
3-second fallback ensures the extension runs even in edge cases where the title selector doesn't fireSource code released under MIT License
Version 1.1.0
Released Aug 12, 2026 - 33.95 KBWorks with firefox 140.0 and laterv1.1.0
New features:
Opt-in anonymous telemetry — verdict data reported to Cloudflare Worker + Neon database for future z-score calibration
Welcome page on first install with plain-English opt-in disclosure (CSP compliant, external script)
Background service worker fires onInstalled to open welcome tab on fresh install
Telemetry toggle in popup — change opt-in preference at any time
AI content detection — detects YouTube's "Made with AI" disclosure label and displays a purple 🤖 AI badge in the widget header
is_ai_content flag recorded in both Neon tables for future engagement pattern research
Comments disabled detection — shows "Off" in stats and excludes comment rate signal when YouTube has disabled comments
Passive Watch edge case identified — GitHub issue filed for v1.x implementation
Bug fixes:
Likes scraper timing — retry on 0 value; was reading before YouTube's aria-label populated
Comment scraper timing — retry on 0 value; lazy-load timing issue
Comment scraper in playlist context — added ytd-comments-header-renderer #count selector
MutationObserver for lazy-loaded comments — updates widget when user scrolls to comments section
NaN prevention in scoring — comment rate excluded when null, same pattern as sentiment signal
SPA navigation — added URL polling fallback to catch pushState navigations that don't fire yt-navigate-finish
Selector fetch branch name — corrected main to master in GitHub raw URL
innerHTML replaced with createElement throughout — resolves AMO validator warning
host_permissions removed — not supported in MV2; consolidated into permissions
strict_min_version bumped to 140 — matches data_collection_permissions support requirement
.git folder excluded from xpi build
data_collection_permissions optional value corrected to camelCase technicalAndInteraction
Welcome page CSP compliance — inline script moved to external welcome.js
Selector updates (v1.0.1 → v1.0.3):
Added like-button-view-model button as primary likes selector
Added ytd-comments-header-renderer #count for playlist context
Added ytd-structured-description-content-renderer AI label detection
Bumped selector version and updated timestampsSource code released under MIT License
Version 1.0.1
Released Aug 9, 2026 - 61.85 KBWorks with firefox 140.0 and laterFixed: .git folder excluded from build — should not have been included in v1.0.0 package
Fixed: Removed host_permissions key (not supported in Manifest V2 — permissions consolidated into permissions array)
Fixed: Bumped strict_min_version from 115 to 140 to match data_collection_permissions support requirement
Fixed: Likes scraper now retries on 0 value — was reading before YouTube's aria-label had populated, resulting in 0 likes on first load
Fixed: Comments scraper now retries on 0 value — comments section lazy-loads and wasn't ready on initial scrape
Fixed: Added URL polling fallback for SPA navigation detection — previously stale data could carry over when navigating between videos without a hard refresh
Fixed: Retry limit increased from 20 to 40 attempts to accommodate slow-loading comments section
Updated: README installation section reflects AMO submission in progressSource code released under MIT License