Self-hosted Windows runner builds an unsigned Windows Release zip with
the Flutter .exe + bundled monero/wownero DLLs + MinGW runtime DLLs +
MSVC runtime DLLs. workflow_dispatch only — triggered from the Gitea
Actions UI.
Major design points hammered out during initial bring-up:
- Use explicit Git Bash path for `shell:` rather than `shell: bash`,
since act_runner under LocalSystem resolves bare `bash` to
C:\Windows\System32\bash.exe (WSL) which refuses to run as
LocalSystem.
- Configure git identity + safe.directory before any submodule ops,
since LocalSystem has no global git config and scripts/monero_c/
apply_patches.sh does git-commit-equivalents.
- Clone torch_dart + reown_flutter from git instead of tarball — the
upstream-published .tar.gz tarballs contain example-app
.plugin_symlinks with absolute /home/runner paths that Windows tar
refuses to extract.
- Fetch monero_c prebuilt release-bundle.zip (same one Android/iOS
use) and re-stage its x86_64-w64-mingw32 wallet DLLs into the
layout that windows/CMakeLists.txt expects:
scripts/monero_c/release/<coin>/x86_64-w64-mingw32_libwallet2_api_c.dll
CMake's install() rules RENAME them to <coin>_libwallet2_api_c.dll
in the Release dir.
- Mirror those wallet DLLs under their lib<coin>_wallet2_api_c.dll
Dart-FFI-expected names — package:monero's DynamicLibrary.open()
uses a different naming convention than windows/CMakeLists.txt's
RENAME rules.
- Source MinGW runtime DLLs (libssp-0.dll, libwinpthread-1.dll) from
Git for Windows' bundled mingw64/bin — has modern symbols including
pthread_cond_timedwait64 that monero_c requires. Flutter's bundled
mingit is too old (2017-vintage libwinpthread).
setup-windows-runner.ps1 (the one-shot toolchain installer for the
runner host) is gitignored — it's runner-side infra, not part of the
app.
Hash Bags
Hash Bags (#) is an open-source, non-custodial, multi-currency crypto wallet for Android, iOS, macOS, Linux, and Windows. It is a fork of Cake Wallet maintained by Such Software LLC.
Why a fork?
Cake Wallet ended Wownero support in early 2026. Hash Bags exists to keep Wownero as a first-class mobile experience, run by the project's founder, while shipping a slimmer, more focused multi-coin wallet without the chains and integrations we don't want to maintain or recommend.
Supported chains
- Monero (XMR)
- Wownero (WOW)
- Bitcoin (BTC)
- Litecoin (LTC), incl. MWEB
- Bitcoin Cash (BCH)
- Dogecoin (DOGE)
- Nano (XNO)
- Ethereum (ETH) + ERC-20s
- Polygon (POL)
- Base (BASE)
- Arbitrum (ARB)
- BNB Smart Chain (BSC)
Hardware wallet support: Ledger, Trezor, BitBox.
What's different from Cake Wallet
Removed:
- Solana, Tron, Zano, Zcash, Decred (chain support disabled)
- Lightning Network (deferred — running Greenlight infra is out of scope for now)
- Cake Pay gift cards (Cake Labs–operated service)
- All direct swap-provider integrations except Trocador, which already aggregates ChangeNow, FixedFloat, LetsExchange, Exolix, StealthEx, Quantex, and ~16 others under one privacy-friendly API
Replaced or planned:
- Default Monero/Wownero/BTC node lists augmented with community nodes (don't rely on Cake Labs–operated nodes alone)
- Fiat price API replacement (Cake's API → public source) — pending
- Tor / Arti integration improvements — pending
Build instructions
The build system is unchanged from upstream Cake Wallet. See docs/ for per-platform instructions:
- Android:
docs/build_android.md - iOS:
docs/build_ios.md - macOS:
docs/build_macos.md - Linux:
docs/build_linux.md - Windows:
docs/build_windows.md
Required Flutter version is pinned in Dockerfile (currently 3.32.0) and .tool-versions. Newer Flutter SDKs (3.5+) drop the _macros pseudo-package that Cake's pinned hive_generator + build_resolvers transitively require — flutter pub get will fail until you switch to 3.32.0. If using asdf or mise, the version will be picked up automatically; otherwise:
git clone --depth 1 --branch 3.32.0 https://github.com/flutter/flutter.git ~/sdks/flutter/3.32.0
export PATH="$HOME/sdks/flutter/3.32.0/bin:$PATH"
flutter --version # confirm 3.32.0 / Dart 3.8.0
Before the first flutter pub get, you must run the prep scripts to clone external native dependencies:
./scripts/prepare_torch.sh
./scripts/prepare_moneroc.sh
./scripts/build_bitbox_flutter.sh
# Then fetch the prebuilt reown_flutter tarball (CI does this; reproduce locally
# with the URL in .github/workflows/build-linux.yml).
Then run the platform-specific configure script, e.g.:
APP_LINUX_TYPE=cakewallet ./configure_hash_wallet.sh linux
Contributing
Issues and PRs welcome at https://github.com/Such-Software/hash-wallet. See CONTRIBUTING.md for ground rules.
License
Hash Bags is distributed under the MIT License, inheriting from Cake Wallet.
Copyright (C) 2018–2023 Cake Labs LLC
Copyright (C) 2026 Such Software LLC
Cake Wallet, the Cake Wallet logo, and related marks are trademarks of Cake Labs LLC and are not used by Hash Bags.