尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證open source zcash browser wallet
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Wallet: https://app.celariwallet.com · Website: https://celariwallet.com
An open-source, privacy-first Zcash wallet that runs in your browser. No token, no points, no airdrop promises. Just a private ZEC wallet that works.
Celare (Latin): to hide, to conceal.
[!WARNING] Celari is early software and has not had an independent security audit. The WebZjs library it is built on also says in its README that it is not audited yet. Do not use it for amounts you cannot afford to lose.
[!IMPORTANT] This release runs on Zcash's NU6.3 (Ironwood) rules and knows NU7; only the first real-funds tests on mainnet have been done. Mainnet moved to Ironwood on 28 July 2026 at block 3,428,143; NU7 activates at block 3,543,405 (early November 2026). Celari's engine is built with the librustzcash releases that implement these upgrades.
- What was tested, and what was not: on mainnet, with wallets that own nothing: scanning Ironwood blocks (the engine's count of Ironwood outputs matched the server's tree sizes exactly), addresses, the network check and the upgrade from the previous release. At the end of October 2026, with a small real amount: receiving into Ironwood and sending from Ironwood to a transparent address (a v6 transaction mined under Ironwood rules at block 3,535,070; the change came back to the shielded balance). Shielding, a shielded send with a memo, spending from Orchard and the NU7 boundary were tested only locally, with fake notes, so far. Until those tests are done, use only small amounts you can afford to lose.
- A one-time rescan after the update: the new engine cannot read the old wallet database. On the first unlock after the update the wallet is rebuilt from the recovery phrase (a view-only wallet from its key) and its starting block, and rescanned; the old copy is kept untouched until the rescan reaches the network tip. The rescan runs only while the wallet is unlocked, pauses at every lock and continues after the next unlock; the app says so. A month of blocks (about 48,000) took about 11 minutes when measured; a very old starting block (especially 2022-2023) can take hours and several GB of memory in the browser tab. The recipients, memos and fees of past sends are fetched again from the server during the rescan (while the switch under Settings > Privacy is on, the default).
- A wallet belongs to the address it was opened on: it lives in that address's browser storage. A wallet made on an earlier address (such as the preview deployment) does not move to app.celariwallet.com by itself; restore it there from its recovery phrase.
- An old starting month is costly: if the month chosen for a restore means scanning more than about 500,000 blocks (~14 months with the safety margin), the app says so at that step; it does not stop the restore. Measured with the engine alone (without the app): a restore from January 2025 (784,000 blocks) took 51 minutes and the browser process peaked at ~1 GB. A start in the 2022-2023 spam era is estimated at about a day and can need several GB; it was not measured after the memory fix. Choose the latest month you are sure of.
- Sending and shielding are on. Payments received in Ironwood show in the balance; change and shielded funds go to Ironwood. An Orchard balance stays spendable: a payment from it crosses into Ironwood and the amount that crosses is visible on chain (ZIP 318); the change stays in Orchard, so each later payment from it crosses again. Celari does not offer a gradual, private Orchard-to-Ironwood migration yet. No transaction is built for the NU7 activation block or the 10 blocks before it (about 14 minutes), and one built just before is not sent under the wrong rules.
- A fresh address on every opening: Receive shows a new shielded-only unified address each time (Orchard and Sapling receivers, no transparent receiver; Ironwood payments go to the Orchard receiver). Addresses shown before keep working. The transparent (
t1…) address is shown separately and stays the same.
GetLightdInfo) at start-up and on every sync, again before every spend and once more right before the broadcast. If the engine does not support those rules, or no answer comes, sending and shielding are switched off and the screen says why; an announced upgrade the engine will not support is shown in advance.Browser ──────────────────────────────────────────────┐
│ React interface (src/screens) │
│ │ │
│ WalletController (src/state) ── encrypted IndexedDB│
│ │ │
│ ZcashEngine interface (src/engine/types.ts) │
│ │ │
│ WebZjs (Rust → WebAssembly, multi-threaded) │
│ + engine/zcash_client_memory (wallet backend) │
└──────┼──────────────────────────────────────────────┘
│ gRPC-web
lightwalletd proxy (default: zcash-mainnet.chainsafe.dev)
patches/webzjs/, and engine/zcash_client_memory (the wallet's in-memory backend, kept in this repository as readable source; its origin is in UPSTREAM.md), built with the October 2026 librustzcash releases (zcash_client_backend 0.25, zcash_protocol 0.11: NU6.2, NU6.3 Ironwood, NU7).generate_seed_phrase but with the audited @scure/bip39, which uses the browser's secure random number generator; WebZjs's own documentation says its function may not use secure randomness in a browser.Requirements: Node 22. To build WebZjs, also rustup, curl, clang 17 or later and wasm-pack. The Rust toolchain (nightly-2026-10-28), the wasm-bindgen CLI (the version in the lockfile, cargo install --locked) and, on x86_64 Linux, binaryen's wasm-opt (checksum-verified) are installed by the build script.
npm install
# UI work with the fake engine (no wasm or network needed)
npm run dev:fake
# Tests
npm run typecheck
npm test # unit tests
npm run test:e2e # UI flows (Playwright, fake engine)
# The real engine: build WebZjs from the pinned commit, then run it
npm run build:webzjs # builds the wasm packages into vendor/
npm run dev # http://localhost:5173
npm run build # dist/ (fails unless vendor/ matches scripts/webzjs-vendor.sha256)
npm run test:e2e:real # mainnet smoke test of the production build
The fake engine (src/engine/fake.ts) is enabled only on the dev server with VITE_FAKE_ENGINE=1 and never reaches the production bundle.
build:webzjs applies the patches in patches/webzjs/ to the pinned commit in order (scan progress counters, a lock fix, memo support, the librustzcash 2026-10 releases with Ironwood and NU7), copies engine/webzjs.Cargo.lock as the lockfile and builds with --locked. A patch that does not apply, or an uncommitted, untracked or index-hidden file under patches/webzjs/ or engine/, stops the build. Details: patches/webzjs/README.md.
The engine's native (non-wasm) tests, with the versions pinned in the repository (--locked):
scripts/test-engine-native.sh # the wallet backend (engine/zcash_client_memory), ~15 min
scripts/test-engine-native.sh glue # the webzjs-wallet glue, after build:webzjs
scripts/audit-engine.sh # RustSec advisories, sources and licences (cargo-deny)
scripts/gen-licenses.sh # regenerates public/THIRD_PARTY_LICENSES.txt
The engine's design decisions, what it deliberately does not do (and fails with an explicit error instead), the tests still to do with real funds, and how the build is reproduced: docs/engine-port.md.
CI builds WebZjs from source and compares the SHA-256 of every file in vendor/ with the list in scripts/webzjs-vendor.sha256. Pushes to main, the weekly run and runs started by hand with full_rebuild always build from source, fail if the list does not match, and only then save vendor/ to the cache. Pull requests check the cached vendor/ against the same list, and build from source if it does not match. A change to WEBZJS_COMMIT, to a patch under patches/webzjs/, to a file under engine/ or to a tool version must update the list too: CI uploads the new one as the webzjs-vendor-sha256 artifact (gh run download <run-id> -n webzjs-vendor-sha256 -D scripts). The build script trims this machine's paths from the wasm, pins its tools, runs the build with an allow-listed environment and refuses settings meant to change the output (another toolchain, rustc wrappers, extra rustflags, CARGO_INCREMENTAL, C compiler and wasm-bindgen settings for the wasm target, cargo configuration from outside the patched workspace). A local build on x86_64 Ubuntu 24.04 with clang-18 (1:18.1.3-1ubuntu1) is meant to give CI's list, but CI decides: its own build fails unless it matches. CI also audits npm advisories (failing on shipped packages, warning on dev tools) and the engine's Rust dependencies. Details are in the comments of .github/workflows/ci.yml.
The wallet runs at https://app.celariwallet.com and the website at https://celariwallet.com, on Vercel: two projects on two origins, so nothing of the website runs next to the wallet's keys. Vercel does not build the wallet. What it serves is the celari-dist artifact of CI's from-source build of main; deploy/make-branch.sh puts it on a temporary deploy/app branch only if its wasm files are in scripts/webzjs-vendor.sha256, and the branch is deleted after the release, so main is the repository's only branch. The steps are in deploy/README.md; the website is in landing/.
To host it yourself: WebZjs uses SharedArrayBuffer, so the page must be cross-origin isolated. The server must send:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
public/_headers does this for Netlify and Cloudflare Pages, together with a strict Content-Security-Policy header (for Vercel, the same is in deploy/vercel.json). GitHub Pages cannot send custom headers, so it does not work. The production build also carries the policy as a <meta> tag, and the build fails if it cannot add it.
docs/reviews/2026-10-pre-nu7-core-review.md, docs/engine-port.md). It does not replace an independent audit.docs/engine-port.md). It does not replace an independent audit.MIT or Apache-2.0, at your option. WebZjs © ChainSafe Systems, MIT / Apache-2.0. engine/zcash_client_memory © Electric Coin Company, MIT / Apache-2.0 (licence files and origin in its directory). The licences and copyright notices of the Rust crates compiled into the wallet engine are in public/THIRD_PARTY_LICENSES.txt, which the app serves at /THIRD_PARTY_LICENSES.txt (Settings > About).
zcash:0,25).