macOS / Linux 向けの個人開発環境を Nix (Home Manager) を中心に宣言的に管理するリポジトリ。
パッケージとツールの管理は用途別に 3 層に分かれている。
| 層 | 用途 | 設定ファイル |
|---|---|---|
| Nix (Home Manager) | CLI utility / バージョン固定でよいもの (jq, ripgrep, gh, tmux, starship 等)。設定ファイルの symlink と、macOS では defaults の適用も担う |
flake.nix, nix/home.nix, nix/dotfiles/*.nix |
| mise | バージョン更新が頻繁、または project 単位でバージョンを切り替えたいもの (node, claude, gcloud 等) |
mise/config.toml (~/.config/mise/config.toml に symlink)。マシン固有ツールは ~/.config/mise/config.local.toml (後述) |
| Homebrew (macOS のみ) | macOS GUI cask と、Nix で扱いづらい macOS 特化バイナリ (trash 等) |
Brewfile |
dotfiles の実体はリポジトリ直下のディレクトリ (例: .emacs.d/, tmux/, starship/) に置かれ、Home Manager の mkOutOfStoreSymlink で $HOME 配下に symlink される。この方式により、設定を直接編集してすぐ反映できる(再ビルド不要)。
- macOS (Apple Silicon / Intel いずれも可) または Linux (x86_64 / aarch64)
- リポジトリは
~/projects/dotfilesに clone する (symlink の向き先がこのパスに固定されている)
Linux では Homebrew と macOS defaults の層はスキップされ、Nix (Home Manager) + mise のみが適用される。
git clone https://github.com/kuriyosh/dotfiles ~/projects/dotfiles
cd ~/projects/dotfiles
./install.shinstall.sh が自動で以下を行う:
-
Nix をインストール (determinate-systems installer を利用)
-
home-manager switch --flake .で以下を適用- CLI パッケージのインストール
- dotfiles の symlink 配置
- oh-my-zsh の配置 (Nix 管理、
programs.zsh.oh-my-zsh) - macOS のみ: Homebrew のインストール、macOS defaults の適用 (Dock / メニューバー等)、ghostty 等の macOS 固有設定
-
(macOS のみ)
brew bundleでBrewfileの GUI アプリを入れる -
(Linux のみ) Nix の zsh を
/etc/shellsに登録し、chshでログインシェルにする (sudo が必要) -
mise installで mise 管理のツールを入れる
# dotfiles 本体の更新を取り込んだあと (--impure は $USER 解決のため必須)
home-manager switch --flake ~/projects/dotfiles --impure
# Nix 依存関係の更新
nix flake update --flake ~/projects/dotfiles
# Homebrew (macOS のみ)
brew bundle --file=~/projects/dotfiles/Brewfile
# mise
mise upgrademise の設定は 2 ファイルに分ける。mise は両方を自動でマージして読む。
| ファイル | 役割 | 管理 |
|---|---|---|
mise/config.toml |
全マシンで必須のツールだけを書く | dotfiles (symlink) |
~/.config/mise/config.local.toml |
そのマシンだけで必要なツール | git 管理外。各マシンで直接編集 |
-
マシン固有のツールの追加は
mise-localalias を使う:mise-local postgres@17 # 実体: mise use -p ~/.config/mise/config.local.toml postgres@17
-
mise use -gは使わない。共有のconfig.toml(= リポジトリの実体) を書き換えてしまうため -
project 固有のツールは各リポジトリの
mise.toml(共有する場合) かmise.local.toml(個人用、global gitignore 済み) に書く
├── flake.nix # Nix flake エントリポイント
├── nix/
│ ├── home.nix # 共通 Home Manager 設定 (packages, programs.git, programs.zsh)
│ └── dotfiles/
│ ├── shared.nix # クロスプラットフォームな symlink
│ └── darwin.nix # macOS 固有 (Homebrew, defaults, ghostty 等)
├── Brewfile # Homebrew cask
├── mise/config.toml # mise 管理ツール (~/.config/mise/config.toml に symlink)
├── install.sh # bootstrap
├── .emacs.d/ # Emacs 設定
├── tmux/ # tmux 設定
├── starship/ # starship prompt 設定
├── ghostty/, cursor/, vscode/, zed/, karabiner/, macOS/
├── .scripts/ # CLI スクリプト集 (PATH に追加される)
├── docs/
│ └── rationale.md # ツール選定の理由
└── archives/ # 過去使っていた設定 (item2, warp, hyper)
docs/rationale.md を参照。ターミナル / エディタ / 補完 etc. の選定経緯をまとめてある。
home-manager switch が "file exists" で失敗する
既存の手書き dotfile (例: ~/.zshrc) が残っている場合、Home Manager は上書きを拒否する。バックアップしてから削除:
mv ~/.zshrc ~/.zshrc.bak
home-manager switch --flake . --impureまたは -b backup を付けると既存ファイルを .backup に退避して続行する。
attribute 'homeConfigurations.xxx' missing で失敗する
username を $USER から解決しているため、home-manager switch には常に --impure が必要。
SSH で commit できない (1Password)
macOS では programs.git.signing.signer が 1Password アプリ (/Applications/1Password.app/...) を参照する。1Password の SSH Agent 機能を有効化していること、および SSH_AUTH_SOCK が 1Password のソケットを指していることを確認。
Linux では signer は設定されず、ssh-keygen によるデフォルト署名になるため、鍵を ssh-agent に load しておく。
nix run home-manager/master -- uninstall
brew bundle cleanup --file=~/projects/dotfiles/Brewfile # macOS のみ
/nix/nix-installer uninstall # Nix 自体を消す場合