The terminal stays the center of gravity, while the parts of Android you need remain one gesture away.
01 · LAUNCH
Reach anything without opening a drawer.
Use the app dock or search installed apps from the terminal. Android-exposed cloned and work-profile launch targets appear alongside your regular apps.
App dock
Terminal app search
Clone and work-profile discovery
Everything is reachable from home.
02 · STAY
Your shell never disappears behind the experience.
Android Material colors flow through launcher surfaces and the shell. Sixel artwork renders in the terminal, while the optional tmux plugin adds CPU, RAM, weather and extra keys.
Material theme integration
Sixel image drawing
Optional tmux workspace
Album art, spectrum and controls at the prompt.
03 · ACT
Do the small things without leaving home.
Use launcherctl to launch apps and read launcher or system data. Optional MCP tools, Shizuku helpers, and experimental LiteRT/MNN model backends extend the same workflow.
LauncherCtl shell bridge
Optional MCP and Shizuku tools
Experimental LiteRT + MNN AI
Reply without breaking context.
INSTALL3 STEPS
Make the shell your home.
Choose one edition, install its Main APK, add matching companions only if you need them, then set Termux Launcher as your Android home app.
⚠The recommended com.termux edition replaces a regular Termux install. Use the io.vaj.tl edition only when you need a side-by-side install and accept its manually maintained package repository.
1
Pick an edition and install the Main APK
API and Styling are optional. If you use either companion, choose the matching fork and edition because all installed add-ons must share the launcher's package family and signing key.
Recommended
com.termux ecosystem
Termux edition
The recommended build. It uses official Termux repositories and supports arm64-v8a, armeabi-v7a, x86_64 and x86.
Launch the Main app so Termux finishes its first-run bootstrap. Wait for the fish ❯ prompt, then you're ready to set it as home.
3
Set it as your home launcher
From Android settings, or right inside the launcher:
Long press Terminal → More → Apps Bar →Set as home launcher
✓Current builds ship with Terminal Material colors on by default, so the terminal and tmux theme follow your wallpaper out of the box — no manual toggle needed.
✓ That's it — the terminal is home.
DOCUMENTATION
Start here
Termux Launcher turns a real Termux session into your Android home screen. You keep the terminal, packages, files, and sessions you expect from Termux, then gain a touch-friendly app dock, fast search, wallpaper-aware styling, an optional built-in keyboard, and an authenticated shell bridge to Android.
The shortest path to a working launcher
Read Install & first run and choose the correct edition.
Open the app once and let the Termux bootstrap finish.
Walk through the in-app Quick start tour.
Try the dock and % app search before changing anything.
Set it as your Home app only when the terminal and your must-have apps work.
The core launcher does not require Shizuku, notification access, tmux, local AI, or a custom shell. Add those one at a time later.
A first launch that explains itself
New installations open a seven-step, scrollable tour after the Termux bootstrap is ready. It introduces the terminal Home, app search, Material styling, the optional fish/tmux workspace, LauncherCtl, and the optional Shizuku and TAI layers before Android asks you to make any long-term choices.
Existing installations are not interrupted after an upgrade. Replay the tour at any time from Settings → Quick start tour.
Recommended: the matching Termux:API and Termux:Styling forks if you use those add-ons.
Helpful: Unexpected Keyboard if you prefer a mature external terminal keyboard.
Optional: tmux workspace, Shizuku, notification access, TAI models, MCP clients.
Choose your next page
Feature tour shows the complete surface with current screenshots.
The launcher surface teaches the gestures and icon actions.
Recreate the shell workspace explains the live fish/tmux setup without copying private aliases or keys.
launcherctl bridge is the beginner entry to shell-to-Android automation.
Troubleshooting starts with safe checks and escalates only when needed.
Tip: the Quick start tour is always available again under Settings → Quick start tour.
DOCUMENTATION
Install & first run
This guide gets you to a safe, reversible first launch. Do not set Termux Launcher as Home until the bootstrap finishes and you can reopen your important apps.
1. Pick the correct edition
Edition
Android package
Use it when
Termux edition
com.termux
You want the recommended build and the official Termux package ecosystem. It replaces an existing official Termux install.
VAJ edition
io.vaj.tl
You must keep official Termux installed side by side. It uses the separately maintained VAJ package repository.
The com.termux edition cannot coexist with official Termux because both use the same Android package identity. Back up anything important before replacing an existing installation. If you are unsure, begin with the VAJ edition and read the release notes.
2. Install one matching build family
Download the Main APK from the project’s Releases.
If you use Termux:API or Termux:Styling, download the matching forks from the same edition family.
Do not mix official add-ons, old forks, or APKs signed with a different key. Android will reject shared-UID/signature mismatches.
You only need the Main APK to try the launcher.
3. Let first-run setup finish
Open Termux Launcher normally. The first launch extracts the Termux bootstrap; wait until a prompt appears. The new Quick start popup opens after a genuinely new bootstrap completes, not merely after an app upgrade.
The tour covers:
the terminal home screen;
touch and terminal app search;
appearance and built-in keyboard controls;
the optional fish/tmux workspace;
LauncherCtl, Shizuku, and TAI;
where to choose the default Home app.
Tap Skip if you already know the launcher. Replay it later from Settings → Quick start tour.
4. Verify the basics before changing Home
At the prompt, run:
launcherctl status
launcherctl apps
Then check these touch paths:
Tap one pinned app and return Home.
Type %settings without pressing Enter; confirm the dock filters.
Long-press an app icon; dismiss the actions without changing anything.
Long-press the terminal and open More → Settings.
5. Set it as Home
Use either Android’s default-app settings or:
Settings → Apps & Access → Set as home launcher
Keep a fallback route in mind while learning: Android Settings → Apps → Default apps → Home app.
If you plan to switch the Termux package manager from pkg/apt to pacman, do it before making the launcher your default Home. Recovery is easier while another Home app is still selected.
First ten minutes
Leave Material colors and the default dock enabled.
Learn % search and the A–Z row.
Decide whether to use the built-in keyboard or an external one.
Grant notification access only if you want dots, inline notification views, media, or LauncherCtl notification commands.
Skip Shizuku and TAI until the core launcher feels stable.
Updating later
Install the newer matching APK over the existing app. Do not uninstall just to update; uninstalling may remove app data.
After an update:
termux-reload-settings
launcherctl update-scripts
launcherctl update-scripts refreshes repo-owned helpers with timestamped backups. It does not overwrite ~/.tmux.conf.
DOCUMENTATION
Feature tour
This is the current Termux Launcher surface, captured live on the Nothing phone used for development. Start with the core launcher; every integration later on this page is optional.
Watch the first-launch tour
Terminal-first Home
Your active terminal is the wallpaper, workspace, and control surface. Normal Termux sessions, packages, files, selection, URLs, and Extra Keys remain available. tmux can keep sessions, panes, and status widgets alive across app switches.
Open and organize Android apps
Tap pinned icons for one-touch launch.
Type % plus a name to filter from terminal input.
Drag across A–Z to narrow the catalog; swipe upward to launch the highlighted result.
Long-press icons to pin, move, group into folders, choose shortcuts, change icons, open app info, or uninstall where Android allows it.
Enable a Most used page if you prefer learned ranking next to explicit pins.
Discover cloned/work-profile launch targets when Android exposes them to the launcher.
The live recording below shows % filtering followed by the long-press menu. No app is opened or changed.
Style one connected surface
Wallpaper-derived Material colors can flow through the terminal, ANSI palette, cursor, dock, built-in keyboard, and tmux plugin. Appearance controls include theme mode, wallpaper handling, terminal opacity, blur, glass opacity and grain, dock height, icon count, labels, icon normalization, monochrome/material icons, shadows, and icon packs.
Pick your keyboard
Use any Android keyboard, or enable the launcher’s built-in terminal keyboard. The built-in path supports system/custom themes, per-key color-scheme editing, dock matching, drag-to-resize sizing, typography, haptics, key sounds, optional extra keys, and custom layout files.
Recreate the live shell workspace
The public setup mirrors the safe foundation of the live device:
fish with an empty greeting and optional tmux auto-attach;
Oh My Posh using the termux-launcher theme;
eza aliases and zoxide navigation;
tmux with the Termux Launcher plugin;
wallpaper Material colors and status helpers;
optional Shizuku-backed btop wrappers.
Private aliases and API keys are intentionally not copied. See Recreate the shell workspace for the guarded installer and a file-by-file explanation.
Bridge the shell and Android
launcherctl exposes a localhost, bearer-token-authenticated API and friendly shell commands. It can launch apps, read resource snapshots, expose media and notification state after access is granted, stream events, restart its bridge, generate client configs, and route confirmation-gated agent tools.
launcherctl status
launcherctl resources
launcherctl launch maps
launcherctl client-config codex
Bind safe calls to tmux keys or use the MCP stdio bridge with a compatible client.
Optional privileged and AI layers
Shizuku: optional lock-screen backend, privileged shell, richer system helpers, and btop integration.
TAI / Termux AI: on-device LiteRT-LM and MNN model hosting, catalog downloads/imports, language and embedding roles, and OpenAI/Ollama-compatible localhost APIs.
Agent & MCP: shared LauncherCtl tool registry with explicit risk levels and confirmation gates.
Termux add-ons: matching API and Styling forks extend normal Termux workflows.
TAI marks its sensitive settings window secure, so Android screenshots of endpoint/token details are intentionally blocked. The docs never ask you to disable that protection.
Python/client configuration; confirmations for risky tools
DOCUMENTATION
The launcher surface
The terminal is Home. Launcher controls sit around it and disappear back into the same Material surface instead of replacing your shell with a separate app drawer.
Read the screen from top to bottom
Status and terminal: your Termux or tmux session.
Apps row: pinned, ranked, or filtered launch targets.
A–Z row: direct catalog filtering and launch gestures.
Navigation/Extra Keys row: configurable terminal and tmux controls.
Keyboard: Android IME or the optional built-in keyboard.
Apps row
Tap an icon to launch it. Swipe between dock pages when more icons are available.
Long-press an icon for the actions Android and the current item support:
pin or unpin;
move within the dock;
move into or out of a folder;
launch an app shortcut;
change or reset its icon;
open app info;
uninstall.
Long-press empty dock space to open list-based pin and folder management. Your explicit pins stay under your control even when usage ranking is enabled.
A–Z row
Drag horizontally to filter by initial letter.
Keep dragging to preview the focused result.
Swipe upward from a letter to launch the highlighted app.
Double-tap the row to lock only after choosing a lock method under Apps & Access.
The lock method can be off, accessibility-backed, or Shizuku-backed depending on your setup. Normal launcher use does not need either privileged option.
Search from terminal input
The default split character is %. Type it before an app name without pressing Enter:
%maps
Backspace clears the query. Change the split character under Settings → Apps & Access if % conflicts with your shell habits.
Notifications and media
With notification-listener access, the launcher can show notification dots, controlled notification popups/replies, current media, and the corresponding LauncherCtl data. Without that permission, the dock and app launching still work normally.
Never grant notification access just because a setup guide mentions it; grant it only if you want those features.
Settings map
Open Settings by long-pressing the terminal and choosing More → Settings.
Section
What it controls
Quick start tour
Replay the beginner walkthrough
TAI · Termux AI
Model catalog/imports, roles, runtime, API and MCP integration
Shizuku
Backend status, permission, privileged helpers
Termux
Core terminal I/O, view, and debugging preferences
Appearance
Theme, wallpaper, terminal, dock, icons, sessions menu
Apps & Access
Launcher rows, search, ranking, Home selection, Android access
Keyboard
Built-in keyboard themes, sizing, color editor, feedback, keys
Live wallpapers can prevent reliable blur capture. Set blur to zero for clear glass, or use a static/launcher-managed wallpaper when tuning the frosted dock.
DOCUMENTATION
launcherctl bridge
launcherctl is the launcher’s command-line bridge to Android. The app installs it when the launcher starts and serves an authenticated API on localhost. Begin with read-only commands; add permissions and automation only when you need them.
Confirm it is ready
launcherctl status
launcherctl apps
launcherctl resources
status reports the bridge and optional backend state.
apps lists launch targets exposed to the launcher, including profiles Android makes visible.
resources returns a current CPU, memory, battery, thermal, network, and storage snapshot.
If the command is missing, reopen Termux Launcher. If it exists but cannot connect, run launcherctl restart.
Launch an app
launcherctl launch maps
Queries are fuzzy. Use a more specific label or package fragment when two apps match. This is the same catalog used by the dock and % search.
Optional data sources
Command
Needs
What it returns
launcherctl media
Notification-listener access
Current media session and playback metadata
launcherctl notifications
Notification-listener access
Current cached notifications
notification recent/search/stats routes
Notification-listener access
Persisted event history and aggregates
Shizuku-backed helpers
Shizuku permission
Privileged actions exposed by their specific tool
No permission is required for ordinary app launch or the basic resource snapshot.
Endpoint and token
The current endpoint and bearer token live in:
~/.launcherctl/endpoint
~/.launcherctl/token
The server binds to localhost by default. Treat the token as a secret: do not paste it into screenshots, bug reports, shell history, dotfile repositories, or chat. If it leaks:
For scripts, prefer JSON-capable commands/routes and check exit status. Avoid high-frequency polling; use the event stream or event tail routes for changing state.
Keep helpers current
launcherctl update-scripts
This validates downloaded repo-owned helpers, writes timestamped backups when replacing them, and does not modify ~/.tmux.conf.
Clients and automation
Generate starting configurations instead of hand-copying endpoint/token values:
For risk-classified tools and natural-language routing, continue to Agent & MCP. For every endpoint and request body, use the Termux AI page’s API reference.
DOCUMENTATION
Recreate the shell workspace
The launcher works with the default Termux shell. This page recreates the optional fish/tmux workspace seen in the screenshots using secret-free repo examples derived from the live device.
What the guarded installer changes
Item
Behavior
Missing packages
Installs only the packages needed by your selection
~/.config/fish/config.fish
Installs the example only when the file does not already exist
Oh My Posh theme
Installs only when the destination does not already exist
~/.tmux.conf
Keeps the file and appends only missing TPM/plugin lines
TPM and launcher plugin
Clones when absent; fast-forwards a clean existing launcher plugin
Locally edited plugin checkout
Stops and asks you to clean or back it up
Shizuku btop
Runs only for the All or btop choice and requires working rish
It does not copy the developer phone’s private aliases, personal paths, or API keys.
Run it
Download the script so you can inspect it before execution:
All: fish + Oh My Posh, tmux plugin, and optional Shizuku btop helper.
tmux only: TPM and the Termux Launcher tmux plugin.
btop only: the rish-backed helper; use this only after Shizuku setup.
Exit: make no setup choice.
New users should choose tmux only first, or leave the default shell unchanged until the launcher feels familiar.
How the pieces fit
Tool
Job
fish
Friendly interactive shell with syntax highlighting and abbreviations
Oh My Posh
Prompt segments for path, git state, and exit status
tmux
Persistent sessions, windows, panes, keybinds, and status bar
Termux Launcher tmux plugin
Material themes, Android-friendly bindings, resource/weather/media widgets
eza
Colored, icon-aware file listings and tree views
zoxide
Learns frequently used directories for fast jumps
launcherctl
Supplies launcher/system data and launches Android apps
The live phone keeps tmux auto-start disabled in fish until explicitly enabled. The public config follows the same conservative default:
set -g fish_auto_tmux 0
Change it to 1 only after tmux starts and detaches cleanly on your device.
Material colors
Keep Settings → Appearance → Material colors enabled. The launcher exports its palette, and the shell/plugin reads the exported values with built-in fallback colors.
Add app-launch keybinds safely
List the labels LauncherCtl knows:
launcherctl apps
Then add only the bindings you want to ~/.tmux.conf:
Back up any destination you already maintain and merge the pieces you understand instead of overwriting the whole file.
DOCUMENTATION
tmux keys & status
tmux is optional, but it is the easiest way to keep a terminal workspace alive as Android apps open over it. The Termux Launcher plugin adds Material themes, Android-friendly bindings, and status widgets backed by LauncherCtl.
Install it through Recreate the shell workspace, then start:
tmux new-session -A-s main
Learn one key first
Press Alt+e inside the plugin to open the current key reference. It is more trustworthy than memorizing an old screenshot.
The public config uses Ctrl+Space as the main prefix and Ctrl+b as a fallback.
Essential actions
Key
Action
prefix q
Reload ~/.tmux.conf
F12
Run termux-reload-settings
prefix h / prefix v
Split below / right in the current path
prefix x
Kill current pane
prefix c
Create a window in the current path
Alt+1 … 9
Jump to a window
Alt+← / →
Previous / next window
Alt+↑ / ↓
Previous / next session
The full table remains visible in the plugin popup.
Status widgets
The live configuration uses a compact top bar for sessions/windows plus CPU, memory, weather, and latency/date context. Available plugin options include:
system resource widgets;
weather mode;
current media;
storage, battery, CPU temperature, and battery temperature;
rounded, sleek, and purem3 visual themes;
top or bottom status position.
Enable only the widgets you read. LauncherCtl-backed resource snapshots avoid aggressive shell polling.
set -g @termux-launcher-tmux-system-widgets on
set -g @termux-launcher-tmux-weather on
set -g @termux-launcher-tmux-now-playing on
set -g @termux-launcher-tmux-theme sleek
set -g @termux-launcher-tmux-status-position top
Launch Android apps
Ask LauncherCtl for exact labels, then add deliberate bindings:
If tmux itself is broken, start a normal shell/failsafe session and temporarily move only your tmux config out of the way after making a backup. Do not clear the entire Termux app just to debug tmux.
DOCUMENTATION
Shizuku, rish & btop
Shizuku is optional. Skip this page unless you want a privileged lock method, a rish shell, or the Shizuku-backed btop helpers. App launch, search, styling, keyboards, normal tmux, and basic LauncherCtl do not need it.
Approve the Shizuku prompt only for the launcher edition you installed.
Verify before adding btop
launcherctl tty-doctor
rish -c'id'
Read the reported identity and errors. Do not continue if rish points at the wrong package or Shizuku is not running.
Install the optional helper
Run the guarded shell installer and choose btop only or All:
~/setup-shell
The wrappers are btop-shizuku and mini-btop-shizuku. On Android 14+, keep rish_shizuku.dex non-writable as Shizuku recommends.
Lock methods
Under Settings → Apps & Access, the A–Z double-tap lock can remain off or use a configured accessibility/Shizuku method. Test the selected method manually before relying on it. Never weaken the device lock screen to make a launcher gesture work.
DOCUMENTATION
Keyboards & Extra Keys
Termux Launcher supports three layers that are easy to confuse:
an Android keyboard such as Unexpected Keyboard;
the launcher’s optional built-in keyboard;
Termux Extra Keys, the configurable row above either keyboard.
Use whichever combination feels reliable. None is required for the app dock.
Built-in keyboard
Open Settings → Keyboard to enable it and choose theme, per-key colors, dock matching, size and shape, font, haptics, sound, and optional keys.
The built-in keyboard stays available when returning from other apps. Use the size-and-shape editor if it consumes too much terminal space, especially in landscape.
External keyboard
Unexpected Keyboard remains a good terminal-oriented choice. Disable the built-in keyboard first if you want Android to use your selected IME.
Extra Keys file
Termux Extra Keys live in:
~/.termux/termux.properties
After every edit:
termux-reload-settings
Compact tmux row
Start with one row. It assumes Ctrl+b is available as a tmux prefix:
extra-keys=[[ \
{macro: "CTRL b F12", display: "♼"}, \
{macro: "CTRL b h", display: "𝍣", popup: {macro: "CTRL b v", display: "𝍬"}}, \
{macro: "CTRL b 1", display: "⓵"}, \
{macro: "CTRL b 2", display: "⓶"}, \
{macro: "CTRL b 3", display: "⓷"}, \
{macro: "CTRL b [", display: "✎"}, \
{key: KEYBOARD, popup: PASTE}, \
{macro: "CTRL b", display: "㋡"} \
]]
The keyboard key toggles the IME; its popup pastes. The tmux plugin can use F12 to reload Termux settings.
Two rows
Two rows give dedicated modifiers and more pane controls, but cost terminal height. Enable compact dock spacing and test portrait plus landscape before keeping them.
If a macro behaves differently from typing the same keys, first confirm the tmux prefix in ~/.tmux.conf, then run tmux source-file ~/.tmux.conf and termux-reload-settings.
DOCUMENTATION
Termux AI (TAI)
TAI is the optional on-device model host built into Termux Launcher. It can serve compatible chat, tool-use, vision/audio, and embedding models through OpenAI- and Ollama-shaped localhost APIs.
You do not need TAI to use the launcher or LauncherCtl.
Check the device first
Model downloads are large and runtime memory use can be significant. Open:
Settings → TAI · Termux AI
Read the device profile, compatible accelerators, minimum memory, model size, and license before downloading. Start with the smallest compatible model that satisfies your use case.
TAI protects the sensitive settings window with Android screenshot security. A black screenshot is expected; do not disable the protection to capture endpoints or tokens.
Beginner flow
Open Browse Catalog.
Filter by the capability you need: chat, tools, vision/audio, or embeddings.
Read license/terms and hardware requirements.
Download or import one model.
Load it with the recommended/automatic accelerator.
Check status from the shell.
tai status
tai models
tai runtime
tai manages the host and models; it is not an interactive chat client.
Compatible clients can then use chat completions, responses, embeddings, or Ollama-shaped chat/generate endpoints according to model capability.
Runtime habits
Keep only one generation model resident.
Use preflight before loading an unfamiliar model.
Prefer auto acceleration until you have a reason to force CPU or GPU.
Unload when finished to release memory.
Cancel a stuck load/generation before restarting the whole launcher.
tai doctor
tai runtime
For role assignment, import metadata, exact endpoints, streaming, rate limits, and error bodies, open the full Termux AI API page from the site navigation.
DOCUMENTATION
Agent & MCP
LauncherCtl exposes one shared tool registry to shell scripts, local/remote model clients, and MCP-capable agents. It does not hide a model inside the router: the client decides what to request, while the bridge enforces schemas, risk levels, and confirmations.
The bridge speaks over stdio; the authenticated Android/TAI server remains on localhost. Keep ~/.launcherctl/token out of version control and shared logs.
Optional web tools
Settings can generate a LauncherCtl MCP preset for supported web-search providers. Provider API keys stay in app preferences and are injected into that MCP server’s environment. They are not part of the public fish/tmux dotfiles.
Local model pairing
Pair MCP with TAI for an on-device model path, or use a remote model client you already trust. Local inference does not make every tool action local or harmless; the confirmation and Android permission rules still apply.
DOCUMENTATION
Troubleshooting
Start with the smallest safe check. Do not clear app data, uninstall, or delete dotfiles as a first response.
Launcher or terminal feels stale
termux-reload-settings
launcherctl status
If only tmux looks wrong:
tmux source-file ~/.tmux.conf
If the bridge does not respond:
launcherctl restart
launcherctl status
Symptom map
Symptom
First check
Next step
Dock search does not filter
Confirm the split character under Apps & Access
Try %settings, then reset usage ranking only if ranking is the issue
No dock/apps row
Apps & Access → apps row enabled
Reopen Home after changing the toggle
Keyboard covers too much space
Keyboard → Size & shape
Test landscape; disable built-in keyboard to use Android IME
Blur is flat/black
Check live wallpaper and blur value
Use clear glass (0 blur) or a static/managed wallpaper
launcherctl missing
Reopen the launcher
Run launcherctl update-scripts after the command returns
401 Unauthorized
Client has stale token
Reread token or rotate deliberately, then update every client
Connection refused
Launcher/bridge not running
Reopen launcher, then launcherctl restart
Notifications/media empty
Notification-listener access
Confirm the source app currently has media/notifications
Shizuku says OFF/DENIED
Shizuku service and app grant
Verify the edition package in rish
tmux plugin update refuses
Local plugin changes
Back up/commit those changes; installer intentionally stops
TAI
tai doctor
tai status
tai runtime
Model incompatible: recheck ABI, backend, role, and accelerator support.
Out of memory: unload, choose a smaller model/context, close other heavy apps, and avoid repeated immediate load attempts.
Secure settings screenshot is black: expected behavior, not a rendering failure.
Client 401: reread the current LauncherCtl token.
Endpoint unavailable: reopen launcher and check launcherctl status before touching model files.
Shell setup
The guarded installer keeps existing fish/Oh My Posh files and only appends missing tmux plugin lines. If your custom setup behaves differently, compare against the public examples rather than overwriting your files.
Collect a useful report
Include:
edition and app version;
Android/device model;
exact path and command;
whether the app is the selected Home launcher;
relevant permission/backend state;
a screenshot with tokens and private notification text removed;
the smallest app-scoped log excerpt that contains the failure.
Never include ~/.launcherctl/token, provider/API keys, private notifications, or unrestricted device logs.
TAI · TERMUX AI
Local language models, on your device.
TAI hosts models locally and speaks OpenAI- and Ollama-compatible HTTP. Your prompts and output stay on the device unless you deliberately expose the API to your network.
◆
On-device & private
Localhost bind by default. Bearer-token auth on every request.
⇄
OpenAI + Ollama
Drop-in for Codex, OpenCode, Crush, AIChat and Ollama clients.
▤
Two backends
LiteRT-LM (default) and a bundled MNN backend, routed per model.
⚙
Phone actions via MCP
Model generation and Android permissions stay separate and gated.
◐
Capability-aware
Text, image, audio, tools, embeddings — each model reports what it serves.
↥
Import your own
LiteRT-LM .litertlm/.task and MNN model directories.
Model catalog
Models aren't bundled in the APK — pull them from the in-app gallery or with tai (several GB each). Only one generation model loads at a time, inside the isolated :tai_runtime process. This is the full built-in catalog; you can also import your own.
Two backends — LiteRT-LM (Google AI Edge) and MNN. rec = recommended default · gated = accept the provider's Hugging Face terms first · import = added via the import flow, not a direct download. Multimodal LiteRT-LM models also appear as separate -vision / -audio IDs on the API.
Model
Backend
Best for
Download
RAM
Gemma 4 E2B IT · rec
LiteRT-LM
General chat · image · audio · tools
2.4 GB
8 GB+
Gemma 4 E4B IT
LiteRT-LM
Coding · reasoning · multimodal · tools
3.7 GB
12 GB+
Qwen2.5 1.5B Instruct · import
LiteRT-LM
Lightweight text · code · multilingual
1.5 GB
6 GB+
DeepSeek-R1 Distill 1.5B
LiteRT-LM
Small reasoning tasks
1.7 GB
6 GB+
FunctionGemma 270M · gated
LiteRT-LM
Function/tool selection (CPU-only)
0.3 GB
6 GB+
EmbeddingGemma 300M · gated
LiteRT-LM
Embeddings (/v1/embeddings)
183 MB
4 GB+
Qwen3 Embedding 0.6B
MNN
Embeddings (/v1/embeddings)
378 MB
4 GB+
Qwen2.5-Coder 1.5B · rec
MNN
Coding · tools · terminal clients
971 MB
4–6 GB+
Qwen2.5-Coder 7B
MNN
Higher-quality coding
4.4 GB
10–12 GB+
Qwen2.5 0.5B
MNN
Tiny general chat
557 MB
3 GB+
Qwen2.5 1.5B
MNN
Lightweight multilingual chat
879 MB
4–6 GB+
Qwen2.5 3B
MNN
Balanced multilingual chat
2.4 GB
6–8 GB+
DeepSeek-R1 1.5B Qwen
MNN
Small reasoning tasks
1.0 GB
4–6 GB+
◐About the multimodal LiteRT models. Gemma 4 E2B / E4B are multimodal, but rather than holding text, vision and audio in memory at once, TAI splits each into separate -vision and -audio model IDs that share one downloaded file. Only the mode you request is loaded at a time — a deliberate trade-off to cut RAM cost and avoid memory pressure on phones. Pick the ID matching the input you intend to send. Learn more about the backends: LiteRT (Google AI Edge) ↗ · MNN ↗ (docs)
Add & import your own models
Beyond the built-in catalog, TAI can pull any compatible model straight from Hugging Face. The suggested flow: set a Hugging Face token once, then either download a catalog entry or paste a model's repo URL into the import window. Everything runs through Settings → TAI / Termux AI.
↧Recommended: let the app download for you. Rather than fetching files by hand, just paste the model's Hugging Face URL into the import window — TAI downloads, verifies, and registers it. Browse compatible models here: huggingface.co/litert-community (LiteRT) and huggingface.co/taobao-mnn (MNN). Copy any model's page URL and paste it into Add a model.
1
Set a Hugging Face token
A classic Read token — or a fine-grained token with Contents: Read — is enough. It's sent only to Hugging Face download URLs. For a gated model, also open its huggingface.co page and accept the terms first.
2
Paste a repo URL to add
In Add a model, paste a Hugging Face repo URL (or pick a local LiteRT package). Capabilities are guessed from known LiteRT/MNN model names — tick or untick them, then Import & verify. Catalog entries download the same way; just tap one and confirm the provider terms.
3
Point your client at it
Once installed, load it (tai load MODEL_ID) and connect any OpenAI- or Ollama-compatible client with the local base URL and bearer token from Endpoint & access — the same values live in ~/.launcherctl/.
ℹSupported packages: LiteRT-LM .litertlm / .task, MNN model directories (config.json + sidecars), and LiteRT EmbeddingGemma .tflite with its tokenizer. GGUF, safetensors, PyTorch and ONNX weights are not supported — run those under a separate runtime such as llama.cpp in Termux.
Quickstart: chat from the terminal with AIChat
AIChat is the fastest and lightest way to talk to your on-device model right now — a single terminal binary, no extra runtime. It's in both this launcher's repo and the official Termux repo.
1
Install
pkg i -y aichat
2
Run & answer the prompts
aichat
On first run, AIChat offers to create a config file. Walk through it:
Choose the OpenAI-Compatible platform.
Give it any name (e.g. tai).
Paste the API base URL and API key from Settings → TAI / Termux AI → Endpoint & access — the base URL already ends in /v1, and the key is the bearer token. (The same two values are in ~/.launcherctl/endpoint and ~/.launcherctl/token.)
Prefer to write the config by hand? It looks like this in ~/.config/aichat/config.yaml:
clients:
- type: openai-compatible
name: tai
api_base: http://127.0.0.1:54298/v1 # your endpoint
api_key: YOUR_TOKEN # your bearer token
models:
- name: gemma-4-e2b-it # any installed model id
⚠Chat and coding models work well over AIChat. The embedding models are untested with AIChat's RAG features for now — treat them as experimental.
tai commands
$ tai status
$ tai models
$ tai download MODEL_ID URL --accept-terms
$ tai preflight MODEL_ID
$ tai load MODEL_ID [--auto|--cpu|--gpu]
$ tai keep-warm MODEL_ID --minutes 30
$ tai runtime
$ tai unload
$ tai delete MODEL_ID
$ tai doctor
Prefix any command with tai --json for raw API JSON you can pipe into jq and scripts. tai load, preflight, and keep-warm default to the assistant model when no ID is given. See tai --help for the full command set.
API REFERENCE
Introduction
Use TAI's local API to run and interact with models. The same server also powers launcherctl. Every route requires the bearer token.
Base URL & auth
TAI stores its current address and secret token in ~/.launcherctl/. OpenAI-compatible clients append /v1; Ollama clients use the base address as-is.
Default bind mode is localhost (127.0.0.1). LAN mode is opt-in; treat the token as a network secret when enabled. No CORS headers are emitted — browser clients can't call the API directly.
Rate limits
Every route is rate-limited per a rolling 60-second window, per route. Exceeding a limit returns HTTP 429. No Retry-After or RateLimit-* headers are sent — back off in your client (a short sleep and retry) when you see a 429.
Errors use the OpenAI error envelope, with a string code you can switch on. Common codes: bad_request (400), model_not_found (404), unsupported_audio_output (501). Missing or wrong bearer token returns 401.
The OpenAI routes (/v1/chat/completions, /v1/responses) stream as Server-Sent Events when you send "stream": true, terminated by a data: [DONE] line. The Ollama routes (/api/chat, /api/generate) stream newline-delimited JSON by default. The launcher event feed /v1/events/stream is a long-lived SSE connection — open one stream rather than polling.
OPTIONALPOST-INSTALL
One command for the shell theme
Once you're home, recreate the opinionated workspace from the video — fish · oh-my-posh · tmux · zoxide · eza plus the Material tmux theme and the optional Shizuku btop wrapper. Terminal Material colors are already on by default, so the theme picks up your wallpaper immediately.
The script asks whether to install everything, tmux only, or btop only. Want to know exactly what it changes, plus how fish, oh-my-posh, zoxide and eza fit together? → read the shell & tmux docs
tmux keybinds
The bundled termux-launcher-tmux plugin ships Android-friendly keybinds. Forget one? There's a popup that lists every current binding:
Alt + eShow the keybind reference popup
Ctrl + Space · prefix (Ctrl + b fallback)
Alt + 1…9 · jump to window
Alt + ← / → · prev / next window
Alt + ↑ / ↓ · prev / next session
Ctrl+Alt + arrows · move between panes
F12 · reload Termux settings
Full keybind tables, themes and app-launch shortcuts → shell & tmux docs