Give your agent a wallet you control.
에이전트가 일회용 카드나 기계 결제 프로토콜로 온라인 결제하고, 모든 요청을 직접 승인
Celari는 오픈소스·프라이버시 우선 Zcash 지갑으로 브라우저에서 동작합니다. 기본 보호, 키는 기기에서 암호화. 토큰·계정 필요 없음
Celari is an open-source, privacy-first Zcash wallet that runs in your browser. Shielded by default, keys encrypted on your device. No token, no account.
금융TypeScript · RustGitHub @Kubudak90온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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).