New app: Plain Wallet

Abstract

Please introduce the functions and usage of your app in summary, and also attach some screenshots.

Plain Wallet is a very minimal wallet for Ethereum and other EVM networks. On Android it's a browser with the wallet built in: you type a site and it gets Plain Wallet as its wallet, with clear approvals for connections, signatures, transactions and network changes. You can star the sites you use, send tokens, see balances and connected sites, keep watch-only accounts, sign offline and unlock with your fingerprint. The vault stays on the phone and is never backed up to the cloud, and the app has no servers, accounts, analytics or telemetry. It's open source under the MIT license, and the same wallet ships as a Chrome/Firefox extension and an iPhone/Mac app. Website: https://plainwallet.app

Please elaborate why you wrote this app. Please highlight the unique functions it provides over other similar apps in F-Droid.

I wanted a wallet small enough to read in an evening: about 2,850 lines of TypeScript with three runtime dependencies, so it's easy to audit what happens to your keys. It decodes what a transaction or signature does before you approve it, works with any RPC you set, and keeps the same behavior across the Android browser, the browser extension and the Apple apps. NonFreeNet is declared because the default networks use public RPC providers, which you can replace with your own node.

The release APK is built reproducibly in GitHub Actions and attached to each release, so the metadata uses Binaries and AllowedAPKSigningKeys.

Checklist

Policy

  • The app complies with the inclusion criteria.
  • The original app author has been notified (and does not oppose the inclusion). I am the author.
  • The upstream app source code repo contains the app metadata in a Fastlane or Triple-T folder structure. The summary and description must be included and images, icon, and changelog should also be provided for better user experience. The en-US locale must be included.

Docs

Merge Request Setup

Metadata

  • Metadata must be put in metadata/<applicationId>.yml.
  • Metadata must be a valid YAML file.
  • Metadata must use LF as line ending.
  • Don't add summary/description/changelog/images or anything that should be provided in upstream repo. Please check the Changes tab to make sure there is no other unrelated files added in the MR.
  • Releases are tagged and auto update is enabled unless there is a special reason.
  • There is an issue tracker and contact info of the author so that we can report bugs and contact the author.
  • An AuthorName must be added. It doesn't need to be the real name.
  • External repos are added as git submodules instead of srclibs. (No external repos.)
  • Enable Reproducible Builds. Binaries points at the APK that our release workflow builds from the tag and attaches to each GitHub release, signed with our upload key, and AllowedAPKSigningKeys pins that key. The APK has no dependency-metadata signing block.
  • Setup abi split if the APK is large and the splitted ones can be much smaller. (Not needed: no native code.)
  • Only the latest versions should be kept in the metadata before it's merged. If you update the metadata, please replace the old versions with the new ones.
  • Don't add any disabled versions in the metadata.
  • The commit field should be the full hash. Please don't use tag or branch in commit.

Pipeline

  • All pipelines should pass.
  • All warnings and errors in the Reports tab should be fixed or explained.
  • F-Droid CI runners are under GitLab's FOSS program, so there's no need for you to pay for any CI time. If Gitlab starts asking for phone numbers or credit cards don't submit anything, just leave a note in the MR so we know we need to trigger the CI.

Notes:

  • The only Android dependency is AndroidX WebKit, and there are no trackers. The wallet UI is built from the same repo with npm ci and npm run build:android in prebuild, using Node from Debian forky because the build tool (wxt) needs Node 22 or newer; node_modules is scan-deleted afterwards. The prebuiltWeb Gradle property stops Gradle from running npm a second time.
  • Two clean clones of the tag build byte-identical unsigned APKs, and Node 22 produces the same web output as the Node version used in CI.

Merge request reports

Loading
Loading