I gave a language model hands inside Android — and it built me an app factory An anonymous developer built Termux Assistant AI, an open-source Android app (MIT) that gives a language model direct shell access inside Termux by bridging a WebView running DeepSeek Chat with local HTTP servers. The system's "Vibe mode" lets the model autonomously generate, compile and sign Android apps via aapt2, javac, d8 and apksigner, with a watchdog that auto-resumes stalled runs. The developer says they do not know how to code and that the project was built by one person and one AI. Most LLM assistants are "brains in a jar." They can reason, write code, explain concepts — but they can't do anything in the real world. Everything they produce is text that a human copies and pastes somewhere. I decided to fix that. Termux Assistant AI is an Android app that bridges a WebView with DeepSeek Chat and simultaneously gives the assistant direct shell access inside Termux via local HTTP servers. In effect — the language model gets hands. The project is fully open source MIT : github.com/CR4CODE/Termux-Assistant-AI https://github.com/CR4CODE/Termux-Assistant-AI . Termux https://termux.dev is a terminal emulator for Android with a full Linux environment — no root required. Bash, Python, git, ssh, package manager — all working. Essentially a regular Linux distro in your pocket. The key insight: if I have Termux, I have a shell. And if a language model has a shell, it can run arbitrary commands, work with files, compile code, publish releases. Two questions remained: The system consists of three isolated layers. The main app is an Android WebView that loads chat.deepseek.com . The user chats with the model as usual. But the app intercepts the "Send" button and can insert prompts into the input field and read responses from the DOM. Implemented via a JavaScript bridge VibeWebBridge : methods sendMessage , readLastAnswer , lastAnswerHash , isThinking , isStopped execute JS in the WebView and return results through callbacks. Response reading works by finding class =markdown elements and hashing the last block to distinguish a new response from an old one. Inside Termux runs a Python server ai-tasker-server . It listens on 127.0.0.1:8767 and accepts tasks from the app: the app accepts tasks: POST /task Body: {"task": "auto:uptime"} Response: {"status":"success","output":"...","exit code":0} Routes are grouped by prefix: A key design decision: auto: commands go straight to bash, without LLM-based classification. The first version tried to guess the command type, which caused hangs on non-existent routes. Now it's just subprocess.run "bash","-c", code , timeout=120 . A separate Android service that manages the WebView and exposes an HTTP API: This service is how the assistant talks to DeepSeek and runs autonomous loops. This is the most interesting part — Vibe mode . You write one task, and the system does the rest. Workflow: vibe-run