0.2.31
Added
-
A first-launch tour over real footage. Three pages on first open: the two commands worth
running before anything else, the dock as an app launcher with its%search and alphabet
rail, and persistent windows with splits and the live status surfaces — each over a short
looping clip of the launcher actually doing it. Skippable from any page, shown once, and
forceable withEXTRA_SHOW_ONBOARDINGfor demos. -
A usable landscape layout. The launcher draws into the display cutout and pads content by
its insets, ending the unscrimmed wallpaper strip on the camera edge. The in-app keyboard's
height scale is stored per orientation (landscape follows portrait until adjusted), and its
landscape ceiling drops so the keyboard can no longer starve the terminal to a single row.
The horizontal dock becomes a vertical rail of pinned apps on the left edge, which the window
bar, terminal and keyboard all inset past. Portrait is unchanged. -
A workspace can restore what was running. Saving records the foreground command of each
pane behind a checkbox, and loading a workspace that carries commands offers to run them
again, labelled with how many — asked on both sides, because workspace files are hand-editable
and a hand-written one should execute nothing unasked. A restored command runs through the
normal Termux login shell, so it lands in your shell with your config and your PATH, and a
pane whose command ends or fails is left on a usable shell instead of vanishing. The picker
also gains a per-row delete, confirmed by name. -
Per-pane zoom. Pinch (or the font-size keys) now sizes only the pane you did it in and pins
that size to the pane — switching windows or re-rendering no longer folds every pane back to
one shared size, and no pane in any other window moves with it. A new split starts at the size
of the pane it was split from, and a new window at the size of the pane you came from; panes
you never zoomed keep following the settings default. Pinned sizes survive activity recreation.
The scratchpad stays on its own remembered size, neither inheriting nor donating. -
Reproducible Termux recipes for Sigye and animated-Kitty Fastfetch — pinned upstream builds
carry the Android clipboard compatibility fix Sigye v0.6.0 still needs and the Fastfetch GIF
frame upload/playback patch used to exercise the launcher's terminal-driven Kitty animation.
Both install under~/.localwithout replacing APT-owned files. -
Terminal font picker — Settings → Appearance → Terminal fonts installs a complete multi-face font with no shell: pick from fourteen curated families with download sizes, SHA-256 verification and license text shown up front, with a star on the suggested one (Maple Mono, the variable pair) and each family's own icon, ligature and feature defaults applied on install. Toggles for icons, ligature policy and the
wghtaxis rewrite the config in place, and Use font.ttf / Termux:Styling hands control back by deleting exactly one file. The picker writes only under~/.termux/fonts/, plus~/.termux/fonts.d/10-launcher.conf; it never creates, overwrites or deletes~/.termux/font.ttforfont-italic.ttf, so installing a family changes the terminal only. Reachable from the palette, keybindings and agents asfonts.pickandfonts.install. -
~/.termux/fonts.d/*.confdrop-ins — font config fragments load in filename order before your ownfonts.conf, so a hand-written file always overrides an app-managed or third-party fragment while still inheriting what it does not restate. Bounded to 32 files and 256 KiB across all of them, which never eats intofonts.conf's own 64 KiB allowance. -
Ordered font fallback —
fallback_font path=…|family=…, repeatable up to 8, is the controllable answer to Android substituting a CJK or emoji face you did not choose. Coverage is probed on the cluster's base code point and memoized, and a fallback face never changes cell width. -
Named symbol maps —
symbol_map name=<ident> …letsfont_featuresandfont_variationstarget one specific map instead of the sharedsymbolstarget. -
Geometric box drawing — box-drawing, block, shade, braille and sextant cells are drawn as geometry snapped to shared integer cell edges, so frames, block ramps and braille graphs join seamlessly at any cell size instead of showing the hairline gaps a font's glyph metrics leave.
box_drawing fontrestores glyph rendering,box_drawing_scaletunes the four line weights, andpowerline_symbols synthesizeclaims the separator ranges too. -
Bind a key to an app from the palette — long-press an app row (or
Ctrl+Alt+Enteron the focused one) and press a combination; it is written to~/.termux/termux-launcher-bindings.confwith your comments and ordering preserved, and takes effect immediately. App rows also show the chord already bound to them, and are searchable by it. -
Rename any session from the palette — a Rename row per session, so renaming a session other than the current one needs neither the browser nor the panel (
session.rename_at_index). -
Working indication — the pill rim of a window breathes while the shell in it is actually working. The signal is CPU burned by the foreground process group between polls, not output, so a shell echoing keystrokes or a TUI repainting its clock once a second does not read as work, and typing silences the indication outright. Where no privileged reading exists it falls back to sustained output, excluding alternate-buffer applications.
-
Settings cog in the expanded status panel, opening the launcher's settings; the top-pane clock opens the device's clock app.
-
The terminal identifies itself to capability detectors. XTVERSION replies
termux-launcher(version), XTSMGRAPHICS answers with the sixel colour-register count and screen-following geometry instead of swallowing the query, andTERM_PROGRAM/TERM_PROGRAM_VERSIONare exported to every shell — so programs that pick features by asking which terminal this is (chafa, notcurses and everything on their databases) stop falling back to their most conservative path. -
Rename and close buttons on sessions-panel rows — the long press still works, but it was the only way to know it was possible.
-
A window whose shell asked for you lights up. The pill rim of a window turns the Material error colour and pulses with a halo once a shell in it rings the terminal bell — a permission prompt, an agent handing its turn back, a build that stopped for input. The bell is the signal, so no cooperation from the program is needed, and it is recorded even when the launcher is in the background. Focusing the window clears it, and a bell from the window you are already in is not news.
-
Terminal contrast in the surface editor — Edit surfaces → Terminal now carries the Softer/Default/Harder control alongside opacity and border, applied live like everything else there, with Reset tab and dismiss behaving as they do for the rest of the tab. Disabled with a reason when wallpaper colours are off, since contrast only grades the generated palette.
-
Every Material container role is exported.
on_error_container,on_tertiary,on_tertiary_container,outlineand theprimary/secondary/tertiary_containerfamilies with theiron-partners join~/.termux/material-colors.{sh,properties}, so a prompt or script can draw a filled chip with a guaranteed-contrast pairing instead of borrowing an accent role. The bundled Aliens Material prompt uses them: its Python/virtualenv chip ison_tertiary_containerontertiary_container(7.25:1) and only turns red when there is an actual error, where it was painting every virtualenv in the error colours (5.34:1).
Changed
- Shipped terminal defaults now match the maintained live setup. The bundled keyboard and its
editable copies use the revised navigation/voice gestures, while the Fish template and guarded
installer select the compact, status-aware Aliens Material prompt. - An upper-case letter in a binding is Shift.
map Ctrl+Alt+R …andmap Ctrl+Alt+r …are now two bindings rather than the same one — case on the key was previously discarded, so a config file had no short way to name the shifted stroke. Modifier names and multi-character key names (left,pageup) stay case-insensitive. Using it:Ctrl+Alt+Rrenames the shell session on any layout, whileCtrl+Alt+rrenames the current window (and still renames the session when split panes are off, where there is no window to rename). The palette prints a shifted letter the same way:C-A-R. - One group colour per action family, everywhere a binding is shown. The keybind hint legend and the lit caps on the in-app keyboard now colour each key by its action's namespace — panes, windows, session, workspace, terminal, clipboard, appearance, app — as hue rotations of the live Material primary instead of three shared roles, so windows and session no longer wear the same colour.
- Pressing a lit cap on the in-app keyboard runs its binding. A character key under a latched
Ctrl+Altis resolved as a stroke instead of being written to the shell as an escape-prefixed control byte, sotermux-launcher-bindings.confgoverns the soft keyboard exactly as it governs a hardware one. - The Rounded surface style's follow-the-style corner radius is 20dp (was 16–26dp by surface height), and the status surface honours it instead of squaring off.
- Session names are capped at 8 characters instead of 5, and the scratchpad shell is named
scratch; an existing scratchpad is re-adopted rather than duplicated. - The transient notice chip moved to the top-right, is quieter, and now carries every terminal notice — window positions, "no session to split", the max-terminals refusal — which were previously stock toasts. Creating a pane reports the new pane count.
- Background commands report per session, not per pane. Opening a window, splitting a pane, or moving between the windows of one session no longer raises a corner notice, even when you leave a command running: those windows are still on screen and their pills carry the working and waiting states. Only leaving the session hides them, and that is what now puts a standing row in the top-right corner.
- A changing window title no longer raises a notice. It fired on every progress write — several times a second for one background job — to say what the window's own pill and the corner stack already say.
- The transient notice chip is a Material surface. Label-medium type on a surface-container-high fill with an outline hairline and elevation, entering on the emphasized-decelerate curve, instead of 9.5sp text on a black scrim. The standing background rows match it one step lower in the elevation scale, and the two share one column: the rows sit directly under the notice and slide up into its slot when it expires.
- The palette is only rebuilt when it actually changed. Resume, configuration changes and wallpaper-colour callbacks all forced a full refresh — an HCT palette build, a recolour and repaint of every session, a font-config re-read with typefaces rebuilt and re-applied to every pane, and two file writes — whether or not any Material role had moved. They now consult a fingerprint first, and that fingerprint covers all 25 roles the export is derived from rather than six accents plus the contrast level.
- Colour and font refreshes are separate. A wallpaper change no longer re-reads font config from disk, rebuilds typefaces or re-measures panes; only a font change does.
- The in-app keyboard's colours follow the Material theme. Every swatch re-resolves its source role on load, on a wallpaper-colour change and on the way back from hidden, so the keyboard moves with the system theme instead of freezing whatever the roles were when the scheme was first written. A swatch you edit is pinned and left alone, an imported Tinted/Base16 palette pins the whole set, and Follow theme hands pinned colours back. Repaints are gated on the resolved roles actually moving.
- The font catalog doubles — Meslo LGS NF, Iosevka Term, Monaspace Neon, Commit Mono, 0xProto, Intel One Mono, Recursive Mono Casual and Comic Shanns Mono join, every download verified as before. The Nerd-Font-patched Maple Mono build is dropped: the bundled Symbols Nerd Font already routes the icon planes for every family, so its 20 MB download bought nothing.
- Powerline separators are synthesized by default, the way kitty draws them itself: geometry is the only way their edges sit flush with the cell-aligned background rectangles, since a font glyph never quite fills the cell.
powerline_symbols fonthands them back to a patched Nerd Font whose author drew their own. - Settings search reaches every sub-screen. Root search matched only the destination rows' own titles and summaries, so "fonts", "shizuku" or "ligatures" found nothing; each destination now indexes every preference reachable under it, and a row matched through its children says what it contains. The root screen groups its destinations under Launcher and System & Info headers, a duplicated Recents toggle is gone, and the three surface-editor entries are named in parallel.
- Open-Meteo is credited beside the forecast — their CC BY 4.0 licence asks for the credit next to the data, not only in a notices file — and hidden when none of their data is on screen. The notices file and in-app licences screen gain a data-sources section recording what actually leaves the device: no account or key, the last known coordinates to four decimal places, and only once the reading is enabled and location granted.
- Bar CPU/RAM readings are smoothed instead of repainting every raw sample, and with the mini-btop card closed sampling slows to halve the privileged
/procreads; the card still gets every sample.
Fixed
- Every key a latched prefix binds now lights up and appears in the hint legend. The 18-row legend cap also ended the loop that built the keyboard lighting, so the strokes registered last —
Ctrl+Alt+Ramong them, behind the nine session-index digits — were neither listed nor lit. Lighting is no longer capped at all, and a run of keys one action claims (the four arrows,1–9) collapses to a single legend row. - Terminal text is no longer clipped by the rounded corners of the terminal border, at 20dp or at 40dp: the arc's depth is now padding inside the clip rather than a margin around it, which moved the box without moving its corners off the arc.
- Closing a pane no longer leaves its background jobs running. Teardown hangs up the shell's whole process group and escalates to a kill only if the leader is still alive, so
sleep 300 &dies with the pane it was started from.nohupandsetsidstill detach, as intended. - The scratchpad no longer shrinks every time the keyboard opens and closes, and no longer paints under the dock.
- Showing or hiding a float no longer reflows the terminal behind it — the frame-line owner, and so the pane inset, no longer depends on whether a float is present, and floats are attached without rebuilding the tiled tree.
- The CPU card keeps working. A failed privileged read no longer wipes the process list, a wedged command no longer stops sampling for good, output is drained concurrently so a large process list cannot deadlock the read, sampling resumes after leaving the app, and a stale sample is labelled rather than blanked.
- Swipe-to-reply opens the newest reply-capable notification instead of only firing when an app had exactly one, and an incoming notification no longer throws away a half-typed reply.
- The command palette's focus highlight and bottom fade stay inside its rounded corners, and its accent rim is no longer painted over.
- The floating pane's grab pill no longer draws a near-black slab across the top of the float.
- The sessions pop-down accounts for its own row chrome, and only autoscrolls a title that overflows by a readable amount.
- The wallpaper is visible again in wallpaper mode. With wallpaper colours on, the terminal surface was raising its own opacity to keep every generated glyph legible over any wallpaper — a floor that only full opacity could satisfy, because a mid-tone grey ANSI colour cannot meet a contrast target over both a dark and a light backdrop at once. That colour is painted on the full-screen root, so the whole launcher went opaque behind the dock and keyboard. The opacity slider is the contract again.
- The background-command chips no longer blink. Every bind rebuilt all the rows, which handed the layout transition a full turnover on a view that is re-bound on every title change of every background shell. Rows are reused now, so only real arrivals and departures animate.
- A new window no longer flashes a chip for its own startup. Anything a shell's rc files spawn is a non-idle foreground with no shell-integration mark yet, indistinguishable from a background command; a foreground now has to survive one resolver poll before it earns a row.
- Working indication counts a wrapper script's child. CPU was read from the foreground process-group leader alone, so
sh build.sh— which only waits while its child works — reported zero and every wrapped command read as idle. The whole process group is summed now, matched onpgrpin one pass over/proc. - A shell that exits no longer leaves its foreground process behind in the cache, where a reused pid would inherit it.
- The exported palette files are built on the main thread. The writer thread was resolving theme attributes and re-deriving the palette itself, so the files could describe different colours than the terminal took.
- The terminal surface no longer rebuilds the whole generated palette to read one colour — a 101-tone contrast search per foreground, cursor and ANSI colour, every time the surface was restyled.
- Returning to the launcher no longer makes every shell re-read the palette. The exported colour files were rewritten byte-for-byte identically on every resume, and shells watch them by modification time — the bundled fish config re-sources the palette when it moves and re-runs the tmux theme script inside tmux. Identical content is now left alone.
- "Customize status appearance" no longer crashes in dark mode below Android 12 (#7). The dark pre-API-31 base theme was the last style in the project on a Material 2 parent, which defines no
materialSwitchStyle, and measuring a MaterialSwitch without one throws. Found alongside it: the recents-visibility policy silently stopped applying on Android 8–9, and the notification-access row was a dead button below Android 11 — both fixed. A new sweep measures a MaterialSwitch under every activity theme, in both night modes, at both ends of the supported API range, so a theme drifting off Material 3 fails as a test rather than as a report from someone else's phone. - The download catalogs no longer flicker while downloading. The font and TAI model lists re-bound every visible row on every progress tick; a pure progress tick now lands directly on the bound progress bar, a row only re-binds when something visible moved, and the ghost insertion cursor Nothing OS painted over re-bound buttons is gone.
- Box-drawing synthesis outranks a
symbol_mapmatch, so the managed nerd-font map — which spans the whole private-use area — cannot silently turn geometry off; and a narrow private-use icon whose neighbour is a same-styled blank gets both cells, so an iconwcwidth()calls narrow is no longer stamped into a single square.