From 8d8c9dcf41ac158b98ddc9d1e419c2fd8d2e8d4e Mon Sep 17 00:00:00 2001 From: grunt-claude-bot Date: Wed, 29 Jul 2026 14:05:33 +0100 Subject: [PATCH] docs: standardize release headers to bold version + PR + divider format (#254) Co-authored-by: grunt-claude-bot <308083480+grunt-claude-bot@users.noreply.github.com> --- README.md | 101 ++++++++++++++++++++++++++++---- images/google-play-badge-en.png | Bin 0 -> 6956 bytes 2 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 images/google-play-badge-en.png diff --git a/README.md b/README.md index ce2ed228..fb5c5225 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,33 @@ **Brainwallet** is a free, open-source, self-custodial [Litecoin](https://litecoin.org) wallet for Android. Your seed phrase and keys stay on your device — Brainwallet never has custody of your funds. +### CircleCI status +[![Release](https://img.shields.io/github/v/release/gruntsoftware/android?style=plastic)](https://github.com/gruntsoftware/android/releases) [![CircleCI](https://dl.circleci.com/status-badge/img/gh/gruntsoftware/android/tree/main.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/main) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) -[![Website](https://img.shields.io/badge/website-brainwallet.co-blue)](https://brainwallet.co) -**CI status** — [main](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/main) · [develop](https://dl.circleci.com/status-badge/redirect/gh/gruntsoftware/android/tree/develop) +## Play Store +[![Get it on Google Play](images/google-play-badge-en.png)](https://play.google.com/store/apps/details?id=ltd.grunt.brainwallet) -## Download - -- **Play Store**: [ltd.grunt.brainwallet](https://play.google.com/store/apps/details?id=ltd.grunt.brainwallet) -- **iOS**: [gruntsoftware/ios](https://github.com/gruntsoftware/ios) +## Important Links & Download +- **iOS Repo**: [gruntsoftware/ios](https://github.com/gruntsoftware/ios) - **Website**: [brainwallet.co](https://brainwallet.co) - **Support**: [brainwallet.co/support](https://www.brainwallet.co/support) +## Why Brainwallet + +**Standalone, not a client of our servers.** Brainwallet connects directly to the Litecoin peer-to-peer network using [SPV](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki) (simplified payment verification) — checking balances and broadcasting transactions doesn't depend on any Brainwallet-run backend. An already-installed copy keeps working even if Brainwallet the company disappeared. + +**Deterministic recovery.** Brainwallet is a [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) hierarchical-deterministic wallet — one seed phrase (paper key) recovers your full balance and transaction history on any device, forever. + +**Keys never leave your device.** Private keys are generated and held in the Android Keystore, not in Brainwallet's infrastructure — we never have custody of your funds and no backend path to recover them for you. + +**Built on open standards**, not a proprietary protocol: +- [SPV](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki) for fast sync without running a full node +- [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) deterministic wallets +- [BIP38](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki) import of password-protected paper wallets +- [BIP70](https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki) payment protocol support + ## Features - Self-custodial Litecoin wallet — your seed phrase never leaves your device @@ -57,8 +71,62 @@ Brainwallet Android is released under the [MIT License](LICENSE). For the full, up-to-date changelog see [GitHub Releases](https://github.com/gruntsoftware/android/releases) and the [compare view](https://github.com/gruntsoftware/android/compare). Highlights from recent versions: -### v4.9.0 +--- + +### **v4.10.6** [PR [#253](https://github.com/gruntsoftware/android/pull/253)] +--- +#### 🐛 Crash Fixes +- **`UnsatisfiedLinkError` on `core-lib` load** — `BRActivity`/`SyncReceiver` loaded the native wallet library via unguarded `System.loadLibrary()` static initializers, crashing every screen on launch if the OS failed to extract the `.so` (a common install/update failure mode on some OEMs). Native lib loading is now centralized in `BrainwalletApp.onCreate()` via [ReLinker](https://github.com/KeepSafe/ReLinker), which falls back to manual extraction from the APK when the system loader fails. +- **Ghost launcher icon crash** — the LibGDX game module's `AndroidLauncher` was accidentally exported with its own `MAIN`/`LAUNCHER` intent-filter, producing a second home-screen icon that crashed with `UnsatisfiedLinkError: libgdx.so not found` when tapped (it bypassed the app's real startup path). Fixed by removing the exported intent-filter. +- **`BreadActivity` NPE fix (#248)** — removed dead bottom-nav/toolbar code left over from an earlier refactor that deleted the view-binding logic but not the code still referencing those views, guaranteeing a `NullPointerException` on every launch. + +#### 🧪 Test Reliability +- Fixed a flaky `BWSender` reentrancy test that relied on `Thread.sleep()` racing real-time against a `StandardTestDispatcher` — replaced with deterministic `CountDownLatch` synchronization. +- Eliminated a flaky `ShopBentoViewModelTest` (#250). +- Removed a stale `modules/bw-gdlib` gitlink that was breaking CI (#249). + +#### 📚 Docs +- Real `SECURITY.md` with an actual vulnerability disclosure process, replacing GitHub's unfilled default template. +- Restructured `README.md` for external visitors/contributors (#251). +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.10.4...v4.10.6 + +--- + +### **v4.10.4** [PR [#236](https://github.com/gruntsoftware/android/pull/236)] +--- +A feature-rich release centered on the Game Hub / emoji mini-game experience and an MVI refactor of the main screens: + +- **New screens**: emoji pager/picker (`EmojiPagerScreen`, `PickEmojisScreen`, `YourEmojisScreen`, `HowToSetEmojisScreen`) and Game Hub bento screens (`GameHubBentoScreen`, `GameHubBentoPagerScreen`) +- **MVI refactor**: `MainScreen`, `SettingsScreen`, and `GameHub` all restructured into Event/State/ViewModel patterns (`MainScreenEvent`/`MainScreenState`/`MainViewModel`, `SettingsEvent`/`SettingsState`/`SettingsViewModel`, `GameHubEvent`/`GameHubState`/`GameHubViewModel`) +- **In-app review**: Google Play in-app review integration (`InAppReviewService`) +- Design system, font (`Bolden Van`, `Lilita One`, `Open Sauce One`), and localization updates alongside the above + +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.9.3...v4.10.4 + +--- + +### **v4.9.4 & v4.9.3** [PRs [#236](https://github.com/gruntsoftware/android/pull/236), [#222](https://github.com/gruntsoftware/android/pull/222)–[#229](https://github.com/gruntsoftware/android/pull/229)] +--- +- Fixed a crash in the send flow (`sendModelOnEvent`) +- Fixed the LTC/fiat picker layout +- Refactored analytics and reduced sync rate polling frequency (techdebt) +- Switched release tagging from release branches to tags going forward + +**Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.9.1...v4.9.4 + +--- + +### **v4.9.1** [PR [#211](https://github.com/gruntsoftware/android/pull/211)] +--- +- Fixed `BreadActivity.initializeViews` crash +- Added `WalletManager`, made `validateAddress` an instance method +- Expanded Send flow test coverage for better stability + +--- + +### **v4.9.0** [PR [#201](https://github.com/gruntsoftware/android/pull/201)] +--- #### ✨ New Features ##### 📋 Copy Transaction Details to Clipboard @@ -95,8 +163,10 @@ A new `bentoSurface()` modifier in `BentoModifiers.kt` consolidates gradient and **Full Changelog**: https://github.com/gruntsoftware/android/compare/v4.7.2...v4.9.0 -### v4.8.3 +--- +### **v4.8.3** +--- #### ✨ New UI — Favourites & Tutorials Bento Sections **PR [#191](https://github.com/gruntsoftware/android/pull/191)** The main screen now features two new purpose-built bento panels replacing the generic placeholder container. The **Favourites** panel displays a set of coloured circular indicators using the app's design theme colours (affirm, info, warn, error) with full dark/light mode support. The **Tutorials** panel shows a "Coming Soon" placeholder consistent with the broader bento design language. The old `HomeBentoContainer` has been removed. String resources for both sections have been translated across 19 locales including Arabic, Chinese (Traditional & Simplified), French, German, Farsi, Hindi, Indonesian, Italian, Japanese, Korean, Polish, Punjabi, Brazilian Portuguese, Russian, Spanish, Swedish, Turkish, and Ukrainian. @@ -109,7 +179,10 @@ The send transaction flow has been fully redesigned as a multi-step paged screen **PR [#182](https://github.com/gruntsoftware/android/pull/182)** Unit test coverage has been significantly expanded alongside the send screen work, bringing the total suite to **309 tests**. New test classes include `AppModuleTest`, `SendStateTest`, and `BrainwalletAppTest`, covering the Koin DI module wiring, send state logic, and core app initialisation paths. -### v3.9.0 – v3.9.1 +--- + +### **v3.9.0 – v3.9.1** +--- - Update README for improved description by @kcw-grunt in #78 - Beta Release [ 🚀 ] Merge Develop into Main by @kcw-grunt in #81 - Current fiat preference from Settings needs to be reset if set in the TickerBento @@ -121,7 +194,10 @@ Unit test coverage has been significantly expanded alongside the send screen wor - Layout fixes for iPhone 8 – iPhone 17 Pro Max on the Welcome Screen - Support.brainwallet.co link fixed -### v3.6.0 +--- + +### **v3.6.0** +--- - 🚀 [Release v3.5.0] merged into Main by @kcw-grunt in #51 - Full Changelog: v3.4.2...v3.6.0 - Switched to `bundle exec fastlane single_unit_test_all` @@ -134,7 +210,10 @@ Unit test coverage has been significantly expanded alongside the send screen wor - Chore/refactor Firebase analytics - Chore/activate test coverage -### v3.3.1 +--- + +### **v3.3.1** +--- - Added locale filter - UI improvements - Various fixes diff --git a/images/google-play-badge-en.png b/images/google-play-badge-en.png new file mode 100644 index 0000000000000000000000000000000000000000..0a1c1f9f7b0e517201267fb66474fd080edc49c4 GIT binary patch literal 6956 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 mD*FY!XgvO3A&LR(fj**#ChR%xO7ed{Rmv|l