features
pass integrationReplaces browserpass via a Rust native host. Walks ~/.password-store, autofills active-tab login forms, copies user / pw / OTP with 45 s clipboard auto-clear (matches pass -c). React/Vue/Lit-safe autofill.Range connections to beat single-stream throughput, with retry / resume, Chrome cookies + User-Agent forwarded for logged-in URLs. Live queue UI, right-click Download with zpwrchrome. Pure-Rust, ureq + rustls, no aria2 binary.citation_* / Dublin Core / Open Graph / schema.org JSON-LD) into CSL-JSON; the native host's zcite.save drops it into the zcite reference manager's inbox. The Zotero-Connector role — handed off as a plain file, no link to the proprietary engine.chrome://extensions/shortcuts.install (unpacked)
git clone https://github.com/MenkeTechnologies/zpwrchrome.git- Open
chrome://extensionsand enable Developer mode - Click Load unpacked, pick the cloned directory
- For
pass, downloads, and screenshots, install the native host from crates.io and register it for this extension:cargo install zpwrchrome-host && zpwrchrome-host --install <ext-id>. Get the ext-id atchrome://extensions(Developer mode).passsupport also requires GPG configured locally. - Open
chrome://extensions/shortcutsto bind any of the 51 user-configurable commands (incl.pass-fill,pass-fill-profile,pass-fill-cc,pass-copy-pw,pass-copy-otp,dl-paste-url,dl-show-queue) - Optional: Load unpacked the
theme/subdirectory for the matching browser theme
keyboard commands
Chrome caps default-suggested shortcuts at 4. The remaining 51 commands are bound by the user
in chrome://extensions/shortcuts.
| command | default | description |
|---|---|---|
_execute_action |
Alt+T | Open zpwrchrome popup |
switch-previous-tab |
Ctrl+E | Switch to the previously active tab (MRU) |
restore-last-closed |
user-set | Restore the most recently closed tab |
recent-modal |
user-set | Open the recent-tabs popup (same as Alt+T — user-bindable) |
open-history |
Ctrl+Y | Open the popup focused on the History category (fzf-search browsing history) |
search-tabs |
user-set | Open popup focused on the tab search box |
mru-next |
user-set | Cycle forward through MRU stack |
mru-prev |
user-set | Cycle backward through MRU stack |
jump-to-1 |
user-set | Jump to tab #1 in current window |
jump-to-2 |
user-set | Jump to tab #2 in current window |
jump-to-3 |
user-set | Jump to tab #3 in current window |
jump-to-4 |
user-set | Jump to tab #4 in current window |
jump-to-5 |
user-set | Jump to tab #5 in current window |
jump-to-6 |
user-set | Jump to tab #6 in current window |
jump-to-7 |
user-set | Jump to tab #7 in current window |
jump-to-8 |
user-set | Jump to tab #8 in current window |
jump-to-9 |
user-set | Jump to last tab in current window |
duplicate-tab |
user-set | Duplicate the active tab |
pin-tab |
user-set | Toggle pin on the active tab |
mute-tab |
user-set | Toggle mute on the active tab |
move-to-new-window |
user-set | Detach active tab to a new window |
close-others |
user-set | Close all other tabs in current window |
close-right |
user-set | Close all tabs to the right of the active tab |
close-duplicates |
user-set | Close tabs with duplicate URLs (keeps leftmost) |
reload-all |
user-set | Reload every tab in current window |
sort-by-url |
user-set | Sort tabs in current window by URL |
group-by-domain |
user-set | Group tabs in current window by domain (Chrome tab groups) |
copy-url |
user-set | Copy active tab URL to clipboard |
copy-title-md |
user-set | Copy active tab as Markdown link |
bookmark-tab |
user-set | Bookmark active tab to Other Bookmarks |
open-dashboard |
user-set | Open the zpwrchrome dashboard — a searchable tile grid of every tool, settings page and info screen |
manage-scripts |
user-set | Open the userscript manager (Tampermonkey-style) |
save-scene-prompt |
user-set | Open popup focused on save-scene input |
restore-scene-1 |
user-set | Restore scene #1 (newest) — opens a new window with saved tabs |
restore-scene-2 |
user-set | Restore scene #2 |
restore-scene-3 |
user-set | Restore scene #3 |
restore-scene-4 |
user-set | Restore scene #4 |
restore-scene-5 |
user-set | Restore scene #5 |
pass-open-popup |
user-set | Open popup focused on the PASS category (matches credentials for the active tab from ~/.password-store via the zpwrchrome native host) |
pass-fill |
Ctrl+Shift+L | Autofill the best-matching `pass` credential into the active tab's login form (requires the native host) — customize at chrome://extensions/shortcuts |
pass-copy-pw |
user-set | Copy the best-matching `pass` password for the active tab to the clipboard (auto-clears after 45 s) |
pass-copy-user |
user-set | Copy the best-matching `pass` username for the active tab to the clipboard |
pass-copy-otp |
user-set | Copy the TOTP code for the best-matching `pass` entry to the clipboard |
pass-open-url |
user-set | Navigate the active tab to the URL stored in the best-matching `pass` entry (parses url/link/website/web/site keys) |
pass-fill-identity |
user-set | Fill whatever identity fields the active tab has — login (username/password), profile (name/address/email/phone/…) AND credit-card (cc-number/cc-exp/cc-csc/cardholder/…) in one keystroke. Picks the best-matching profile/* and creditcard/* entries plus a host-matched login entry (picker if multiple, last-used cached per host). |
pass-fill-profile |
user-set | Fill profile fields only (name, address, email, phone, …) on the active tab from a `profile/*` entry in `pass`. Quick-pick overlay when multiple profiles exist. |
pass-fill-cc |
user-set | Fill credit-card fields only (cc-number, cc-exp, cc-csc, cardholder, …) on the active tab from a `creditcard/*` entry in `pass`. Quick-pick overlay when multiple cards exist. |
find-in-all-tabs |
user-set | Full-text search across every open tab — opens a search UI, scrapes innerText from every http(s) tab in parallel, fuzzy-filters as you type, Enter activates the chosen tab and scrolls to the match (no DevTools required) |
lights-off |
user-set | Turn off the lights — dim the entire active page with a near-black overlay while lifting any video elements above it (cinema-mode for YouTube and beyond). Click the overlay or press Esc to undim |
reader-mode |
user-set | Reader mode — strip the active page to its main article and render it in a strykelang HUD overlay with adjustable typography. Click × in the top bar or press Esc to close |
screenshot-full-page |
user-set | Full-page screenshot — scrolls the active tab in viewport-sized steps and stitches into one PNG (no extra permissions required; customize at chrome://extensions/shortcuts) |
dl-paste-url |
user-set | Download the URL currently on the clipboard via the zpwrchrome segmented downloader |
dl-show-queue |
user-set | Open the zpwrchrome download manager queue view |
dl-pause-all |
user-set | Pause every active download in the zpwrchrome download manager |
dl-resume-all |
user-set | Resume every paused download in the zpwrchrome download manager |
popup categories
The toolbar popup (popup.html / popup.css / popup.js)
renders 12 categories, each fzf-scored against
tab title + host. Jump straight to a category with Cmd+1..Cmd+0
(the digit shown beside each row); Cmd+P and Cmd+K jump to the
Pass and Tech categories. Type to fuzzy-filter, ↑/↓ to move,
Enter to activate, Del to close/forget the highlighted row.
how it works
zpwrchrome is a Manifest V3 extension. The service worker
(background.js) tracks tab activation across every window in
chrome.storage.session so the MRU stack survives service-worker
restarts, dispatches the 55 keyboard commands, answers the
19 message kinds the popup / modal / managers send,
registers userscripts, and bridges to the native host for pass and
segmented downloads.
On-page features ship as content scripts rather than DevTools panels:
a page-theme injector (modal/cyber-theme.js) paints
arbitrary pages with the HUD palette at document_start;
reader mode (modal/reader-mode.js) extracts the main
article into a sanitized overlay; Turn Off the Lights
(modal/lights-off.js) dims the page while lifting <video>
elements above the overlay; a JSON viewer
(modal/json-viewer.js) and XML viewer
(modal/xml-viewer.js) replace raw structured-data pages with
collapsible trees (RFC 6901 pointer / XPath copy). The
find-in-all-tabs page scrapes innerText from every
open http(s) tab in parallel (capped at 200 KB / tab) and fuzzy-filters
across them, scrolling the chosen tab to the match via window.find().
Pure helpers live in lib/util.js and lib/fzf.js with zero
chrome.* references, so they unit-test headless in plain Node and can be
inlined into the shadow-DOM modal by scripts/build-modal.mjs. The fzf
scorer matches the constants used across the MenkeTechnologies tools (boundary 9,
camel 7, gap-start −3, match 16).
native host (zpwrchrome-host)
pass, GPG, and segmented downloads can't run inside an MV3 service
worker, so a small Rust binary handles them over Chrome native messaging
(length-prefixed JSON on stdio). It is a strict 1:1 port of
browserpass-native v3.1.2 with six additive Rust tool families
layered on top — matched before the ported upstream switch, so a stock
browserpass client still gets byte-identical upstream behavior.
Install and register it for your extension ID:
cargo install zpwrchrome-hostzpwrchrome-host --install <ext-id>— writes the native-messaging manifest (host namecom.menketechnologies.zpwrchrome) into every detected Chromium-family browser config dir on macOS/Linux. Find the ext-id atchrome://extensions(Developer mode).zpwrchrome-host --version/-V— print version and exit.-vlogs verbosely to stderr.--help/-hprints usage.
With no flags the host reads one framed JSON request on stdin, dispatches it, and
exits — one process per request, mirroring upstream. It handles the upstream
browserpass actions configure, list, tree,
fetch, save, delete, echo; the six
additive tool families — otp, search,
host.crawl / host.exec (via zwire_host::api),
run.spawn, and zcite.save; and the download-manager
actions dl.add / dl.list / dl.pause /
dl.resume / dl.cancel / dl.remove /
dl.clear / dl.openDir / dl.openFile /
dl.writeFile / dl.writeFileChunk. Downloads run in
detached worker processes (--dl-worker <gid>,
one per download) that setsid away from the parent, fetch N parallel
Range segments with ureq + rustls (no
aria2 binary), and persist authoritative state under
~/.cache/zpwrchrome/dl/ so the queue survives browser restarts.
pass support also requires GPG configured locally.
userscripts (Tampermonkey-equivalent)
The userscript engine (lib/userscript.js + lib/gm-shim.js)
runs scripts in Chrome's native USER_SCRIPT world via
chrome.userScripts. It parses the // ==UserScript== metadata
block (@match / @include / @exclude,
@run-at, @name, …), validates match patterns, and exposes a
Greasemonkey-style API. Manage, edit, enable/disable, and watch the injection fire-log
in the dashboard at scripts-manager/manager.html (open with the
manage-scripts command). Supported GM calls:
Each is also available in promise form (GM.getValue, GM.setValue,
…). Per-script values are stored in an isolated chrome.storage.local bag,
keyed by script, and dropped when the script is deleted.
permissions
19 permissions are declared in manifest.json.
tests/static.test.js enforces that every declared permission is actually
referenced in background.js or popup.js — no dead
permissions ship.
configuration & storage
No options file and no build step — runtime state lives in
chrome.storage. chrome.storage.session holds the cross-window
MRU stack (survives service-worker restart, cleared on browser restart);
chrome.storage.local holds scenes, installed userscripts, per-script GM
bags, the userscript fire-log ring buffer, download settings / rules / queue snapshot,
page-theme injector knobs, ModHeader profiles, and pass settings. Browsing history and
recently-closed tabs come from the Chrome-managed chrome.history and
chrome.sessions APIs. The download host keeps its own authoritative state
on disk under ~/.cache/zpwrchrome/dl/.
troubleshooting
-
pass / downloads do nothing
The native host isn't registered. Run
cargo install zpwrchrome-host && zpwrchrome-host --install <ext-id>with your extension's ID (fromchrome://extensions, Developer mode), then restart the browser. Chrome reports "Native host has exited" when the manifest is missing or points at a stale binary path. -
pass entries don't decrypt
passsupport needs GPG configured locally — the host shells out to your GPG agent to decrypt~/.password-store/*.gpg. Verifypass show <entry>works in a terminal first. -
only 4 commands have default shortcuts
Chrome MV3 caps default-suggested keys at 4. Bind any of the remaining
51 commands yourself at
chrome://extensions/shortcuts. -
a shortcut doesn't fire
The key is reserved by the OS or another extension, or collides with an existing
binding. Pick a different chord at
chrome://extensions/shortcuts. - downloads behind a login fail The host forwards Chrome cookies + User-Agent on every request; if a URL still 401/403s, the session cookie may have expired — reload the source page so Chrome refreshes the cookie, then retry the download.
companion theme
The theme/ directory ships a separate Chrome theme that paints the
browser frame, toolbar, and new-tab page with the same cyberpunk palette
(#05050a bg / #05d9e8 cyan / #ff2a6d accent).
Themes cannot be bundled with action extensions, so load it as its own
unpacked extension.