leanmcp/superview.sh/posthog-adblock-bypass
- community
Checking that the SKILL.md file is still in the repository.
Configure a Next.js app using posthog-js so session recording and dead-click capture survive browser ad blockers. Aliases the three blocker-flagged JS chunks (dead-clicks-autocapture.js, recorder.js, posthog-recorder.js) to bland same-origin paths via Next.js rewrites, and monkey-patches HTMLScriptElement so posthog-js requests the aliases. TRIGGER when posthog-js session replay or dead-click capture is failing in production with ERR_BLOCKED_BY_CLIENT or 404s on /static/dead-clicks-autocapture.js / /static/recorder.js / /static/posthog-recorder.js, or when the user wants to bypass ad blockers for these specific assets. Works alongside an existing PostHog reverse proxy (managed or otherwise) — only the three blocked files divert through Next.js, all other PostHog traffic stays on the original api_host. SKIP for unrelated PostHog setup, non-Next.js apps, or when capture/decide endpoints (/e/, /decide/, /array/*/config.js) are the ones being blocked — those need a different treatment.
Install
npx vskill@latest install leanmcp/superview.sh/posthog-adblock-bypassSKILL.md
PostHog ad-blocker bypass for Next.js
When to use this
The user has posthog-js working mostly — events, feature flags, decide, config all reach PostHog fine — but session recording and/or dead-click capture aren't working, and DevTools shows:
/static/dead-clicks-autocapture.jsfailing/static/recorder.jsor/static/posthog-recorder.jsfailingERR_BLOCKED_BY_CLIENTor a synthesized 404 (the file actually returns 200 viacurl)
Root cause: ad blockers (uBlock Origin / Brave Shields / AdBlock Plus / EasyPrivacy) match on filename patterns (recorder, autocapture, dead-clicks) regardless of host. A reverse proxy alone doesn't help — renaming on a different host still trips the same filter. Confirmation step: ask the user to disable their ad blocker on the page; if the requests succeed, this skill applies.
This skill applies the surgical fix: only those three files divert through the Next.js app under bland filenames. All other PostHog traffic (events, decide, config, recording uploads) keeps using the existing api_host.
Prerequisites to confirm before implementing
- The project is Next.js (App Router or Pages Router both fine) with
posthog-jsfrom npm. - Server-side:
curl -I https://<api_host>/static/dead-clicks-autocapture.js?v=1.xreturns 200. If it returns 404, the upstream proxy is misconfigured — fix that first, this skill won't help. - Identify the PostHog cloud region: US (
us-assets.i.posthog.com) or EU (eu-assets.i.posthog.com). Default to US if unclear, but ask. - Locate the existing
posthog.init(...)call (commonlysrc/lib/posthog.ts, a provider component, orapp/layout.tsx). Note the file so you can hook the rewriter before init. - Session replay must be enabled in the PostHog project dashboard (Settings → Project → Session replay → "Record user sessions"). If it's off, posthog-js never even tries to load the recorder, so this skill produces no visible effect. Surface this check to the user.
Implementation — three changes
1. Add rewrites to next.config.{ts,js,mjs}
Insert a rewrites() block. Use /_p/ as the alias prefix (or any path that doesn't contain words like recorder, analytics, tracking, posthog).
Why all three: posthog-js renamed the recorder chunk across versions. Covering both recorder.js and posthog-recorder.js makes the skill version-resilient. Rewrites preserve the ?v=1.x.y query string automatically and incur no Node overhead.
If the project already has a rewrites() or redirects() block, merge rather than replace.
2. Create the script-tag rewriter
New file at src/lib/posthog-rewrite-loader.ts (adjust path to match the repo's lib convention):
Notes:
- The
__phRewriteInstalledflag is required because Next.js dev HMR can re-execute modules andObject.definePropertywould otherwise throw. - Stripping the host (replacing the entire URL with
/_p/dc.js?v=...) makes the request same-origin, avoiding a CORS preflight on top of the blocker bypass. - The patcher targets the
srcproperty setter on the prototype — posthog-js loads chunks by settingscript.src, so this catches them. It does not catchfetch()or dynamicimport()(not used by posthog-js for these chunks today, but worth noting if a future SDK version changes).
3. Wire the rewriter to run before posthog.init
The patcher must be installed before any posthog.init call. Module-level code in the same file as posthog.init works because module evaluation precedes useEffect:
If posthog.init is called from <Script strategy="beforeInteractive"> in app/layout.tsx instead of from a client module, put the patcher in its own <Script strategy="beforeInteractive"> block placed above the PostHog one. Don't use afterInteractive — by then posthog may have already started loading chunks.
Verification
- Server side — after deploy:
``bash curl -I "https://<your-domain>/_p/dc.js?v=1.0" curl -I "https://<your-domain>/_p/r2.js?v=1.0" ` Both should return 200, content-type: text/javascript. If 404, the rewrite isn't picked up — Next.js needs a rebuild after next.config` changes.
- Browser with ad blocker enabled — in DevTools Network:
- Requests to
/_p/dc.jsand/_p/r2.jssucceed (200). - No
/static/dead-clicks-autocapture.jsor/static/posthog-recorder.jsrequests visible. - In uBlock Origin's Logger,
/_p/*entries should show--(allowed), not red.
- PostHog dashboard:
- Live Events shows dead-click events firing.
- Session replay shows recordings (allow ~5 min for ingestion).
- If recordings still don't appear, the issue is likely the dashboard toggle (Settings → Session replay), not this skill.
Common follow-ups and pitfalls
- "It still doesn't work after deploy" — rewrites only take effect after
next build. Local dev needsnpm run devrestart. Production needs a redeploy. - "A different chunk is now blocked" — surveys, web-vitals, exception-autocapture. Add a fourth rewrite + a fourth regex entry. Pattern is identical.
- "Capture endpoints are also blocked" —
/e/,/decide/,/array/*/config.jsgetting blocked is a different problem (host-level rather than filename-level). Solve with a PostHog reverse proxy on the user's own domain, not this skill. PostHog's docs cover that. - "Want to proxy everything through Next.js instead" — possible but discouraged. Session recording is high-volume (kilobytes per second per active user); routing through Next.js multiplies function invocations 10–100×. The PostHog-managed proxy is purpose-built for this load. Use full-proxy only if you have a hard CSP/compliance requirement.
- SDK upgrades — if posthog-js renames a chunk in a future version, the rewriter silently misses it. After upgrades, watch DevTools Network for any
/static/*.jsrequest leaking through and add a regex entry. - Network-level blockers (Pi-hole / NextDNS) blocking by domain are not bypassed by this. They're a much smaller cohort than browser extensions and your own domain isn't on their lists.
Files modified summary (template for the PR description)
| File | Change | |
|---|---|---|
next.config.{ts,js} | Add rewrites() for /_p/dc.js, /_p/r.js, /_p/r2.js | |
src/lib/posthog-rewrite-loader.ts | New — patches HTMLScriptElement.prototype.src | |
src/lib/posthog.ts (or equivalent) | Call installPostHogScriptRewriter() at module load |
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/posthog-adblock-bypass/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/leanmcp/superview.sh/posthog-adblock-bypass)