Pick where the ethical layer can observe navigation / ad slots and apply block / blur / allow_log (taxonomy-v1.md) with enough context for a “why” panel.
| Surface | Android | iOS | DOM / blur UX | Reach | Store / review notes |
|---|---|---|---|---|---|
In-app WebView (WebView, WKWebView) |
Yes | Yes | Full (hide/blur nodes, overlays) | Only URLs opened inside the app’s WebView | Standard app review; clearest fit for Mischief Manager v1. |
| Thin native shell + WebView (e.g. Capacitor, Cordova, custom Activity hosting WebView) | Yes | Yes | Full (same as above) | Packaged app; same scope as WebView | Common pattern for shipping a Vite/React bundle inside mobile. |
| Chrome extension (MV3) | N/A (desktop Chrome) | N/A | Strong on desktop web (declarativeNetRequest, content scripts) |
Desktop web only unless user uses Chrome on Android with extensions (limited) | Separate SKU, separate review track; good Phase 2 for desktop. |
| Safari Web Extension + Content Blockers | N/A | Partial | Block rules yes; rich blur harder than WebView | Safari only | Extra spike; Apple-specific constraints. |
| Trusted Web Activity / Custom Tabs | TWA opens Chrome; Custom Tabs | N/A / SFSafariViewController | No reliable DOM control in the system browser | Broad web | Poor fit for blur/explainability; optional deep-link target only. |
reactSetup/ is a Vite + React web app. It does not by itself get WKWebView / Android WebView APIs—that requires a wrapper (Capacitor, React Native WebView screen, or minimal native host).
suslink-integration-spike.md).CAT-xx + tier.WKWebView loads the bundle and injects a content bridge for tier actions.