Files with dots in them.
  • Shell 69.1%
  • Python 24.7%
  • Lua 5.3%
  • Liquid 0.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-11 17:13:28 +02:00
agents feat(agents): promote auto-memory rules 2026-10-11 17:10:15 +02:00
claude feat(agents): promote auto-memory rules 2026-10-11 17:10:15 +02:00
leftwm Remove double window title 2021-06-01 20:28:05 +02:00
nvim chore(nvim): update lazy lockfile from fresh plugin sync 2026-10-10 16:42:13 +02:00
pi chore(pi): drop nopus, read pages with kagi_extract 2026-10-11 16:45:48 +02:00
qtile fix(qtile): read OpenWeather key from OWM_API_KEY 2026-09-02 13:08:43 +02:00
superconductor fix(superconductor): use $HOME in the setup hook path 2026-10-10 16:23:29 +02:00
.alacritty.yml Add Rancher Desktop binaries back to PATH, Alacritty nitpicking 2023-06-17 11:03:44 +02:00
.gitconfig fix(git): use tilde for the global excludesfile 2026-10-10 16:23:28 +02:00
.gitconfig-github Add README, setup script, gitconfigs, add zstyle autocompletion 🙏 2025-08-10 20:08:03 +02:00
.gitignore feat(neovim): add lean infrastructure IDE 2026-09-03 15:39:04 +02:00
.gitignore_global chore(git): ignore bytecode, local Claude settings, .sem cache 2026-09-02 13:08:45 +02:00
.p10k.zsh Fix p10k config 2024-01-29 15:29:50 +01:00
.wezterm.lua chore(wezterm): body font to 13, Linux title bar to 12 2026-10-10 17:25:05 +02:00
.zshrc feat(shell): add aliases, env tweaks, and guard shell inits 2026-04-22 11:12:51 +02:00
config.fish fix(fish): put Homebrew on PATH ourselves 2026-10-10 17:21:42 +02:00
fish_plugins chore(pi): track fisher plugin and sync settings 2026-10-10 16:23:30 +02:00
git.plugin.zsh omz-like git plugin, Starship reorg 2025-08-08 15:36:30 +02:00
README.md feat(agents): share one AGENTS.md across Claude and Pi 2026-10-11 16:43:56 +02:00
setup.sh feat(agents): share one AGENTS.md across Claude and Pi 2026-10-11 16:43:56 +02:00
starship.toml fix(starship): restore the git status background 2026-09-03 20:35:07 +02:00
zed.json feat(theme): follow system appearance 2026-09-03 18:57:27 +02:00

🏠 Dotfiles

Personal dotfiles for macOS and Linux (Bazzite, Manjaro/Arch).

What's included

  • Shell: Fish (default) and Zsh (shortcuts, completions, vi keybindings)
  • Terminal: WezTerm
  • Editor: Zed (install from zed.dev or the App Store), Neovim
  • Prompt: Starship
  • Git: Cross-platform configuration with SSH signing
  • AI: Claude Code (settings, statusline, output styles), Pi coding agent (settings, global instructions, packages), and harness-agnostic skills shared by both
  • Extras: Alacritty, window managers (LeftWM, Qtile — linked on Arch-family only)

Dependencies

macOS

brew install fish starship git fzf eza diff-so-fancy fd kubectx fisher neovim ripgrep zoxide mise
brew install lua-language-server ruff stylua terraform-ls tree-sitter-cli ty
brew install --cask wezterm font-0xproto-nerd-font
brew install pi-coding-agent  # Pi coding agent
# Zsh-only (optional)
brew install zsh-autosuggestions zsh-syntax-highlighting

Manjaro/Arch

sudo pacman -S fish starship git fzf eza diff-so-fancy fd kubectx neovim ripgrep zoxide
sudo pacman -S lua-language-server ruff stylua tflint tree-sitter-cli  # Neovim tooling
mise use -g terraform-ls ty                                            # not packaged for Arch
# Zsh-only (optional)
sudo pacman -S zsh-autosuggestions zsh-syntax-highlighting zsh-history-substring-search
yay -S wezterm-git
yay -S fisher   # if not available via pacman
yay -S ttf-0xproto-nerd
yay -S mise

Bazzite

Bazzite's immutable base doesn't use pacman; Homebrew is the documented way to add CLI tools (it ships with the image). Graphical apps come from Flatpak:

brew install fish starship git fzf eza diff-so-fancy fd kubectx fisher neovim ripgrep zoxide mise
brew install lua-language-server ruff stylua terraform-ls tree-sitter-cli ty
brew install --cask font-0xproto-nerd-font   # lands in ~/.local/share/fonts
brew install pi-coding-agent
flatpak install flathub dev.zed.Zed org.wezfurlong.wezterm   # GUI apps

1Password is the one exception to "nothing at system level": its Flatpak can't do SSH-agent or browser integration, so layer the official RPM once per machine (needs a reboot):

rpm-ostree install 1password

setup.sh picks it up afterwards and writes the 1Password SSH signer into ~/.gitconfig.local.

The Zed and WezTerm Flatpaks read the host config paths, so the symlinks from setup.sh apply to them unchanged. Anything not packaged for brew or Flathub goes in a Distrobox container, per Bazzite's software guidelines.

Installation

git clone ssh://git@git.michalkozak.cz:2222/wokoman/dotfiles.git ~/dotfiles
cd ~/dotfiles
chmod +x setup.sh
./setup.sh

Manual setup

mkdir -p ~/.config
mkdir -p ~/.config/fish

# Core
ln -sf ~/dotfiles/.zshrc ~/.zshrc
ln -sf ~/dotfiles/config.fish ~/.config/fish/config.fish
ln -sf ~/dotfiles/fish_plugins ~/.config/fish/fish_plugins
ln -sf ~/dotfiles/.gitconfig ~/.gitconfig
ln -sf ~/dotfiles/.gitignore_global ~/.gitignore_global

# Apps
ln -sf ~/dotfiles/starship.toml ~/.config/starship.toml
ln -sf ~/dotfiles/.wezterm.lua ~/.wezterm.lua
ln -sf ~/dotfiles/git.plugin.zsh ~/.config/git.plugin.zsh
mkdir -p ~/.config/zed
ln -sf ~/dotfiles/zed.json ~/.config/zed/settings.json

# Claude Code
mkdir -p ~/.claude
ln -sf ~/dotfiles/claude/settings.json ~/.claude/settings.json
ln -sf ~/dotfiles/claude/CLAUDE.md ~/.claude/CLAUDE.md
ln -sf ~/dotfiles/claude/output-styles ~/.claude/output-styles
mkdir -p ~/.config/ccstatusline
ln -sf ~/dotfiles/claude/ccstatusline.json ~/.config/ccstatusline/settings.json

# Pi coding agent
mkdir -p ~/.pi/agent
ln -sf ~/dotfiles/pi/settings.json ~/.pi/agent/settings.json
ln -sf ~/dotfiles/agents/AGENTS.md ~/.pi/agent/AGENTS.md
ln -sf ~/dotfiles/pi/APPEND_SYSTEM.md ~/.pi/agent/APPEND_SYSTEM.md
ln -sf ~/dotfiles/pi/keybindings.json ~/.pi/agent/keybindings.json
ln -sf ~/dotfiles/pi/pi-vcc-config.json ~/.pi/agent/pi-vcc-config.json
ln -sfn ~/dotfiles/pi/themes ~/.pi/agent/themes

# Optional
ln -sf ~/dotfiles/.alacritty.yml ~/.alacritty.yml
ln -sf ~/dotfiles/nvim ~/.config/nvim

# Neovim setup
nvim --headless "+Lazy! sync" +qall

ln -sf ~/dotfiles/leftwm ~/.config/leftwm      # Linux
ln -sf ~/dotfiles/qtile ~/.config/qtile        # Linux

Shell setup

Fish is the default shell. On macOS you need to add it to /etc/shells first:

# macOS – add fish to allowed shells and set as default
echo "$(which fish)" | sudo tee -a /etc/shells
chsh -s "$(which fish)"

# Linux – usually just:
chsh -s "$(which fish)"

Bazzite ships no chsh; per its docs, set fish in the Ptyxis terminal profile instead: Terminal → profile → "Use Custom Command" → /usr/bin/fish.

Zsh is also fully configured if you prefer it:

chsh -s "$(which zsh)"

Fish plugins

The tracked fish_plugins file installs Git abbreviations and AWS profile selection. After installing Fisher, restore or update them with:

fish -c 'fisher update'

Neovim

The configuration requires Neovim 0.12+. Leader mappings cover file search (ff), live grep (fg), buffers (fb), help (fh), formatting (cf), and Git hunk preview (hp).

Git setup

# Create work directories
mkdir -p ~/github ~/gitlab

# Copy GitHub config template
cp ~/dotfiles/.gitconfig-github ~/github/.gitconfig
# Edit ~/github/.gitconfig with your details

The .gitconfig uses includeIf to load directory-specific identities and includes an untracked ~/.gitconfig.local for machine-specific settings. The setup script writes the macOS Keychain credential helper there on macOS, and the 1Password SSH signer (/opt/1Password/op-ssh-sign) on Linux when 1Password is installed.

Pi (coding agent)

Configuration for pi, the terminal-based coding agent. setup.sh links settings.json, the shared agents/AGENTS.md, APPEND_SYSTEM.md (Pi-only tool routing), keybindings.json, pi-vcc-config.json and themes/ into ~/.pi/agent/.

settings.json references ../../github/pi-ext, resolved from ~/.pi/agent/, so clone it first:

git clone git@github.com:wokoman/pi-ext.git ~/github/pi-ext
pi update --extensions   # installs every package listed in settings.json
pi update --models

Pi rewrites lastChangelogVersion in settings.json after each update, so expect a one-line dirty diff here now and then.

Machine-local, never tracked — packed as pi-secrets-*.tgz and kept in 1Password:

  • ~/.pi/agent/auth.json — provider logins / API keys
  • ~/.pi/agent/models.json — Oddin LLM endpoint
  • ~/.pi/agent/kagi-api.json — Kagi API key
  • ~/.pi/kagi-search.json — Kagi search tool config
  • ~/.pi/notesnook.json — Notesnook credentials

Standalone install (Steam Deck, any machine)

pi/install.sh sets up Pi alone — no setup.sh, nothing system-wide: everything lands under $HOME, so it's safe on SteamOS and other immutable distros. It runs the official installer, links the config from this repo and the shared skills into ~/.pi/agent/, and restores secrets when you pass the archive:

git clone ssh://git@git.michalkozak.cz:2222/wokoman/dotfiles.git ~/dotfiles
~/dotfiles/pi/install.sh ~/pi-secrets-20261008.tgz   # without the tgz you get a checklist

Without an archive, recreate the five files from 1Password at the paths listed above (chmod 600 each). The script then installs every package from settings.json (npm and git ones alike — pi vendors its own node/npm, so none of that needs to be on the system) and refreshes model catalogs via pi update. Clone pi-ext first if you want the local package.

Claude Code

setup.sh does not link these — do it manually (note output-styles is linked as a whole directory):

mkdir -p ~/.claude
ln -sf ~/dotfiles/claude/settings.json ~/.claude/settings.json
ln -sf ~/dotfiles/claude/CLAUDE.md ~/.claude/CLAUDE.md
ln -sf ~/dotfiles/claude/output-styles ~/.claude/output-styles
mkdir -p ~/.config/ccstatusline
ln -sf ~/dotfiles/claude/ccstatusline.json ~/.config/ccstatusline/settings.json

settings.json expects two things that live outside this repo: rtk on $PATH (brew install rtk), and a PreToolUse hook at ~/.claude/hooks/rtk-rewrite.sh.

superconductor/ holds Superconductor per-repo setup hooks, referenced by absolute path from its own config — nothing to link.

Features

  • Fish: Abbreviations (k, tf, ll, kx, mr, bubu, vim→nvim), vi key bindings, fzf/zoxide/mise integration
  • Zsh: Fuzzy completions, history management, auto-suggestions, syntax highlighting
  • Starship: Full path, Git operations and staged/worktree status, AWS context and expiry, SSH host, command duration
  • WezTerm: Custom colors, 0xProto font, key bindings
  • Neovim: Lua config with lazy.nvim, native LSP (Terraform, Python), Treesitter, and conform.nvim formatting
  • Git: Directory-specific configs, 1Password SSH signing, diff-so-fancy pager
  • GNOME (Bazzite): setup.sh pins the Super+arrow window-tiling keybindings to GNOME's defaults

Troubleshooting

Zsh completions not working

rm -f ~/.zcompdump*
exec zsh

Fish: fzf integration missing

Ensure fzf is installed. The fish config sources fzf --fish | source to enable completions and keybindings.

Homebrew completions missing

brew completions link

Permissions (macOS)

chmod -R go-w "$(brew --prefix)/share"

Git diff pager not working

Make sure diff-so-fancy is installed — it's configured as the default pager in .gitconfig:

brew install diff-so-fancy     # macOS
sudo pacman -S diff-so-fancy   # Arch/Manjaro