Open-source project
rainbow-me/rainbow avatar
rainbow-me/rainbow

Rainbow (rainbow-me/rainbow): Building the Ethereum Wallet from Source

🌈‒ the Ethereum wallet that lives in your pocket

4,396 stars760 forksTypeScriptGPL-3.0

At a glance

What is it?
Rainbow is an open source, GPL-3.0 Ethereum wallet for iOS, Android and browsers. The repository is a large React Native monorepo, and building it yourself means bringing your own API keys, Firebase project and pinned toolchain.
Who is it for?
Adopt the repository if you are an engineer who wants to read or modify a production Ethereum wallet, or if you are evaluating how a React Native wallet handles keys, networks and data providers. Do not adopt it if you want a quick self-hosted wallet, because the build expects your own Infura, Etherscan, Imgix and Firebase credentials and some features stay closed without provider keys.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 27, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Rainbow Is and Who Compiles It

Rainbow is an Ethereum wallet distributed through the iOS App Store, Google Play, and browser extensions for Chrome, Brave, Edge, Firefox and Arc. The repository behind it is the full application source, not a library or an SDK. It is written in TypeScript on React Native, released under GPL-3.0, and the last push to the develop branch was on 2026-09-22, with v2.0.45 published on 2026-09-17. That cadence matters: anyone forking this code inherits a moving target.

The audience is narrow and the README is honest about it. It splits instructions into internal developers, who authenticate the GitHub CLI and clone a private rainbow-me/rainbow-scripts repository, and external contributors, who copy .env.example and fill in their own keys. If you are in the second group, expect a working wallet shell with degraded features. The README states plainly that some features are currently not accessible while the team works with data providers on open source API keys. That is a real constraint, not a footnote.

How the React Native Wallet Is Assembled

The architecture is a React Native app with a Node-style shim layer. The browser and react-native fields in package.json remap core modules: crypto becomes react-native-crypto, stream becomes stream-browserify, http becomes @tradle/react-native-http, and tls is set to false. That mapping is what lets Ethereum-related JavaScript run inside a mobile runtime, and it also explains why so much of the dependency tree is polyfill rather than application code.

Configuration is generated, not hand-written. The postinstall script reads .env and rainbow-scripts to produce build configs and run prebuild hooks, which is why the README insists internal developers set up credentials before running yarn install. The .env.example file lists the surface area: DATA_ENDPOINT, DATA_ORIGIN, DATA_API_KEY, ETHERSCAN_API_KEY, IMGIX_DOMAIN, IMGIX_TOKEN, ETH_GAS_STATION_API_KEY, per-network RPC variables such as ETHEREUM_MAINNET_RPC and POLYGON_MAINNET_RPC, and GOOGLE_SERVICE_API_KEY. The iOS GoogleService-Info.plist ships in the repo and has its API key patched at postinstall time from that variable. Android does not get that convenience.

Installing the Toolchain and Running a First Build

The project pins its tools through mise, so the first step is installing mise and letting it read the repository configuration. Running mise install from the repo root installs all pinned tools, and corepack enable turns on the yarn version the project expects.

bash
curl https://mise.run | sh
mise install
corepack enable

After that, an external contributor copies the example environment file and fills in personal keys. The README names Etherscan, Infura, ETH Gas Station and Imgix as the providers you register with.

bash
cp .env.example .env
yarn install && yarn setup

For Android you also need a google-services.json from your own Firebase project, registered under the package name me.rainbow, placed in android/app/. The README notes that Google Drive backup and restore additionally requires registering your signing keystore's SHA-1 fingerprint as an Android OAuth client. Once dependencies are in place, Metro starts in one terminal and the app builds in another.

bash
yarn start
bash
yarn ios
yarn android

On iOS, the README directs you to open ios/Rainbow.xcworkspace rather than the .xcodeproj, and to install the Xcode version pinned in .xcode-version, recommending the xcodes CLI because it reads that file automatically. Watchman and the Pod install step follow: yarn install-bundle && yarn install-pods. On Android, the first build must run from the terminal before Android Studio will sync.

bash
cd android && ./gradlew assembleDebug && cd ..

Where the Android and iOS Builds Break

The README spends most of its length on failure modes, which tells you where the friction lives. Android Studio ships JDK 21 and the project requires JDK 17; the README links to React Native documentation describing build failures caused by the newer version. The fix is a separate install, for example brew install --cask zulu@17 on macOS, plus JAVA_HOME and ANDROID_HOME exports in your shell profile.

The subtler trap is Gradle sync. Android Studio must be launched from a terminal so it inherits your shell PATH, including the node binary that mise manages. Launching from Spotlight or the Dock produces a Gradle sync failure reading "Cannot run program node". The README also asks you to raise the IDE heap to at least 4096 MB because the default 2048 MB causes slow syncs on a project this size. None of this is unusual for a large React Native codebase, but it does mean a first successful build is an afternoon, not ten minutes. If you want a wallet you can run without owning a Firebase project and four provider accounts, this repository is the wrong tool.

Rainbow Versus MetaMask on Source Availability

The obvious comparison is MetaMask, and the difference is not features but packaging. MetaMask ships a browser extension and mobile app whose source is also public, but its extension is designed to be loaded unpacked into a browser during development, which keeps the feedback loop short. Rainbow's primary targets are native iOS and Android builds, so the loop runs through Xcode, Gradle, CocoaPods and a Firebase project before you see a screen.

That trade-off is deliberate. Rainbow's browser extension exists, but the repository's setup instructions are organized around the mobile builds, with the extension listed in the README's download links rather than its setup section. If your goal is to inspect how a wallet handles account state and network switching, both are readable. If your goal is to modify and ship a browser wallet quickly, MetaMask's extension-first layout is the shorter path. Rainbow's advantage is that the mobile and extension code live in one React Native codebase with a shared shim layer, so a change to the core logic can reach both.

Licence, Upgrades and What a Fork Owes

Rainbow is GPL-3.0. If you distribute a modified build, the licence's copyleft terms apply to the distributed work, and this is a question for your own counsel rather than something the README resolves. What the repository does make visible is the upgrade cost. Releases arrive frequently: v2.0.43 and v2.0.44 both landed on 2026-09-01, and v2.0.45 followed on 2026-09-17.

The harder maintenance burden is the pinned toolchain. .xcode-version, .node-version, .ruby-version and mise.toml all encode versions that must move together, and CI builds against the same Xcode pin, so local parity is a stated goal rather than an accident. A fork that falls behind will find itself reconciling React Native upgrades, Pod changes and provider API changes at once. The presence of .deps-check-baseline.android.json and .deps-check-baseline.ios.json suggests dependency drift is tracked deliberately, which helps only if you keep running the checks.

Editorial conclusion

Adopt the repository if you are an engineer who wants to read or modify a production Ethereum wallet, or if you are evaluating how a React Native wallet handles keys, networks and data providers. Do not adopt it if you want a quick self-hosted wallet, because the build expects your own Infura, Etherscan, Imgix and Firebase credentials and some features stay closed without provider keys. Before committing, verify three things: that your machine can run the Xcode version pinned in .xcode-version, that JDK 17 rather than the JDK bundled with Android Studio is on your PATH, and that you can supply a google-services.json registered under the package name me.rainbow.

Frequently asked questions

Is the Rainbow wallet open source?

Yes. The repository rainbow-me/rainbow contains the TypeScript source for the wallet and is released under GPL-3.0, with the develop branch as the default.

What do I need to build Rainbow from source as an external contributor?

The README lists mise for pinned tools, corepack for yarn, a copy of .env.example filled with your own Etherscan, Infura, ETH Gas Station and Imgix keys, and a personal google-services.json registered under the package name me.rainbow for Android.

Which JDK does the Rainbow Android build require?

JDK 17. The README warns against the JDK bundled with Android Studio because it is JDK 21 and causes build failures, and suggests installing zulu@17 and pointing JAVA_HOME at it.

Why does Gradle sync fail with "Cannot run program node" in Rainbow?

The README attributes this to launching Android Studio from Spotlight or the Dock, which does not inherit your shell PATH. Launching it from a terminal, for example with open -a "Android Studio", lets it find the node binary that mise manages.

Does building Rainbow from source give me every feature?

No. The README states that with your own API keys some features are currently not accessible, and that the team is working with data providers to supply open source API keys.

Official sources

  1. License: GPL-3.0
  2. Project website
  3. rainbow-me/rainbow on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/rainbow-me-rainbow.svg)](https://hysenlabs.com/projects/rainbow-me-rainbow)