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. However, note that withdrawing the lightning balance currently requires the cooperative uptime of the routing servers.
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 and a setup for ios (xcode) or android (android studio).
git clone https://github.com/trustlesswallet/trustless.git
cd trustless
npm install
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.1.1/trustless-v3.1.1-release.apk
shasum -a 256 trustless-release.apk
git clone https://github.com/trustlesswallet/trustless.git
cd trustless
git checkout 3.1.1
docker run --rm --platform linux/amd64 \
-v "$(pwd):/app" -w /app \
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.
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.
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.