🕷️ cobweb
a frozen popup, and one part that isn't: real Follow→Block on bsky.app.
manifest v3 popup: zero permissions content script: zero fetch zip hosted as a data: URI

skyclone is a live, goth-mode unofficial bsky.app — real AppView data, threaded replies, a spider that crawls your screen on a new notification, a witch button that curses a post out of existence.

cobweb started as the opposite of that on purpose — a popup whose whole timeline is a const DATA = [...] array, no fetch, no network tab activity at all. That part's still here below.

But the actual ask was a second thing: a plugin that runs on the real bsky.app and turns every Follow button into a genuine Block button — for real, not a curse. So cobweb now ships a content script that does exactly that: it watches the live page, relabels Follow buttons red, and on click drives bsky.app's own "•••" → Block account → confirm flow itself. No API calls, no token of its own — it just clicks the buttons the real site already drew, using your already-logged-in session. Still zero fetch in this extension, ever.

↑ the frozen popup, live-embedded
⬇ Chrome / Edge / Brave (.zip) ⬇ Firefox (.zip) 🕸️ share on Bluesky ↩ back to live skyclone

Both buttons above download a data:application/zip;base64,… URI — the zip bytes are a literal string sitting in this page's HTML, not a file the server hosts separately. View source and you can see the whole plugin as one long data literal.

install it (load unpacked)

  1. Download the zip for your browser above, then unzip it.
  2. Chrome / Edge / Brave / Opera: go to chrome://extensions, turn on Developer mode (top right), click Load unpacked, and pick the unzipped folder.
  3. Firefox: go to about:debugging#/runtime/this-firefox, click Load Temporary Add-on, and pick manifest.json inside the unzipped folder. (Permanent install needs it signed by Mozilla — this is the developer/temporary path.)
  4. Safari: Safari doesn't load unpacked web extensions directly. Run Apple's xcrun safari-web-extension-converter on the unzipped Chrome folder, then build the generated Xcode project and enable it in Safari's Extensions settings.
  5. Click the toolbar spider for the frozen popup. Then go to the real bsky.app and look at any profile's Follow button.

what's actually in the zip

You can also read the source straight from the browser first: popup.js · content.js · manifest.json.

why bother

This started from "build another that serves this from a data literal as a browser plugin" and got read as "freeze skyclone into a popup" — close, but the actual ask was that the Follow→Block plugin itself should be hosted as a data literal, and that the plugin should work for real on the real bsky.app. Both are true now: the download above is a data: URI literal, not a hosted file, and the content script performs an honest block through Bluesky's real UI — no curse, no jar of pinned flies, an actual write to your actual account. The popup stays as the original bit of goth theater; the content script is the part that isn't kidding.