Use cases
What Podroid is genuinely good for, what it does with caveats, and what to avoid - with honest notes on TCG performance throughout.
Self-hosting via containers
Rootless Podman, Docker and LXC are all ready the moment the VM boots: Podman needs no daemon, and the Docker and LXC services are enabled in the default runlevel, so they start automatically. You can run any ARM64 container image from Docker Hub or GHCR.
Port forwarding rules (see Networking & ports) expose guest ports on the phone's real IP. Use a host port above 1024 for anything you expose, because an unprivileged Android app cannot bind host ports below 1024.
# Pi-hole (DNS + ad-blocking)
$ podman run -d --name pihole \
-p 8080:80 -p 5353:53/tcp \
-e TZ=Europe/London \
docker.io/pihole/pihole:latest
# Gitea (self-hosted Git)
$ podman run -d --name gitea \
-p 3000:3000 -p 2222:22 \
-v gitea-data:/data \
docker.io/gitea/gitea:latest-linux-arm64
# Vaultwarden (Bitwarden-compatible password server)
$ podman run -d --name vaultwarden \
-p 8888:80 \
-v vaultwarden-data:/data \
docker.io/vaultwarden/server:latest
# code-server (VS Code in the browser)
$ podman run -d --name code-server \
-p 8443:8443 \
-v "$HOME/.config:/home/coder/.config" \
-v "$PWD:/home/coder/project" \
ghcr.io/coder/code-server:latest \
--bind-addr 0.0.0.0:8443 /home/coder/project
Services backed by a JVM - Gitea's built-in runner, Jenkins, Gradle builds inside code-server, and anything running on Java or Kotlin - are noticeably slow on the QEMU TCG backend. JVM startup alone can take 10-30 seconds. If you rely on these services heavily, enabling the AVF backend on a Pixel device makes a large practical difference.
Local Linux development environment
The Alpine guest is a full persistent Linux system. Install your toolchain once and it survives every reboot on the ext4 overlay.
# Install a development toolchain
$ apk add git nodejs npm python3 py3-pip go gcc musl-dev make
# SSH in from a laptop on the same Wi-Fi
$ ssh root@<phone-ip> -p 9922
Once SSH is working, VS Code Remote-SSH and JetBrains Gateway both connect without any plugin beyond their standard remote-development extension. The phone acts exactly like any remote Linux server from the laptop's point of view.
Persistence is handled by the overlayfs stack: all writes go to the ext4 storage.img. Packages you install with apk add, files you create, services you enable with rc-update add - all survive reboots and app updates.
Text editing, shell scripting, Git operations, and short Python scripts are comfortable on TCG - these workloads spend most time on IO and memory, where the emulation overhead is low. Long compilations (LLVM, Linux kernel, large Rust projects) will be painfully slow; for those, prefer cross-compiling on the laptop and copying binaries over SSH.
GUI Linux apps
The in-app X11 viewer connects to an Xvnc display in the guest. Install a desktop environment or individual X11 apps and they appear directly in the viewer with touch, external keyboard and mouse, and audio forwarding.
# Install XFCE and common accessories
$ apk add xfce4 xfce4-terminal mousepad ristretto xfce4-taskmanager
# Install Firefox (ARM64 build)
$ apk add firefox
# Install GIMP
$ apk add gimp
See Desktops & X11 viewer for how to start and configure the Xvnc session. Note that only X11 desktop sessions render correctly; Wayland sessions (GNOME on Wayland, Plasma Wayland, sway) do not render in the viewer - see Limitations.
Learning Linux and containers
Podroid gives you a real Linux kernel with cgroup v2, network namespaces, overlayfs, netfilter/nftables, and OpenRC - all on hardware you already own. Nothing is simulated or mocked; the same kernel features that production servers use are present and explorable.
# Inspect the cgroup v2 hierarchy
$ mount | grep cgroup
$ ls /sys/fs/cgroup/
# Run a container and inspect its namespaces
$ podman run --rm -it alpine sh
$ ls -la /proc/1/ns/
# Examine the overlayfs mount used by Podman's graph driver
$ podman info | grep graphDriver
$ mount | grep overlay
# Explore OpenRC service management
$ rc-status
$ rc-update add sshd default
$ rc-service sshd start
# Inspect nftables rules added by Podman for port forwarding
$ nft list ruleset
Because this is a real VM, experiments that would break a shared server are safe here - a factory reset restores a clean Alpine image in under a minute. You can deliberately crash the kernel, fill the disk, or misconfigure networking and recover immediately.
Lightweight CLI tools and scripts
Running cron jobs, personal bots, data processing scripts, or static site generators is one of the most practical uses on TCG. These workloads are typically IO-bound or short-lived, so the 5-20x CPU penalty of TCG emulation is barely noticeable compared to the time spent waiting on network or disk.
# Install common CLI tooling
$ apk add curl jq rsync htop tmux vim ffmpeg yt-dlp
# Run a Python script on a schedule
$ echo "*/15 * * * * python3 /root/sync.py" | crontab -
$ rc-update add crond default && rc-service crond start
What works poorly
- Wayland desktops - GNOME Wayland, Plasma Wayland, sway, and Hyprland do not render in the X11 viewer. Use XFCE or another X11 session instead.
- Heavy compilation on TCG - building LLVM, the Linux kernel, or large Rust crates inside the VM is feasible but very slow (hours, not minutes). Cross-compile on a real machine and copy the result over SSH.
- x86 Docker images - pulling an
linux/amd64image runs it under double emulation (QEMU TCG emulating ARM64 guest, which then runs QEMU user-mode emulating x86). Expect 50-100x slowdown. Always preferlinux/arm64images. - UDP port forwarding on AVF - UDP rules are silently ignored on the AVF backend; switch to QEMU if you need UDP (e.g. a game server or DNS resolver serving LAN clients).
- A full desktop environment at 512 MB RAM - XFCE with a browser open will page heavily into ZRAM swap at 512 MB. Set RAM to 1 GB or more in Settings if you plan to run a desktop regularly.
If TCG is too slow for your workload, the most impactful step is switching to the AVF backend on a Pixel 8 or later - it provides near-native CPU speed. Bumping RAM above 1 GB also helps containers and desktops avoid swap pressure. The Performance & why it's slow page covers every tuning option in detail. For hard limits such as Wayland or UDP-on-AVF, see Limitations & troubleshooting.
Podroid is free software (GPL). Docs for v1.2.1. Found something inaccurate? Open an issue.