Run a Monero full node on your Android device
Features • Requirements • Installation • Building • Usage • Configuration • License
- Full Monero Node - Run a complete Monero node directly on your Android device
- Pruned Node Support - Choose between full node (~300GB) or pruned node (~50GB) to save storage
- External Storage - Use internal storage or external SD card for blockchain data
- Background Service - Node runs as a foreground service with persistent notification
- Start on Boot - Optionally auto-start the node when your device boots
- Real-time Status - Monitor sync progress, peer connections, and node health
- Auto-Update - Check for and install monerod updates directly from the app
- Material 3 Design - Modern dark theme with Monero orange accents
| Main Screen | Settings | Syncing |
|---|---|---|
| Node status and controls | Configuration options | Sync progress |
- Android Version: Android 7.0 (API 24) or higher
- Architecture: ARM64 (arm64-v8a) or ARM32 (armeabi-v7a)
- Storage:
- Pruned node: ~50GB free space
- Full node: ~300GB free space
- RAM: 2GB+ recommended
- Network: Stable internet connection for P2P sync
MoneroDroid requires the following permissions:
| Permission | Purpose |
|---|---|
INTERNET |
P2P network and RPC communication |
FOREGROUND_SERVICE |
Keep node running in background |
WAKE_LOCK |
Prevent device sleep during sync |
POST_NOTIFICATIONS |
Show node status notification |
RECEIVE_BOOT_COMPLETED |
Start on boot feature |
MANAGE_EXTERNAL_STORAGE |
SD card storage support (Android 11+) |
Download the latest release from the Releases page.
- Enable "Install from unknown sources" in your device settings
- Open the downloaded APK file
- Follow the installation prompts
- Grant required permissions when prompted
- Android Studio Arctic Fox (2020.3.1) or later
- JDK 17 or higher
- Android SDK with API level 35
- Gradle 8.9 (included via wrapper)
git clone https://github.com/sevendeuce/monerodroid.git
cd monerodroid# Using Gradle wrapper
./gradlew assembleDebug
# Output: app/build/outputs/apk/debug/app-debug.apk# Unsigned release
./gradlew assembleRelease
# Output: app/build/outputs/apk/release/app-release-unsigned.apk- Open Android Studio
- Select File > Open and navigate to the project directory
- Wait for Gradle sync to complete
- Select Build > Build Bundle(s) / APK(s) > Build APK(s)
Create a keystore for signing:
keytool -genkey -v -keystore release-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias monerodroidSign the APK:
# Build signed release
./gradlew assembleRelease \
-Pandroid.injected.signing.store.file=path/to/release-keystore.jks \
-Pandroid.injected.signing.store.password=YOUR_STORE_PASSWORD \
-Pandroid.injected.signing.key.alias=monerodroid \
-Pandroid.injected.signing.key.password=YOUR_KEY_PASSWORDmonerodroid/
├── app/
│ ├── src/main/
│ │ ├── java/com/sevendeuce/monerodroid/
│ │ │ ├── data/ # Data models (NodeState, RpcResponse)
│ │ │ ├── service/ # NodeService, BootReceiver
│ │ │ ├── ui/
│ │ │ │ ├── screens/ # MainScreen, SettingsScreen
│ │ │ │ └── theme/ # Colors, Typography, Theme
│ │ │ ├── util/ # Managers and utilities
│ │ │ │ ├── MonerodBinaryManager.kt
│ │ │ │ ├── MonerodProcess.kt
│ │ │ │ ├── ConfigManager.kt
│ │ │ │ ├── StorageManager.kt
│ │ │ │ ├── NodeRpcClient.kt
│ │ │ │ └── ArchitectureDetector.kt
│ │ │ ├── viewmodel/ # MainViewModel
│ │ │ └── MainActivity.kt
│ │ ├── jniLibs/ # Bundled monerod binaries
│ │ │ ├── arm64-v8a/libmonerod.so
│ │ │ └── armeabi-v7a/libmonerod.so
│ │ └── res/ # Resources
│ └── build.gradle.kts
├── .github/workflows/ # CI/CD pipelines
├── gradle/
│ └── libs.versions.toml # Dependency versions
└── build.gradle.kts
- Grant Permissions - Accept storage permission to allow blockchain data storage
- Choose Storage - Select internal or external storage for blockchain data
- Select Node Type - Toggle between pruned (~50GB) or full node (~300GB)
- Start Node - Tap the power button to start the node
- The node runs as a foreground service with a persistent notification
- Sync progress is displayed on the main screen
- Peer count shows network connectivity status
- Use the notification to quickly stop the node
- Tap the power button on the main screen, OR
- Tap "Stop" on the notification
- Wait for graceful shutdown (may take up to 30 seconds)
| Setting | Description | Default |
|---|---|---|
| Pruned Node | Use blockchain pruning to reduce storage | Enabled |
| Start on Boot | Auto-start node when device boots | Disabled |
| Storage Location | Internal or external (SD card) storage | Internal |
| Port | Protocol | Purpose |
|---|---|---|
| 18080 | P2P | Peer-to-peer network |
| 18081 | RPC | Local RPC (localhost only) |
| 18089 | RPC | Restricted RPC (network accessible) |
The app generates monerod.conf with optimized settings:
data-dir=/path/to/blockchain
prune-blockchain=1
p2p-bind-ip=0.0.0.0
p2p-bind-port=18080
rpc-bind-ip=127.0.0.1
rpc-bind-port=18081
rpc-restricted-bind-ip=0.0.0.0
rpc-restricted-bind-port=18089
out-peers=32
in-peers=32MoneroDroid can check for and install monerod updates:
- Open Settings
- Scroll to MONEROD UPDATE section
- Tap Check for Updates
- If an update is available, tap Update Monerod
- Wait for download and installation to complete
Note: The node must be stopped before updating.
- Ensure sufficient storage space (50GB+ for pruned, 300GB+ for full)
- Check that storage permission is granted
- Verify the monerod binary is installed (download if needed)
- Ensure stable internet connection
- Check peer count (should be 8+ for good connectivity)
- Consider using a pruned node if storage is limited
- This is expected during initial sync
- Battery usage decreases significantly once synced
- Consider keeping device plugged in during initial sync
- Clear app data and restart
- Reinstall the app
- Check for sufficient RAM (close other apps)
This project uses GitHub Actions for continuous integration:
Every push to main triggers:
- Debug APK build
- Release APK build (unsigned)
- Unit tests
# Tag a new version
git tag v1.0.0
git push origin v1.0.0This automatically:
- Builds signed release APK (if secrets configured)
- Creates GitHub Release with APK attached
- Generates release notes
Configure these secrets in your repository:
| Secret | Description |
|---|---|
KEYSTORE_BASE64 |
Base64-encoded keystore file |
KEYSTORE_PASSWORD |
Keystore password |
KEY_ALIAS |
Key alias name |
KEY_PASSWORD |
Key password |
Encode keystore:
base64 -i release-keystore.jks | tr -d '\n'- Language: Kotlin 2.0
- UI: Jetpack Compose with Material 3
- Architecture: MVVM with StateFlow
- Storage: DataStore Preferences
- Networking: OkHttp 4
- JSON: Gson
- Async: Kotlin Coroutines
- Build: Gradle 8.9 with Kotlin DSL
| Library | Version | Purpose |
|---|---|---|
| Jetpack Compose BOM | 2024.04.01 | UI framework |
| Material 3 | Latest | Design system |
| Lifecycle ViewModel | 2.9.0 | ViewModel + Compose |
| DataStore | 1.1.1 | Preferences storage |
| OkHttp | 4.12.0 | HTTP client |
| Gson | 2.10.1 | JSON parsing |
| Coroutines | 1.8.1 | Async operations |
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Kotlin coding conventions
- Use meaningful variable and function names
- Add comments for complex logic
- Write unit tests for new features
- RPC port 18081 is bound to localhost only
- Restricted RPC (18089) allows limited remote access
- No wallet functionality - this is a node-only app
- All connections to getmonero.org use HTTPS
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2024 SevenDeuce
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
- Monero Project - For the monerod daemon
- Jetpack Compose - Modern Android UI toolkit
- The Monero community for their support
This software is provided for educational and personal use. Running a Monero node contributes to the decentralization and security of the Monero network. The developers are not responsible for any misuse of this software.
Made with ❤️ for the Monero community
