Hi! Trustless is a fully open-source, non-custodial (only you have access to your keys), privacy-focused, Bitcoin-only mobile wallet. It is very minimalist and easy to use, yet very functional.
Bitcoin wallet: Import or create new wallets, send and receive Bitcoin. Trustless also supports pubkey imports for watch-only wallets and PSBT sigining.
Lightning: Switch between on-chain and lightning wallet with one button. You can top-up and withdraw from your Lightning balance at anytime. Lightning is powered by Breez SDK that never has access to your seed phrase. Normal payments and withdrawals require service availability. Settings → Danger Zone → Unilateral exit provides a last-resort on-chain recovery flow; see recovery and testing for its funding, backup and timelock requirements.
BTC Map: Find local and global shops that accept Bitcoin and Lightning payments directly within the app. All thanks to our friends from BTC Map.
Balance breakdown: See actual UTXOs you own by clicking on your total wallet balance.
Coin control: Choose which UTXOs to use for a transaction.
Custom node and network: Connect to your own node via Electrum and use testnet network for transaction testing / development.
Receive address rotation: Have 20 unused receive addresses at all times to choose from. This is a privacy feature, because address reuse links payments together.
Change address rotation: To protect user’s privacy even more, all change addresses are automatically derived from 1/n chain and are never reused for receiving. In tandem with the previous feature, Trustless makes it drastically harder to link and track user’s BTC.
To run the project in development mode, you need Node.js 22.14.0 and a setup for ios (xcode) or android (android studio). The required Node version is also recorded in .nvmrc and package.json.
git clone https://github.com/trustlesswallet/trustless.git
cd trustless
node --version
The command must print v22.14.0 before installing dependencies.
npm ci --legacy-peer-deps
Run on device / simulator:
npm run ios
To run on a physical device, add the -- --device flag and ensure your iphone is connected.
npm run android
Make sure you have an android emulator running or a physical device connected.
npx expo prebuild --clean
cd ios && pod install && cd ..
Then open a trustless workspace file in your ios folder to open the project in xcode. From there you can install the app manually.
Trustless uses Breez SDK to handle lightning operations. SDK requires an API key to work. For obvious reasons we don’t push the .env file with the key to the GitHub repo. To make lightning work you will have to create your own .env file in the root of the directory and add your own Breez API key there like this:
EXPO_PUBLIC_BREEZ_API_KEY=your_api_key
.
To get the API key just fill out the form on Breez’s website. You will receive a key to your email address. This is completely free.
To verify that the official binary was built exactly from the published source code, follow the steps below. This process compares the internal contents of the official signed package (published on GitHub) against a locally built unsigned package (your local build).
The official APK is built on Linux (amd64) inside a pinned Docker container. To get a matching result, your local build must use the same environment.
curl -L -o trustless-release.apk https://github.com/trustlesswallet/trustless/releases/download/3.2.3/trustless-v3.2.3-release.apk
shasum -a 256 trustless-release.apk
git clone https://github.com/trustlesswallet/trustless.git
cd trustless
git checkout 3.2.3
/__w/Trustless/Trustless. Some native modules embed this absolute build path into their compiled .so libraries, so your local build must be mounted at that exact container path to match, regardless of what your local folder is actually named or where it lives on disk.
docker run --rm --platform linux/amd64 \
-v "$(pwd):/__w/Trustless/Trustless" -w /__w/Trustless/Trustless \
reactnativecommunity/react-native-android@sha256:88d93a9282e0f54f84cec7b979da6c5e3f20d87f5be246b75c231838be852fec \
bash -c "
curl -fsSL -o /tmp/node.tar.gz https://nodejs.org/dist/v22.14.0/node-v22.14.0-linux-x64.tar.gz && \
tar -xzf /tmp/node.tar.gz -C /usr/local --strip-components=1 && \
rm /tmp/node.tar.gz && \
node --version && \
bash reproducibility.sh
"
Note: on macOS this runs under emulation and will be slow. A native Linux machine is recommended for faster verification.
If the build fails with a DNS-related error (e.g. Temporary failure in name resolution) while Gradle is downloading dependencies, retry with an explicit DNS server:
docker run --rm --platform linux/amd64 --dns 8.8.8.8 \
-v "$(pwd):/__w/Trustless/Trustless" -w /__w/Trustless/Trustless \
...
cd ..
mkdir unpacked-signed unpacked-unsigned
unzip -q -o trustless-release.apk -d unpacked-signed
unzip -q -o trustless/android/app/build/outputs/apk/release/app-release-unsigned.apk -d unpacked-unsigned
META-INF directory from both folders. This directory contains the cryptographic developer signature and timestamps that will never match between a signed and unsigned package. Compare everything else.
rm -rf unpacked-signed/META-INF unpacked-unsigned/META-INF
diff -r unpacked-signed unpacked-unsigned
If the diff command returns empty output, the contents are identical bit-for-bit. The build is reproducible.
For now Android APKs are used exclusively to prove reproducibility. There is no published app on Google Play right now. We don’t recommend sideloading the APK to Android devices, since the app hasn’t been properly tested there.
Trustless uses Breez SDK to handle lightning operations. The SDK requires an API key, which is not committed to the repository. Therefore, proper code reproduction is only possible without an API key, meaning lightning won’t work in a locally built version. With that said, even without the .env file, all lightning-related code is still compiled into the build, guaranteeing code integrity.
We welcome contributions to Trustless! Please follow the standard fork-and-pull request workflow.
main branch.npm run ios or npm run android before submitting. Also run npm run test to see if any tests fail.This project is licensed under the GNU General Public License v3.0 (GPLv3). See the LICENSE file for details.