A minimal NetworkManager TUI for Linux with complete 802.1X enterprise WiFi support.

A minimal, keyboard-driven TUI for NetworkManager with full 802.1X enterprise WiFi support. Perfect for connecting to eduroam, corporate networks, and regular WiFi from the terminal.
yay -S gazelle-tui
# or
paru -S gazelle-tui
$ # If you don't have GURU enabled already, you need to add it to your system.
$ sudo eselect repository enable guru
$ sudo emerge --ask net-misc/gazelle-tui::guru
Then just run:
gazelle
If you get "target not found" errors for python-textual, python-rich, or python-platformdirs, your mirrors may be behind on Python packages. Use this safe workaround:
# Add official Arch mirrors (temporary)
sudo sed -i '1iServer = https://geo.mirror.pkgbuild.com/$repo/os/$arch' /etc/pacman.d/mirrorlist
sudo pacman -Syy
# Now install gazelle
yay -S gazelle-tui
Why this is safe:
sudo sed -i '/geo.mirror.pkgbuild.com/d' /etc/pacman.d/mirrorlistAdd the Gazelle flake to your user flake:
inputs.gazelle.url = "github:Zeus-Deus/gazelle-tui";
Then enable it in your homeConfigurations:
modules = [
gazelle.homeModules.gazelle
];
Don't forget to add the package as well:
home.packages = [
inputs.gazelle.packages.${pkgs.system}.default
];
You can use Home Manager to declaratively configure Gazelle:
programs.gazelle = {
enable = true;
settings = {
theme = "nord"; # choose your theme
};
Home Manager will automatically generate:
~/.config/gazelle/config.json
with your chosen settings.
Apply the configuration:
home-manager switch
or rebuild your flake
nixos-rebuild switch --flake .#myFlake
Build and run with Nix:
nix build github:Zeus-Deus/gazelle-tui
./result/bin/gazelle
Or run directly with nix run:
nix run github:Zeus-Deus/gazelle-tui
For contributing or testing the latest version:
git clone https://github.com/Zeus-Deus/gazelle-tui.git
cd gazelle-tui
pip install -r requirements.txt
chmod +x gazelle
./gazelle
To integrate Gazelle as your WiFi TUI in Omarchy (replacing Impala):
# Temporarily add Arch mirrors (Omarchy mirror sync issue)
sudo sed -i '1iServer = https://geo.mirror.pkgbuild.com/$repo/os/$arch' /etc/pacman.d/mirrorlist
sudo pacman -Syy
# Install from AUR
yay -S gazelle-tui
Important: Omarchy changed how terminals are launched in November 2025 (version ~3.1.5+), and again in February 2026 (version 3.2.0+) with the switch to Ghostty. Choose the configuration that matches your Omarchy version:
For older Omarchy versions that launch terminals directly (like Alacritty/Kitty):
Configure Hyprland Window Rules:
Create a window rules configuration file:
cat > ~/.config/hypr/windows.conf << 'EOF'
# Gazelle WiFi TUI - floating window
# Old Hyprland Syntax
windowrule = tag +floating-window, match:class Gazelle
EOF
Add the source line to your Hyprland config:
echo "source = ~/.config/hypr/windows.conf" >> ~/.config/hypr/hyprland.conf
Update Waybar Network Module:
Edit ~/.config/waybar/config.jsonc and change the network module's on-click:
"network": {
...
"on-click": "$TERMINAL --class=Gazelle -e gazelle"
}
For newer Omarchy versions that use xdg-terminal-exec as a universal terminal launcher (including the default Ghostty terminal):
Configure Hyprland Window Rules:
Create a window rules configuration file:
cat > ~/.config/hypr/windows.conf << 'EOF'
# Gazelle WiFi TUI - floating window
# New Hyprland Syntax using match:initial_class (xdg-terminal-exec and Ghostty friendly)
windowrule = float on, center on, size 800 600, match:initial_class org.omarchy.Gazelle
EOF
Add the source line to your Hyprland config (if not already present):
echo "source = ~/.config/hypr/windows.conf" >> ~/.config/hypr/hyprland.conf
Update Waybar Network Module:
Edit ~/.config/waybar/config.jsonc and change the network module's on-click:
"network": {
...
"on-click": "xdg-terminal-exec --app-id=org.omarchy.Gazelle -e gazelle"
}
Why the change?
xdg-terminal-exec as a universal terminal launcher.xdg-terminal-exec passes --app-id down to the default terminal. org.omarchy.Gazelle). Passing a simple string like Gazelle will be rejected by GTK, causing the window rule to fail!windowrule with match:initial_class is required for proper window matching.# Reload Hyprland configuration
hyprctl reload
# Restart Waybar
killall waybar && waybar &
Now clicking the WiFi icon in Waybar will launch Gazelle as a centered, floating 800x600 window on top of all other windows - exactly like Impala worked.
Old Style: The floating-window tag automatically applies these rules (defined in Omarchy's system config):
float - Window floats instead of tilingcenter - Centered on screensize 800 600 - Fixed size matching other Omarchy TUIsNew Style: The windowrule rules explicitly define:
float - Window floats instead of tilingcenter - Centered on screensize 800 600 - Fixed size matching other Omarchy TUIsIf you want to go back to nm-applet, change the waybar network on-click to:
"on-click": "nm-applet --indicator"
Gazelle supports all common enterprise authentication methods:
EAP Methods:
Phase 2 Authentication:
When connecting to an 802.1X network, simply select your authentication method from the dropdowns.
j/k or ↓/↑ - Move cursorTab - Switch between Known/New Networks sectionsSpace - Connect to selected networks - Scan for networksh - Connect to hidden networkv - VPN connectionsw - WWAN/Cellular connectionsd - DisconnectCtrl+R - Toggle WiFi on/offCtrl+P - Command palette (themes, etc.)? - Show helpq - QuitGazelle automatically detects and matches your Omarchy theme colors!
How it works:
~/.config/omarchy/current/theme/alacritty.toml (or ghostty.conf) and uses your exact theme colorsSupported:
If Omarchy is not detected, Gazelle uses standard ANSI terminal colors that work with any color scheme.
To use a specific theme regardless of Omarchy:
Ctrl+P (command palette)Note: Manual theme selection is saved and persists across restarts.
Gazelle supports all built-in Textual themes with automatic persistence.
Changing Theme:
Ctrl+P to open the command palette~/.config/gazelle/config.jsonAvailable Themes:
Config File Location: ~/.config/gazelle/config.json
Create your own color schemes by editing ~/.config/gazelle/theme.toml. The file is automatically generated with commented examples on first run.
Omarchy Users: As long as you leave the theme.toml file commented out (default), your automatic theme syncing will continue working. Defining colors in this file will override the Omarchy theme.
Your custom theme appears as "user-theme" in the theme picker (Ctrl+P).
Customize borders, spacing, and other TUI elements by adding a [styles] section to ~/.config/gazelle/theme.toml:
[styles]
dialog_border = "round"
section_border = "round"
Omarchy Users: Border styles are automatically matched to your Hyprland rounding and border size settings. No configuration needed.
Available border styles: none, ascii, blank, dashed, double, heavy, round, solid, thick, wide
All style options:
| Option | Default | Description |
|---|---|---|
dialog_border |
solid |
Modal dialog border style |
section_border |
solid |
Section container border style |
dialog_width |
60 |
Modal dialog width |
dialog_padding |
1 2 |
Modal dialog padding |
section_margin |
1 2 |
Section margin |
section_padding |
0 1 |
Section padding |
info_section_height |
5 |
Device/Station section height |
cursor_opacity |
30% |
Selection highlight opacity |
hover_opacity |
20% |
Hover highlight opacity |
user@university.edu)The connection is saved and will auto-reconnect when in range.
Many corporate/enterprise networks hide their SSID for security.
h (Hidden)Gazelle automatically detects and connects to OWE networks (shown as "owe" in Security column). These are encrypted open networks that provide better security than traditional open WiFi. NetworkManager handles the encryption automatically - just connect like any open network.
Gazelle now supports managing VPN connections directly from the TUI!
Phase 1 Features (v1.5+):
v to open VPN screenPhase 1 requires pre-configured VPN connections. Here's how to set them up:
1. Import VPN Config
sudo nmcli connection import type openvpn file your-vpn.ovpn
2. Store Credentials (optional - prevents password prompts)
sudo nmcli connection modify <vpn-name> \
vpn.user-name "YOUR_USERNAME" \
vpn.secrets "password=YOUR_PASSWORD" \
+vpn.data "password-flags=0"
For NordVPN users: Get service credentials from nordaccount.com/manual-configuration (not your regular login)
3. Use Gazelle
v to open VPN screenEnter or Space to connect/disconnectj/k to navigate, r to refresh1. Import WireGuard Configuration
The .conf file must have a valid interface name (e.g., wg0.conf):
sudo nmcli connection import type wireguard file /path/to/wg0.conf
2. Disable Auto-Connect (optional)
By default, WireGuard connections auto-connect at boot. To disable:
nmcli connection modify wg0 autoconnect no
3. Manual Connection Control
Connect:
nmcli connection up wg0
Disconnect:
nmcli connection down wg0
4. Use Gazelle
Once imported, your WireGuard connection appears in Gazelle's VPN screen:
v to open VPN screenEnter or Space to connect/disconnectPhase 2 Coming: Import .ovpn files directly from Gazelle, edit connections, and more advanced features. See [Issue #3](https://github.com/Zeus-Deu
$ claude mcp add gazelle-tui \
-- python -m otcore.mcp_server <graph>