Experience the future of Bitcoin with Layer2-focused wallet. Bitcoin-only, non-custodial, opensource.
- Mobile apps (iOS/Android)
- Browser extension
- Desktop apps (macOS/Linux/Windows)
Developer Preview Release This is an early access version for developers. Use with caution and report any issues you encounter.
- Bitcoin base layer
- Rootstock
- Citrea (testnet)
- Alpen (testnet)
- Liquid & Liquid assets
- Ark (by ArkLabs) (testnet)
- Spark
- RGB
- Lightning (Spark, Ark)
- Taproot assets
- Hardware wallet support (single-sig & multi-sig)
- Code opensourced
- Bridging from base layer to Layer 2
- Swaps between Layers
This is a monorepo with 3 subprojects, mobile/, ext/ & desktop/. Mobile app is built with React Native (Expo), Extension is built with React, and the Desktop app is built with Electrobun (Bun runtime) + Vite/React.
Shared code (anything that can be reused, cryptography, network fetchers, react hooks) are shared in shared/
- Run
npm installto install the dependencies. - Run
npm start - Load your extension on Chrome following:
- Access
chrome://extensions/ - Check
Developer mode - Click on
Load unpacked extension - Select the
buildfolder.
- Access
- Run
npm installto install the dependencies. - Run
npm start - Use Dev build to scan QR code from terminal
Development build for android (produces apk that has to load bundle remotely): eas build --platform android --profile development-simulator --local
The desktop app uses Bun (see desktop/bun.lock), not npm.
- Run
bun installto install the dependencies. - Run
bun startto build the views (Vite) and launch the app (electrobun dev). - Run
bun run devfor a watch-mode dev build.
On Linux the app bundles CEF (Chromium Embedded Framework) instead of WebKitGTK, which is weak for the WASM-heavy wallet UI.
TBD
npx playwright installnpx playwright install-deps./utils/add-sepolia.shnpm run buildnpm run e2e
We are using Maestro since it's the only recommended option for Expo EAS. Test flows are located in mobile/.maestro/.
On pull requests, Android and iOS Maestro E2E workflows run only after you add the GitHub label run-mobile-e2e. New commits do not re-trigger E2E until you remove and re-apply the label (or run eas workflow:run manually from mobile/).
We are also relying on Expo EAS for builds, so a generic workflow to run e2e tests on USB-connected Android device would be:
- get a list of builds from EAS:
eas build:list(optionally trigger the build manually first:eas build --platform android --profile preview --message="debug smth" --no-wait) - Note the
Artifactsfield, and download the one you need:wget https://expo.dev/artifacts/eas/example.apk - make sure Android device is connected and in dev mode, then install the apk:
adb install example.apk - run the tests
npm run e2e(frommobile/dir)
- local android build:
eas build --platform android --profile preview --local - ext build:
npm run build - desktop build:
bun run build(fromdesktop/) — runs Vite +electrobun build --env=stable, emitting distributables todesktop/artifacts/.
Electrobun only builds for the host platform/arch, so desktop distributables are produced in CI on a runner per OS: the desktop-build-macos (arm64), desktop-build-linux (x64), and desktop-build-windows (x64) jobs in .github/workflows/build.yml run bun run build and upload the artifacts/ folder.
Production builds and store submission run automatically on pushes to master via mobile/.eas/workflows/submit-android.yml (Play Store + release APK) and submit-ios.yml (TestFlight). They run only when that push changes files under mobile/; merges that touch only ext/, shared/, docs, etc. do not trigger them.
To submit without a mobile/ change (or to re-run after a skipped push), from mobile/:
eas workflow:run .eas/workflows/submit-android.yml
eas workflow:run .eas/workflows/submit-ios.yml
A separate iOS app record exists on App Store Connect for distributing an
Expo Dev Client build via TestFlight (bundle id com.layerzwallet.mobile.devclient,
ASC app id 6762009368). The binary is signed as a regular App Store build but
embeds expo-dev-client, so once installed from TestFlight it can load any
branch's JS bundle remotely from expo start --dev-client.
The bundle id is swapped at prebuild time via the APP_VARIANT=devclient
env var (see mobile/app.config.js); the production app's identity is
unaffected.
Build remotely on EAS and auto-submit to TestFlight in one shot:
cd mobile
eas build --platform ios --profile development-device-ios --auto-submit-with-profile=devclient
Or in two steps if you want to inspect the build first:
eas build --platform ios --profile development-device-ios
eas submit --platform ios --profile devclient --latest
Credentials (distribution cert + provisioning profile) are managed by EAS; first run will prompt for an Apple ID and create them automatically.