termux-safe — Claude Code skill: what it does, how to install
Android and Termux constraints reference for Claude Code. Blocks commands that fail silently under Termux, including sudo, systemd, and low ports.
npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a claude-codeWhat termux-safe does
This skill supplies the agent with a strict set of runtime rules when $PREFIX points to /data/data/com.termux/files/usr. Claude Code running directly on Android frequently suggests generic Linux commands that fail silently. This document sets clear boundaries.
It bans privilege escalation such as sudo or su, halts any reliance on systemctl, and rejects container tooling like Docker. Direct script executions relying on #!/usr/bin/env will fail because /usr/bin/env does not exist on Android; the agent must run bash ./script.sh or python ./script.py explicitly.
Package updates prioritize pkg over standard apt, and tool availability checks switch to the builtin command -v. Because native root permissions do not exist here, network bindings must stay above port 1024.
What it helps with
- Stop the agent from generating
sudoand root escalation commands in Termux - Prevent broken calls to
systemd,systemctl, and missing/usr/binpaths - Avoid binding web servers to privileged ports below 1024
- Run shell scripts explicitly without relying on a missing
/usr/bin/env
Example prompts for the agent
- Set up a local test server inside my Termux environment
- Install curl using the recommended package manager and verify its binary
- Execute run.sh safely avoiding Android shebang resolution issues
How to install termux-safe
1Skills CLI (Vercel)
npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a claude-code2Manually: put the files in place
~/.claude/skills/termux-safe/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/termux-safe/
1Skills CLI (Vercel)
npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a codex2Manually: put the files in place
.agents/skills/termux-safe/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a cursor2Manually: put the files in place
.cursor/skills/termux-safe/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install ferrumclaudepilgrim/claude-code-android termux-safe2Manually: put the files in place
.github/skills/termux-safe/SKILL.md1Skills CLI (Vercel)
npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a gemini-cli2Platform CLI
gemini skills install https://github.com/ferrumclaudepilgrim/claude-code-android --path .claude/skills/termux-safeManually: put the files in place
.devin/skills/termux-safe/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about termux-safe
How to install termux-safe in Claude Code?
Run npx skills add ferrumclaudepilgrim/claude-code-android --skill termux-safe -a claude-code. Alternatively, copy the file to ~/.claude/skills/termux-safe/SKILL.md.
What does termux-safe do?
It informs the assistant about Android Termux constraints, preventing suggestions that require root, systemd, or standard Linux directory paths.
Why does the skill restrict standard shebang scripts?
Android lacks /usr/bin/env, causing scripts with env shebangs to throw interpreter errors unless launched directly with python or bash.
Source text
SKILL.md · MIT
--- name: termux-safe description: Android/Termux constraints reference. Prevents Claude Code from suggesting commands that fail silently on Android (sudo, systemd, non-Termux paths, etc.). user-invocable: false disable-model-invocation: false # No allowed-tools field: this skill is content-only and grants no additional tool access. --- # Android / Termux Environment Constraints > **Scope and when this applies.** These constraints apply when you are executing inside Termux on Android, regardless of how Claude Code itself was packaged. The load-bearing runtime signal is `$PREFIX === "/data/data/com.termux/files/usr"`. If that environment variable points at Termux's prefix, you are in Termux and these constraints apply, even if `process.platform` reports `"linux"` (it will report `"linux"` if Claude Code was installed via this repo's v2.9.0 Path A, which runs the linux-arm64 binary patched via glibc-runner; it will report `"android"` only on older Path A v2.x installs that used the JS bundle). If `$PREFIX` is unset or points at `/usr`, you are inside a chroot-like sandbox (for example, a Linux rootfs running under `proot-distro`, Path B) or inside a hypervisor-managed Linux VM (Path C), and standard Linux conventions apply; most of this file does not. If the runtime signals indicate the in-Termux case, the constraints below produce **silent failures, not errors.** Every suggestion must account for them. ## Hard Rules: Never Suggest These - **No `sudo`.** Root does not exist. No `su`, no `doas`, no privilege escalation of any kind. - **No `systemctl` or `systemd`.** Android does not use systemd. No `journalctl`, no `service`, no unit files. - **No standard Linux paths.** `/usr/bin`, `/etc`, `/var` do not exist or are not writable. Termux paths: - Home: `/data/data/com.termux/files/home` - Prefix: `/data/data/com.termux/files/usr` - Binaries: `$PREFIX/bin` - Config: `$PREFIX/etc` - **No ports below 1024.** No root = no binding to 80, 443, etc. Use 1024+. - **Prefer `pkg` over `apt`.** Both work, but `pkg` auto-updates the package index before installing. - **No Docker, no containers.** The kernel does not support them without root. ## Silent Failure Modes - **Node.js is not required by this repo's `install.sh`.** The patched linux-arm64 claude binary is self-contained. If Node is installed separately on native Termux, prefer v25+: v24 had a documented startup hang on ARM64 that was resolved in v25. - **File descriptor limits vary by device.** Check with `ulimit -n`. Avoid spawning many concurrent processes. - **Android can stop background work.** Its phantom process controls can kill excess child processes, and battery and background policies can suspend or kill Termux. Keep concurrent subagents and child processes modest. Where Developer options offers "Disable child process restrictions", turning it on helps with the first limit. `tmux` or `nohup` keep work running when a terminal window closes, but not after Android kills Termux or the phone reboots. - **`process.platform` reporting varies by install path.** On Path A v2.9.0 (the linux-arm64 binary patched via glibc-runner), Node.js reports `process.platform === "linux"` even though you are inside Termux. On older Path A v2.x (the JS-bundle npm install) it reports `"android"`. On Path B (proot-distro Ubuntu) and Path C (AVF), it reports `"linux"` and you are not in Termux. The reliable cross-path signal that you are still in Termux is `$PREFIX === "/data/data/com.termux/files/usr"`. - **`#!/usr/bin/env` scripts fail under the Path A launcher.** When the Bash tool runs a script directly and its first line is `#!/usr/bin/env bash` (or `python3`, `node`), it exits with "bad interpreter": Android has no `/usr/bin/env`, and Claude Code's subprocesses do not carry Termux's fix for it. Run the interpreter explicitly: `bash ./script.sh`, `python ./script.py`. Tools called by name and `#!/bin/sh` scripts are unaffected. - **Prefer `command -v` to check command availability.** It is a shell builtin. `which` is available with `pkg install which`, but this repo's installers do not explicitly install it. ## Package Installation Prefer `pkg` (auto-updates the index before install). `apt` and `apt-get` also work but skip the auto-update: ```bash pkg install <package> -y pkg upgrade pkg search <query> ``` ## When Unsure If you're about to suggest a command that assumes standard Linux, stop and verify it works on Termux first. When in doubt, prefix with `command -v <tool> >/dev/null 2>&1` to check availability.
© ferrumclaudepilgrim · MIT · ferrumclaudepilgrim/claude-code-android