A non-custodial wallet for Dusk. Chrome and Firefox extension builds from one codebase.
Your keys. Your DUSK. No middleman.
🔐 Self-custody — Your mnemonic never leaves your device. Encrypted at rest.
⚡ Public & Shielded — Send from your public account or shield funds for privacy.
🌐 dApp Ready — Connect to any Dusk dApp through event-based provider discovery.
🔄 Multi-network — Switch between mainnet, testnet, devnet, or custom nodes.
🧩 Shared runtime — Extension targets share the same wallet engine and UI shell.
From a fresh checkout:
npm install
npm run build:chromeThen load dist/ as an unpacked extension in chrome://extensions (Developer mode).
From a fresh checkout:
npm install
npm run build:firefoxThen load dist-firefox/ as a temporary add-on in about:debugging.
The extension announces an EIP-1193-style provider through Dusk discovery events. Dusk isn't EVM, but the provider patterns are familiar.
const providers = [];
window.addEventListener("dusk:announceProvider", (event) => {
providers.push(event.detail);
});
window.dispatchEvent(new Event("dusk:requestProvider"));
const dusk = providers[0]?.provider;
const [account] = await dusk.request({ method: "dusk_requestAccounts" });
dusk.on("accountsChanged", console.log);
dusk.on("chainChanged", console.log);Full API reference: docs/provider-api.md
src/
├── background/ # Extension service worker
├── ui/ # Popup, full view, notifications
├── shared/ # Wallet logic (works everywhere)
├── platform/ # Platform abstraction (extension vs tauri)
└── wallet/ # Engine interface
The wallet engine runs in an offscreen document for extension builds. The shared runtime is structured so other hosts can reuse the same cryptographic core.
Additional documentation:
npm run build:extension # Build extension → dist/
npm run build:firefox # Build Firefox extension → dist-firefox/
# Local Rusk node (Docker)
npm run rusk:up
npm run rusk:wait
# UI component workbench
npm run storybook
# E2E (Playwright + Docker Rusk)
npm run e2e:rusk- Mnemonic encrypted with user password (PBKDF2 + AES-GCM)
- No analytics, no tracking, no remote calls except to your chosen node
MIT
