Skip to content
bmuxBack

Browser extensions (experimental)

Extensions are installed separately in each bmux browser profile. Installation grants the extension its manifest permissions for that profile. Install only extensions you trust. They run in sandboxed extension contexts; websites do not receive the bmux API.

Use the Extensions button beside a pane’s profile icon to see extensions installed in the selected pane's profile. Use each row's toggle to enable or disable an extension. Click an enabled extension row to open its popup when one is provided. The info button within each row opens its description, version, ID, package location, and declared permissions, including site access and optional permissions. Back to extensions returns to the list. Removal lives in the details view's Danger zone and affects only the selected profile. The Plugins tab in the same view contains built-in tools and plugin toggles.

Disabled extensions stay installed and remain disabled after restarting bmux. Options in the details view opens the extension's own settings page when one is provided. These controls affect only the selected profile; removing an extension does not delete shared package files or another profile's installation. Extensions installed in another profile appear under "Available from other profiles". Choose "Enable" to load the same extension package in the selected profile. Each profile keeps its own extension storage and sign-in state.

Private sessions start without extensions. The Extensions panel lists packages already installed in regular profiles; enable any needed extension for that private session. Its extension storage and enabled choices stay in the temporary private partition and are discarded when the session closes. Regular profile extension settings are unchanged.

Open the command prompt and run extensions for the manager, or use individual commands below. You can bind the extensions action in keyboard settings.

Open the command prompt and run:

extension install-bitwarden
extension open Bitwarden
extension disable Bitwarden
extension enable Bitwarden
extension options Bitwarden

The installer downloads the official Bitwarden 2026.6.1 Chrome release from GitHub and verifies its pinned SHA-256 checksum before extraction. This is the last known-good release before a Bitwarden 2026.7–2026.8 WASM decryption regression that can leave a successfully synced vault empty. Sign in using Bitwarden's own popup. The extension manages its own vault session. Extension updates are manual in this prototype.

A 2026.10.0 preview is available separately from the stable installer. Prepare its checksum-verified official package with bmux's inline editor and passkey compatibility patches and a direct login popup route:

pnpm exec tsx scripts/prepare-bitwarden-preview.ts
bmux profile create bitwarden-preview
bmux extension load /absolute/path/printed/by/the/script --profile PROFILE_ID
bmux extension open Bitwarden --profile PROFILE_ID

Use the new profile ID returned by profile create. The preview keeps its own package, extension ID, storage, and sign-in; it does not change an existing profile or replace the stable package. Sign in manually and verify vault loading, unlock, inline autofill (including embedded login forms), New item, and passkeys before switching a working profile. The smoke test verifies login and worker ports for both releases, but cannot establish that a real account's vault decrypts.

The compatibility changes are maintained as a small downstream patch set in src/main/bitwarden-extension.ts. A full Bitwarden source fork is unnecessary for these changes. Each supported bundle is pinned by version and checksum; patching fails if its expected code changes. Keep 2026.6.1 as the default until manual vault verification succeeds. Hammerspoon automatic unlock also needs the preview's separate extension ID to be explicitly trusted before it can fill it.

After installation, reload existing login pages so the extension can inject its content scripts. Bitwarden provides the passkey UI; this does not add Chrome's phone QR chooser to Electron. Vault authentication and passkey signing require a manual check with your account; the automated smoke test stops at Bitwarden's email login screen and does not access a real vault. Bitwarden registers its passkey scripts only after an account is signed in. For the first manual check, sign in with email and master password, unlock the vault, reload the website, and choose that website's passkey sign-in option.

If the vault locks while a website still has Bitwarden's passkey hook, clicking passkey sign-in opens Bitwarden's unlock window. The current request rejects with NotAllowedError, allowing the website to offer its normal sign-in flow. Unlock Bitwarden and retry passkey sign-in. Background conditional autofill does not open a window. Startup checks and opening the unlock window each have a five-second bound and return an actionable error if the extension does not respond. Existing bmux-managed 2026.6.1 packages receive this compatibility patch when loaded.

Bitwarden's popup reconnects its memory-storage ports after a disconnect and retries interrupted reads once. This prevents a stale connection from leaving the vault stuck on Loading even though its items synced and decrypted. Reconnection also invalidates cached keys removed while disconnected, including on lock or logout. Writes are never replayed: an interrupted write reports an error so it can be retried explicitly. Requests time out rather than waiting indefinitely. These changes keep Bitwarden's original per-profile memory storage; they do not persist vault keys. Existing managed packages receive the patch when loaded by an updated bmux.

If the background process remains unavailable, disable and re-enable Bitwarden in the affected pane's profile, then reopen its popup. This retains its saved browser storage. Sign in or unlock that profile's vault and reload the login page.

For other unpacked extensions, use extension load /absolute/path. The directory must contain manifest.json and remain at that path between launches. Packaged CRX files are not supported. To remove an extension, use extension remove ID. Unloading stops the extension but retains its browser storage; reload open pages to remove scripts it has already injected.

Hanzisize 0.2.7 and 1.0.1 automatically apply the profile's saved language and minimum font size when permitted pages finish loading, including after a reload or browser restart. Open its popup once to choose the language and a nonzero size. Enabling it also applies those settings to pages already loaded in that profile. Its resize keyboard shortcut is not supported in bmux yet. Electron does not currently grant temporary host access for activeTab, so Hanzisize also needs explicit site patterns in its local manifest's permissions array (for example, https://*.facebook.com/*). Add only the sites you intend to allow, then disable and re-enable the extension in each profile to reload it.

The CLI exposes the same operations with an explicit profile:

bmux extension install-bitwarden --profile profile_default
bmux extension list --profile profile_default
bmux extension open Bitwarden --profile profile_default
bmux extension disable EXTENSION_ID --profile profile_default
bmux extension enable EXTENSION_ID --profile profile_default
bmux extension options EXTENSION_ID --profile profile_default
bmux extension remove EXTENSION_ID --profile profile_default

extension list reports installed extensions, their enabled state, available popup/options pages, and any restoration failures. Commands accept an extension ID, its full name, or an unambiguous leading name. Enable/disable/remove also accept the package path, including when the package can no longer be loaded. Loading successfully does not guarantee compatibility with all Chrome APIs. Optional permission requests are declined. Native desktop integration, biometrics, extension shortcuts, the side panel, and store updates are not implemented.

Compatibility and licensing #

The prototype uses electron-chrome-extensions 4.9.0 under GPL-3.0, with a pnpm patch for chrome.storage.session, event cleanup, and removal of API argument and result logging. Session storage is memory-only, scoped to each extension and profile, restricted to extension pages/workers, and cleared on unload or exit. It is never substituted with disk-backed storage.local.

The browser is distributed under GPL-3.0-only. The private website repository is outside this change. The previous MIT copyright and permission notice is retained in LICENSE-MIT.

References: Electron extension support, compatibility library, Bitwarden release.

The managed Bitwarden patches also return heuristic autofill rules immediately while the vault is locked or signed out. Resolving optional account feature flags first can stall page collection after a browser restart and hide the field icon needed to open the unlock window. Unlocked vaults retain their normal site rules when available. If the optional rule lookup stalls for 1.5 seconds or fails, field collection falls back to Bitwarden’s usual heuristics, including inside cross-origin login frames.

Edit on GitHub