termui
A fzf-driven launcher for your terminal (TUI) apps. Browse your tools, launch them, install what's missing, add your own, and trigger the whole thing with a hotkey.
The command you type/bind is termui; the installable package is called tuil (the name termui was already taken on PyPI).
Linux only. It relies on
sudo, Linux package managers (pacman/apt-get/dnf/zypper/apk),~/.bashrc/~/.config/fish/config.fishfor the alias, and Hyprland/Sway/i3/sxhkd/GNOME for the keybind. It won't run as-is on macOS or Windows.
Requirements
- Python 3.10+
fzfon yourPATHsudo(only touched if you install something through a system package manager)
Install
From a clone of this repo:
pipx install .
(or pip install --break-system-packages -e . for an editable dev install). Either way this gives you a real termui command on your PATH.
Once published, this will also work directly:
pipx install tuil
First run
The first time you run termui, a one-time wizard walks through:
- Package manager detection — detects
pacman,apt-get,dnf,zypper, orapk, and reports how many of the ~30 default tools are already installed. - Preload defaults? — yes seeds the list with common TUI tools, install commands auto-mapped to your detected package manager. No starts you with an empty, custom-only list.
- Alias setup — pick a command name (default
termui), added to~/.bashrcand~/.config/fish/config.fish, whichever exist. - Keybind setup — pick a modifier (
SUPER/CTRL/ALT/SHIFT) and a key. It detects your window manager / desktop and wires up the binding accordingly:Environment Where the bind goes Apply it with Hyprland ~/.config/hypr/hyprland.confhyprctl reloadSway ~/.config/sway/configswaymsg reloadi3 ~/.config/i3/configi3-msg reloadsxhkd (bspwm etc.) ~/.config/sxhkd/sxhkdrcpkill -USR1 sxhkdGNOME custom keybinding via gsettingsworks immediately If none of these are detected, it skips the hotkey and tells you to bind the alias manually in your desktop's shortcut settings. The bind opens whatever terminal it finds on your system ( kitty,alacritty,wezterm,foot,gnome-terminal,konsole, orxterm, in that order, or$TERMINALif set) runningtermui.
This all only runs once, tracked in ~/.config/tuilauncher/state.json. Delete that file to redo the wizard.
Every session
Each launch asks fresh whether to cache sudo for that session (credentials don't persist between runs):
- Yes — one password prompt, then a background keep-alive so installs don't ask again.
- No — installs run normally;
sudoprompts inline whenever a command needs it.
Using the menu
| Option | What it does |
|---|---|
| (any app name) | Launch it if installed, otherwise prompt you to install it |
[34] Install Package |
Pick one missing tool and install it |
[35] Install All |
Install every missing tool in the list |
[36] Add Custom Tool |
Add your own entry — name, run command, install command, category, description |
[00] Quit |
Exit |
Config file
Your app list lives at ~/.config/tuilauncher/apps.csv, pipe-delimited:
name|run_command|install_command|description|category
Edit it by hand if you'd rather skip the [36] Add Custom Tool menu.
Project layout
tuil/
├── pyproject.toml
├── README.md
├── .gitignore
└── src/
└── tuil/
├── __init__.py
└── cli.py
Screenshots

Metadata
Release files for tuil 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tuil-0.1.0.tar.gz | 11.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tuil-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.0 kB
Release files / tuil-0.1.0.tar.gz
| Download URL | tuil-0.1.0.tar.gz |
|---|---|
| Size | 11.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee972a516195bf106440a787faa138fe0f640a2f6618ccc669fb2b56f4aa5311
|
|
BLAKE2b-256 checksum How to use checksums |
6959bdb702be6205d4ee7451991fbb08f79719775dc9cfb869133bffaf5319c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Release files / tuil-0.1.0-py3-none-any.whl
| Download URL | tuil-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bb3cbe755203e6e52b0b1a6092508ded631f52e3d1f9fa55a5743555d3ea7a9a
|
|
BLAKE2b-256 checksum How to use checksums |
a326dd23dc80efdc87d74b4af541aaf41367cfc16ed5a4a4f31629b2a43e7866
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|