confy-tui 3.1.1

a config manager for linux/unix based systems
confy-tui-3.1.1 is not a library.

features

  • organize with groups - create folders to organize your configs (hyprland/, nvim/, etc)
  • collapsible groups - expand/collapse groups to keep your view clean
  • search - real-time fuzzy search through all your configs
  • multiple sort modes - sort by name, date modified, or file size
  • open in $EDITOR - edit files with one keypress
  • elevated editing - :su opens the selected file with root via polkit
  • remote profiles - :device <host> mounts and browses another machine's tracked configs over sshfs
  • live preview pane - toggle a side-by-side file preview with p
  • built-in themes - catppuccin, dracula, gruvbox, nord, tokyo-night, one-dark, switch with :theme
  • remembers last file - quick access to recently edited configs
  • built-in file picker - navigate with vim keys, no external dependencies
  • rollback - automatic compressed backups before every edit, restore with :rb
  • custom colors - set colors via config.json, supports hex and named colors
  • vim-style keybinds - j/k navigation, command mode
  • git integration - sync your dotfiles to a git repo with :git, commit and push without leaving confy
  • streamer mode - hide paths and timestamps with :streamer so nothing leaks on stream
  • lightweight and fast - single native binary, zero runtime dependencies

installation

from AUR (arch linux)

yay -S confy-tui

from nixpkgs (unstable)

nix-shell -I nixpkgs=https://github.com/nixos/nixpkgs/archive/nixos-unstable.tar.gz -p confy-tui

confy is in nixpkgs under the name confy-tui.

from cargo

cargo install confy-tui

build from source

git clone https://github.com/phluxjr/confy.git
cd confy
cargo build --release
sudo install -Dm755 target/release/confy /usr/local/bin/confy
# optionally install the man page
sudo install -Dm644 confy.1 /usr/share/man/man1/confy.1

dependencies

none required for core functionality.

two commands need optional system tools:

  • :device (remote profiles) needs sshfs installed
  • :su (elevated editing) needs pkexec (polkit), and for use with :device, user_allow_other set in /etc/fuse.conf on your local machine
  • :git commit / :git push need git installed

confy will tell you clearly if any of these are missing rather than crashing.

usage

just run confy in your terminal.

navigation

  • j/k or arrow keys - move up/down
  • enter - open file in $EDITOR (or toggle group)
  • space - toggle group expand/collapse
  • p - toggle live preview pane
  • / - search mode
  • : - command mode
  • q - quit

commands

file management

  • :ac - add config to ungrouped
  • :ac <group> - add config to specific group
  • :rm - remove selected file from tracking (does not delete the file)
  • :l - open last edited file
  • :rb - rollback selected file to last backup
  • :su - open selected file with root via pkexec (needs polkit)

remote profiles

  • :device <host> or :ssh <host> - mount and browse a remote host's tracked configs over sshfs (accepts an ~/.ssh/config alias or a literal user@host)
  • :device local - switch back to your local configs
  • :device (no args) - show the currently active device, if any

git integration

  • :git sync - copy all tracked configs into your dotfiles repo (organized by group)
  • :git commit - sync + prompt for a commit message
  • :git push - sync + commit + push to remote
  • :git dir - change the dotfiles repo path interactively
  • :git dir <path> - set the dotfiles repo path directly
  • :git reset - reset dotfiles repo path to ~/dotfiles-git
  • :bl - toggle git blacklist on the selected file or group (blacklisted items are skipped by :git sync)
  • :bouncer - open a menu to bulk-manage the git blacklist (space to toggle, Z to confirm)

appearance

  • :theme <name> - switch color theme (catppuccin, dracula, gruvbox, nord, tokyo-night, one-dark)
  • :theme (no args) - list available themes
  • :streamer - toggle streamer mode (hides paths and timestamps)

group management

  • :ag <group> - add new group
  • :mg <group> - move selected file to group
  • :rg <group> - remove group (moves files to ungrouped)

sorting & filtering

  • :sort name - sort alphabetically
  • :sort date - sort by last modified
  • :sort size - sort by file size
  • :reverse - toggle ascending/descending order
  • / then type - search files and groups in real-time

configuration

  • :cd - change config directory (opens built-in file picker)
  • :cd <path> - set config directory directly
  • :cd reset - reset to ~/.config
  • :q - quit

rollback

confy automatically saves a compressed backup of any file to /tmp/<filename>.confbak before you open it for editing. if you make a mess of your config, select the file and run :rb to restore it.

rollback can be disabled in config.json:

"settings": {
  "rollback": false
}

git integration

:git sync copies your tracked configs into ~/dotfiles-git (or wherever git_dir points), organized by group name. files in named groups go into a folder with the group's name. ungrouped files with a shared filename prefix (e.g. hyprland.conf and hyprlock.conf) get auto-sorted into a folder named after that prefix.

:git commit and :git push sync first, then prompt for a commit message in the terminal. :git push requires at least one prior commit to exist. make your initial commit manually.

use :bl on any file or group to exclude it from syncing (useful for .env files or anything sensitive). :bouncer gives you a full menu to manage the blacklist in bulk.

git settings in config.json:

"git_dir": "~/dotfiles-git",
"git_blacklist": ["/home/user/.config/some/secret.env"],
"git_blacklist_groups": ["personal"],
"git_auto_push": false,
"git_auto_commit": false

themes

confy ships with six built-in themes: catppuccin (default), dracula, gruvbox, nord, tokyo-night, and one-dark. switch with:

:theme dracula

applies instantly and persists to config.json, no restart needed. run :theme with no arguments to list all available themes.

streamer mode

:streamer toggles streamer mode, which hides full file paths and timestamps. only filenames are shown. useful if you're on stream and don't want your username or directory structure visible. persists to config.json, or set it directly:

"settings": {
  "streamer_mode": true,
  "streamer_hide_git": true
}

preview pane

press p to toggle a live preview pane alongside your file list. it shows the first lines of the selected file, updating as you move the selection. works correctly on a mounted :device too. your preference persists across restarts.

remote profiles (:device)

:device <host> mounts a remote machine's entire filesystem over sshfs and switches confy's view to that host's tracked configs, letting you browse and edit them exactly like local files.

:device phluxjr           # resolves an alias from ~/.ssh/config
:device phluxjr@exam.ple  # or connect directly
:device local             # switch back to your own configs

requires sshfs installed locally. if the remote host is running an older confy that predates config.json (i.e. still on tracked.json), confy will refuse to connect and ask you to update confy there first.

while on a device, the header shows [remote: <host>] so it's always clear you're not looking at your local files. edits, previews, sorting, and rollback all work through the mount.

elevated editing (:su)

select a file and run :su to open it with root via pkexec. works on local files and on files viewed through a mounted :device.

needs pkexec (polkit) installed. for :su to work while a device is mounted, your local machine also needs user_allow_other uncommented in /etc/fuse.conf. confy will tell you if it's missing.

search mode

press / to enter search mode, then start typing:

  • filters both files and groups in real-time
  • case-insensitive matching
  • enter to confirm, esc to clear and show all files

groups

groups are purely organizational. your actual config files stay in their original locations. ungrouped always appears at the bottom of the list regardless of sort mode.

groups are collapsible, press space or enter on a group header to toggle.

configuration file

confy stores everything in ~/.config/confy/config.json. upgrading from an older version with tracked.json? confy migrates it automatically on first run.

full example config.json:

{
  "groups": {
    "hyprland": ["/home/user/.config/hypr/hyprland.conf"],
    "nvim": ["/home/user/.config/nvim/init.lua"],
    "ungrouped": []
  },
  "settings": {
    "rollback": true,
    "theme": "catppuccin",
    "colors": {
      "bg": "default",
      "fg": "default",
      "highlight": "#cba6f7",
      "group": "#89b4fa"
    },
    "background_enable": false,
    "background_color": "#1e1e2e",
    "streamer_mode": false,
    "streamer_hide_git": true,
    "editor": null,
    "ssh_allow": true
  },
  "git_dir": "/home/user/dotfiles-git",
  "git_blacklist": [],
  "git_blacklist_groups": [],
  "git_auto_push": false,
  "git_auto_commit": false,
  "preview_enabled": false
}

settings reference

key description default
rollback save a backup before every edit true
theme active color theme "catppuccin"
background_enable draw a solid background instead of terminal default false
background_color background color (hex) "#1e1e2e"
streamer_mode hide paths and timestamps in the file list false
streamer_hide_git also hide git-blacklisted files in streamer mode true
editor override $EDITOR (useful for .desktop launchers) null
ssh_allow enable :device / sshfs integration true

why confy?

tired of doing cd ~/.config/whatever a million times a day? same. confy keeps all your important configs in one list so you can jump to them instantly.

organize related configs into groups, search through everything, sort however you want, and open files in your editor with a single keypress. if you break something, roll it back. if you want your dotfiles in git, :git push and you're done.

simple, fast, does one thing well.

examples

# start confy
confy

# create some groups and add configs
:ag hyprland
:ac hyprland

# move a file between groups
:mg shell

# search for configs
/hypr

# sort by recently modified, newest first
:sort date
:reverse

# oops, broke your config
:rb

# switch theme
:theme tokyo-night

# toggle preview pane
p

# check on your server's configs
:device phluxjr
:su
:device local

# sync dotfiles to git
:git push

# going live? hide your paths
:streamer

tips

  • set export EDITOR=nvim in your shell rc, or use the editor setting in config.json
  • use groups to organize by application (hyprland/, nvim/, kitty/)
  • use :sort date to quickly find recently edited configs
  • use :bl on .env files or anything sensitive before running :git sync
  • collapse groups you don't use often to keep the view clean
  • missing files show up in red so you know when a config has moved