Skip to main content

Wallet Guide

The zkCoins wallet is a web application at zkcoins.app for sending and receiving private Bitcoin transactions.

Getting started

  1. Open zkcoins.app
  2. Choose Create with Passkey (biometric) or Create with Seed Phrase (12 words)
  3. For seed phrase: write down the 12 words, confirm them, set an unlock password
  4. Use the Faucet button to mint testnet coins
  5. Enter a recipient address and amount, then click Send Coins

Your keys are generated locally, encrypted with AES-256-GCM, and stored in IndexedDB. They are never sent to any server.

Features

FeatureStatusDescription
Seed phrase (BIP-39)✅ Live12-word recovery phrase, create + restore
Passkey (WebAuthn)✅ LiveBiometric auth via PRF extension
Encrypted storage✅ LiveAES-256-GCM in IndexedDB via Web Crypto API
Balance display✅ LiveAuto-refreshing balance with 5s polling
Send coins✅ LiveSchnorr-signed transfers to any zkCoins address
Faucet✅ LiveMint testnet coins (testnet only)
Transaction log✅ LiveLocal history of all transactions
WASM crypto✅ LiveBIP-39, BIP-32, Schnorr signing in browser
Account backup🔜 PlannedExport/import wallet state
Mobile PWA🔜 PlannedProgressive Web App for mobile

Tech stack

LayerTechnology
FrameworkNext.js 14 (App Router)
LanguageTypeScript
StylingTailwind CSS (dark theme, Bitcoin orange)
StateZustand with encrypted IndexedDB persistence
CryptoRust → WebAssembly (secp256k1, BIP32)
APIREST client to Rust/Axum backend

Self-hosting

The wallet is fully open-source and can be self-hosted:

# Clone the monorepo
git clone https://github.com/zk-coins/app.git
cd app

# Install dependencies
npm install

# Start the wallet in development mode
npm run dev

# The wallet is available at http://localhost:3090

To connect to your own backend, set the environment variable:

NEXT_PUBLIC_API_URL=http://localhost:4242

API endpoints

The wallet communicates with the Rust backend via REST:

EndpointMethodDescription
/api/infoGETNetwork info (mainnet/testnet)
/api/balanceGETQuery account balance
/api/addressGETList all known addresses
/api/mintPOSTMint new coins (testnet faucet)
/api/sendPOSTSend coins (with optional Schnorr signature)
/api/receivePOSTSubmit a received coin proof
/api/proof/{id}GETDownload a coin proof (binary)