OPEN SOURCE · ANDROID 8+ · AGSL BLUR ON 13+

A home screen
you can command.

Termux Launcher turns Android into a fast, keyboard-first workspace. Your apps, music, messages and shell stay together at the prompt.

v0.2.29 · GPL-3.0-only · built on Termux + Termux:Monet

45-second tour
147GitHub stars · live v0.2.29Latest Termux edition GPL-3.0-onlyOpen source
Android 8+AGSL blur on Android 13+
BUILT FOR HOW YOU ACTUALLY USE ANDROID

Less hunting.
More doing.

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
Termux Launcher home screen with the A–Z app rail and keyboard
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
Music playing in kew with sixel album artwork
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
Replying to a notification directly from Termux Launcher
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.

Main app
com.termux · v0.2.29
Release ↗
API companion · optional
com.termux.api · v0.53.0
Release ↗
Styling companion · optional
com.termux.styling · v0.32.1
Release ↗
Install Main · v0.2.29
Cannot coexist with the regular Termux app — uninstall it first.
io.vaj.tl ecosystem

VAJ edition

Installs beside stock Termux, but is arm64-v8a only and uses a manually maintained VAJ APT repository that receives updates less often.

Main app
io.vaj.tl · v0.2.29-vaj
Release ↗
API companion · optional
io.vaj.tl.api · v0.53.0-vaj
Release ↗
Styling companion · optional
io.vaj.tl.styling · v0.32.1-vaj
Release ↗
Install Main · v0.2.29-vaj
Match companions
Optional API and Styling add-ons must match the launcher's edition and signing key. Official F-Droid add-ons will not pair.
Enable unknown sources
Allow your file manager or browser to install APKs, then open the Main app first.
Requirements
Android 8.0+ (API 26). AGSL blur requires Android 13+ (API 33). Termux edition: four Android ABIs; VAJ edition: arm64-v8a only.
2

Open it once

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.

Termux Launcher home screen with tmux status, live terminal, app dock, A–Z row, and built-in keyboard

The shortest path to a working launcher

  1. Read Install & first run and choose the correct edition.
  2. Open the app once and let the Termux bootstrap finish.
  3. Walk through the in-app Quick start tour.
  4. Try the dock and % app search before changing anything.
  5. 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.

First page of the live seven-step onboarding tour

Existing installations are not interrupted after an upgrade. Replay the tour at any time from Settings → Quick start tour.

What you can grow into

Level Start with Add when useful
New to Termux Terminal, app dock, A–Z row, % search Built-in keyboard, appearance controls
Comfortable in a shell fish, tmux, Oh My Posh, eza, zoxide LauncherCtl commands and tmux app bindings
Automating Android LauncherCtl resources, media, notifications, events Agent tools, MCP, Shizuku-backed helpers
Running models locally TAI catalog and runtime OpenAI/Ollama clients, embeddings, local agents
  • Required: one Termux Launcher main APK.
  • 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

  1. Download the Main APK from the project’s Releases.
  2. If you use Termux:API or Termux:Styling, download the matching forks from the same edition family.
  3. 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:

  1. Tap one pinned app and return Home.
  2. Type %settings without pressing Enter; confirm the dock filters.
  3. Long-press an app icon; dismiss the actions without changing anything.
  4. Long-press the terminal and open More → Settings.

Current settings hub showing the Assistant, Launcher, and System sections

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.

Live terminal Home with tmux status widgets, dock, A–Z navigation, and keyboard

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.

Terminal app search for maps showing the live filtered dock

The live recording below shows % filtering followed by the long-press menu. No app is opened or changed.

Long-press actions for an app, including app info and icon customization

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.

Appearance screen with Material colors, terminal opacity, and live dock glass controls

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.

Built-in keyboard settings showing theme, color scheme, dock matching, sizing, and feedback

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.

LauncherCtl page in the replayable onboarding tour

Optional privileged and AI layers

Settings hub with TAI and a live Shizuku READY status

  • 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.

Final onboarding page with optional Home selection and full guide actions

Capability checklist

Capability Works immediately Extra setup
Terminal Home, sessions, dock, A–Z, % search Yes None
Folders, pins, ranking, icon packs, shortcuts Yes Configure to taste
Built-in keyboard and color editor Yes Enable in Keyboard settings
Material terminal/dock palette Yes by default Wallpaper and appearance choices
LauncherCtl apps/resources Yes None
Notification dots, replies, media, notification commands No Notification-listener access
tmux/fish/Oh My Posh workspace No Run the guarded shell setup
Shizuku lock, shell, btop No Shizuku + rish permission
TAI models and local clients No Model download/import and enough RAM
Agent tools and MCP Bridge included 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.

Home surface showing tmux, prompt, dock, A–Z row, navigation keys, and keyboard

Read the screen from top to bottom

  1. Status and terminal: your Termux or tmux session.
  2. Apps row: pinned, ranked, or filtered launch targets.
  3. A–Z row: direct catalog filtering and launch gestures.
  4. Navigation/Extra Keys row: configurable terminal and tmux controls.
  5. 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

Live percent search filtering the dock

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

Current launcher settings map

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:

launcherctl token rotate

Existing clients must reread the new token.

Use it in tmux and scripts

bind -n M-m run-shell 'launcherctl launch maps >/dev/null 2>&1 || tmux display-message "Launch failed: Maps"'

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:

launcherctl client-config codex
launcherctl client-config opencode
launcherctl client-config ollama

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:

curl -fsSL https://raw.githubusercontent.com/PickleHik3/termux-launcher/main/docs/en/examples/setup-tmux-btop -o ~/setup-shell
chmod 700 ~/setup-shell
sed -n '1,220p' ~/setup-shell
~/setup-shell

Choose:

  1. All: fish + Oh My Posh, tmux plugin, and optional Shizuku btop helper.
  2. tmux only: TPM and the Termux Launcher tmux plugin.
  3. btop only: the rish-backed helper; use this only after Shizuku setup.
  4. 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.

Appearance controls used by the terminal, dock, keyboard, and tmux palette

Add app-launch keybinds safely

List the labels LauncherCtl knows:

launcherctl apps

Then add only the bindings you want to ~/.tmux.conf:

bind -n M-m run-shell 'launcherctl launch maps >/dev/null 2>&1 || tmux display-message "Launch failed: Maps"'

In tmux syntax, M-m means Alt+m. Avoid copying a large personal binding list: start with one app, test it, then add more.

Refresh after an app update

launcherctl update-scripts
tmux source-file ~/.tmux.conf

The first command refreshes repo-owned scripts with backups; it leaves ~/.tmux.conf unchanged. The second reloads your tmux config.

Manual alternative

If you prefer full control, open the public examples before copying them:

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:

launcherctl apps
bind -n M-m run-shell 'launcherctl launch maps >/dev/null 2>&1 || tmux display-message "Launch failed: Maps"'

Do not copy the developer phone’s full personal binding list; conflicts depend on your apps and keyboard.

Reload and recover

tmux source-file ~/.tmux.conf
termux-reload-settings

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.

Before you start

  • Install Shizuku from a source you trust.
  • Follow its official setup guide.
  • Understand that Shizuku grants selected apps elevated Android service access while its service is running.

The launcher shows backend state as OFF, READY, SHELL, or DENIED in Settings.

Set up rish

  1. In Shizuku, open Use Shizuku in terminal apps.
  2. Generate rish and rish_shizuku.dex.
  3. Put both in a directory already on your Termux $PATH, such as ~/.local/bin after you add that directory to PATH.
  4. Check the launcher edition:
printf '%s\n' "$TERMUX_APP__PACKAGE_NAME"
  1. Set the bottom of rish to that exact package:
# Termux edition
RISH_APPLICATION_ID="com.termux"

# VAJ edition
RISH_APPLICATION_ID="io.vaj.tl"
  1. Make the script executable and run it once:
chmod +x "$(command -v rish)"
rish

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:

  1. an Android keyboard such as Unexpected Keyboard;
  2. the launcher’s optional built-in keyboard;
  3. 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.

Current built-in keyboard settings

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.

extra-keys = [[ \
  {macro: "CTRL b h", display: "𝍣"}, \
  {macro: "CTRL b v", display: "𝍬"}, \
  {macro: "ALT LEFT", display: "⬸"}, \
  {macro: "CTRL b c", display: "+"}, \
  {macro: "ALT RIGHT", display: "⤑"}, \
  {macro: "CTRL b [", display: "✏"}, \
  {macro: "CTRL b z", display: "□"}, \
  {macro: "CTRL b x", display: "×", popup: {macro: "CTRL b k", display: "⊠"}} \
], [ \
  {key: ESC, display: "Esc", popup: {macro: "CTRL b F12", display: "⟲"}}, \
  {key: TAB, display: "TAB"}, \
  {key: SHIFT, display: "SHFT"}, \
  {key: CTRL, display: "CTRL"}, \
  {key: ALT, display: "ALT"}, \
  {key: LEFT, popup: DOWN}, \
  {key: RIGHT, popup: UP}, \
  {key: KEYBOARD, popup: PASTE} \
]]

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

  1. Open Browse Catalog.
  2. Filter by the capability you need: chat, tools, vision/audio, or embeddings.
  3. Read license/terms and hardware requirements.
  4. Download or import one model.
  5. Load it with the recommended/automatic accelerator.
  6. Check status from the shell.
tai status
tai models
tai runtime

tai manages the host and models; it is not an interactive chat client.

Connect a client safely

Generate a config when supported:

launcherctl client-config codex
launcherctl client-config opencode
launcherctl client-config ollama

Or read the endpoint/token at runtime from ~/.launcherctl/. Never commit the token or paste it into screenshots.

export OPENAI_BASE_URL="$(sed -n '1p' ~/.launcherctl/endpoint)/v1"
export OPENAI_API_KEY="$(cat ~/.launcherctl/token)"

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.

Inspect before executing

launcherctl agent --dry-run "open maps"
launcherctl agent "open maps"

Use dry-run while learning which tool and arguments a natural-language request resolves to.

Risk model

  • Low-risk read-only tools can run without an extra confirmation.
  • Medium-, high-, and critical-risk tools require explicit confirmation.
  • Android/Shizuku permissions remain separate from the model’s decision.
  • A model cannot gain access that the launcher itself does not have.

Treat tool confirmation as a security boundary, not an annoyance. Read the resolved tool and arguments before approving changes.

MCP stdio bridge

Install Python, then start the bridge:

pkg install python
launcherctl mcp

Generate a client preset when available:

launcherctl client-config codex
launcherctl client-config opencode

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 · recLiteRT-LMGeneral chat · image · audio · tools2.4 GB8 GB+
Gemma 4 E4B ITLiteRT-LMCoding · reasoning · multimodal · tools3.7 GB12 GB+
Qwen2.5 1.5B Instruct · importLiteRT-LMLightweight text · code · multilingual1.5 GB6 GB+
DeepSeek-R1 Distill 1.5BLiteRT-LMSmall reasoning tasks1.7 GB6 GB+
FunctionGemma 270M · gatedLiteRT-LMFunction/tool selection (CPU-only)0.3 GB6 GB+
EmbeddingGemma 300M · gatedLiteRT-LMEmbeddings (/v1/embeddings)183 MB4 GB+
Qwen3 Embedding 0.6BMNNEmbeddings (/v1/embeddings)378 MB4 GB+
Qwen2.5-Coder 1.5B · recMNNCoding · tools · terminal clients971 MB4–6 GB+
Qwen2.5-Coder 7BMNNHigher-quality coding4.4 GB10–12 GB+
Qwen2.5 0.5BMNNTiny general chat557 MB3 GB+
Qwen2.5 1.5BMNNLightweight multilingual chat879 MB4–6 GB+
Qwen2.5 3BMNNBalanced multilingual chat2.4 GB6–8 GB+
DeepSeek-R1 1.5B QwenMNNSmall reasoning tasks1.0 GB4–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

Hugging Face token dialog in Termux AI settings

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

Add a model window: Hugging Face repo URL and capability checkboxes

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

Endpoint and access dialog showing OpenAI base URL and bearer token

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:

  1. Choose the OpenAI-Compatible platform.
  2. Give it any name (e.g. tai).
  3. 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.

BASE=$(sed -n '1p' ~/.launcherctl/endpoint)
TOKEN=$(cat ~/.launcherctl/token)
export OPENAI_BASE_URL="$BASE/v1"
export OPENAI_API_KEY="$TOKEN"

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.

Reads (status, models, resources, notifications)120 / min
Generation & agent (chat, responses, embeddings, execute)60 / min
App launch30 / min
Model load / download / import20 / min
Live event stream (opens)12 / min
Destructive (app restart, token rotate)5 / min

Errors & status

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.

{
  "error": {
    "type": "invalid_request_error",
    "code": "model_not_found",
    "message": "Unknown TAI model: MODEL_ID"
  }
}

Streaming

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.

curl -fsSL https://raw.githubusercontent.com/PickleHik3/termux-launcher/main/docs/en/examples/setup-tmux-btop -o ~/setup-shell \
  && chmod 700 ~/setup-shell && ~/setup-shell

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 + e Show 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