# Android / Termux MemPalace does not currently install directly into Termux's Android Python. Its compiled dependencies publish Linux wheels, while Termux uses Android's Bionic libc and Android wheel tags. `pip` therefore falls back to source builds that may fail in dependencies such as ChromaDB or Maturin. The tested compatibility route is to run the normal Linux ARM64 packages in a Debian PRoot container. This is not a native Android port. The recipe below was tested on Android ARM64 with Termux, Debian 12, Python 3.11, and the `sqlite_exact` backend. ## Before you start - Use a current Termux build and a 64-bit ARM device. - Allow at least 2 GB of free space for the Debian root filesystem, Python environment, dependencies, and embedding model. - Keep the palace inside the PRoot container. Only bind the Termux directories that MemPalace needs to read. PRoot is a compatibility layer, not a security boundary. The launcher below uses isolated mode and exposes only the Termux home directory, but MemPalace can still read everything under that bind. ## Install the container Run these commands in Termux: ```bash pkg update pkg install proot-distro proot-distro install -n mempalace debian:12 ``` Then install MemPalace into a dedicated virtual environment inside Debian: ```bash proot-distro login --isolated mempalace -- /bin/sh -lc ' set -eu apt-get update apt-get install -y --no-install-recommends ca-certificates python3 python3-venv mkdir -p /opt/mempalace/home /opt/mempalace/cache /opt/mempalace/palace python3 -m venv /opt/mempalace/venv /opt/mempalace/venv/bin/python -m pip install --upgrade pip /opt/mempalace/venv/bin/python -m pip install --only-binary=:all: mempalace ' ``` `--only-binary=:all:` makes the installation fail clearly instead of starting an unsupported source build if a future dependency has no Linux ARM64 wheel. ## Add a launcher Save the following script as `~/.local/bin/mempalace-proot` in Termux, then run `chmod 700 ~/.local/bin/mempalace-proot`: ```bash #!/data/data/com.termux/files/usr/bin/bash set -euo pipefail termux_home="${HOME:?}" case "$termux_home" in /*) ;; *) echo "HOME must be an absolute path" >&2; exit 2 ;; esac case "$termux_home" in *:*) echo "HOME containing ':' cannot be bound safely" >&2; exit 2 ;; esac case "$PWD" in "$termux_home"|"$termux_home"/*) work_dir="$PWD" ;; *) work_dir="$termux_home" ;; esac exec "${PREFIX:?}/bin/proot-distro" login \ --isolated \ --bind "$termux_home:$termux_home" \ --work-dir "$work_dir" \ mempalace -- \ env -i \ HOME=/opt/mempalace/home \ PATH=/opt/mempalace/venv/bin:/usr/bin:/bin \ LANG=C.UTF-8 LC_ALL=C.UTF-8 \ XDG_CACHE_HOME=/opt/mempalace/cache \ MEMPALACE_PALACE_PATH=/opt/mempalace/palace \ MEMPALACE_BACKEND=sqlite_exact \ MEMPALACE_EMBEDDING_MODEL=minilm \ MEMPALACE_EMBEDDING_DEVICE=cpu \ MEMPALACE_EMBEDDING_THREADS=1 \ OMP_NUM_THREADS=1 TOKENIZERS_PARALLELISM=false \ /opt/mempalace/venv/bin/mempalace "$@" ``` The wrapper preserves every command-line argument and the current working directory when it is under the Termux home directory. It uses the bundled `sqlite_exact` backend to avoid relying on ChromaDB's embedded storage runtime under PRoot, while keeping embedding and retrieval local to the device. One embedding thread is a conservative default for phone thermals. ## Verify and use it ```bash mempalace-proot --version # Project files under the Termux home bind mempalace-proot mine "$HOME/projects/myapp" # Codex conversations mempalace-proot mine "$HOME/.codex/sessions" --mode convos mempalace-proot search "why did we change the authentication flow" ``` The first mine or search downloads the local MiniLM model (about 80 MB). A warning about denied access to `/sys/class/drm` can appear under PRoot; it is harmless when `MEMPALACE_EMBEDDING_DEVICE=cpu` is set as above. Paths outside the Termux home directory are deliberately unavailable. Copy the source under `$HOME`, or add a narrow, explicit `--bind source:destination` to the launcher after considering what that exposes. ## Upgrade Upgrade only the Python environment; the palace remains under `/opt/mempalace/palace`: ```bash proot-distro login --isolated mempalace -- \ /opt/mempalace/venv/bin/python -m pip install \ --upgrade --only-binary=:all: mempalace ``` Back up the container before removing or resetting it. Both `proot-distro remove mempalace` and `proot-distro reset mempalace` destroy the palace stored inside the container.