Skip to content

KiaraGrouwstra/cfg

Repository files navigation

kiara's nix config

Gitea Last Commit GitHub commit activity Gitea Issues

This is my setup for NixOS.

philosophy

  • reproducible
    • NixOS with flakes to lock versions
    • ephemeral root to stay conscious about unreproduced state
  • ergonomics
    • keyboard-first favoring vim-like keybinds
  • intuitiveness
    • scrollable tiling

screenshots

(credit: wallpaper by Alena Aenami.)

JIT-installed neofetch

neofetch

thefuck plugin for zsh (hit double Esc) filled the JIT-install command for the missing app neofetch. the expanded notification bar SwayNotificationCenter is shown with a notification about a completed rebuild. this menu can be opened using `Super+`` or by right-clicking the 'Windows' button.

file managers

yazi

yazi is a terminal-based file manager with vim-like keybindings. thunar is available as a graphical alternative.

thunar

firefox

firefox

Firefox is used as a web browser, with some basic add-ons.

terminal-based IDE

helix

running ide in the WezTerm terminal opens a terminal-based IDE at that directory, consisting of:

  • Git TUI lazygit, offering a terminal-based way to work with Git repositories, including vim keybindings.
  • helix, featuring language servers for nix (thru nixd) and others
  • a shell, using Zsh and decorated using powerline-go

lazygit

As a back-up, the graphical VSCodium is provided (with some plugins).

application menu

anyrun

Application menu anyrun can be opened using Super+Space or by left-clicking the 'Windows' button.

JIT application menu

jit menu

A menu to JIT-install and run applications can be opened using Super+Shift+Space.

audio volume

volume control

Right-clicking the volume icon in the bar opens Pulse Audio Volume Control.

wifi

nmtui

Pressing Super+i or right-clicking the wifi icon opens the Network Manager TUI.

show dependency age

just age

command just age showing the age of any dependencies included in flake.lock

emoji picker

emoji picker

pressing the Microsoft keyboard's emoji key](https://support.microsoft.com/en-us/topic/use-microsoft-ergonomic-keyboard-c917dad0-3797-d97b-efb3-fbe27ac9703c#ID0EDFBBDDD) (Super-Ctrl-Alt-Shift-Space) triggers an emoji picker using fuzzy picker fzf.

symbol picker

anyrun symbols

keybind Super+B lets the user pick symbols using anyrun's symbols plugin

btop

btop

right-clicking the CPU or RAM bar indicators opens the resource-monitor btop

file picker

file picker

pressing CTRL-T in the shell opens fzf's file picker, copying the selected file or directory path to the clipboard.

ctrl-alt-delete

gnome monitor

ctrl+alt+delete triggers Gnome System Monitor

zfxtop

zfxtop

Pressing Ctrl-Shift-Escape or left-clicking the CPU icon opens monitoring tool zfxtop.

devices

This configuration was made with the following devices in mind:

Name Use Model Config
hammer home laptop Lenovo IdeaPad Slim 5 16ABR8 nixosConfigurations
krost old work laptop Dell Latitude 5430 Google Chromebook homeConfigurations
orca work laptop Dell XPS 13 9340 homeConfigurations

usage

prerequisites

installation

clean install from NixOS USB
cd Downloads
git clone https://codeberg.org/kiara/cfg.git
cd cfg
sudo nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode disko -f .#hammer
dest=/mnt/persist/home/kiara/.config/sops/age/
sudo mkdir -p $dest
sudo cp -r ./. $dest
sudo cp ~/Downloads/keys.txt $dest  # import/create
sudo nixos-install --no-root-passwd --flake .#default --no-root-passwd
sudo nixos-enter --root /mnt
cp /etc/{machine-id,group,passwd,shadow} /persist/etc
install from existing NixOS system
$ nix --experimental-features "nix-command flakes" run nixpkgs#just -- switch

commands

$ just -l
Available recipes:
    age                   # Check when inputs were last updated
    boot                  # Build a new configuration
    clean                 # Remove all generations older than 7 days
    decode                # Decode secrets
    default               # default action: list actions
    dry                   # Dry-build a new configuration
    encode                # Encode secrets
    ephemeral dir="$HOME" # Show what has yet to be persisted in a folder. Usage: just ephemeral $PWD | $PAGER
    fmt                   # Format code
    gc                    # Garbage collect all unused nix store entries
    home                  # Rebuild the home config
    repl                  # Open a Nix REPL - run manually to load flake: `:lf .`
    switch                # Rebuild the system
    test                  # Run tests
    up                    # Update all inputs
    upp input             # Update specific input. Usage: just upp nixpkgs

... or if just isn't available yet:

nix run nixpkgs#just -- -l

impermanence

to ensure you can persist useful state on an ephemeral system, you can find say:

  • newly created (5 mins) files: find ~ -cmin -5
  • files now on root: tree -x /
  • diffs from last backup: rsync --dry-run

features

fixes for flake

  • the flake.locked nixpkgs is used for:
    • nix commands
    • 'command not found' errors
  • nix flake show is fixed using Flake Schemas
  • $SHELL is retained in nix shell

used software

Component Software
Nix interpreter Lix
DM TUIgreet
Compositor Niri1
Bar Waybar
Notifications Swaynotificationcenter
Menu Anyrun
Web browser Firefox
File browser Yazi
Terminal Wezterm
Text editor VSCodium
Editor (shell) Helix
Shell Zsh
Fuzzy finder Fzf
Pager Nvimpager
Text-to-speech Piper thru LocalAI

style

package types

command drop-ins

command drop-in improvements
cd n/a (can skip it in Zsh)
cd z remembers visited locations
cd cd (enhancd) interactive directory picker using cd, cd . or cd ..
ls eza (aliased to ls) friendlier output and interface
cat bat syntax highlighting
less less (lesspipe) syntax highlighting
find fd faster, friendlier interface, respects .gitignore
grep rg friendlier interface
make just show comments, friendlier file format
ssh xxh use your favorite shell

keybinds

Used keyboard layouts, with Caps Lock remapped to Esc:

  • workman-programmer, with application keymaps modified to keep arrow actions h/j/k/l (+ actions 'y'/'n') in their ergonomic qwerty positions (at the cost of moving actions e/o to keys h/l)
  • en-us (qwerty)

Application keybinds, tweaked to layout by setting config.keyboard.active:

bottom bar

module left-click right-click scroll
start button open anyrun application launcher toggle swaync notifications -
media player toggle play/pause skip ahead previous/next
clock - toggle month/year in calendar pop-up previous/next in calendar pop-up
volume toggle mute Pulse Audio Volume Control change volume
memory manage processes with Gnome System Monitor manage processes with btop -
CPU open monitoring tool zfxtop manage processes with btop -
battery run battery viewer powersupply - -
storage garbage-collect nix show big files/folders using dust -
network manage network by networkmanager_dmenu manage network by nmtui -
systray (application-specific) open application context menu -

what goes where

what where
system configuration ./hosts/
home-manager configuration ./home-manager/
binaries and command wrappers ./home-manager/kiara/commands.nix
reusable modules ./modules/
custom functions ./lib/
custom packages ./pkgs/*.nix (from flake inputs: ./pkgs/default.nix)
overlays ./overlays/*.nix (from flake inputs: ./flake.nix)
LSP (vscodium / coc.nvim) ./home-manager/kiara/features/development/
shell scripts ./home-manager/kiara/scripts/*.sh
dotfiles ./home-manager/kiara/dotfiles/ + ./home-manager/kiara/dotfiles.nix
custom desktop entries ./home-manager/kiara/desktop.nix
MIME types ./home-manager/kiara/mime.nix
file templates ./home-manager/kiara/dotfiles/Templates/
keybinds ./home-manager/kiara/niri.nix
persisted state ./hosts/hammer/persistence.nix

Footnotes

  1. While Niri uses Wayland, X11 applications can be emulated thru xwayland-run.