Zucchini Wallet
A self custody zcash browser wallet extension.
Created on 3rd December 2025
•
Zucchini Wallet
A self custody zcash browser wallet extension.
The problem Zucchini Wallet solves





The Zucchini Wallet Extension addresses the common frustrations faced by Zcash users who need a seamless, browser-based way to manage their ZEC assets without compromising on privacy or usability.
Many Zcash enthusiasts struggle with the lack of dedicated browser extensions for Zcash wallets—relying instead on mobile apps, desktop clients, or built-in browser features like Brave Wallet that offer limited Zcash-specific functionality. This often leads to clunky workflows, especially for tasks like testing on the Zcash testnet, where support is inconsistent across wallets (e.g., YWallet may not fully support testnet, and others require complex setups). Additionally, syncing issues plague many existing Zcash wallets, with users reporting hours or even days of delays due to shielded transaction backlogs, network load, or inefficient data handling.
Zucchini solves these by providing:
- Instant access in your browser sidebar: Persist your wallet across tabs without obstructing your workflow, making it easier to send, receive, and swap ZEC on the go.
- Built-in testnet support: Seamlessly switch to testnet for development and experimentation, avoiding the pitfalls of wallets that lack this feature or require manual configurations.
- Fast, reliable syncing: Leverage optimized light-client technology to sync in minutes, not hours, even for shielded balances—bypassing common "data pileup" problems in other wallets.
- Effortless shielded address generation: Create privacy-focused z-addresses tied directly to your wallet using integrated tools inspired by Rust crates like
zcash_client_backend
and JS SDKs, without needing external repos or coding knowledge. - Secure cross-currency swaps: Swap ZEC to any other currency (or vice versa) directly within the extension, enhancing safety by keeping everything self-custodial and reducing exposure to centralized exchanges.



Whether you're a developer testing shielded transactions, a privacy advocate managing daily ZEC use, or someone tired of slow syncing and fragmented tools, Zucchini makes Zcash more accessible, faster, and safer right from your browser.

Challenges I ran into
Building a fully functional, non-custodial Zcash wallet extension in the browser came with several significant technical hurdles:
- WASM & Manifest V3 Compatibility
One of the biggest challenges was integrating the Zcash Rust libraries (librustzcash) into a Manifest V3 extension. MV3 enforces a strict Content Security Policy (CSP) that disallows remote code and restricts how WASM is loaded.
Hurdle: Getting the WASM binary to load correctly within the service worker and UI contexts without violating CSP.
Solution: We utilized WXT and Vite with specific plugins (vite-plugin-wasm, vite-plugin-top-level-await) to bundle the WASM correctly and configured the build to be compatible with the extension's sandbox environment.
2. Complex State Synchronization
The wallet architecture involves multiple isolated contexts: the DApp (web page), Content Script, Background Service Worker, Side Panel UI, and a Web Worker for heavy cryptography.
Hurdle: Keeping the wallet state (balance, sync status, pending requests) synchronized across all these layers in real-time.
Solution: We implemented a robust Message Passing architecture and used chrome.storage.local as a reactive source of truth. We also built a custom hook system in React to listen for storage changes and update the UI instantly.
3. The "Account Not Found" Race Condition
We encountered a critical bug where the wallet would sometimes fail to find the account immediately after creation, causing connection failures.
Hurdle: The Web Worker was initializing or resetting its in-memory state before the IndexedDB persistence layer had fully committed the new account data.
Solution: We refactored the initialization flow to enforce an atomic save operation immediately after account creation and added a post-creation verification step in the worker to ensure the account ID was valid and persisted before allowing any further interactions.
4. Designing for the Side Panel
Moving away from the traditional "Popup" wallet experience to a persistent Side Panel required a shift in UX thinking.
Hurdle: Handling connection requests gracefully without blocking the user's browsing experience.
Solution: We implemented a Badge Notification system on the extension icon and a dedicated "Connection Request" view that automatically activates when the user opens the panel, ensuring a seamless flow between the DApp and the Wallet.
Tracks Applied (18)
Cross-Chain Privacy Solutions
Starknet
General Bounty
Network School
Self-Custody & Wallet Innovation
Mina Protocol
Cross-Chain Privacy Solutions
Axelar Network
Private DeFi & Trading
Arcium
Self-Custody & Wallet Innovation
Aztec
Privacy Infrastructure & Developer Tools
Electric Coin Company
Cross-Chain Privacy Solutions
Osmosis
Self-Custody & Wallet Innovation
Osmosis
Self-Custody & Wallet Innovation
Miden
Self-Custody & Wallet Innovation
Fhenix
Privacy Infrastructure & Developer Tools
Zcash Community Grants
Self-Custody & Wallet Innovation
Unstoppable Wallet
Cross-Chain Privacy Solution
Bitlux
Privacy Infrastructure & Developer Tools
Raybot
Generic Bounty
Mintlify
Cross-Chain Privacy Solutions
NEAR Protocol
General Bounty
Project Tachyon
Cheer Project
Cheering for a project means supporting a project you like with as little as 0.0025 ETH. Right now, you can Cheer using ETH on Arbitrum, Optimism and Base.
