DroidSpaces Nebula is the public release hub for the RM11 Pro DroidSpaces, Wayland, Steam/Proton, and PowerDeck experiments.
This repo is the reviewable source and workflow layer. Large APKs, screenshots, logs, Mesa packages, rootfs images, and private device evidence stay in the local nebula-assets folder or in explicit GitHub Release assets after review.
Nebula is the single baseline APK/module entrypoint for this stack. It does not silently vendor or replace DroidSpaces, Termux:X11, WayLandIE, Nubia Toolkit, or RedMagic Control Center; it detects them, reports ownership, and promotes fixed commands only after proof:
- show which lanes are installed
- verify versions and signer hashes
- launch the existing apps or their Android app-info screens
- generate a copyable diagnostic report
- keep risky root/module work out of the first app cut
- expose one standalone ownership manifest for APK, module, display, container, hook, hardware, and PowerDeck lanes
Current status: pre-release integration baseline. Do not describe Nebula as stable, production ready, or safe for general users yet.
io.droidspaces.nebula
Start with the Nebula baseline:
- Install the Nebula APK.
- Install the Nebula Core KernelSU/Magisk-style module.
- Open Nebula and press Refresh.
- Copy the doctor report if you are filing a test result.
Nebula then reports the status of the other lanes from one place:
- WayLandIE display/runtime;
- DroidSpaces / Anland container fallback;
- Nubia Toolkit / ReZygisk provider / Vector hook readiness;
- RedMagic Control Center hardware references;
- PowerDeck dry-run automation readiness.
RM11 Pro gets the strongest proof lane because it is the device we can verify directly, but Nebula is not meant to strand users on weaker or different phones. Keep compatibility lanes explicit:
| Tier | Lane | Status |
|---|---|---|
| 1 | RM11 Pro WayLandIE/Gamescope/Xwayland R6 sidecars | Phone active module proof is the authority: NEBULA_R6_WAYLAND_WORKING_REAL_BUFFER_PASS, NONE_WAYLAND_DISPLAY, vkGetMemoryFdKHR failures 0, real-buffer commits 2; next gate is bounded game-client runtime before Steam/Proton promotion. |
| 2 | Anland + DroidSpaces Ubuntu26/KDE | Proven visible lane: NEBULA_R6_ANLAND_DROIDSPACES_WAYLAND_VISIBLE. |
| 3 | DroidSpaces native profiles | Termux:X11, VirGL, Turnip/KGSL, llvmpipe, and PulseAudio profiles exist; each needs its own proof. |
| 4 | Vower WayLandIE latest | Compatibility candidate for non-RM11Pro/lower-spec devices; synced locally at 3ea02d5, not promoted as the RM11 R6 baseline. |
Vower latest is tracked because it targets GPU, DXVK, shader-cache, Turnip, AHB, and direct Android compositing work that may help devices outside the RM11 Pro lane. It needs bounded install/launch/display proof before user promotion.
- Rooted Android device for the Nebula Core module.
- RM11 Pro / NX809J for RedMagic fan, pump, LED, trigger, and GameHub-specific checks.
- WayLandIE companion APK for the Phone/App display lane.
- DroidSpaces/Anland files only when testing the container surface lane.
- ReZygisk v1.0.0-rc.9 as the standalone Zygisk provider when intentionally testing future Nubia hook lanes; disable Magisk built-in Zygisk for this module path.
- Vector/LSPosed only when intentionally testing future Nubia hook lanes.
- ADB access for logs, APK install, module install, and recovery.
Baseline status is read-only. It does not enable LSPosed hooks, write hardware nodes, start game clients, replace DroidSpaces, or launch Proton/Wine/Steam.
Checked: 2026-06-27
These are test artifacts, not stable releases:
APK:
/home/richtofen/.android/repositories/Droidspaces-Nebula/app/build/outputs/apk/debug/app-debug.apk
size: 6469966
sha256: 67e49e8da87cd1a698faeb66e390aef52a8f6e1a9ac5873e9ad40beb96113a8c
Core module:
/home/richtofen/.android/repositories/Droidspaces-Nebula/build/module/Droidspaces-Nebula-Core-0.2.2.zip
size: 36116
sha256: cfcbbabcc99cac22a9f62b24134a21a4f448fa2c252668aff5bf94fb9f111756
Tester install order:
- Install the APK.
- Install or update the matching Nebula Core module.
- Reboot if your module manager requires it.
- Open Nebula, press Refresh, and save the report.
Fresh Reversa-Matrix evidence scans were written locally to:
/home/richtofen/.android/repositories/nebula-assets/local/reversa_matrix_nebula_current_linux_container
/home/richtofen/.android/repositories/nebula-assets/local/reversa_matrix_nebula_current_userspace_graphics
/home/richtofen/.android/repositories/nebula-assets/local/reversa_matrix_nebula_current_rm11pro_gaming_runtime
Nebula reports each display method with its own container_ref,
container_kind, container_status, display_status, runtime_status, and
missing_requirements fields. This keeps a working lane from being confused
with a different incomplete lane.
For the full source-backed map, run:
su -c '/data/adb/modules/nebula_core/bin/nebula-core display method-containers --json'For concrete DroidSpaces profile templates, run:
su -c '/data/adb/modules/nebula_core/bin/nebula-core display method-profiles --json'For the one-APK/one-module ownership contract, run:
su -c '/data/adb/modules/nebula_core/bin/nebula-core integrations standalone --json'integrations standalone is read-only. It shows which layer Nebula owns,
which external payloads are detected instead of bundled, which commands are
fixed, and why active module output stays authoritative over pending updates.
method-profiles is read-only. It emits config/env lines, config paths, and
copyable create/start commands. Safe config-only materialization is direct
atomic file creation: write container.config.tmp, move it to
container.config, chmod 0644, then start later with
droidspaces --config=<container.config> start. DroidSpaces create only
creates a rootfs image; start persists or mirrors container.config. Use one
writable rootfs image or directory per profile, because multiple active profiles
must not share the same writable rootfs.img.
| Method | Container ref | Current requirements |
|---|---|---|
| Phone/App Mode | waylandie_app_imagefs |
Phone active module proves WayLandIE/Gamescope/Xwayland display with NEBULA_R6_WAYLAND_WORKING_REAL_BUFFER_PASS, NONE_WAYLAND_DISPLAY, vkGetMemoryFdKHR failures 0, and real-buffer commits 2; game-client runtime remains unpromoted until the next bounded proof. |
| Anland Surface Mode | dedicated DroidSpaces Anland container, recommended anland-ubuntu26-kde |
Needs the Anland Android consumer APK, virtual-drm-daemon module, Ubuntu26 KDE rootfs with anland_kde, anland.env, socket bind, and startanland-kde.sh. |
| DroidSpaces rootfs image | rootfs.img |
Use --rootfs-img or import --rootfs-arc into a sparse image for stable Android container storage. |
| DroidSpaces rootfs directory | rootfs_directory |
Use --rootfs for simple unpacked rootfs testing. |
| DroidSpaces Termux:X11 | droidspaces_container_enable_termux_x11 |
Set enable_termux_x11=1; DroidSpaces injects DISPLAY=:0 through /run/droidspaces.env on the current RM11 Pro proof. |
| DroidSpaces VirGL | droidspaces_container_enable_virgl |
Set enable_virgl=1; DroidSpaces injects GALLIUM_DRIVER=virpipe and uses /tmp/.virgl_test. |
| DroidSpaces Turnip/KGSL | droidspaces_container_enable_gpu_mode |
Set enable_gpu_mode=1 and enable_hw_access=1; device-specific Turnip/KGSL env still belongs to that container. |
| DroidSpaces llvmpipe | droidspaces_container_software_gl |
Keep GPU/VirGL disabled and optionally force software GL for compatibility checks. |
| DroidSpaces PulseAudio | droidspaces_container_enable_pulseaudio |
Set enable_pulseaudio=1; DroidSpaces injects PULSE_SERVER=unix:/tmp/.pulse-socket. |
| Dock Lease Mode | none until a lease receiver is implemented |
External-display discovery and operator approval are still required. |
| Compatibility Mode | future dedicated compatibility/software container | Not wired by design. |
| Recovery/Safe Mode | none |
Always available, blocks risky starts. |
Dock Lease schema work is host-only. docs/integration/schemas/ and
tests/fixtures/dock-lease/ describe the future command/result envelope without
adding a start command, APK allowlist entry, DRM mutation, or compositor launch.
scripts/dock-lease-command-plan-report.js can generate a review report from
those fixtures, but profile set dock remains blocked.
For Phone/App Mode, first check runtime waylandie status --json or
display lanes --json. The read-only output includes live reinstall-safe path
fields (package_path, native_lib_dir, glibc_loader), plus selected_icd,
selected_vulkan_driver, and loader_pin, where VK_ICD_FILENAMES and
VK_DRIVER_FILES both point to the pinned local Freedreno ICD manifest inside
the WayLandIE imagefs. The /data/app/... install instance is expected to
change after reinstall; Nebula resolves it from the live package path instead
of carrying forward archived proof paths.
DroidSpaces already owns rootfs image/directory startup, Termux:X11, VirGL, Turnip/KGSL, llvmpipe, and PulseAudio wiring. Nebula reports them separately so we can try each method without mixing socket, GPU, audio, and rootfs assumptions into one confused profile.
Anland is not a generic toggle for the same daily container. It flips display
ownership to the Anland daemon socket and a patched Wayland/KWin producer. The
repo-backed producer path is the DroidSpaces rootfs KDE builder with Ubuntu26,
KDE auto-start, and anland_kde enabled. A dedicated Anland profile/container
should own:
env_file=/data/local/Droidspaces/Containers/<container>/anland.env
bind_mounts=/data/local/tmp/display_daemon.sock:/run/display.sockThe host socket must be app-writable, normally srw-rw-rw-. If it exists as
root-only or owner-writable only, the producer can connect but the Android
consumer cannot deposit buffers, which presents as a black Anland screen.
and anland.env must set at least:
ANLAND=1
ANLAND_SOCKET=/run/display.sock
ANLAND_DRM_DEVICE=/dev/dri/renderD128
MESA_LOADER_DRIVER_OVERRIDE=kgsl
GALLIUM_DRIVER=kgsl
FD_FORCE_KGSL=1The Ubuntu26/KDE builder emits a .tar.xz rootfs archive. Stage it on the
phone as /sdcard/Download/anland-ubuntu26-kde.tar.xz, then let DroidSpaces
create the sparse rootfs image:
/data/local/Droidspaces/bin/droidspaces \
--rootfs-arc=/sdcard/Download/anland-ubuntu26-kde.tar.xz \
--rootfs-img=/data/local/Droidspaces/Containers/anland-ubuntu26-kde/rootfs.img \
--size=32G \
createThen start or restart the container through DroidSpaces, not by raw-writing the container config:
/data/local/Droidspaces/bin/droidspaces \
--name=anland-ubuntu26-kde \
--rootfs-img=/data/local/Droidspaces/Containers/anland-ubuntu26-kde/rootfs.img \
--net=host \
--hw-access \
--gpu \
--selinux-permissive \
--privileged=nocaps,noseccomp \
--env=/data/local/Droidspaces/Containers/anland-ubuntu26-kde/anland.env \
--bind=/data/local/tmp/display_daemon.sock:/run/display.sock \
startInside that rootfs, the producer command is startanland-kde.sh.
For sparse-image containers, verify and launch it through DroidSpaces:
/data/local/Droidspaces/bin/droidspaces --name=anland-ubuntu26-kde \
run sh -lc 'test -x /usr/local/bin/startanland-kde.sh'
/data/local/Droidspaces/bin/droidspaces --name=anland-ubuntu26-kde \
run sh -lc 'nohup /usr/local/bin/startanland-kde.sh >/tmp/anland-kde.log 2>&1 &'Nebula also exposes the contributor Linux-native desktop flow as a read-only recipe manifest:
su -c '/data/adb/modules/nebula_core/bin/nebula-core display anland recipes --json'
su -c '/data/adb/modules/nebula_core/bin/nebula-core display anland status-check --json'Use it as a checklist, not a launcher. It records APK/module verification,
rootfs image creation, container lifecycle, KDE producer launch, status checks,
screenshot capture, audio fixes, browser installs, and Steam install leads. All
mutating recipes remain deferred and exposed_by_nebula=false.
Use display anland status-check --json for the stricter selected-container
status projection. It is fixed-path/proc/config only: no DroidSpaces runtime
invocation, no process inventory, no daemon log tailing, no setup commands, no
container lifecycle, no KDE launch, no package installs, and no game runtimes.
ANDROID_HOME=/home/richtofen/.android/sdk ANDROID_SDK_ROOT=/home/richtofen/.android/sdk \
/home/richtofen/.android/repositories/nebula-assets/Repos/Droidspaces-OSS/Android/gradlew \
--project-dir /home/richtofen/.android/repositories/Droidspaces-Nebula \
--no-daemon :app:assembleDebugVerified locally on 2026-06-21 after moving the repo to the top-level
/home/richtofen/.android/repositories/Droidspaces-Nebula path.
The CI workflow in .github/workflows/nebula-android.yml runs source hygiene
checks first, then builds the debug APK on GitHub Actions. It uploads only the
generated debug APK and SHA256 file from CI.
app/ Android selector/doctor app
docs/ workflow, lane, upstream, and safety notes
scripts/ validation helpers for CI and local review
The current WayLandIE bridge experiments are still promoted selectively from the local review worktree:
/home/richtofen/.android/repositories/nebula-assets/Repos/waylandie-vower-578b431
The 2026-06-28 contributor linux native.zip artifact is tracked as local
evidence only under nebula-assets/local/contributor-linux-native-2026-06-28.
It contains Anland compositor, DroidSpaces engine, KDE rootfs builder, APK, zip,
keystore, and build-output material. Nebula may absorb source-level contracts
and reproducible command surfaces from it, but the public repo must not ingest
large binaries, private keys, generated build trees, or unreviewed APK/module
payloads.
Do not vendor that whole worktree until the active diffs are reviewed and trimmed.
- Safe desktop: Termux, Termux:API, Termux:X11
- Zero-copy display: WayLandIE proof lane
- DroidSpaces container: DroidSpaces app lane
- Native compositor: wlroots/AHardwareBuffer reference lane
- Steam/Proton: WinNative/GameNative/Proton/Wine reference lane
- PowerDeck: dry-run module lane
- RedMagic controls: RedMagic Control Center and Nubia Toolkit reference lane
- Vower reference: build-pass lead, not a drop-in install target
- Vower latest compatibility: synced candidate for broader device support, not the RM11 R6 proof baseline
Current external-display research inputs:
- BD DRM Control package is captured and validated as reference evidence for external-display-only DRM leasing. It is not vendored or executable in Nebula.
- Qualcomm Adreno mobile best-practices documentation is captured local-only as provenance for Vulkan-first, power-aware, tile/UBWC/GMEM-preserving runtime design. Public source keeps only distilled guardrails and never commits Qualcomm PDFs, extracted text, drivers, or blobs.
See:
This app does not request storage, root, notification, overlay, or shell permissions. It does not write device nodes or install APKs.
Public source must not contain private dumps, full EDL backups, private keys, serials, personal logs, token material, proprietary Qualcomm blobs, or copied vendor documentation payloads.