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
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
## Unreleased

## v68.3.0 (2026-05-21)

### Detection Evasion
- **Ad spoofing default flipped on → off** — was previously on by default with a localStorage opt-out (`twitchAdSolutions_disableAdSpoofing='true'` to disable); now off by default with a localStorage opt-IN (`twitchAdSolutions_disableAdSpoofing='false'` to re-enable). Rationale: convergent signals that the spoof's always-100%-watched + audible + visible beacon pattern (fires before a human would plausibly have watched the ad) may itself fingerprint as anomalous in Twitch's anti-adblock heuristics — silent fingerprinting that vaft's `GQL response status` surveillance line (which only catches loud rejections) cannot detect. Field signal: an in-stream ad reaching the committed autoplay 360p backup on `warn` despite full vaft pod coverage and 100% Twitch acceptance of the spoof beacons (i.e., consistent with detection escalation rather than spoof rejection). Convergent with the TTV-AB maintainer's hypothesis. Mechanism retained intact: users who want to A/B test or explicitly opt in can set `twitchAdSolutions_disableAdSpoofing='false'`. vaft only (#NN)
- **Ad spoofing default flipped on → off** — was previously on by default with a localStorage opt-out (`twitchAdSolutions_disableAdSpoofing='true'` to disable); now off by default with a localStorage opt-IN (`twitchAdSolutions_disableAdSpoofing='false'` to re-enable). Rationale: convergent signals that the spoof's always-100%-watched + audible + visible beacon pattern (fires before a human would plausibly have watched the ad) may itself fingerprint as anomalous in Twitch's anti-adblock heuristics — silent fingerprinting that vaft's `GQL response status` surveillance line (which only catches loud rejections) cannot detect. Field signal: a Twitch ad overlay with countdown reached the user during an ad break on `warn` while spoofing was on, despite full vaft pod coverage and 100% Twitch acceptance of the spoof beacons — though the precise mechanism by which the spoof would drive overlay rendering is unverified (Twitch's player UI is driven by local m3u8 ad-cycle tracking, not GQL response — but a server-side coupling is plausible). Convergent with the TTV-AB maintainer's hypothesis. Mechanism retained intact: users who want to A/B test or explicitly opt in can set `twitchAdSolutions_disableAdSpoofing='false'`. vaft only (#NN)

## v68.2.0 (2026-05-21)

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ uBlock files have `twitch-videoad.js text/javascript` as line 1 (not valid JS

## Versions

Bump `@version` (userscript header) and `ourTwitchAdSolutionsVersion` together for functional changes. Current: vaft 68.2.0/83, video-swap-new 1.86/54, strip 1.9/26. Testing: vaft 651.0.0/651, video-swap-new -/619.
Bump `@version` (userscript header) and `ourTwitchAdSolutionsVersion` together for functional changes. Current: vaft 68.3.0/84, video-swap-new 1.86/54, strip 1.9/26. Testing: vaft 651.0.0/651, video-swap-new -/619.

## localStorage Config

Expand Down
2 changes: 1 addition & 1 deletion vaft/vaft-ublock-origin.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ twitch-videoad.js text/javascript
}
}
'use strict';
const ourTwitchAdSolutionsVersion = 83;// Used to prevent conflicts with outdated versions of the scripts
const ourTwitchAdSolutionsVersion = 84;// Used to prevent conflicts with outdated versions of the scripts
console.log('[AD DEBUG] TwitchAdSolutions vaft v' + ourTwitchAdSolutionsVersion + ' loading');
if (typeof window.twitchAdSolutionsVersion !== 'undefined' && window.twitchAdSolutionsVersion >= ourTwitchAdSolutionsVersion) {
console.log('[AD DEBUG] CONFLICT: vaft v' + ourTwitchAdSolutionsVersion + ' skipped — another script already active (v' + window.twitchAdSolutionsVersion + '). Remove duplicate scripts.');
Expand Down
4 changes: 2 additions & 2 deletions vaft/vaft.user.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// ==UserScript==
// @name TwitchAdSolutions (vaft)
// @namespace https://github.com/ryanbr/TwitchAdSolutions
// @version 68.2.0
// @version 68.3.0
// @description Multiple solutions for blocking Twitch ads (vaft)
// @updateURL https://github.com/ryanbr/TwitchAdSolutions/raw/master/vaft/vaft.user.js
// @downloadURL https://github.com/ryanbr/TwitchAdSolutions/raw/master/vaft/vaft.user.js
Expand Down Expand Up @@ -47,7 +47,7 @@
}
}
'use strict';
const ourTwitchAdSolutionsVersion = 83;// Used to prevent conflicts with outdated versions of the scripts
const ourTwitchAdSolutionsVersion = 84;// Used to prevent conflicts with outdated versions of the scripts
console.log('[AD DEBUG] TwitchAdSolutions vaft v' + ourTwitchAdSolutionsVersion + ' loading');
if (typeof window.twitchAdSolutionsVersion !== 'undefined' && window.twitchAdSolutionsVersion >= ourTwitchAdSolutionsVersion) {
console.log('[AD DEBUG] CONFLICT: vaft v' + ourTwitchAdSolutionsVersion + ' skipped — another script already active (v' + window.twitchAdSolutionsVersion + '). Remove duplicate scripts.');
Expand Down
Loading