forked from 7778777.online/tags

Files
README.md

Tags #

Privately tag accounts and see your tags next to them — everywhere Impro would show a moderation label (profile header, feed/thread posts, quoted posts, DM info panel).

How it's private #

Tags are stored via the plugin SDK's loadData()/saveData() — private, per-account storage that syncs automatically across every device signed into your account. It round-trips through your account's own AT-Proto preferences record rather than a public PDS record, so it's readable only by clients authenticated as you, and needs no manifest permission.

(Earlier versions of this plugin stored tags as HMAC-keyed public PDS records instead, with a per-device secret "key" you had to copy to each device by hand. That approach never made it into the official impro-plugin SDK and has been dropped entirely — loadData/saveData already gives cross-device sync for free, with no key to manage and nothing ever written to a public repo.)

Usage #

  • On any profile or post, use the "..." menu → Edit tags. Add or remove tags for that account, pick an icon for any new one, and Save.
  • Each tag shows up as a badge (default icon tag-line, or whatever icon you've set) wherever Impro would show a moderation label.
  • Click a badge — or use Browse by tag in the plugin's settings — to see everyone tagged with it, with Edit and Remove actions per account.
  • Every tag can have its own icon and description, editable from either place (a tag's row in "Edit tags", or its browse view). The description shows as a hover tooltip on the badge — handy when the icon alone doesn't say enough, or the tag text itself is a short abbreviation (see below). Picking an icon opens a searchable picker covering the app's full icon set, each option shown with its actual glyph rather than just its name — or paste an emoji into the picker's text field to use that instead. An emoji's display name (e.g. "Fire", "Red Heart") is fetched lazily the first time you open a picker, rather than shipped with the plugin — until that resolves, or if it fails, the picker just shows "Emoji".

Export / import #

Settings → Export / import tags shows your tags, descriptions, and icons as a JSON blob you can select and copy — to back them up, or move them to another account. Paste that same blob back into the Import box and choose:

  • Merge — unions each account's tags with whatever's already there; only fills in a description/icon for tags that don't already have one, so your current edits always win over the import on conflict.
  • Replace all — wipes current tag data and replaces it wholesale with the import. Useful for restoring from a backup if sync ever breaks.

Migrate a list to tags #

Settings → Migrate a list to tags bulk-tags every member of one of your own Bluesky lists in a single action: pick a list, adjust the auto-abbreviated tag text and icon if you like, and confirm. The tag is merged into each member's existing tags, never replacing them. The list's name — plus its own description, if it has one — becomes that tag's description automatically, unless you've already set one by hand; a later migration into an already-customized tag never overwrites your edits.

Your own lists are read from Bluesky's public AppView (public.api.bsky.app). List membership, though, is read from Constellation, a network-wide backlink indexer, rather than the AppView's own getList — getList is a hydrated view that can quietly omit some members depending on the relationship between the list owner and a member, where Constellation just indexes "this record exists and references this list" with no filtering, so a migration always picks up every member.

Requirements #

Refreshing a tag's account list after an edit, and the icon picker's own live updates, rely on Modal.update() — updating a modal's content in place instead of closing and reopening it. That method isn't in a published impro-plugin release yet, so package.json points at the local impro/impro-plugin source (file:../impro/impro-plugin) rather than a published version. Switch it back to a real published version once a release containing Modal.update() ships.

manifest.json requests three permissions.fetch entries, granted once at install: public.api.bsky.app for reading your own lists, constellation.microcosm.blue for reading a list's actual membership (see "Migrate a list to tags"), and a version-pinned jsdelivr URL for the emoji display-name lookup above — all public, read-only data, fetched straight from the plugin sandbox, not proxied through Impro's own servers.

Local development #

See ../impro/plugins.md for the general workflow. In short:

npm install
npm start   # watches src/main.js and rebuilds main.js

main.js is symlinked into impro/plugins-local/, so changes appear after a page reload in a locally running Impro instance.