Plume

Post to your IndieWeb blog from any page โ€” toolbar composer or right-click capture. Cross-browser, multi-account, no telemetry.

Capture from anywhere you read

Plume lives in the toolbar and in the right-click menu. Every kind of post the IndieWeb knows about โ€” notes, articles, bookmarks, replies, likes, reposts, quotes, photos โ€” is one click away.

Plume's toolbar popup with a composed note, tags, and syndication chips

Quick composer

Click the toolbar feather. Type. Pick tags. Choose where to syndicate. Post. The whole loop takes ~5 seconds and never leaves the page you were reading.

Plume's bookmark composer pre-filled with a URL and title from a context-menu click

Right-click to bookmark, reply, quote, like

Right-click any page, link, image, or text selection. Plume opens with the right fields pre-filled โ€” URL of what you're bookmarking, page title, the passage you highlighted as a Markdown blockquote with citation.

Plume's options page showing multiple accounts, a retry queue, and draft posts

Drafts, retry queue, multi-account

Auto-save while you write โ€” drafts survive across popup closes. Posts that hit a network blip get queued and retried in the background with exponential backoff. Connect multiple Micropub blogs and switch between them.

Plume's composer showing the successful post confirmation toast

Posted, with a link back

When the server confirms, Plume shows you the URL of your new post and closes. Your content lands on your blog with whatever syndication targets and metadata you chose โ€” exactly as if you'd posted from the admin UI.

What's inside

Everything Plume does runs in your browser. No analytics, no telemetry, no third-party hosts. The only network requests Plume makes are to the Micropub endpoints you connect.

๐Ÿ” IndieAuth + PKCE

Standards-compliant OAuth via chrome.identity.launchWebAuthFlow. Tokens stay on your device.

๐Ÿชถ Multi-account

Connect more than one Micropub blog. Switch the active account; each keeps its own drafts and queue.

๐Ÿ’พ Draft autosave

Per-target drafts auto-save 1 second after each keystroke. Restored on next popup open. 7-day expiry.

๐Ÿ” Retry queue

Network outage? Server hiccup? Plume queues failed posts and retries with backoff (30s โ†’ 24h). Badge shows queue depth.

๐ŸŽฏ Narrow permissions

Install asks for nothing broad. Host permissions are requested per-account, only when you actually connect a blog.

๐Ÿงฉ Server-aware

Plume reads ?q=config, ?q=post-types, and ?q=category from your blog. Caches 24h.

๐Ÿค– AI metadata

Optional per-post fields disclosing AI involvement (level, tools, description). Works with any extension-aware Micropub server.

๐Ÿ“ Markdown authoring

Toolbar with bold, italic, link, list, quote, code, heading. Optional live preview pane with sanitized rendering (snarkdown + DOMPurify, lazy-loaded).

โ†— Pop-out composer

Toolbar popup is sized for quick notes. Click the pop-out arrow to open the same composer in a tab at desk-width for long-form articles.

โŒจ Keyboard shortcut

Alt+Shift+P opens the composer from any page. Rebindable via the browser's extension-shortcuts settings.

๐ŸŒ Cross-browser

One codebase, Chrome + Firefox manifests. Built on WXT + Preact + TypeScript.

For IndieAuth servers

This page is Plume's IndieAuth client_id URL. When the extension initiates authentication, your IndieAuth server fetches this URL and reads the <link rel="redirect_uri"> entries in the <head> to verify the OAuth callback. Three patterns are declared:

  • https://hcphdjeoolimpjjekegpobkhoealiige.chromiumapp.org/ โ€” pinned Chrome extension ID (assigned by the Chrome Web Store at first upload). The same ID is used by unpacked dev installs because wxt.config.ts embeds the CWS public key as manifest.key in development mode — dev and prod share one ID.
  • https://*.chromiumapp.org/ โ€” wildcard fallback for unpacked dev installs that don't embed the CWS public key
  • https://*.extensions.allizom.org/ โ€” Firefox addon callback (UUID is per-install, can't be pinned)

Indiekit servers running @rmdes/indiekit-endpoint-auth 1.0.0-beta.31 or later support fetching this URL and matching wildcards. Other IndieAuth servers may need to implement redirect URL discovery similarly.

On the AI transparency convention

Plume ships with an opt-in panel for the AI transparency metadata convention defined by Ricardo Mendes at Adding AI usage metadata to posts. The convention proposes four mf2 properties on h-entry posts: ai-text-level (0โ€“3), ai-code-level (0โ€“2), ai-tools, and ai-description. This isn't (yet) a Micropub or IndieWeb specification — it's a working convention with a reference server implementation in @rmdes/indiekit-endpoint-posts and a reference client implementation in Plume.

Plume auto-detects support by scanning the Micropub server's ?q=post-types response and matching known extension property names against each post type's properties[] array. This uses only spec-defined Micropub surface (properties[] on ?q=post-types entries is documented to list the mf2 fields a post type accepts), so any Micropub server that advertises the AI metadata fields the standard way will work with Plume automatically — no vendor-specific discovery field required. When the server advertises the required properties, the options page shows a "โœ“ Server supports" badge next to the extension toggle; users still opt in explicitly per account.