Projects

Three apps. Same architecture. Different superpowers.

Pockr

Pockr

Docker on Android

Run Docker containers on a non-rooted Android device. Pull images, start containers, tail logs — all from a native Flutter UI backed by a Docker daemon in an Alpine VM.

  • Pull & run any Docker image
  • Real-time container logs
  • Terminal into the Alpine VM host
  • Configurable vCPU + RAM (1–4 cores, 512 MB–4 GB)
Zyvr

Zyvr

Asterisk PBX on Android

Zero-carrier Your Voice Router. A full Asterisk 20 PBX running on your phone. Manage SIP extensions, monitor live calls, and route calls — carrier-independent.

  • Asterisk 20 with PJSIP driver
  • SIP extension management (create, delete, list)
  • Live call monitor + hangup
  • WebRTC/SIP.js support via WSS on 8089

How it works

Every app uses the same layered stack — QEMU gives the Linux VM, Alpine gives the environment, the app gives the UI.

Flutter UI (Dart)
Native Android UI — tabs, logs, terminal, settings
Kotlin VmManager
Launches libqemu.so via JNI, manages ForegroundService lifecycle
QEMU (libqemu.so)
Compiled as .so shipped inside the APK. Runs as a normal app process — no root.
Alpine Linux VM
Boots from a bundled QCOW2 asset. SLIRP networking, persistent overlay, OpenRC init.
Your workload
Docker daemon · Asterisk PBX · bash shell — whatever runs on Linux

SLIRP port mappings

PortProtocolServiceApp
7080TCPFastAPI control serverAll
2222TCPOpenSSHLinxr
5060TCP/UDPSIPZyvr
5038TCPAsterisk AMIZyvr
8088/8089TCPARI / WebSocket (WSS)Zyvr
10000–10019UDPRTP mediaZyvr

Requirements

📱
Android 8.0+
API level 26 or higher
⚙️
ARM64 only
arm64-v8a architecture required
💾
~250 MB storage
For the APK + VM image
🔓
No root needed
QEMU runs as a normal app process