Personal configuration files managed with KCL and dotter.
- Shell: Zsh (Oh My Zsh), Nushell, Fish
- Terminal: Ghostty
- Multiplexer: Tmux with theme support
- Editor: Neovim with LSP, plugins, and profile variants (default/work/personal)
- CLI Tools: Starship, Atuin, Carapace, Zoxide, Jujutsu, iamb
- AI Assistants: OpenCode, Claude Code, Kiro (MCP server configs, commands, skills)
- Window Management: AeroSpace (macOS), Hyprland (Linux)
- Package Managers: Homebrew (macOS), pnpm, npm
git clone https://github.com/zenibako/dotfiles.git
cd dotfiles
cp local.toml.example .dotter/local.tomlEdit .dotter/local.toml to set your name, email, profile, platform, and theme.
sh init.shThis installs dependencies, generates configs from KCL, and deploys via dotter.
./deploy.sh # KCL generation + dotter deploy
./deploy.sh -f # Force overwrite changed targetsAlways use ./deploy.sh rather than bare dotter deploy — KCL must regenerate global.toml before dotter reads it.
Select ONE profile, ONE platform, ONE theme in .dotter/local.toml:
packages = ["work", "mac", "monokai"]- work / personal — both inherit from default via
depends - Themes: monokai, nightowl, tokyonight
Secrets are fetched from macOS Keychain (or Proton Pass) and injected into deployed configs during post_deploy.sh. Never commit secrets to local.toml.
security add-generic-password -s KEY_NAME -a dotfiles -w SECRET_VALUE -U login.keychainsrc/ # Source of truth
├── main.k # KCL entrypoint
├── profiles.k # Profile/package definitions
├── *.k # KCL modules (env, packages, themes, etc.)
├── zshrc # Zsh interactive config (template)
├── nvim/ # Neovim configs (default/work/personal)
├── opencode/ # OpenCode commands, prompts, skills
├── claude-code/ # Claude Code CLAUDE.md + settings
├── kiro/ # Kiro steering + MCP config
├── gnupg/ # GPG agent config (template)
└── ... # Other tool configs
scripts/ # Deploy pipeline scripts
├── pre_deploy.sh # KCL generation + validation (dotter hook)
├── post_deploy.sh # Secret injection + post-deploy checks (dotter hook)
└── dotter/ # Shared helpers and validators
├── lib.sh # Common functions (resolve_python, run_with_timeout, etc.)
├── generate_from_kcl.py # Converts KCL JSON output to dotter global.toml + configs
├── validate_*.py # Config validation scripts
└── validate_schema.sh
.dotter/ # Generated output (gitignored)
├── global.toml # Generated by KCL pipeline
├── local.toml # Per-machine config (user creates)
├── pre_deploy.sh # Symlink → ../scripts/pre_deploy.sh
└── post_deploy.sh # Symlink → ../scripts/post_deploy.sh
out/ # Generated config files (gitignored, written by KCL)
deploy.sh # Deploy wrapper (creates .dotter/, runs pipeline)
init.sh # First-time machine setup
local.k.example # Template for local.k (generates .dotter/local.toml)
local.toml.example # Template for .dotter/local.toml
- KCL (
src/main.k) evaluates profiles, variables, and templates into JSON - Python (
scripts/dotter/generate_from_kcl.py) converts JSON into.dotter/global.toml+out/configs - Dotter reads
global.toml+local.toml, deploys files to~/.config/etc. - Post-deploy injects secrets from Keychain, validates Lua/LSP/schemas
- macOS: Full support (Homebrew, AeroSpace, Ghostty)
- Linux: Fedora (dnf), Arch (pacman), Debian/Ubuntu (apt), openSUSE (zypper), Alpine (apk)
Personal configurations — use at your own discretion.