This repository contains my personal, declarative dotfiles managed with Nix and home-manager. It is tailored for macOS  as the primary host environment.
The setup is split between purely declarative Nix/Home Manager settings (this repo) and a small set of host-side dependencies and helpers that must be installed on macOS (listed below).
- Homebrew (brew): used to install host-side packages and GUI apps not managed by Nix. Install from https://brew.sh/ and use it for any macOS-specific installers you prefer.
- yabai + skhd: tiling window management and hotkeys on macOS, install
yabai
andskhd
via Homebrew (or your preferred method) and follow their macOS setup steps (codesigning, Accessibility & Input Monitoring permissions).
This repository includes a Taskfile.yaml
with helper tasks for bootstrapping and maintenance. Typical steps to get started:
- Clone this repository to
$HOME/.config/home-manager
:
git clone https://github.com/mfin/dotfiles $HOME/.config/home-manager
- Download Task. I usually just download the binary from a Github Release and make it executable. Task gets properly installed after bootstrap with Home Manager.
curl -sLO https://github.com/go-task/task/releases/download/v3.45.4/task_darwin_arm64.tar.gz
tar -xzf task_darwin_arm64.tar.gz task
chmod +x task
- From the repo root, run the bootstrap task which wires home-manager into your user environment and installs declared packages:
./task bootstrap
- Open a new terminal (or re-source your shell profile) and verify your environment. After this, you can use
task
as part of your environment.
See home.nix
for the exact imports. Some modules have extra host-side notes (for example yabai
and skhd
require macOS-specific setup). There are also nested directories for module-specific configuration like modules/neovim/
and modules/nnn/plugins/
.
This setup will include optional private overrides from $HOME/.private/private.nix
if it exists. Use that file to keep secrets or machine-specific settings out of version control.
- yabai/skhd permissions: after installing the binaries, codesign them if necessary and grant Accessibility & Input Monitoring in System Settings > Privacy & Security.
- SSH integration: I use Strongbox as my password manager and use their agent for SSH keys.
- macOS shell login vs GUI apps: GUI apps launched by macOS (like Terminal/iTerm) may not inherit the same environment as shells run through Nix. If something looks missing, open a login shell or source your home-manager generated profile.
This repository is available under the license in LICENSE
.