Native Android app (Kotlin) that bundles JavaScript Solid Server (JSS) for one-click mobile install. Realizes part of JSS#46 (“Solid Pod on Every Phone”) for non-technical users.
Status: scaffold / pre-MVP. Tracking issue: JSS#366. Pivot decision: comment.
┌─────────────────────────────────────────────────┐
│ Android APK (Kotlin) │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ WebView │ │ libnode.so │ │
│ │ (MainActivity) │ │ (JNI thread) │ │
│ │ │◄──►│ │ │
│ │ http:// │HTTP│ bin/jss.js │ │
│ │ 127.0.0.1:4443 │ │ (single-user) │ │
│ │ │ │ │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ Foreground service + notification │
└─────────────────────────────────────────────────┘
libnode.so from nodejs-mobile is linked via JNI and runs JSS on a dedicated thread. The WebView talks to JSS over HTTP — no platform-channel bridge needed (JSS is already a server, the WebView is already a client).
bcryptjs, sql.js, @noble/curves). Verified by static audit. Bundling is a pure asset-copy.nodejs-mobile + WebView), both highlighted on nodejs-mobile.github.io.See the feasibility spike for the full dep audit, and the pivot rationale for why we landed on Kotlin instead of Flutter or React Native.
scripts/bundle-jss.sh — npm pack → install prod deps → refuse to bundle native modulesbin/jss.js start --single-user --port 4443 --host 127.0.0.1 --root <files-dir>/data --idpbuild.gradle.kts, MainActivity.kt, AndroidManifest.xml, theme)scripts/fetch-libnode.sh — pulls libnode.so (arm64-v8a + armeabi-v7a) from nodejs-mobile releaseshttp://127.0.0.1:4443/, with port-bind retry (4443 → 4444 → …)Context.filesDir--git, no --terminal — nodejs-mobile’s Node disallows child_process. Both are optional flags; v1 just doesn’t enable them.--tunnel is the path to public exposure via a remote JSS (decentralized ngrok).# Prereqs: Android Studio (or Android SDK + JDK 17), an Android device or emulator
adb devices # confirm device is visible
# Vendor libnode.so for the target ABIs (TBD)
./scripts/fetch-libnode.sh
# Bundle JSS into the APK assets
./scripts/bundle-jss.sh
# Build & install on a connected device (TBD: gradle scaffold)
./gradlew installDebug
jss-android/
├── README.md # this file
├── ARCHITECTURE.md # design details
├── LICENSE # AGPL-3.0-only (matches JSS)
├── build.gradle.kts # root gradle
├── settings.gradle.kts
├── app/
│ ├── build.gradle.kts
│ ├── libnode/ # vendored libnode.so + headers (gitignored)
│ └── src/main/
│ ├── AndroidManifest.xml
│ ├── java/live/jss/jss_android/
│ │ ├── MainActivity.kt
│ │ └── JssService.kt
│ ├── cpp/
│ │ ├── native-lib.cpp # JNI shim
│ │ └── CMakeLists.txt
│ ├── assets/
│ │ └── jss/ # JSS bundled here at build time
│ └── res/
└── scripts/
├── bundle-jss.sh # → app/src/main/assets/jss/
└── fetch-libnode.sh # → app/libnode/{abi}/libnode.so
nodejs-mobile — patched Node runtime for Android/iOSnodejs-mobile-samples — reference Kotlin Android projectAGPL-3.0-only — matches JSS.