A Magic Wormhole client for Android.
Current limitations:
- Received directories are kept in zip form
- Send only supports sending a single file
Available from the Play Store: https://play.google.com/store/apps/details?id=io.sanford.wormhole_william
Prebuilt APKs are provided with each release. Install to an Android device with developer mode enabled:
adb install wormhole-william.release.apk
This project uses Nix for reproducible builds. Install Nix and enable flakes:
# Install Nix (if not already installed)
curl -L https://nixos.org/nix/install | sh
# Enable flakes (add to ~/.config/nix/nix.conf)
experimental-features = nix-command flakes# Enter the development environment
nix develop
# One-time setup: initialize gomobile
make init
# Build debug APK
make
# Build release APK (requires signing key)
make releaseThe debug APK will be output to wormhole-william.debug.apk.
wormhole-william-mobile/
├── wormhole/ # Go library (gomobile bindings)
│ ├── wormhole.go # Main client API
│ ├── callbacks.go # Callback interfaces for Android
│ ├── pending.go # File transfer acceptance handling
│ └── config.go # Configuration persistence
│
├── android/ # Android application
│ ├── app/src/main/
│ │ ├── kotlin/ # Kotlin/Compose UI
│ │ └── res/ # Android resources
│ └── build.gradle.kts # Gradle build config
│
├── Makefile # Build orchestration
└── flake.nix # Nix flake for dev environment
The app uses a native Android UI built with Jetpack Compose. The wormhole protocol logic is implemented in Go and bound via gomobile:
┌─────────────────────────────────────┐
│ Kotlin/Compose UI │
│ (Screens, ViewModels, Repository) │
└──────────────┬──────────────────────┘
│ gomobile bindings
┌──────────────▼──────────────────────┐
│ Go wormhole package │
│ (Wraps wormhole-william lib) │
└─────────────────────────────────────┘
iOS development is on the ios branch.