Personal configuration for Linux (Ubuntu/Debian). Three tiers: server (any box), desktop (Kubuntu), and workstation (this specific machine).
Do a minimal install of Kubuntu, then enable passwordless sudo:
sudo bash -c 'echo "brokenlander ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/brokenlander && chmod 440 /etc/sudoers.d/brokenlander'git clone https://github.com/brokenlander/dotfiles.git ~/dotfiles
cd ~/dotfiles
./scripts/install-dependencies.sh
# restart shell
./scripts/install.shThis installs and configures everything portable: CLI tools, ZSH, Neovim, Tmux, Docker, Git, Starship, Kitty, Kate, KDE settings, fonts, Zen Browser, Vesktop, OnlyOffice, Spotify, Steam, Krohnkite, and more. Desktop packages are auto-skipped on headless servers.
./scripts/workstation.shHardware-specific setup for the primary rig:
- NVIDIA driver 590 (RTX 5090) + Secure Boot MOK enrollment
- Display: 1440p @ 120Hz, 1.5x scale
- Disable sleep/suspend (always-on)
- OpenLinkHub (Corsair iCUE alternative)
- Keymapp + udev rules (ZSA Voyager keyboard)
- Elgato Wave 3 WirePlumber fix (mic silence bug)
- CUDA toolkit 13.1
Voice services (ASR/TTS) are managed separately — see ~/forge/voice/README.md.
# GitHub CLI
gh auth login
# OneDrive — interactive login (browser), then configure + first sync (see notes below)
onedrive # authorise in browser, paste redirect URI back
onedrive --sync --resync
# Timeshift — first snapshot
sudo timeshift-gtkThe abraunegg client crawls the entire remote tree before downloading, so a
huge folder you don't want (e.g. a multi-hundred-GB photo archive) makes the
first sync appear to hang. Two lessons:
-
skip_dirbeatssync_listfor excluding big folders.sync_liststill crawls everything and filters;skip_dirnever even looks inside. In~/.config/onedrive/config(config is per-machine, never committed — it holds personal paths, andrefresh_tokennext to it is a secret):sync_dir = "~/OneDrive" skip_dir = "BigArchive|SomeFolder/BigSubdir" # example namesChanging
skip_dir/sync_listrequiresonedrive --sync --resync. -
Grab one folder fast without crawling siblings:
onedrive --single-directory 'Folder/Subfolder' --sync -
Automatic background sync — enable the bundled user service (and linger so it runs while logged out):
systemctl --user enable --now onedrive sudo loginctl enable-linger "$USER"
- Panel height — right-click panel > Edit Mode > drag top edge to ~36px
- Krohnkite — System Settings > Window Management > KWin Scripts > Krohnkite gear icon (gaps, float rules, layouts). Reboot after.
- OBS Studio — first launch wizard: optimize for recording, 2560x1440 base, 1920x1080 output, Lanczos, 30fps, NVENC, Screen Capture (PipeWire)
| Category | Tools |
|---|---|
| Shell | ZSH + Starship prompt |
| Editor | Neovim (30+ plugins, LSP, Mason, Treesitter) |
| Multiplexer | Tmux (Tokyo Night, session persistence) |
| Git | Delta pager, GitHub CLI integration, aliases |
| CLI tools | bat, eza, fd, ripgrep, zoxide, delta, dust, btop, tldr, duf, difftastic |
| Dev tools | lazygit, lazydocker, fzf, direnv, gh CLI |
| Runtimes | fnm (Node.js), uv (Python), micromamba (conda), pipx |
| Containers | Docker, Docker Compose |
| Tool | Purpose |
|---|---|
| Kitty | GPU-accelerated terminal (Tokyo Night) |
| Kate | Text editor (Tokyo Night theme) |
| KDE | Breeze Dark, Papirus-Dark icons, Bibata-Modern-Ice cursor |
| Krohnkite | Dynamic tiling for KWin |
| JetBrains Mono Nerd Font | Terminal/editor font |
| OnlyOffice | Office suite |
| Vesktop | Discord client (Vencord) |
| Haruna | Video player |
| KeePassXC | Password manager |
| Spotify | Music |
| Component | What |
|---|---|
| GPU | NVIDIA RTX 5090 (driver 590-open, CUDA 13.1) |
| Mic | Elgato Wave 3 (WirePlumber always-process fix) |
| Camera | Logitech UVC webcam (cameractrls GUI for settings) |
| Keyboard | ZSA Voyager (Keymapp + udev rules) |
| Cooling | Corsair (OpenLinkHub) |
| Gaming | Steam, MangoHud, Gamemode, ProtonUp-Qt |
dotfiles/
├── nvim/ # Neovim (Lazy.nvim, LSP, plugins)
├── zsh/ # Shell aliases, keybindings, integrations
├── tmux/ # Tmux config + Tokyo Night theme
├── git/ # .gitconfig + .gitignore_global
├── git-hooks/ # Global git hooks (block AI references in commits)
├── kitty/ # Kitty terminal config
├── kate/ # Kate editor theme
├── starship/ # Starship prompt config
├── btop/ # System monitor config + theme
├── cava/ # Audio visualizer config
├── fastfetch/ # System info display config
├── mangohud/ # Game overlay config
└── scripts/
├── install-dependencies.sh # Server + Desktop packages
├── install.sh # Symlinks + configs
├── workstation.sh # Hardware-specific setup
├── sync-zen-settings.sh # Zen Browser Windows sync
└── uninstall.sh # Restore original configs
- Leader: Space
gddefinition,gRreferences,<leader>cacode action,<leader>rnrenameTab/Shift+Tabswitch buffers<leader>eefile explorer,<leader>fffind files
- Prefix: Ctrl+B
|/-split panesAlt+h/j/k/lswitch panes (no prefix)Prefix+Ctrl+ssave session,Prefix+Ctrl+rrestore
Ctrl+Rfuzzy history (fzf)Ctrl+Tfuzzy file searchAlt+Cfuzzy cd
./scripts/uninstall.shRestores original configs from backup.