Run an Arkovia blockchain node and its bundled wallet directly on your Android phone. The APK includes the Android Java runtime, node software, wallet interface, and ARKOS artwork. No Termux, separate Java installation, desktop computer, or remote wallet server is required. An internet connection is needed for normal node operation and synchronization.
Current release: build 6. The app name remains Arkovia Node v0.1.0. “Build 6” identifies the update; the bundled core reports its own version, 1.13.1.
Download the signed APK · Release page · Successful validation run · Report a problem
This is an experimental Android release. The node-only predecessor ran successfully on a Moto g 5G (2024), Android 15. Build 6 passed compilation, integrity, authentication, and browser wallet tests. Its wallet still needs physical Android-device validation. Automated tests did not send payments, issue currencies, or start live forging.
- Features
- Requirements and compatibility
- Install or update
- Start and synchronize the node
- Use the wallet
- Node settings
- Forging
- Privacy, recovery phrases, and local access
- Troubleshooting
- Downloads and verification
- Build from source
- Tests and GitHub Actions
- Repository structure
- Release history
- Support and contributions
- Source provenance and licenses
| Area | Included behavior |
|---|---|
| Full node | Download, verify, and store the Arkovia blockchain locally. |
| Status | Display local block height, connected peers, synchronization/scanning state, and node logs. |
| Wallet | Open the bundled Arkovia wallet inside the app, including its welcome and account-login screens. |
| Accounts and payments | Account lookup, balances, receiving addresses, sending ARKOS, and transaction history through the upstream wallet. |
| Assets and currencies | The pinned wallet's asset exchange and monetary-system interfaces, including the operations supported by the core. |
| Other wallet modules | Messages, aliases, account properties, voting, approval requests, data cloud, marketplace, and shuffling interfaces supplied by the upstream wallet. |
| Peer service | Optional incoming peer connections on port 4874, subject to network reachability. |
| Forging | Opt-in node support and explicit wallet start/stop controls; account eligibility and chain rules still apply. |
| Operating controls | Start/stop buttons, foreground notification with stop control, Wi-Fi-only and charging-only settings. |
| Files and diagnostics | Android document-picker integration for file selection and supported local HTTP downloads; diagnostic-log export. |
Availability in the bundled wallet does not mean every transaction type has been tested on Android. The wrapper preserves the pinned core's consensus, supply, fees, account format, and eligibility rules; it does not add proposed future consensus changes or integrations with unrelated services.
- Camera QR scanning is not implemented. Generated QR-code images are allowed; device rendering still needs confirmation.
- Remote wallet plugins, external exchange services, API proxying, and desktop integrations are blocked or unsupported.
- The wallet download handler supports local HTTP downloads. Browser-generated
blob:downloads and desktop printing flows are not implemented by the wrapper. - The wallet is not exposed to the LAN or internet. A plain browser visit to its internal address is not an authenticated session.
- Android may stop the app under memory pressure or background restrictions. Continuous operation is not guaranteed.
- The node does not start automatically after a reboot or after a selected operating condition becomes valid again.
| Item | Requirement or verified status |
|---|---|
| Architecture | ARM64 / arm64-v8a. No 32-bit or x86 Android APK is supplied. |
| Runtime compatibility | Android 12 or later, with supported heap-tagging controls and 4 KB memory pages. This is not a guarantee for every device. |
| APK metadata | Minimum API 28; target/compile API 35. The bundled JVM's actual runtime requirements are stricter than the APK installation minimum. |
| Device confirmation | Build 5: Moto g 5G (2024), Android 15, running at block 8,605 with two connected peers. |
| Connectivity | An internet-capable connection; Wi-Fi-only mode is enabled by default. |
| Storage | Space for the APK, extracted runtime, and a growing blockchain database. There is no fixed final database size documented here. |
| Resources | JVM configuration uses up to 512 MiB of Java heap and two active processors; total app memory also includes native code and WebView. |
The storage policy stops or prevents operation below approximately 256 MiB of free app-volume space. That cutoff is not an estimate of how much space a complete blockchain needs. Initial synchronization can use substantial data, storage, battery, and time. Wi-Fi-only mode does not make usage free or unmetered.
- Download
Arkovia-Node-v0.1.0-build6-arm64-v8a.apkfrom the release page. - Open the downloaded APK. If Android requests it, permit your chosen browser or file manager to install this APK.
- Open Arkovia Node v0.1.0.
- Allow notifications when prompted so the persistent node status and stop control are available.
- Review the operating settings, then tap Start node.
- Tap Stop node and wait for shutdown before installing the update.
- Install the new signed APK over the existing app.
- Do not uninstall or clear app storage to perform a normal update.
- Reopen the app, verify your settings, and start the node.
The published build 6 APK uses the original app signing certificate and package ID, org.arkovia.node.android, to support an in-place update. A differently signed APK cannot replace it normally. Rebuilding with a new signing key does not preserve this update relationship.
Uninstalling or clearing storage removes this app's downloaded chain and local settings. Keep your wallet recovery phrase backed up independently; reinstalling the app cannot recover a lost phrase.
Tap Start node while the selected network and charging conditions are satisfied. The app prepares the bundled files, starts Java, and initializes the blockchain database.
The status card may show:
| Status | Meaning |
|---|---|
| Preparing / starting | The bundled node or database is initializing. |
| Synchronizing | The node reports that it is downloading blockchain data. |
| Checking stored blocks | The core reports a blockchain scan. |
| Waiting for peers | The node is active but has no connected peers. |
| Node running | The node is initialized, has peers, and is not reporting a download or scan at that moment. |
| Node exited | The process ended; inspect the log for the actual reason. |
An increasing block height is evidence of progress. A single “Node running” screenshot does not prove that the node has reached the network's latest height or that it will remain stable indefinitely.
Use Stop node in the app or notification for a normal shutdown. Changing connection or forging settings requires stopping the node first, then starting it with the new settings.
- Start the node and wait for initialization.
- Tap Open wallet.
- A fresh wallet session may show a welcome screen first. Choose Returning User for an existing account or Create New Account to follow the account-creation flow.
- If the server is still starting, wait and use Reload in the wallet toolbar.
The internal wallet address is http://127.0.0.1:4876. Open it using the app's button. The app supplies a private session cookie; entering that address in a separate browser normally returns 403. This is intentional and is not a failed node connection.
The upstream wallet provides account-address lookup and passphrase-based access. An address-only lookup is useful for reviewing public balances and activity without signing transactions. Spending or other signed operations require the appropriate account credentials.
For a new account, follow the wallet's recovery-phrase generation and confirmation steps. Make an independent offline backup before relying on the account. Do not put the phrase in GitHub, diagnostic logs, screenshots, or support requests.
Use your account's ARK-… receiving address for supported Arkovia transfers. For sending or other wallet operations, review the selected account, recipient, amount, fee, and confirmation details presented by the wallet before submitting. Wait for synchronization before relying on displayed balances and chain-dependent actions.
Assets, currencies, messages, voting, and other modules follow the rules of the pinned Arkovia core. No new earning rules or automatic currency creation were added by the Android wrapper.
Close wallet returns to the node screen. It closes the WebView session and removes its cookies; public account preferences or contacts may remain in app storage. It does not stop the node or an explicitly started forging session. Stop forging in the wallet, or stop the node, when that is your intention.
The wallet screen uses Android's secure-window setting to block screenshots. There is no native JavaScript bridge exposing app internals to the wallet page.
| Setting | Default for a new installation | Behavior |
|---|---|---|
| Seed peers | 147.93.138.255:4874;217.216.64.226:4874 |
Bootstrap peer addresses bundled with this build; availability is not guaranteed. |
| Wi-Fi only | On | Stops or prevents operation when the active connection does not satisfy the Wi-Fi policy. |
| Run only while charging | Off | When enabled, requires the phone to remain plugged in. |
| Accept incoming peer connections | On | Enables the peer server on port 4874; actual inbound access depends on the network. |
| Allow forging controls in wallet | Off | Enables forging support on the next node start; does not begin forging by itself. |
Seed peers use host:port, separated by semicolons. The current editor accepts hostnames or IPv4-style hosts; it does not accept bracketed IPv6 peer entries.
No UPnP/router forwarding is enabled automatically. Carrier networks, NAT, or router configuration may prevent inbound connections even when the switch is enabled. Port 4874 is the peer service; port 4876 is the private local wallet/API and must not be treated as a public wallet endpoint.
If Wi-Fi, charging, connectivity, or free-space requirements stop being met, the app requests shutdown. Restore the condition and tap Start node again. Settings are saved locally; existing installations retain previously stored settings.
- Stop the node.
- Enable Allow forging controls in wallet.
- Start the node and let it synchronize.
- Open the wallet using an account that satisfies the core's forging rules.
- Start forging explicitly through the wallet and check its reported status.
Enabling the switch alone does not start forging or guarantee earnings. A running node is not proof that it is forging. Eligibility, balance requirements, timing, and rewards are controlled by the blockchain core.
A forging session keeps the required secret in node memory until that session or the node is stopped. Closing the wallet screen alone does not end it. Automated development tests verified zero active forging sessions and did not start live forging.
The Android wrapper does not save wallet recovery phrases. The existing wallet and node handle the operations that require account credentials. Public wallet preferences and contacts can persist separately from in-memory credentials.
Local access protections include:
- Wallet/API binding to
127.0.0.1:4876. - A fresh random wallet session credential for each node launch.
- An HttpOnly, SameSite session cookie supplied by the app.
- Rejection of missing/incorrect cookies, unexpected Host headers, and foreign Origins.
- WebView restrictions on external navigation, file/content URL access, mixed content, and external resources.
- Blocking of the database shell, proxy routes, and wallet plugin routes.
These are implementation protections, not a claim that the legacy wallet or Android Java port has received a complete security audit. The peer service necessarily communicates with other nodes when connected.
App-private files include the runtime, chain database, generated configuration, status, and logs under the app's files/node directory. Generated conf/nxt.properties is rewritten from the app settings when the node is prepared; manual edits are not a supported persistent configuration method.
| Symptom | What to check |
|---|---|
| Wallet address returns 403 | Use Open wallet in the app. Plain browser/API requests lack its session cookie. |
| Wallet says it cannot load | Confirm the node is still active, wait for initialization, then tap Reload. |
| Settings appear disabled | Stop the node before editing them. |
| Node stops when leaving Wi-Fi or unplugging | Check the Wi-Fi-only and charging-only policies. |
| Node stops unexpectedly in the background | Review the node log and Android's app battery/background settings. Android resource limits can still stop it. |
| No peers or no block progress | Check connectivity and seed settings. “Waiting for peers” is different from a process crash. |
| No incoming peers | Confirm network reachability to port 4874. Enabling the switch does not create router forwarding. |
| No forging earnings | Confirm that support is enabled, the wallet actually started forging, the chain is synchronized, and the account meets core rules. Earnings are not guaranteed. |
| APK will not update the app | Check the package, version, signing certificate, available storage, and that you selected the signed release APK rather than an unsigned build. |
| Storage warning | Free space, then restart. Do not delete the database or clear app storage as a routine first step. |
| Runtime reports a 4 KB page requirement | This runtime does not support that device's memory-page configuration. |
Historical builds encountered these issues:
| Earlier error | Change carried into build 6 |
|---|---|
Failed setting boot class path |
Restored the runtime library layout and installed read-only library copies. |
ClassFormatError: Incompatible magic value |
Restored the complete Java modules file and added runtime size/hash checks. |
Pointer tag ... was truncated |
Configured heap-tagging compatibility before loading the JVM and checked new allocations. |
Exit codes alone are not diagnoses. If a current build fails, include the lines around the error and the native launcher build identifier.
Run 33803056614 failed because the test waited for #login_panel while a new browser profile was showing the welcome screen. The test was corrected to choose Returning User before checking login.
Run 33803765477 passed, including the browser wallet test and signed-release publication. The earlier red run remains in GitHub's history; it does not describe the published corrected build.
The recorded Node.js deprecation notices concern GitHub Actions' tooling, not the Android app's Java runtime. They were not the cause of that login-test failure. An artifact-upload step can succeed even when an earlier test in the same job failed; check the overall run result.
| Item | Build 6 value |
|---|---|
| APK | Arkovia-Node-v0.1.0-build6-arm64-v8a.apk |
| Size | 74,456,226 bytes |
| Package ID | org.arkovia.node.android |
| Version name / code | v0.1.0 / 6 |
| Release source commit | 80da53a |
APK SHA-256:
3c90074d5ef246a0fcbbe9b1e3fbb7eb5576b197196beae1c18cb18008ea4712
Signing-certificate SHA-256:
14653d26e3a8d98624f9e630faa8da58ed1f52d12ec256eae63445b6d806d214
On Linux:
sha256sum Arkovia-Node-v0.1.0-build6-arm64-v8a.apkOn Windows PowerShell:
Get-FileHash .\Arkovia-Node-v0.1.0-build6-arm64-v8a.apk -Algorithm SHA256The release also includes manifest.json. If you use Android SDK build tools, apksigner verify --verbose --print-certs <apk> checks the APK signature and prints the certificate fingerprint.
The exact signed APK is stored losslessly in release/parts/. This representation supports publishing through a GitHub connector without a direct release-binary upload operation.
git clone https://github.com/mycreationhaven/android-v0.1.0.git
cd android-v0.1.0
python3 release/assemble.pyThe script verifies decoded size, SHA-256, and ZIP integrity and writes the APK inside release/. Reconstruction does not compile source or require a signing key.
Use Linux x86-64 with Python 3.12+, Git, unzip, and enough disk space for the toolchains and build outputs. The preparation script downloads JDK 17, Android SDK 35, NDK r27d, the pinned core checkout, and the Android OpenJDK runtime. The toolchain downloads are substantially larger than the installable APK.
git clone https://github.com/mycreationhaven/android-v0.1.0.git
cd android-v0.1.0
python3 android-node/scripts/prepare.py --tools .tools --core .core
python3 android-node/scripts/build.py --tools .tools --core .coreOutput:
android-node/build/Arkovia-Node-v0.1.0-build6-unsigned.apk
An unsigned APK cannot be installed. It is not the signed release download. A fresh source build is also not promised to be byte-for-byte identical to the supplied signed APK.
Use the original private signing key if the APK must update an existing installation. Set ARKOVIA_STORE_PASSWORD and ARKOVIA_KEY_PASSWORD securely in the build environment, then run:
export ARKOVIA_KEY_ALIAS=arkovia-test
python3 android-node/scripts/build.py \
--tools .tools \
--core .core \
--keystore /private/path/signing.keystoreThe default alias is arkovia-test; use the alias belonging to your actual keystore. The build invokes apksigner with passwords read from the environment.
Never commit private signing keys, passwords, recovery phrases, wallet session credentials, or blockchain databases. The public repository contains no private signing key. The supplied test signing identity should not be treated as a separately audited production signing program.
The build checks runtime archive hashes, extracted runtime-file lengths and hashes, and the Java modules image. It then checks the packaged runtime, nested JAR integrity, APK ZIP integrity, and alignment. Signed builds also undergo signature verification. This guards against the incomplete-runtime packaging problem encountered in earlier builds.
The original ARKOS artwork is stored in android-node/artwork/coin.b64.*. Preparation reconstructs the exact PNG and checks its hash. The source-code license does not grant ownership of that artwork.
The workflow builds the source independently and runs:
- HTTP tests for authenticated local access, bad/missing session credentials, Host/Origin rejection, and restricted routes.
- An offline node integration test using an isolated genesis database, with no peer synchronization or live spending.
- A Chromium test covering wallet initialization, the first-use welcome flow, and read-only genesis-account login.
- Reconstruction, checksum verification, and Android signature verification of the supplied signed APK before release publication.
The successful browser test reported no JavaScript page errors. Its fixture used the public genesis account; its synthetic/offline account balance is not a user's wallet balance. The offline test confirmed zero forging sessions and graceful shutdown with exit code 0.
mkdir -p android-node/build/tests
.tools/jdk-17/bin/javac \
-cp '.core/lib/*:android-node/build/node-classes' \
-d android-node/build/tests \
android-node/tests/WalletGateTest.java
.tools/jdk-17/bin/java \
-cp 'android-node/build/tests:android-node/build/node-classes:.core/lib/*' \
WalletGateTest
python3 android-node/tests/offline_wallet.py .tools/jdk-17/bin/javaFor the browser check:
python3 -m pip install playwright==1.58.0
python3 -m playwright install --with-deps chromium
python3 android-node/tests/offline_wallet.py .tools/jdk-17/bin/java --browserTests bind local port 4876, so it must be available. The browser test requires an environment that permits Chromium to run. Browser and host-JDK success do not replace physical Android WebView/runtime testing. See VALIDATION.md for the evidence and pending checks.
The workflow runs on pushes to main and manual dispatch. It publishes the pre-signed bytes supplied in release/parts/, after validation; it does not secretly sign a new source build. When changing the app for a future release, build and sign the new APK privately, update its parts and manifest, and update the version, release naming, workflow, and documentation together. Do not publish a changed source tree with unrelated old APK bytes.
| Path | Purpose |
|---|---|
android-node/app/src/ |
Android activity, WebView wallet, node service, settings, and runtime preparation. |
android-node/native/launcher.c |
Native JVM launcher and heap-tagging compatibility checks. |
android-node/node/src/ |
Core adapter, status reporting, shutdown handling, and local wallet authentication gate. |
android-node/res/ |
Android layouts/resources, styles, icon definitions, and local cleartext-network policy. |
android-node/artwork/ |
Lossless encoded original coin artwork. |
android-node/scripts/ |
Dependency preparation and build scripts. |
android-node/tests/ |
HTTP authentication and offline wallet/browser tests. |
android-node/dependencies.json |
Pinned source/runtime revisions and asset/runtime hashes. |
release/ |
Signed-APK parts, integrity manifest, and reconstruction script. |
.github/workflows/android.yml |
Build, validation, and publication automation. |
VALIDATION.md |
Executed checks and remaining device validation. |
| Build | Main change |
|---|---|
| Initial prototype | Standalone Android node wrapper and bundled runtime. |
| 2 | Runtime library-layout correction and Arkovia name/artwork. |
| 3 | Complete Java modules image restored and verified. |
| 4 | Initial heap-tagging compatibility workaround. |
| 5 | Removed the compatibility-setting bypass, added allocation checks, and achieved confirmed phone startup/peer connectivity. |
| 6 | Bundled wallet, authenticated local access, optional peer sharing/forging controls, QR-image allowance, source publication, and validated signed GitHub release. |
Open an issue with:
- Phone model, Android version, and installed app build.
- What you selected and what you expected to happen.
- The relevant node-log excerpt or exported diagnostic log.
- Whether the problem concerns startup, synchronization, wallet access, or a particular operation.
- The GitHub Actions run URL if reporting a workflow failure.
Review diagnostic output before posting it. Never include a recovery phrase, private key, signing keystore, password, or wallet session cookie.
Contributions should preserve the working Android runtime fixes, local wallet access boundary, upstream copyright notices, and chain rules. Document what was actually tested. Consensus changes require separate review and must not be introduced as incidental Android or branding changes.
- Android wrapper and adapter: this repository; new code is covered by LAUNCHER-LICENSE.txt.
- Core, wallet, and dependencies: Arkovia-Blockchain at
a358e9f, pinned in dependencies.json. - Android OpenJDK runtime: ZalithLauncher2 at
0cd27d8.
The core and wallet retain the Jelurida Public License and their copyright notices. OpenJDK and all other dependencies retain their respective licenses; the Android wrapper's MIT license does not replace those terms. Applicable upstream license files are included in the APK payload. Review those licenses and their obligations before redistributing modified binaries.
Arkovia is the blockchain. ARKOS is its native currency.