It also occurred to me that there's a real value to tuis vs guis which is that since they're simpler to build with the same developer effort you can build more tools. I remember the dwarf fortress guys saying this in their interview, that they had at some point a similar game to DF but in 3d, but at some point they realized that by not wasting effort building the graphics part of the game they saved time to focus on what mattered.
If I have one tiny criticism about bluetui is the annoying fonts. I understand what they're trying to do: with more glyphs you can increase the density of information. But the thing is it's not really necessary in this case. Like someone else commented, there's plenty of white space. I know to some people it feels like eye candy, but to me the emojis sprinkled in the text are an eye sore.
https://github.com/Zaloog/blueutil-tui
Its written in python using the textual framework and displays the connections inline in your Terminal.
Is there a non-interactive CLI as well?
I currently use `bluetoothctl` with a wrapper script and `expect` so that I can quickly fire off `bluetooth.sh <device name substring>`, and it does the tedium of ensuring that the connection is established regardless of my audio settings. I do still use `bluetoothctl` for manually scanning and pairing, but once a device is paired, I don't run it directly. So it would be great if I could solve both things with the same tool.
I would only really need an interactive TUI for scanning and pairing. Maybe not even for that. E.g. if I run `bt pair <some device name>` then the tool could scan available devices and try to pair with one that fuzzily matches the provided name. And `scan` could work in a similar way. E.g. `bt scan --duration 10s` could show found devices within a specific time.
I'm not a big fan of interactive UIs if the same can be accomplished non-interactively. This allows the tool to be scripted, and can be much quicker to do what you want.
Does such a tool exist for Bluetooth? I'm tempted to whip something up myself, though I really have enough side projects as it is...
The same happens when connecting or disconnecting from VPN using the nm applet. This is a simple but extremely useful way of separating two states.
> It made me really happy how a tool so simple makes such a huge difference in terms of how smooth it is to solve a problem,
Happy to hear that :)
> if I have one tiny criticism about bluetui is the annoying fonts
You suggest to get rid of the icons ? what if they can be disabled in the config, will that fix the issue for you ?
> there's plenty of white space You can set the window width from the config file (width = positive integer) if you don't want the TUI to be responsive.
I refuse to be old man who yells at clouds, but I think just like the new gen can't help what comes, neither can I. I just feel so old sometimes because most of the "new ideas" aren't really at all; they just have a different language to describe the same thing.
1. sudo apt install cargo on latest ubuntu and on attempt to "cargo install bluetui" it will say something about edition 2024 error. Because ubuntu is installing rust from 2023 and nobody bothered to update it?
2. Installing from https://rust-lang.org/tools/install/ will install rust only after removing existing version from 2023 (Why you won't just rewrite it?). Now I don't have cargo at all.
3. On attempt to use rustup it will tell me that path was not found. I need separate installation?
I am sorry but WTF is this garbage? Seems like whole rust ecosystem is broken...
There's a good ratio between the time it takes to implement a TUI and its usefulness.
Writing a GUI with equivalent functionality would typically be a lot more work, with no gains at all. Er, except maybe touchscreen and touch-gesture support, none of which would add any value for this kind of tool.
I want a GUI when I don't have a keyboard, typically on my mobile phone.
[1]: https://en.wikipedia.org/wiki/Text-based_user_interface
It displays inline and supports j/k navigation. Also wrote a short post about its creation [1].
I'm not a professional programmer, I just want to have more control over my computer. C seems like a full time job to learn and not shoot yourself in the foot.
I'm proficient with Python and Julia, but I avoid Python as much as possible.
> The learning curve is way softer than Rust's
Ok, it might be easier, but then I'll have learned Go and not Rust :-)
It is written in Go as well.
I truly like this new generation of command line utils (I have bat, eza, etc aliased to things like cat and ls) and TUIs like yours. TUIs in particular: having grown up with DOS apps, then graduating to using Pine for email on a shell account, they are nostalgic, but also just super fast and practical. And I like having an option in between the command line and config files and a full-blown GUI app (which, on Linux, might look like any old random thing anyway).
I disagree. Have you used something like tkinter? It's ridiculously easy to build GUIs. The trouble is if you build a GUI that way it will look kinda beige/crap whereas a TUI looks retro (but looks even worse to non-nerds).
Emoji in text is annoying, but this isn't a page of text, it's a UI element, and that can make something clear especially if you're connecting a device whose name is unknown, but you know it's a speaker, or whatever.
So having the option to enable / disable is better than taking away the icons, in my opinion.
Yes.
In general, its a good idea to not rely on someone having installed nerdfonts / fonts with glyphs. Or at the very least offer fallback.
You can usually get pretty far by repurposing Unicode symbols.
For example, from Bamum:
𖦤 Headphone
𖦥 IEM
𖤣 Mic
ꚰ Warning
𖥉 Bluetooth (had to get a little creative)I mean if you're offering, I would love that.
And thank you for releasing under GPL. <3
Thanks, glad you like it. And yes Big kudos to Orhun !
Have you tried mise[1]? The last thing you probably want is to add another abstraction on top of this mess, but I've had good experiences with it, and it manages Rust, Go, Python, etc. environments very well.
IME getting any modern toolchain setup on different distros can be problematic, especially if you mix in the often outdated distro packages. So using isolated environments with a tool specifically built for that works better.
$ ./bluetui-x86_64-linux-gnu
Error: Error { kind: Internal(DBus("org.freedesktop.DBus.Error.TimedOut")), message: "Failed to activate service 'org.bluez': timed out (service_start_timeout=25000ms)" }
I have Bluez installed. Comes with Debian KDE by default I guess, because didn't install it myself.Apt packages are managed by the OS so its normal they don't get overwritten by tools you download of the internet directly as that could break other apps installed with apt. As a general rule, don't use coding tools from apt as they are normally out of date, install them from other sources
There are linter which helps prevent most of if not all crashes (just keep in mind to run linting and compile the binary it would still be ages faster than anything rust I have ever compiled). His argument is weak, and not simple.
I'll give that type system in golang is too simplistic sometimes, and a more complex could help to express better some use cases.
Still go for a person coming from a interpreted language is a solid choice by being MUCH MUCH simpler.
I would, however, have expected it to shadow the OS version. That is, I would expect any installer running as your user to install eg. ~/.local/bin/rustc and ignore /usr/bin/rustc (and maybe print a message about making sure that ~/.local/bin takes precedence in your PATH).
wifi => iwd => impala, iwctl, iwgtk blueooth => bluetoothd => bluetoothctl, bluetui ... vpn => coming soon ;)
> 3 years working with I might have had at most 3 times nil pointer crashes in prod
I've been running a rust app for my personal trading app and a small service at a very large FAANG company for more than 3 years, and guess what I'm yet to see a nil crash.
You don't need network manager for bluetooth. just install bluetoothd and there you go and use bluetui or bluetoothctl for wifi, I recommend iwd, and then you can use impala, or iwctl pick up the right tool for right purpose
I've used "nmtui" on Linux for many years to do this. "nm" = "Network Manager".
A Linux based OS with bluez installed.
[!NOTE] You might need to install nerdfonts for the icons to be displayed correctly.
You can download the pre-built binaries from the release page release page
You can install bluetui from crates.io
cargo install bluetui
You can install bluetui from the extra repository:
pacman -S bluetui
You can install bluetui from the lamdness Gentoo Overlay:
sudo eselect repository enable lamdness
sudo emaint -r lamdness sync
sudo emerge -av net-wireless/bluetui
If you are a user of x-cmd, you can run:
x install bluetui
Run the following command:
git clone https://github.com/pythops/bluetui
cd bluetui
cargo build --release
This will produce an executable file at target/release/bluetui that you can copy to a directory in your $PATH.
Tab or l: Scroll down between different sections.
shift+Tab or h: Scroll up between different sections.
j or Down : Scroll down.
k or Up: Scroll up.
s: Start/Stop scanning.
ctrl+c or q: Quit the app.
p: Enable/Disable the pairing.
o: Power on/off the adapter.
d: Enable/Disable the discovery.
u: Unpair the device.
Space or Enter: Connect/Disconnect the device.
t: Trust/Untrust the device.
e: Rename the device.
Space or Enter: Pair the device.
Keybindings can be customized in the default config file location $HOME/.config/bluetui/config.toml or from a custom path with -c
# Possible values: "Legacy", "Start", "End", "Center", "SpaceAround", "SpaceBetween"
layout = "SpaceAround"
# Window width
# Possible values: "auto" or a positive integer
width = "auto"
toggle_scanning = "s"
[adapter]
toggle_pairing = "p"
toggle_power = "o"
toggle_discovery = "d"
[paired_device]
unpair = "u"
toggle_trust = "t"
rename = "e"
If you like bluetui and you are looking for a TUI to manage WiFi, checkout out impala
GPLv3
Bluetui logo: Marco Bulgarelli
This bears emphasis; I sometimes use tools that try to use fancy fonts for icons, and it just gives me unreadable symbols because I don't have the font installed. And you might reasonably say, "just install the font package", but that only works if the font is packaged for my system, and I know what package it's in.
So there’s another issues with GUIs, they might be fine on Xorg and have issues on Wayland (or viceversa). TUIs all work as long as your terminal emulator works.
Rust is not always the answer just because it has "no nil exception". The correctness of Rust comes at a cost as well.
The bluetui author also has impala, which is a tui for the network manager. But in this case, nmtui is good enough.
While the issue here is Win10, it shows that the problem is client font sensitive so it might affect others too (perhaps those running old-but-still-supported Linux distro releases with default fonts).
I remember some hipster fauxretro player with just some playlist made of m3u links, written in Go. The visualization animations made it unusable under my n270 CPU based netbook. Meanwhile, the playlist URL's from the code played perfectly well under mocp with a really low CPU usage. Oh, you want bells and whistles? I think the Cava terminal visualizer can work with MPD and plug any CLI/TUI client you like.
You can set a window with in the config file (with = positive integer) and TUI will be displayed with this width even in a large screen.
https://github.com/pythops/bluetui?tab=readme-ov-file#custom...
This is pretty funny to me, because on plain ol' Firefox on NixOS everything looks just fine!
We've come pretty far from the days when things were randomly broken on Linux..
And colors should be semantic. If you don’t have any theming ability, just use reverse video to indicate selected state.
My current pet peeve is cli tools using ansi codes for progress bar. And with very poor detection of terminals.
[edit] Okey, so installing the complete Google Noto Fonts family resolved this issue. But I still don't know if relying on a script with almost no font support is any better than what the OP did.
But seriously, it's a very nice distro - everything works and setup is a bliss. The themes are nice (for someone who uses black and white for quite literally everything), everything following consistent theming - sure there's some headscratchers like Google Photos, etc, but the no frills installer (default btrfs with mount arguments I'd use coming out of the box). This is also coming from a debian fanboy. I really like the general consistency of keybinds as well and things just make sense it really feels like you can just load it up and get some work done it actually made me use my laptop more instead of never and made me take a genuine attempt at using neovim instead of trying for an hour and just going back to bugbrains lagfest 2026.
--
on a side note, catchyos hyprland is something else alright, you should maybe rant about that instead or hyprland in general.
what is arch anyway? just a kernel repository and a package manager?
I didn't know anything about DHH before omarchy I just saw a youtube video about some guy trying it out and had a go on my laptop that I never used before and I like it, it fits the way I want to interact with my laptop as a baseline one of the first things I did is remove all the frills (screenlocker being the first ones to go) and I found it really easy in general to de-dhh whatever I didn't like about the distro/installscript/flavor/whateveryouwanttocallit and remove pulling updates from the omarchy repository and use my own gitea fork instead to possibly use on future installations or reformats.
On the servers I am running a debootstrap installed ubuntu (better hw support) that come in at less than 1gb size, but for a desktop that has 1.7tb of project files I could care less about a bloated desktop image.