Part 11 closed the v3.0.0 chapter: a rootless Alpine Linux VM with Docker, live boot logs and shared storage. The obvious next question from testers was: now what do I run on it?

Linxr v3.1.0 answers that with a Marketplace.

🛒 One tap, one stack

The new Marketplace tab lists ready-made recipes. Tap one and Linxr pulls, configures and starts it inside the VM, streaming the output live so you can see what it is doing.

The first catalogue covers the stacks people kept asking for:

Area Recipes
Kubernetes k3s
AI Ollama
Web and data Nginx, Redis, PostgreSQL
Dev VS Code Server, Node.js, Python, Rust, Go
Ops Portainer, Tailscale

A recipe is either a Docker container or a script that runs inside the VM, so the same engine can install a container or configure the Alpine system itself.

🔄 Recipes that update without an app update

Recipes are not baked into the APK. Linxr syncs them from a public repository, AI2TH/linxr-marketplace. Tap Refresh and new community recipes appear; offline, Linxr falls back to the cached and built-in ones.

You can also build your own recipe in the app, or import one from JSON someone shared. (Part 16 walks through writing one.)

🤖 A local LLM in your pocket

The Ollama recipe runs a CPU build of Ollama (alpine/ollama:latest) tuned for phone memory limits. Its API is forwarded to the phone at:

http://127.0.0.1:11434 

so any app on the phone, including a browser, can talk to a model running entirely on the device.

🌐 Open it in Chrome

Linxr now forwards a set of common ports from the VM to the phone automatically:

8080 3000 8000 5000 8443 9000 8088→80 11434 

Start a web app in the VM, then open http://localhost:8080 in Chrome on the same phone.

📶 Reliable pulls on mobile data

Image pulls on mobile networks were flaky. v3.1.0 tunes the Docker daemon for phones: IPv6 disabled inside the VM, a smaller MTU (1200) and two DNS servers. Pulls now behave the same on Wi-Fi and mobile data.

Next, Part 13: the Docker daemon was costing too much battery. We replaced it.

📥 Get Linxr