- Shell 69.1%
- Python 24.7%
- Lua 5.3%
- Liquid 0.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| agents | ||
| claude | ||
| leftwm | ||
| nvim | ||
| pi | ||
| qtile | ||
| superconductor | ||
| .alacritty.yml | ||
| .gitconfig | ||
| .gitconfig-github | ||
| .gitignore | ||
| .gitignore_global | ||
| .p10k.zsh | ||
| .wezterm.lua | ||
| .zshrc | ||
| config.fish | ||
| fish_plugins | ||
| git.plugin.zsh | ||
| README.md | ||
| setup.sh | ||
| starship.toml | ||
| zed.json | ||
🏠 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-fancypager - 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