- JavaScript 100%
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.