Portable Nix-based dotfiles for macOS with individual tool wrappers.
- Shell: Zsh with Starship prompt
- Editor: Neovim 0.11+ with LSP, Treesitter, and completion
- Terminal: Ghostty with Flexoki theme
- Window Management: LeaderKey with modal keybindings and Moves for window tiling
- Development: Claude Code, direnv, fzf, ripgrep
- Git: Modern config with rebasing, pruning, and helpful aliases
- Portable: Run tools on any Nix-enabled machine without installation
# Run neovim with your config
nix run github:rastasheep/dotfiles#nvim
# Run tmux, git, or any other tool
nix run github:rastasheep/dotfiles#tmux
nix run github:rastasheep/dotfiles#git status
# Run from local checkout
cd ~/src/github.com/rastasheep/dotfiles
nix run .#nvim# Install all tools to your profile
nix profile install github:rastasheep/dotfiles
# Or from local checkout
cd ~/src/github.com/rastasheep/dotfiles
nix profile install .#default
# Update later
nix profile upgrade '.*dotfiles.*'# Cherry-pick the tools you want
nix profile install github:rastasheep/dotfiles#{nvim,git,tmux}# Install complete machine-specific bundle
cd ~/src/github.com/rastasheep/dotfiles
nix profile install .#aleksandars-mbp
# Update later
apply-dot # or: nix profile upgrade ".*aleksandars-mbp.*".
├── flake.nix # Flake definition with multi-system support
├── flake.lock # Locked dependency versions
├── lib/ # Shared utilities and helpers
│ └── default.nix # Reusable functions (wrapWithConfig, buildConfig, etc.)
├── packages/ # All tool and app packages (CLI + GUI)
│ ├── nvim/ # Neovim with plugins and config
│ ├── git/ # Git with custom config
│ ├── tmux/ # Tmux with custom config
│ ├── zsh/ # Zsh with plugins and config
│ ├── starship/ # Starship prompt config
│ ├── scripts/ # Custom scripts (dev, git-*, etc.)
│ ├── dircolors/ # GNU dircolors configuration
│ ├── ghostty/ # Ghostty terminal with config
│ ├── claude-code/ # Claude with 1Password + config
│ ├── macos-defaults/ # macOS system defaults management
│ ├── blender/ # Custom Blender build (optional, commented out)
│ └── kicad/ # Custom KiCad build (optional, commented out)
└── machines/ # Machine-specific bundles
└── aleksandars-mbp/ # Composes tools + apps for this machine
All packages are exposed individually and can be run or installed standalone.
nvim- Neovim with plugins (treesitter, gitsigns, fzf-lua) and custom configgit- Git with custom config and aliasestmux- Tmux with vi-mode and custom keybindingszsh- Zsh with plugins (autosuggestions, completions) and configstarship- Starship prompt with minimal configscripts- Custom shell scripts (dev, git-, gh-, etc.)dircolors- GNU dircolors configuration
ghostty- Ghostty terminal with custom configleader-key- LeaderKey with modal keybindings configurationmoves- Moves app for window tiling and managementclaude-code- Claude Code with 1Password integration and custom settingsmacos-defaults- Declarative macOS system defaults managementkicad- Custom KiCad build
Note: Common tools like fzf, direnv, and 1password-cli are included directly in the machine bundle without custom wrappers.
Pre-configured bundles for specific machines:
aleksandars-mbp- Complete setup with all CLI tools + GUI appsdefault- Core CLI tools only (no GUI apps)
The flake supports multiple systems out of the box:
aarch64-darwin(Apple Silicon Macs)x86_64-darwin(Intel Macs)aarch64-linux(ARM Linux)x86_64-linux(x86 Linux)
All packages use shared utilities from lib/default.nix:
wrapWithConfig: Standard CLI wrapper patternbuildConfig: Config directory buildersmartConfigLink: Backup and symlink logicmkMeta: Standardized meta attributes
This ensures consistency and reduces code duplication across all packages.
All wrapped packages expose the underlying package via passthru.unwrapped:
# Run with your config
nix run .#git status
# Run without your config (unwrapped)
nix run .#git.unwrapped status
# Check version
nix eval .#git.versionValidate packages build correctly:
# Run all checks
nix flake check
# View available checks
nix flake show | grep checks
# Run specific check
nix build .#checks.aarch64-darwin.all-packages- Create package directory in
packages/ - Use shared library utilities from
lib/default.nix - Add package to
flake.niximports - Add to machine bundle in
machines/aleksandars-mbp/default.nix - Run
nix flake checkto verify
- Use
inherit (pkgs) lib;instead ofwith pkgs.lib; - Add complete meta attributes (description, homepage, license, platforms)
- Add
passthru.unwrappedfor wrapped packages - Use shared library utilities where applicable
- Use
stdenvNoCCfor pure config packages