Zapp is a privacy-first Zcash wallet with an end-to-end encrypted peer-to-peer messenger built into it. Shielded ZEC for the money, Hyperswarm for the messages, and a peer-to-peer offramp for spending in local currency. No account, no custody, no tracking.
Zapp for iOS is a fork of Zodl, itself a fork of Electric
Coin Company's Zashi. The fork diverged at
upstream commit 0d3b93ad
and carries its own line of development on top of it.
The Android counterpart lives at JustZappIt/zapp-android.
- Encrypted P2P chat. Direct and group messaging over Hyperswarm, with identities derived from the wallet seed. No Zapp server can read your messages: a project-run blind peer stores encrypted blocks so they reach a recipient who was offline, and it cannot decrypt them.
- A peer-to-peer offramp. Pay a merchant in local currency out of shielded ZEC, through the p2p.me contracts on Base.
- A unified send-and-swap screen. One screen sends ZEC or swaps it for another asset through NEAR intents, with the recipient prefilled wherever Zapp already knows it.
- A different shell and visual system. Zapp's tabbed shell (
ZappTabsView,ZappPayView) and a Swiss-minimalist token set, layered on top of upstream's design system rather than replacing it.
Everything else is deliberately kept in lockstep with upstream: target names, scheme names, the
secant / zodl file and module naming, and the build-flag prefixes all stay as zodl-ios has
them so that future upstream merges stay cheap. That is why the Xcode project is still
secant.xcodeproj and the build flags are still SECANT_MAINNET / SECANT_TESTNET.
- Shielded-by-default Zcash send and receive, with unified, transparent and shielded addresses
- Ironwood (NU6.3) support, including a guided migration that moves Orchard funds into the new shielded pool in standard-sized pieces over time
- Transaction history, filters, notes and tax export
- Address book, with the same records backing chat contacts
- Encrypted chat: DMs, groups, media, read receipts, payment requests
- Keystone hardware-wallet signing over animated QR
- Swaps to and from shielded ZEC through NEAR intents
- Tor routing for exchange-rate lookups, transaction submission and integrations, with a settings toggle to turn it off
- English and Spanish
secant.xcodeproj references two local Swift packages by relative path, so both must be checked
out beside this repository. Both are public:
<some-dir>/
ios-zapp/ <-- this repository
zappMessaging/ <-- JustZappIt/zappmessaging-sdk, cloned under this name
zcash-swift-wallet-sdk/ <-- JustZappIt/zcash-swift-wallet-sdk, branch zapp/sdk-mit-on-main
Scripts/bootstrap-zappmessaging.sh clones the messaging SDK to the right place at the commit
pinned in .zapp-deps and generates its build artifacts. The directory is named
zappMessaging because that is the path the Xcode project references.
Scripts/bootstrap-zcash-sdk.sh does the same for the wallet SDK, then compiles its Rust FFI
(libzcashlc.xcframework — a few minutes from cold). The pin lives on our fork's
zapp/sdk-mit-on-main branch rather than upstream: upstream's default build links the
AGPL-3.0-only zodl-slipstream crate, which we may not ship, so zcash/zcash-swift-wallet-sdk
cannot resolve the pinned SHA. Override the source with ZAPP_SDK_REMOTE / ZAPP_SDK_BRANCH.
- Xcode matching
.xcode-version - SwiftGen —
brew install swiftgen - SwiftLint 0.50.3 specifically — install from the official 0.50.3 package
- Rust with the iOS targets, to build the wallet SDK's FFI —
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
SwiftGen and SwiftLint run automatically as Xcode build phases. On Apple Silicon, if you installed either via Homebrew, symlink it so the build phase can find it:
ln -s /opt/homebrew/bin/swiftgen /usr/local/bin
ln -s /opt/homebrew/bin/swiftlint /usr/local/bin
Scripts/bootstrap-zappmessaging.sh # clones/pins the sibling and generates its artifacts
Scripts/bootstrap-zcash-sdk.sh # clones/pins the wallet SDK and builds its Rust FFI
open secant.xcodeprojRe-run bootstrap-zappmessaging.sh whenever you pull JS changes in zappMessaging — the build
otherwise links a stale worklet.bundle with no warning at all.
| Scheme | Network | Notes |
|---|---|---|
zodl-internal |
mainnet (ZEC) | internal/development build; also runs the zodlTests target |
zodl-testnet |
testnet (TAZ) | |
zodl-AppStore |
mainnet (ZEC) | production / App Store build |
Integrations read their keys from secant/Resources/PartnerKeys.plist, which is gitignored and
never committed. Archive builds fail without it — see
Scripts/validate-partner-keys.sh for the required keys.
Normal debug builds run fine without the file; the affected integrations are simply inert.
Vendor/ZappOfframp.xcframework is a compiled artifact, not third-party closed source. It is the
Kotlin Multiplatform offramp-lib module built for the iosMain target; its source is public in
zapp-android.
Run the zodlTests target via the zodl-internal scheme. All tests use
Swift Testing with TCA's TestStore.
Please read the Contributing Guidelines and Code of Conduct. AGENTS.md documents the architecture, conventions and invariants that reviews enforce — read it before your first change. Further documentation is in docs/.
Please do not open a public issue for security vulnerabilities. See SECURITY.md for how to report one.
- Website — justzappit.xyz
- Android app — JustZappIt/zapp-android
- Messaging runtime — JustZappIt/zappmessaging-sdk
MIT, with Zapp-original contributions additionally available under Apache 2.0. See LICENSE and NOTICE.