Skip to main content

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.fish for 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+
  • fzf on your PATH
  • sudo (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:

  1. Package manager detection — detects pacman, apt-get, dnf, zypper, or apk, and reports how many of the ~30 default tools are already installed.
  2. 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.
  3. Alias setup — pick a command name (default termui), added to ~/.bashrc and ~/.config/fish/config.fish, whichever exist.
  4. 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.conf hyprctl reload
    Sway ~/.config/sway/config swaymsg reload
    i3 ~/.config/i3/config i3-msg reload
    sxhkd (bspwm etc.) ~/.config/sxhkd/sxhkdrc pkill -USR1 sxhkd
    GNOME custom keybinding via gsettings works 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, or xterm, in that order, or $TERMINAL if set) running termui.

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; sudo prompts 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

![Main menu](screenshots/main-menu.png)

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)

Source distribution for tuil 0.1.0
File Size Uploaded
tuil-0.1.0.tar.gz 11.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tuil 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page