I wanted the launcher to hold small tools, not become every tool.
A timer, the current song, a few notes, or the state of a server can belong beside the prompt. A whole Linux environment does not. Modules work because RETUI keeps that difference visible.
A module is a place, not a plugin loophole
Modules are terminal panels owned and rendered by RETUI. They show useful state, offer a few focused actions, and stay close to the command line. They do not load somebody else's Java or Kotlin into the launcher.
That limit is deliberate. Extensibility is useful, but turning the launcher into an unbounded plugin host would make permissions, crashes, and visual behaviour much harder to reason about. Modules get a defined surface instead.
module -ls module -show timer module -show notes module -close
The built-ins are ordinary on purpose
The current launcher includes modules for music, notifications, timer, calendar, reminder, notes, RSS, and weather. None of those ideas are exotic. Their value is that they can remain visible without making you leave the launcher for every small check or action.
musicSee playback state and keep previous, play, next, info, and stop close to the prompt.
notificationsMove through notifications, open one, reply where Android allows it, and reach access or filter controls.
timerAdd time, start a 25-minute session, stop it, or check its state.
calendar / reminderKeep upcoming events visible and run a native add, edit, or remove conversation for local reminders.
notes / rss / weatherBring small local notes, feed updates, and weather state into the same surface.
When a module has actions, those actions get their own compact strip. The normal suggestion row still belongs to apps, aliases, shortcuts, guide steps, and commands. Opening a panel should not quietly break the rest of the launcher.
The dock is a choice, not a permanent fixture
A new install starts with music, notifications, timer, calendar, and reminder in the dock. Add notes, RSS, weather, or a custom module if you want them there. Remove everything and the dock stays empty; RETUI does not "helpfully" restore the defaults behind your back.
module -dock add notes weather module -dock remove music module -dock -toggle
Hiding a built-in does not delete it. A hidden or undocked module remains available through `module -show`. You can also disable the row from Behaviour settings or with `config -set show_module_dock false`.
Lua is for the launcher-native path
Sometimes a panel needs state, buttons, suggestion chips, a small form, or a reactive layout. Lua modules provide that inside RETUI without asking someone to manage a Termux project first.
module -new lua counter module -edit counter module -check counter module -show counter
The script lives in local RETUI storage and travels with personal backup and restore. It can keep module-local preferences and files, render native text and controls, and respond to actions. The older `widget` command remains as a compatibility alias, but these scripts share the same module dock as everything else.
Capability is not automatic. A script that wants network, clipboard, vibration, local files, active ticks, notifications, apps, intents, or shortcuts has to declare that need. `module -approve <id>` records consent for that script and permission set. Change the script or add a capability, and approval is required again.
Termux is for work that belongs to a shell
RETUI can ask a Termux script to run, read its output, and place the result in a module panel. Termux still owns the shell, its packages, the script file, and network execution. RETUI owns the panel.
module -add server termux:/data/data/com.termux/files/home/retui/server-health.sh module -refresh server module -show server
Plain stdout becomes the body. When alignment matters, a script can mark a block with `::pre`, `::ascii`, or `::code`, then close it with `::end`. Structured lines can set a title, add body text, or provide command suggestions.
::title Server ::body prod-api ONLINE ::pre CPU [####....] 50% ::suggest refresh | command | module -refresh server
Removing the module only removes RETUI's registry entry. It does not delete the Termux script. That boundary should stay boring and predictable.
Some tools need more room
A module is glanceable. It is not the right surface for Midnight Commander, htop, SSH, a REPL, or a long-running terminal program. Those belong in the optional tmux workspace, where Termux owns a persistent session and RETUI provides the phone-friendly frame around it.
Likewise, a Lua script that needs a larger focused surface can be a Lua app instead of a dock module. The point is not to force every idea into the same rectangle. The point is to choose the smallest RETUI surface that can hold the job honestly.
The short command map
You do not need the entire scripting API to use modules. These commands cover the normal lifecycle.
module -lsList built-in, registered script, and local Lua modules, plus the current dock.
module -show <name>Open a module without requiring it to live in the dock.
module -refresh <name>Explicitly rerun or rerender a module. Tapping an active module title also forces a refresh.
module -hide <name>Remove a built-in from the dock without pretending it has been deleted.
module -rm <name>Remove a registered custom module. Built-ins cannot be removed.
module -prompt reminder addStart the reminder module's native guided input session.
Run `help module` on the installed build when you need the complete current syntax.
I like modules because they make RETUI more capable without pretending the launcher should own everything. Small tools stay close. Bigger tools keep the environment they deserve.