r/tui

▲ 50 r/tui+3 crossposts

[OC] I made a small terminal screensaver that renders Perlin noise flow fields with Braille characters

Hi everyone,

I wanted to share a small Python project I have been working on called halo.

It is a terminal screensaver / visualizer that renders a particle flow field using 3D Perlin noise, Braille cells, and 24-bit ANSI color. The main idea was to see how much visual detail I could get out of a normal terminal without opening a GUI window or relying on an external rendering engine.

The renderer uses Braille characters as a kind of sub-cell pixel grid, so each terminal character can represent a 2x4 block of virtual pixels. Particles move through a vectorized noise field, leave trails behind, and the output is diffed frame-to-frame so it only writes changed cells back to the terminal.

It includes a few color presets such as neon, sunset, ocean, forest, and fire, and it should work in modern true-color terminals like Windows Terminal, WezTerm, Alacritty, kitty, Ghostty, and iTerm2.

Install from GitHub:

pip install git+https://github.com/programmersd21/halo.git

Run it with:

halo

Example:

halo -c fire -p 600 -s 2.0

This is not meant to be a serious productivity tool. It is just a small terminal art experiment that I had fun building, and I tried to keep it lightweight and readable.

Repo: https://github.com/programmersd21/halo

I would appreciate any feedback, especially from people who enjoy terminal graphics, creative coding, or small CLI projects. Consider checking out the repo and leaving a star!

u/Klutzy_Bird_7802 — 15 hours ago
▲ 22 r/tui+7 crossposts

Cosmo - Real-time PostgreSQL TUI Dashboard (v0.2.0)

Just shipped Cosmo — a clean TUI to monitor your Postgres database in real-time.

Github: https://github.com/mujib77/cosmo

Live overview, active queries, WAL rate, locks, and more.

I’m actively developing more features and older version support.
Would love your feedback and suggestions!

u/VermicelliLittle6451 — 19 hours ago
▲ 379 r/tui+3 crossposts

Back to the roots: 'Tetro TUI' is very customizable but runs purely in the terminal

As shrimple as that (apart from a gazillion terminal limitations and implementing NES style using text???) @ https://github.com/Strophox/tetro-tui :-)

u/Strophox — 1 day ago
▲ 33 r/tui+3 crossposts

repo-check: a simple terminal dashboard to monitor git repositories

Hello!

I made a small CLI tool called check-repo to quickly scan multiple Git repositories and see which ones are clean, dirty, missing, or have pending updates.

It can also track different repo lists per environment, for example Linux, macOS, or WSL, which is useful if you use the same config across multiple machines.

I mostly use it after topgrade with this alias:

alias update='topgrade && echo && check'

The demo also shows the interactive mode (--interactive or -i), which lets you handle simple repo tasks from the terminal.

You can find more info on the GitHub page:
https://github.com/Cartoone9/check-repo

Feedback is welcome. Have a good day.

u/Leather_Coyote_5483 — 1 day ago
▲ 47 r/tui+1 crossposts

ghgrab v2.0 is out - now supports GitHub, GitLab, Codeberg, Gitea, and Forgejo

Hey everyone,

A while back I posted about ghgrab, a small CLI/TUI tool to grab only the files or folders you need from a repo without cloning the whole thing.

Just released v2.0.

New stuff:

  • works with GitHub, GitLab, Codeberg, Gitea, and Forgejo
  • GitHub repo search directly inside the TUI
  • file preview support
  • release asset downloads
  • agentic mode for scripts/AI agents to fetch only needed files

Install:

cargo install ghgrab

npm install -g u/ghgrab/ghgrab

pipx install ghgrab

Repo: https://github.com/abhixdd/ghgrab

Would love feedback or feature ideas.

u/hmm-ok-sure — 1 day ago
▲ 25 r/tui+1 crossposts

YT-X v0.8.0 (Browse youtube plus other yt-dlp supported sites from your terminal)

Its been sometime since i made any change to the script, had some free time and decided to go all out

The script has been rewritten improving alot of the existing features and making it easy to maintain and read.

Plus now the script introduces a ton of cmdline options, to make it easier to script and connect to keybinds

Features (from github)

🔍 Search & Discovery

  • Comprehensive Search Capabilities: Directly search for videos, playlists, channels, shorts or movies.
  • Advanced Search Filters: Apply colon-prefixed quick filters directly to search queries:
    • Time: :hour, :today, :week, :month, :year
    • Type: :video, :movie, :live, :short, :long
    • Features: :4k, :hd, :hdr, :subtitles, :360, :vr, :3d, :local
    • Sort by: :newest, :views, :rating
  • Search History & Recall: Automatically saves search history. Allows quick recall of previous searches using bang syntax (e.g., !1 for the most recent search, !2 for the second, etc.).
  • YouTube Feeds: Access personal feeds including the Home Feed, Trending, Watch Later, Liked Videos, Watch History, and Clips.
  • Channel Browsing: Deep dive into channels with dedicated menus for Videos, Featured content, Playlists, Shorts, Live Streams, Podcasts, and Channel-specific search.
  • Channel Subcommand: Jump directly into a channel from the command line (e.g., yt-x channels -n "Linus Tech Tips" -v) – perfect for scripting and keyboard-driven workflows.

🖥️ User Interface & Experience

  • Dual Launcher Support: Operates flawlessly in the terminal using FZF (Fuzzy Finder) or as a graphical desktop menu using Rofi.
  • Rich Media Previews: Supports inline previews for search results containing:
    • High-resolution thumbnails rendered directly in the terminal via chafa, icat, kitten icat, or imgcat.
    • Detailed metadata including Channel Name, Follower Count, View Count, Duration, Upload Timestamp, Live Status, and formatted descriptions.
  • Theming & Styling: True-color (24-bit) support with a default "Tokyo Night" inspired color scheme. Fully customizable UI formatting.
  • Multi-language Support: Loadable language files (.lang) to easily localize the UI prompts and messages.
  • Pagination: Smoothly browse through massive lists with Next/Previous pagination controls (fetches a configurable number of items per page, default is 30).
  • Selection Skipping: New --playlist-skip (-ps) flag forces the launcher to automatically pick the first item in any list, bypassing interactive selection – ideal for non‑interactive scripts.
  • Media Action Shortcuts: Directly perform actions (play, listen, download, save, etc.) without opening the media action menu – see “Media Action Shortcuts” below.

🎬 Playback & Media Handling

  • Multiple Player Support: Out-of-the-box integration with mpv, vlc, and tplay.
  • Video & Audio Modes: Choose to "Watch" (video) or "Listen" (audio-only, launching without a video window).
  • Playlist Actions: Play individual videos, queue/play entire playlists, or queue "Listen to All" for audio-only marathon sessions.
  • Auto-Mix Generation: Dynamically generates .m3u8 playlist mixes based on a single video (YouTube "Mix" feature replication).
  • Background Playback: Option to disown the media player process (CONFIG_DISOWN_PLAYER), allowing the UI to remain unblocked while media plays.
  • Media Action Shortcuts (Skip the Media Menu):
    • --play / --play-all : Watch selected video or whole playlist.
    • --listen / --listen-all : Audio‑only playback.
    • --download / --download-all : Download video(s).
    • --download-audio / --download-audio-all : Download audio only.
    • --save : Save current video to saved list.
    • --save-playlist : Save current playlist to custom playlists.
    • --shell : Drop into a stateful subshell.
    • Many of these (e.g., --play-all, --save-playlist) implicitly enable --playlist-skip for seamless non‑interactive operation.

💾 Downloading & Archival

  • Powered natively by yt-dlp.
  • Granular Downloads: Download single videos, entire playlists, or extract audio-only (MP3 format).
  • Smart Archiving: Utilizes a download archive directory to track previously downloaded media and prevent duplicate downloads.
  • Organized File Structure: Automatically routes downloads into structured directories (e.g., video/individual/ChannelName/ or audio/PlaylistName/ChannelName/).
  • Enumeration Toggle: Easily toggle file prefix enumeration (01 -, 02 -) to keep downloaded playlist items in order.

📚 Library & Data Management

  • Local Subscriptions Sync: Syncs your actual YouTube subscriptions locally by passing browser cookies to yt-dlp, creating a private, locally stored subscription feed.
  • Local Watch History (Recent): Automatically tracks recently watched media in a local JSON file to resume or re-watch easily.
  • Saved Videos & Playlists: Create local "Saved Videos" and "Custom Playlists" natively within the CLI without needing a YouTube account.
  • Cookie Integration: Seamlessly imports cookies from installed browsers (Brave, Chrome, Firefox, Safari, Edge, etc.) to access age-restricted or account-specific content.

⚙️ Extensibility & Power User Features

  • Custom Commands: Create custom macros that execute specific URLs and yt-dlp options (e.g., setting up a command to browse a completely different streaming site).
  • Extension System: Modular architecture allowing the autoloading of custom scripts, sites, themes, and commands placed in $HOME/.config/yt-x/extensions/.
  • Stateful Sub-Shell Execution: Drop into a system shell (fish or sh) pre-loaded with the environment variables of your current session (current video title, URL, channel info, etc.) for advanced custom scripting on the fly.
  • Desktop Integration: Built-in command (-E) to generate a .desktop entry file, allowing yt-x to be launched natively from application menus (Linux).
  • Cache Management: Automatically cleans up stale preview images, auto-generated playlists, and logs older than a configurable retention period (default 7 days).
  • Direct Shortcut Flags: Skip the interactive menu entirely with dedicated flags like --feed, --subscriptions-feed, --watch-later, --saved, --recent, --liked, --watch-history, --clips, and more – ideal for keybindings and scripting.
  • Non‑Interactive Exit Helpers: --cmd-exit terminates the script after executing a shortcut, while --media-exit does the same after any media action – perfect for one‑off commands and aliases.
  • Direct Access to Saved Items: Open a specific saved video (-sv, --saved-video), custom playlist (-cp, --custom-playlist), or custom command (-cc, --custom-cmd) without browsing menus, with tab completion in supported shells.

🛠️ Cross-Platform & Infrastructure

  • OS Support: Works across Linux, macOS, Windows (via WSL/MSYS/Cygwin), and Android (uses am start intents to open media natively in Android apps like VLC or MPV).
  • Configuration Management: Generates a robust config file automatically on first run. Allows editing configuration files directly from the UI menu.
  • Auto-Updater: Built-in update checker that securely pulls the latest version from GitHub and prompts the user to apply updates inline.
  • Shell Completions: Generates native shell autocomplete definitions (fish, with dynamic channel name completion from subscriptions.json, custom playlist and saved video name completion, and extension completion from ~/.config/yt-x/extensions/).

link

The readme is mostly generated by ai due to time constraints and effort required. But it was fully involved it did most of the writing and i did the thinking and even with it it took hours. I just did not want to spend several more weeks on a readme(1000+ lines) after manually rewriting the script which is now over 4k+ lines/

u/Fragrant-Currency-86 — 2 days ago
▲ 23 r/tui+1 crossposts

I built a khinsider Explorer & Bulk Downloader

I think I did something beautiful.

Spent my last few days building and refining a TUI app to browse and download the whole khinsider download catalouge: khi-explorer

You can easily search for OSTs, navigate albums, download individual tracks and YES even whole albums at once!

I think that's the most outstanding feature a lot of people want - just press D-key on an entry and you will see a progress bar showing you when it's finished.

On first launch the app will create .khi_explorer.yaml in your home directory. There you can set:

  • Download path (default: [HOME_DIRECTORY]/khi_explorer)
  • Default format (you can switch this anytime inside the app by pressing TAB-key)
  • Player for live playback (you must have mpv, ffplay or vlc installed but most people already have)

It's built in Go using the Bubbletea library, so it's easy to cross-compile and you can install it on Windows, Linux or macOS using the linked install scripts on GitHub or by just downloading the binary directly from the releases page (Linux binary is heavily compressed using upx; macOS sadly not supported; Windows Defender says no-no very bad)

Happy exploring! 🙂

https://github.com/madLinux7/khi-explorer

u/Linuxxsxx — 3 days ago
▲ 81 r/tui+3 crossposts

tui youtube player for music with mcp and can sync channels to sqlite

Hi! it's my first project with bubble tea and lipgloss. also uses sqlite, mpv, and yt-dlp.
It plays music you curate with any agent via mcp connectors. the agent can manage and create playlist, also play and pause any songs for you. you can favorite a song or download to ~/music/tuitube/ and play it offline. there are 14 themes and 2 visualizers and the db i made ships with 8000+ songs. there are no ads as it uses yt-dlp.
there are probably other similar tui app but it's got the features that I mainly use and very easy nav imo + agent native tooling.

https://github.com/gitcoder89431/tuitube

open source with mit license, 2 releases cause i only have a linux and mac os machine. I can publish on homebrew or aur if anyone needs it. thank you for your time. 😆

u/Thin_Beat_9072 — 3 days ago
▲ 13 r/tui+1 crossposts

Lsport - Command-line utility for inspecting and managing TCP ports

Hey everyone,

I just published my first open source project on PyPI and would love some honest feedback before I keep iterating.

The problem

Two pain points I kept hitting:

  1. No clean way to see what's running where. lsof -i -P -n | grep LISTEN works, but the output is noisy and columnar — you have to mentally filter it every time. There's no single command that just tells you "here are the ports currently in use, by which process."
  2. Killing a port-holder is a multi-step dance:

lsof -i :3000 to find the PID, then kill -9 <PID> and hope it's the right one. Two commands, copy-paste a PID, parse columns. Across a workday it adds up.

What lsport does

pipx install lsport

Three subcommands:

  • lsport list — all TCP ports currently in use, rendered as a clean table (PID, port, process, user). One command, one glance.
  • lsport kill 3000 — kills whatever owns that port, with a confirmation prompt.
  • lsport interactive — a TUI to browse and kill from a table view.

Works on macOS and Linux. Windows isn't supported yet — I don't have a reliable way to test it.

Tech

Python 3.9+, single-module. psutil for cross-platform socket/process enumeration, rich for table rendering and the TUI, tests with pytest, lint/format with ruff. Published via PyPI Trusted Publishing (OIDC) — no API tokens stored anywhere.

Why not just fuser -k 3000/tcp or a shell alias?

Fair question. fuser is Linux-only and the UX is rough. lsof | grep | awk | xargs kill works but is fragile, and it still doesn't solve the "show me everything at a glance" case. I wanted something opinionated that handles the 90% case and reads naturally.

I'm also aware tools like kill-port (npm) exist — lsport is in that family but Python-native and adds the listing + TUI layer.

What I'd actually love feedback on

  • Code quality and project structure — this is my first OSS project, so blind spots are guaranteed
  • The kill confirmation flow — too noisy, or about right?
  • Windows support — happy to mentor anyone who wants to take a stab
  • Subcommand naming and UX

Repo: https://github.com/0xBroom/lsport PyPI: https://pypi.org/project/lsport/

MIT licensed. Issues and PRs are open. Tear it apart — I'd rather hear it now than later.

u/JohnHopeman — 2 days ago
▲ 483 r/tui+4 crossposts

Concord(not that game) - TUI client for Discord

Concord, a terminal UI client for Discord written in Rust with Ratatui.

The new update adds voice support. Concord can now join voice channels, play received voice audio!

Other features include:
- Guild, channel, thread, forum, and DM navigation
- Sending, editing, deleting, replying, pinning, and reacting to messages
- Inline image previews in supported terminals
- Desktop notifications
- Vim-style keyboard navigation

Checkout more features in readme.

Github repository : https://github.com/chojs23/concord

u/n3oz22 — 5 days ago
▲ 79 r/tui+2 crossposts

matchmaker: an elegant and modern fuzzy searcher

After a long hiatus, matchmaker is back, with some fixes for some embarassing bugs from before times. With 0.0.26, there is now also windows (powershell) support.

Matchmaker is a searcher like fzf, but its got a lot of qol features, as well as improved column support, regex capture groups, toml declarations, horizontal scrolling, built in documentation and a minimalist philosophy. It's built with ratatui, which means customization is extremely powerful without being overwhelming. Link here: https://github.com/Squirreljetpack/matchmaker

u/squirreljetpack — 4 days ago
▲ 4 r/tui

Trying to pick

Most comfortable with Python so textual/rich

But should I be using Go with bubbletea ect..

Or Rust with ratatui?

Seems like these 2 can make nicer looking and more features rich TUIs?

Whats the best language and packages to make TUIs in and any tutorials to get started would be greatly appreciated.

reddit.com
u/PrintingScotian — 4 days ago
▲ 17 r/tui+2 crossposts

I built sdctl, a security-focused systemd service manager

sdctl

Before I talk about `sdctl`, I want to first address the elephant in the room: why another TUI for managing systemd services?

This tool is not the first of its kind. I have been using systemctl-tui and systemd-manager-tui extensively to the point that I forgot how to use `systemctl` from the command line. However those tools share one major limitation: they require `sudo` for privileged operations. In today’s supply-chain threat landscape, that is a serious risk because a TUI app depends on many components, and any compromised dependency could become a full-privilege attack vector.

This is why I built `sdctl` with a completely different security model: the app itself should never be run with `sudo`, and no action ever asks for blanket root access. When you perform any action that requires escalated privileges, the app opens an embedded `polkit` flow that authenticates only the specific `systemctl` action you are trying to perform, using whatever mechanism is available on the system, such as password, fingerprint reader, or smart card. That keeps the privilege boundary explicit and tied to a single operation instead of the whole process.

requesting authentication to restart a service

On top of that, I've packed a lot of useful features into `sdctl`. These are meant to address actual pain points I've encountered while using similar tools, including a powerful syntax highlighter for viewing journal logs (powered by tailspin), a simple yet useful custom-built syntax highlighter for viewing unit files, a comprehensive filter system with fuzzy search, and a line-based selection mode (inspired by vim's visual mode) that makes copying multiple lines from journal logs much faster.

copying multiple lines of log into the system clipboard (with wl-copy or xclip)

unit file view with a simple built-in syntax highlighter

Here's the github repo: https://github.com/ruiiiijiiiiang/sdctl Feedback and contribution welcome!

reddit.com
u/ruiiiij — 3 days ago
▲ 138 r/tui

A Terminal With Buttons (GUI)

Built a GUI - I’ve been using a lot of TUIs lately though, and I’ve actually enjoyed running them through my app KickUp to organize terminals and commands more easily.

If anyone feels like trying their favorite TUI in it, I’d genuinely love feedback from ninjas who actually live in the terminal every day. 🥷😊

- https://kickup.dev

- winget install kickup

u/Prudent_Condition_40 — 6 days ago
▲ 12 r/tui

Customized my Hermes Agent skin into a retro green terminal vibe

I spent an unreasonable amount of time tuning this Hermes Agent skin 😅

Wanted something that felt like an old-school hacker terminal, but less eye-burning than full neon Matrix green. The mascot is done with inverse Braille/ASCII, so the hair and face show up through negative space.

Still tweaking the proportions and colors, but I’m pretty happy with how this version turned out.

u/Sweet_Dragonfruit_92 — 4 days ago