mirror of
https://github.com/smg1024/nix-darwin.git
synced 2026-05-22 20:32:59 +09:00
refactor: migrate nix-darwin config to a flake-parts dendritic layout
This commit is contained in:
parent
f80b0b0d4f
commit
09801ac429
84 changed files with 1029 additions and 687 deletions
62
README-ko.md
62
README-ko.md
|
|
@ -5,9 +5,9 @@
|
||||||
|
|
||||||
## 이 저장소가 관리하는 것
|
## 이 저장소가 관리하는 것
|
||||||
|
|
||||||
- `hosts/`의 시스템 레벨 macOS 설정
|
- `modules/flake/`의 flake 조립 및 호스트 구성 생성
|
||||||
- `home/`의 사용자 레벨 도구/셸/터미널/에디터 설정
|
- `modules/aspects/`의 자동 발견 Darwin/Home Manager aspect
|
||||||
- `hosts/apps.nix`의 선언적 Homebrew tap/app/cask 관리
|
- `hosts/`의 자동 발견 멀티 호스트 선언
|
||||||
- `secrets/` + `.sops.yaml`의 SOPS 암호화 시크릿
|
- `secrets/` + `.sops.yaml`의 SOPS 암호화 시크릿
|
||||||
|
|
||||||
## 사전 요구사항
|
## 사전 요구사항
|
||||||
|
|
@ -23,15 +23,14 @@
|
||||||
|
|
||||||
## 저장소 구조
|
## 저장소 구조
|
||||||
|
|
||||||
- `flake.nix`: flake input/output 및 `darwinConfigurations`
|
- `flake.nix`: `flake-parts` 진입점과 flake input
|
||||||
- `Justfile`: 일상 명령(`darwin`, `darwin-debug`, `fmt`, `up`, `gc` 등)
|
- `Justfile`: 일상 명령(`darwin`, `darwin-debug`, `fmt`, `up`, `gc` 등)
|
||||||
- `hosts/`: 시스템 모듈
|
- `modules/flake/`: 저장소 옵션, Darwin 조립, 공유 context 모듈
|
||||||
- `default.nix`
|
- `modules/aspects/`: `base`, `homebrew`, `shell`, `editor`, `desktop` 같은
|
||||||
- `nix-core.nix`
|
이름 있는 자동 발견 aspect 진입 모듈
|
||||||
- `system.nix`
|
- `modules/aspects/_*/`: 공개 aspect를 뒷받침하는, 자동 로딩에서 제외되는
|
||||||
- `apps.nix`
|
내부 구현 트리
|
||||||
- `host-users.nix`
|
- `hosts/`: `system`과 flat `features` 목록을 등록하는 자동 발견 호스트 선언
|
||||||
- `home/`: Home Manager 모듈(`git.nix`, `zsh.nix`, `nvf/`, `aerospace.nix` 등)
|
|
||||||
- `secrets/`: 암호화된 시크릿 파일(`poby.yaml`)
|
- `secrets/`: 암호화된 시크릿 파일(`poby.yaml`)
|
||||||
|
|
||||||
## 자주 쓰는 명령
|
## 자주 쓰는 명령
|
||||||
|
|
@ -53,11 +52,14 @@ just fmt .
|
||||||
just up
|
just up
|
||||||
|
|
||||||
# 특정 input 하나만 업데이트
|
# 특정 input 하나만 업데이트
|
||||||
just upp nixpkgs-darwin
|
just upp nixpkgs
|
||||||
|
|
||||||
# 스위치 없이 빌드 검증(예시 호스트: fenrir)
|
# 스위치 없이 빌드 검증(예시 호스트: fenrir)
|
||||||
nix build .#darwinConfigurations.fenrir.system --extra-experimental-features 'nix-command flakes'
|
nix build .#darwinConfigurations.fenrir.system --extra-experimental-features 'nix-command flakes'
|
||||||
|
|
||||||
|
# 실제 빌드 없이 dry-run 검증
|
||||||
|
nix build .#darwinConfigurations.fenrir.system --dry-run --extra-experimental-features 'nix-command flakes'
|
||||||
|
|
||||||
# 시스템 프로필 히스토리 확인 / 오래된 generation 정리
|
# 시스템 프로필 히스토리 확인 / 오래된 generation 정리
|
||||||
just history
|
just history
|
||||||
just clean
|
just clean
|
||||||
|
|
@ -66,18 +68,38 @@ just gc
|
||||||
|
|
||||||
## 설정 노트
|
## 설정 노트
|
||||||
|
|
||||||
- `flake.nix`는 현재 `hostname` 기반으로 하나의 `darwinConfigurations` 항목을
|
- `flake.nix`는 이제 `flake-parts`를 사용하고 `./modules/flake`는 명시적으로
|
||||||
만들고, 시스템 모듈은 `./hosts`에서 import 합니다.
|
유지한 채 `import-tree`로 `./modules/aspects`와 `./hosts`를 자동 발견합니다.
|
||||||
- `home/default.nix`에서 사용자 모듈(셸, git, nvf, aerospace, sops, ssh)을
|
- `hosts/fenrir.nix`가 현재 호스트 선언이며 `fenrir`를 하나의 flat feature
|
||||||
조합합니다.
|
목록에 매핑합니다.
|
||||||
- Aerospace 멀티 모니터 워크스페이스 할당은 `home/aerospace.nix`에 있습니다.
|
- `modules/flake/darwin-configurations.nix`가 각 호스트의
|
||||||
- 자주 업데이트되는 앱은 Homebrew 중심으로 `hosts/apps.nix`에서 관리합니다.
|
`darwinConfigurations.<host>`를 만들고, 사용자 `poby`의 Home Manager를
|
||||||
|
nix-darwin 안에 통합합니다.
|
||||||
|
- `modules/aspects/`가 호스트가 선택하는 기능 vocabulary입니다. 현재 feature
|
||||||
|
집합은 `base`, `nix-core`, `system-packages`, `homebrew`,
|
||||||
|
`macos-defaults`, `activation`, `fonts`, `sudo-auth`, `shell`,
|
||||||
|
`cli-tools`, `git`, `ssh`, `secrets`, `terminal`, `editor`, `desktop`,
|
||||||
|
`fenrir` 입니다.
|
||||||
|
- `cli-tools` aspect가 `zoxide`를 포함한 CLI 사용자 도구 묶음을 담당합니다.
|
||||||
|
- `modules/aspects/_*/`는 자동 발견에서 제외되는 내부 구현 경로입니다.
|
||||||
|
이 저장소는 `/_`가 포함된 경로를 `import-tree`가 건너뛴다는 규칙을 사용해
|
||||||
|
NVF 같은 서브트리를 보호합니다.
|
||||||
|
- 이번 단계에서는 Home Manager를 Darwin 내부에서만 사용하며, 별도의
|
||||||
|
`homeConfigurations` 출력은 만들지 않습니다.
|
||||||
|
|
||||||
|
## 호스트 추가 방법
|
||||||
|
|
||||||
|
- `hosts/<hostname>.nix` 파일을 만듭니다.
|
||||||
|
- `repo.hosts.<hostname>.system`을 등록합니다.
|
||||||
|
- `repo.hosts.<hostname>.features`에 사용할 aspect 이름 목록을 등록합니다.
|
||||||
|
- 호스트 전용 동작은 공유 feature를 수정하지 말고 `modules/aspects/`에 새
|
||||||
|
aspect로 추가합니다.
|
||||||
|
|
||||||
## 시크릿
|
## 시크릿
|
||||||
|
|
||||||
- 시크릿은 `secrets/*.yaml`에 암호화해서 보관합니다.
|
- 시크릿은 `secrets/*.yaml`에 암호화해서 보관합니다.
|
||||||
- `.sops.yaml`이 `secrets/.*\.yaml`에 대한 암호화 규칙을 강제합니다.
|
- `.sops.yaml`이 `secrets/.*\.yaml`에 대한 암호화 규칙을 강제합니다.
|
||||||
- Home Manager는 `home/sops.nix`를 통해 `secrets/poby.yaml`에서 아래 항목을
|
- Home Manager는 `secrets` aspect를 통해 `secrets/poby.yaml`에서 아래 항목을
|
||||||
읽습니다.
|
읽습니다.
|
||||||
- `github_ssh_key`
|
- `github_ssh_key`
|
||||||
- `github_cli_token`
|
- `github_cli_token`
|
||||||
|
|
@ -87,5 +109,7 @@ just gc
|
||||||
- 자세한 평가/빌드 로그가 필요하면 `just darwin-debug <hostname>`을 사용하세요.
|
- 자세한 평가/빌드 로그가 필요하면 `just darwin-debug <hostname>`을 사용하세요.
|
||||||
- 특정 호스트 평가가 실패하면 해당 호스트가 `darwinConfigurations`에 정의됐는지
|
- 특정 호스트 평가가 실패하면 해당 호스트가 `darwinConfigurations`에 정의됐는지
|
||||||
확인하세요.
|
확인하세요.
|
||||||
|
- 의존성 그래프만 확인하고 싶다면
|
||||||
|
`nix build .#darwinConfigurations.<host>.system --dry-run`을 먼저 실행하세요.
|
||||||
- 빌드 성공 후에도 설정 반영이 이상하면 switch를 다시 실행하고 활성
|
- 빌드 성공 후에도 설정 반영이 이상하면 switch를 다시 실행하고 활성
|
||||||
hostname/config를 확인하세요.
|
hostname/config를 확인하세요.
|
||||||
|
|
|
||||||
69
README.md
69
README.md
|
|
@ -7,9 +7,9 @@ Declarative macOS setup with `nix-darwin`, `home-manager`, `nix-homebrew`, and
|
||||||
|
|
||||||
## What This Repo Manages
|
## What This Repo Manages
|
||||||
|
|
||||||
- System-level macOS configuration in `hosts/`
|
- Flake orchestration and host assembly in `modules/flake/`
|
||||||
- User-level tooling, shell, terminal, and editor config in `home/`
|
- Auto-discovered Darwin and Home Manager aspects in `modules/aspects/`
|
||||||
- Declarative Homebrew taps/apps/casks in `hosts/apps.nix`
|
- Auto-discovered host declarations in `hosts/`
|
||||||
- Encrypted secrets via SOPS (`secrets/` + `.sops.yaml`)
|
- Encrypted secrets via SOPS (`secrets/` + `.sops.yaml`)
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
@ -25,16 +25,15 @@ Declarative macOS setup with `nix-darwin`, `home-manager`, `nix-homebrew`, and
|
||||||
|
|
||||||
## Repository Layout
|
## Repository Layout
|
||||||
|
|
||||||
- `flake.nix`: flake inputs/outputs and `darwinConfigurations`
|
- `flake.nix`: `flake-parts` entrypoint and flake inputs
|
||||||
- `Justfile`: day-to-day commands (`darwin`, `darwin-debug`, `fmt`, `up`, `gc`)
|
- `Justfile`: day-to-day commands (`darwin`, `darwin-debug`, `fmt`, `up`, `gc`)
|
||||||
- `hosts/`: system modules
|
- `modules/flake/`: repo options, Darwin assembly, and shared context modules
|
||||||
- `default.nix`
|
- `modules/aspects/`: auto-discovered aspect entry modules such as `base`,
|
||||||
- `nix-core.nix`
|
`homebrew`, `shell`, `editor`, and `desktop`
|
||||||
- `system.nix`
|
- `modules/aspects/_*/`: ignored internal implementation trees that back the
|
||||||
- `apps.nix`
|
public aspect entry modules
|
||||||
- `host-users.nix`
|
- `hosts/`: auto-discovered host declarations that register `system` and a flat
|
||||||
- `home/`: Home Manager modules (`git.nix`, `zsh.nix`, `nvf/`, `aerospace.nix`,
|
`features` list
|
||||||
etc.)
|
|
||||||
- `secrets/`: encrypted secret files (`poby.yaml`)
|
- `secrets/`: encrypted secret files (`poby.yaml`)
|
||||||
|
|
||||||
## Common Commands
|
## Common Commands
|
||||||
|
|
@ -56,11 +55,14 @@ just fmt .
|
||||||
just up
|
just up
|
||||||
|
|
||||||
# Update one flake input
|
# Update one flake input
|
||||||
just upp nixpkgs-darwin
|
just upp nixpkgs
|
||||||
|
|
||||||
# Validate build without switching (example host: fenrir)
|
# Validate build without switching (example host: fenrir)
|
||||||
nix build .#darwinConfigurations.fenrir.system --extra-experimental-features 'nix-command flakes'
|
nix build .#darwinConfigurations.fenrir.system --extra-experimental-features 'nix-command flakes'
|
||||||
|
|
||||||
|
# Validate without realizing a full build
|
||||||
|
nix build .#darwinConfigurations.fenrir.system --dry-run --extra-experimental-features 'nix-command flakes'
|
||||||
|
|
||||||
# Inspect profile history / cleanup old generations
|
# Inspect profile history / cleanup old generations
|
||||||
just history
|
just history
|
||||||
just clean
|
just clean
|
||||||
|
|
@ -69,19 +71,36 @@ just gc
|
||||||
|
|
||||||
## Configuration Notes
|
## Configuration Notes
|
||||||
|
|
||||||
- `flake.nix` currently defines one `darwinConfigurations` entry from
|
- `flake.nix` now uses `flake-parts`, keeps `./modules/flake` explicit, and
|
||||||
`hostname`, and imports system modules through `./hosts`.
|
auto-discovers `./modules/aspects` and `./hosts` through `import-tree`.
|
||||||
- `home/default.nix` composes user modules (shell, git, nvf, aerospace, sops,
|
- `hosts/fenrir.nix` is the current host declaration and maps `fenrir` to one
|
||||||
ssh).
|
flat feature list.
|
||||||
- Aerospace multi-monitor workspace assignment lives in `home/aerospace.nix`.
|
- `modules/flake/darwin-configurations.nix` assembles each host’s
|
||||||
- Homebrew-first app management (for frequently updated apps) is in
|
`darwinConfigurations.<host>` output and embeds Home Manager for user `poby`.
|
||||||
`hosts/apps.nix`.
|
- `modules/aspects/` is the feature vocabulary for hosts. The current feature
|
||||||
|
set is `base`, `nix-core`, `system-packages`, `homebrew`,
|
||||||
|
`macos-defaults`, `activation`, `fonts`, `sudo-auth`, `shell`, `cli-tools`,
|
||||||
|
`git`, `ssh`, `secrets`, `terminal`, `editor`, `desktop`, and `fenrir`.
|
||||||
|
- The `cli-tools` aspect owns the CLI user tool set, including `zoxide`.
|
||||||
|
- `modules/aspects/_*/` contains implementation files that are intentionally not
|
||||||
|
auto-loaded. `import-tree` skips paths containing `/_`, which is the repo’s
|
||||||
|
convention for internal helpers and subtrees like the NVF source.
|
||||||
|
- Home Manager is Darwin-integrated only in this phase; no standalone
|
||||||
|
`homeConfigurations` output is exposed.
|
||||||
|
|
||||||
|
## Adding A Host
|
||||||
|
|
||||||
|
- Create `hosts/<hostname>.nix`.
|
||||||
|
- Register `repo.hosts.<hostname>.system`.
|
||||||
|
- Register `repo.hosts.<hostname>.features` with the desired aspect names.
|
||||||
|
- Add any host-specific behavior as a new aspect in `modules/aspects/` instead
|
||||||
|
of modifying shared features.
|
||||||
|
|
||||||
## Secrets
|
## Secrets
|
||||||
|
|
||||||
- Keep secrets encrypted in `secrets/*.yaml`.
|
- Keep secrets encrypted in `secrets/*.yaml`.
|
||||||
- `.sops.yaml` enforces encryption rules for `secrets/.*\.yaml`.
|
- `.sops.yaml` enforces encryption rules for `secrets/.*\.yaml`.
|
||||||
- Home Manager reads from `secrets/poby.yaml` via `home/sops.nix`:
|
- Home Manager reads from `secrets/poby.yaml` via the `secrets` aspect:
|
||||||
- `github_ssh_key`
|
- `github_ssh_key`
|
||||||
- `github_cli_token`
|
- `github_cli_token`
|
||||||
|
|
||||||
|
|
@ -89,10 +108,8 @@ just gc
|
||||||
|
|
||||||
- Use `just darwin-debug <hostname>` for detailed evaluation/build output.
|
- Use `just darwin-debug <hostname>` for detailed evaluation/build output.
|
||||||
- If evaluation fails for a host, verify it exists under `darwinConfigurations`.
|
- If evaluation fails for a host, verify it exists under `darwinConfigurations`.
|
||||||
|
- Dry-run evaluation with
|
||||||
|
`nix build .#darwinConfigurations.<host>.system --dry-run` before a full
|
||||||
|
switch when you only want to confirm the dependency graph.
|
||||||
- If settings look stale after a successful build, run switch again and verify
|
- If settings look stale after a successful build, run switch again and verify
|
||||||
active hostname/config values.
|
active hostname/config values.
|
||||||
|
|
||||||
## Milestone
|
|
||||||
|
|
||||||
- [ ] `multi-host implementation`
|
|
||||||
- [ ] Dentritic Pattern - using flake-parts
|
|
||||||
|
|
|
||||||
82
flake.lock
generated
82
flake.lock
generated
|
|
@ -20,7 +20,7 @@
|
||||||
"darwin": {
|
"darwin": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs-darwin"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
@ -55,6 +55,24 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flake-parts": {
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772408722,
|
||||||
|
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts_2": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs-lib": [
|
"nixpkgs-lib": [
|
||||||
"nvf",
|
"nvf",
|
||||||
|
|
@ -78,7 +96,7 @@
|
||||||
"home-manager": {
|
"home-manager": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs-darwin"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
@ -128,6 +146,21 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"import-tree": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1773693634,
|
||||||
|
"narHash": "sha256-BtZ2dtkBdSUnFPPFc+n0kcMbgaTxzFNPv2iaO326Ffg=",
|
||||||
|
"owner": "vic",
|
||||||
|
"repo": "import-tree",
|
||||||
|
"rev": "c41e7d58045f9057880b0d85e1152d6a4430dbf1",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "vic",
|
||||||
|
"repo": "import-tree",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"mnw": {
|
"mnw": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1770419553,
|
"lastModified": 1770419553,
|
||||||
|
|
@ -185,25 +218,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773231277,
|
"lastModified": 1774216008,
|
||||||
"narHash": "sha256-Xy3WEpUAbpsz8ydgvVAQAGGB/WB+8cNA5cshiL0McTI=",
|
"narHash": "sha256-Z/FO3AI2tL6pTJfGodMvNccEurAJJmWEbsv4psp90z4=",
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "75690239f08f885ca9b0267580101f60d10fbe62",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"id": "nixpkgs",
|
|
||||||
"type": "indirect"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs-darwin": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1773282714,
|
|
||||||
"narHash": "sha256-at2PNNVNoTfXBe3bA6pgff+CKOwdBWUZCUBIfXGrXsU=",
|
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a8556879c286b4a40a717a416ae61818c26d1ac8",
|
"rev": "98bf8103e311377ca1d648c22f56332756d89bb2",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -213,10 +232,25 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs-lib": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1772328832,
|
||||||
|
"narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nvf": {
|
"nvf": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-compat": "flake-compat",
|
"flake-compat": "flake-compat",
|
||||||
"flake-parts": "flake-parts",
|
"flake-parts": "flake-parts_2",
|
||||||
"mnw": "mnw",
|
"mnw": "mnw",
|
||||||
"ndg": "ndg",
|
"ndg": "ndg",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
|
|
@ -241,12 +275,16 @@
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"darwin": "darwin",
|
"darwin": "darwin",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"homebrew-cask": "homebrew-cask",
|
"homebrew-cask": "homebrew-cask",
|
||||||
"homebrew-core": "homebrew-core",
|
"homebrew-core": "homebrew-core",
|
||||||
|
"import-tree": "import-tree",
|
||||||
"nix-homebrew": "nix-homebrew",
|
"nix-homebrew": "nix-homebrew",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"nixpkgs-darwin": "nixpkgs-darwin",
|
"nixpkgs-darwin": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
"nvf": "nvf",
|
"nvf": "nvf",
|
||||||
"sops-nix": "sops-nix"
|
"sops-nix": "sops-nix"
|
||||||
}
|
}
|
||||||
|
|
@ -254,7 +292,7 @@
|
||||||
"sops-nix": {
|
"sops-nix": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs-darwin"
|
"nixpkgs"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
|
|
|
||||||
78
flake.nix
78
flake.nix
|
|
@ -1,32 +1,25 @@
|
||||||
{
|
{
|
||||||
description = "Nix for Poby's MacOS";
|
description = "Nix for Poby's MacOS";
|
||||||
|
|
||||||
# TODO: is this necessary?
|
|
||||||
# nixConfig = {
|
|
||||||
# substituters = [
|
|
||||||
# "https://nix-community.cachix.org"
|
|
||||||
# "https://cache.nixos.org"
|
|
||||||
# ];
|
|
||||||
# };
|
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
# nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-unstable"; # comment out for unstable version
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-25.11-darwin";
|
||||||
nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-25.11-darwin";
|
nixpkgs-darwin.follows = "nixpkgs";
|
||||||
|
|
||||||
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
|
import-tree.url = "github:vic/import-tree";
|
||||||
|
|
||||||
home-manager = {
|
home-manager = {
|
||||||
url = "github:nix-community/home-manager/release-25.11";
|
url = "github:nix-community/home-manager/release-25.11";
|
||||||
inputs.nixpkgs.follows = "nixpkgs-darwin";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
darwin = {
|
darwin = {
|
||||||
url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
|
url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
|
||||||
inputs.nixpkgs.follows = "nixpkgs-darwin";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Homebrew
|
|
||||||
nix-homebrew.url = "github:zhaofengli/nix-homebrew";
|
nix-homebrew.url = "github:zhaofengli/nix-homebrew";
|
||||||
|
|
||||||
# Optional: Declarative tap management
|
|
||||||
homebrew-core = {
|
homebrew-core = {
|
||||||
url = "github:homebrew/homebrew-core";
|
url = "github:homebrew/homebrew-core";
|
||||||
flake = false;
|
flake = false;
|
||||||
|
|
@ -36,61 +29,32 @@
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# NVF for neovim
|
|
||||||
nvf = {
|
nvf = {
|
||||||
url = "github:notashelf/nvf";
|
url = "github:notashelf/nvf";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
# sops-nix for secrets
|
|
||||||
sops-nix = {
|
sops-nix = {
|
||||||
url = "github:Mic92/sops-nix";
|
url = "github:Mic92/sops-nix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs-darwin";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = inputs @ {
|
outputs = inputs @ {flake-parts, ...}:
|
||||||
self,
|
flake-parts.lib.mkFlake {inherit inputs;} {
|
||||||
nixpkgs,
|
imports = [
|
||||||
darwin,
|
inputs.flake-parts.flakeModules.modules
|
||||||
home-manager,
|
./modules/flake
|
||||||
nvf,
|
(inputs.import-tree ./modules/aspects)
|
||||||
sops-nix,
|
(inputs.import-tree ./hosts)
|
||||||
nix-homebrew,
|
];
|
||||||
...
|
|
||||||
}: let
|
|
||||||
system = "aarch64-darwin";
|
|
||||||
username = "poby";
|
|
||||||
useremail = "smg981024@gmail.com";
|
|
||||||
hostname = "fenrir"; # TODO break down to multiple hosts
|
|
||||||
|
|
||||||
specialArgs =
|
systems = [
|
||||||
inputs
|
"aarch64-darwin"
|
||||||
// {
|
|
||||||
inherit username useremail hostname;
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
darwinConfigurations."${hostname}" = darwin.lib.darwinSystem {
|
|
||||||
inherit system specialArgs;
|
|
||||||
modules = [
|
|
||||||
./hosts
|
|
||||||
nix-homebrew.darwinModules.nix-homebrew
|
|
||||||
home-manager.darwinModules.home-manager
|
|
||||||
{
|
|
||||||
home-manager = {
|
|
||||||
useGlobalPkgs = true;
|
|
||||||
useUserPackages = true;
|
|
||||||
backupFileExtension = "backup";
|
|
||||||
extraSpecialArgs = specialArgs;
|
|
||||||
sharedModules = [
|
|
||||||
nvf.homeManagerModules.nvf
|
|
||||||
sops-nix.homeManagerModules.sops
|
|
||||||
];
|
];
|
||||||
users.${username} = import ./home;
|
|
||||||
|
perSystem = {pkgs, ...}: {
|
||||||
|
formatter = pkgs.alejandra;
|
||||||
};
|
};
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
formatter.${system} = nixpkgs.legacyPackages.${system}.alejandra;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,191 +0,0 @@
|
||||||
{
|
|
||||||
programs.aerospace = {
|
|
||||||
enable = true;
|
|
||||||
userSettings = {
|
|
||||||
start-at-login = true;
|
|
||||||
accordion-padding = 10;
|
|
||||||
default-root-container-layout = "tiles";
|
|
||||||
default-root-container-orientation = "auto";
|
|
||||||
on-focused-monitor-changed = ["move-mouse monitor-lazy-center"];
|
|
||||||
automatically-unhide-macos-hidden-apps = false;
|
|
||||||
# persistent-workspaces = [ "1" "2" "3" "4" "5" "6" "7" "8" "9" ];
|
|
||||||
|
|
||||||
key-mapping = {
|
|
||||||
preset = "qwerty";
|
|
||||||
};
|
|
||||||
|
|
||||||
gaps = {
|
|
||||||
inner.horizontal = 3;
|
|
||||||
inner.vertical = 3;
|
|
||||||
outer.left = 3;
|
|
||||||
outer.bottom = 3;
|
|
||||||
outer.top = 3;
|
|
||||||
outer.right = 3;
|
|
||||||
};
|
|
||||||
|
|
||||||
mode.main.binding = {
|
|
||||||
alt-slash = "layout tiles horizontal vertical";
|
|
||||||
alt-comma = "layout accordion horizontal vertical";
|
|
||||||
|
|
||||||
alt-h = "focus left";
|
|
||||||
alt-j = "focus down";
|
|
||||||
alt-k = "focus up";
|
|
||||||
alt-l = "focus right";
|
|
||||||
|
|
||||||
alt-shift-h = "move left";
|
|
||||||
alt-shift-j = "move down";
|
|
||||||
alt-shift-k = "move up";
|
|
||||||
alt-shift-l = "move right";
|
|
||||||
|
|
||||||
alt-minus = "resize smart -50";
|
|
||||||
alt-equal = "resize smart +50";
|
|
||||||
|
|
||||||
alt-1 = "workspace 1";
|
|
||||||
alt-2 = "workspace 2";
|
|
||||||
alt-3 = "workspace 3";
|
|
||||||
alt-4 = "workspace 4";
|
|
||||||
alt-5 = "workspace 5";
|
|
||||||
alt-6 = "workspace 6";
|
|
||||||
alt-7 = "workspace 7";
|
|
||||||
alt-8 = "workspace 8";
|
|
||||||
alt-9 = "workspace 9";
|
|
||||||
|
|
||||||
alt-shift-1 = [
|
|
||||||
"move-node-to-workspace 1"
|
|
||||||
"workspace 1"
|
|
||||||
];
|
|
||||||
alt-shift-2 = [
|
|
||||||
"move-node-to-workspace 2"
|
|
||||||
"workspace 2"
|
|
||||||
];
|
|
||||||
alt-shift-3 = [
|
|
||||||
"move-node-to-workspace 3"
|
|
||||||
"workspace 3"
|
|
||||||
];
|
|
||||||
alt-shift-4 = [
|
|
||||||
"move-node-to-workspace 4"
|
|
||||||
"workspace 4"
|
|
||||||
];
|
|
||||||
alt-shift-5 = [
|
|
||||||
"move-node-to-workspace 5"
|
|
||||||
"workspace 5"
|
|
||||||
];
|
|
||||||
alt-shift-6 = [
|
|
||||||
"move-node-to-workspace 6"
|
|
||||||
"workspace 6"
|
|
||||||
];
|
|
||||||
alt-shift-7 = [
|
|
||||||
"move-node-to-workspace 7"
|
|
||||||
"workspace 7"
|
|
||||||
];
|
|
||||||
alt-shift-8 = [
|
|
||||||
"move-node-to-workspace 8"
|
|
||||||
"workspace 8"
|
|
||||||
];
|
|
||||||
alt-shift-9 = [
|
|
||||||
"move-node-to-workspace 9"
|
|
||||||
"workspace 9"
|
|
||||||
];
|
|
||||||
|
|
||||||
alt-tab = "workspace-back-and-forth";
|
|
||||||
alt-shift-tab = "move-node-to-monitor --wrap-around next";
|
|
||||||
|
|
||||||
alt-shift-semicolon = "mode service";
|
|
||||||
};
|
|
||||||
|
|
||||||
mode.service.binding = {
|
|
||||||
esc = [
|
|
||||||
"reload-config"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
r = [
|
|
||||||
"flatten-workspace-tree"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
f = [
|
|
||||||
"layout floating tiling"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
backspace = [
|
|
||||||
"close-all-windows-but-current"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
|
|
||||||
alt-shift-h = [
|
|
||||||
"join-with left"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
alt-shift-j = [
|
|
||||||
"join-with down"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
alt-shift-k = [
|
|
||||||
"join-with up"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
alt-shift-l = [
|
|
||||||
"join-with right"
|
|
||||||
"mode main"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
workspace-to-monitor-force-assignment = {
|
|
||||||
# "workspace" = "monitor"
|
|
||||||
"1" = ["secondary" "main"];
|
|
||||||
"2" = ["secondary" "main"];
|
|
||||||
"3" = ["secondary" "main"];
|
|
||||||
"4" = ["secondary" "main"];
|
|
||||||
"5" = ["secondary" "main"];
|
|
||||||
"6" = "main";
|
|
||||||
"7" = "main";
|
|
||||||
"8" = "main";
|
|
||||||
"9" = "main";
|
|
||||||
};
|
|
||||||
|
|
||||||
on-window-detected = [
|
|
||||||
{
|
|
||||||
"if" = {
|
|
||||||
app-id = "com.apple.finder";
|
|
||||||
};
|
|
||||||
check-further-callbacks = true;
|
|
||||||
run = ["layout floating"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"if" = {
|
|
||||||
app-id = "com.apple.Notes";
|
|
||||||
};
|
|
||||||
check-further-callbacks = true;
|
|
||||||
run = ["layout floating"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"if" = {
|
|
||||||
app-id = "com.daymore.Across";
|
|
||||||
};
|
|
||||||
check-further-callbacks = true;
|
|
||||||
run = ["layout floating"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"if" = {
|
|
||||||
app-id = "com.bitwarden.desktop";
|
|
||||||
};
|
|
||||||
check-further-callbacks = true;
|
|
||||||
run = ["layout floating"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"if" = {
|
|
||||||
app-id = "org.hammerspoon.Hammerspoon";
|
|
||||||
};
|
|
||||||
check-further-callbacks = true;
|
|
||||||
run = ["layout floating"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"if" = {
|
|
||||||
app-id = "com.utmapp.UTM";
|
|
||||||
};
|
|
||||||
check-further-callbacks = true;
|
|
||||||
run = ["layout floating"];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
username,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
./fd.nix
|
|
||||||
./fzf.nix
|
|
||||||
./gh.nix
|
|
||||||
./git.nix
|
|
||||||
./nvf
|
|
||||||
./ripgrep.nix
|
|
||||||
./starship.nix
|
|
||||||
./zoxide.nix
|
|
||||||
./zsh.nix
|
|
||||||
./eza.nix
|
|
||||||
./jq.nix
|
|
||||||
./lazygit.nix
|
|
||||||
./mise.nix
|
|
||||||
./terminal.nix
|
|
||||||
./bat.nix
|
|
||||||
./aerospace.nix
|
|
||||||
./sops.nix
|
|
||||||
./ssh.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
home = {
|
|
||||||
inherit username;
|
|
||||||
homeDirectory = "/Users/${username}";
|
|
||||||
stateVersion = "25.11";
|
|
||||||
|
|
||||||
# packages that are not available via programs and does not need regular updates
|
|
||||||
packages = with pkgs; [];
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.home-manager.enable = true;
|
|
||||||
}
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
config,
|
|
||||||
username,
|
|
||||||
homebrew-core,
|
|
||||||
homebrew-cask,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
nixpkgs.config.allowUnfree = true;
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
git
|
|
||||||
neovim
|
|
||||||
just # use Justfile to simplify nix-darwin's commands
|
|
||||||
tree
|
|
||||||
fastfetchMinimal
|
|
||||||
];
|
|
||||||
environment.variables.EDITOR = "nvim";
|
|
||||||
|
|
||||||
nix-homebrew = {
|
|
||||||
enable = true;
|
|
||||||
enableRosetta = true;
|
|
||||||
user = username;
|
|
||||||
taps = {
|
|
||||||
"homebrew/homebrew-core" = homebrew-core;
|
|
||||||
"homebrew/homebrew-cask" = homebrew-cask;
|
|
||||||
};
|
|
||||||
mutableTaps = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
homebrew = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
onActivation = {
|
|
||||||
autoUpdate = true;
|
|
||||||
cleanup = "zap";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Applications to install from Mac App Store using mas.
|
|
||||||
masApps = {
|
|
||||||
KakaoTalk = 869223134;
|
|
||||||
Across = 6444851827;
|
|
||||||
Bitwarden = 1352778147;
|
|
||||||
};
|
|
||||||
|
|
||||||
taps = builtins.attrNames config.nix-homebrew.taps;
|
|
||||||
|
|
||||||
# WARNING only include those not in nixpkgs
|
|
||||||
brews = [
|
|
||||||
"gemini-cli"
|
|
||||||
];
|
|
||||||
|
|
||||||
casks = [
|
|
||||||
"batfi"
|
|
||||||
"hammerspoon"
|
|
||||||
"shottr" # stable version dmg link not found
|
|
||||||
"arc"
|
|
||||||
"codex"
|
|
||||||
"claude-code"
|
|
||||||
"telegram"
|
|
||||||
"raycast"
|
|
||||||
"jordanbaird-ice"
|
|
||||||
"keka"
|
|
||||||
"kekaexternalhelper"
|
|
||||||
"stats"
|
|
||||||
"iina"
|
|
||||||
"utm"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
{...}: {
|
|
||||||
imports = [
|
|
||||||
./apps.nix
|
|
||||||
./host-users.nix
|
|
||||||
./nix-core.nix
|
|
||||||
./system.nix
|
|
||||||
];
|
|
||||||
}
|
|
||||||
24
hosts/fenrir.nix
Normal file
24
hosts/fenrir.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
{...}: {
|
||||||
|
repo.hosts.fenrir = {
|
||||||
|
system = "aarch64-darwin";
|
||||||
|
features = [
|
||||||
|
"base"
|
||||||
|
"nix-core"
|
||||||
|
"system-packages"
|
||||||
|
"homebrew"
|
||||||
|
"macos-defaults"
|
||||||
|
"activation"
|
||||||
|
"fonts"
|
||||||
|
"sudo-auth"
|
||||||
|
"shell"
|
||||||
|
"cli-tools"
|
||||||
|
"git"
|
||||||
|
"ssh"
|
||||||
|
"secrets"
|
||||||
|
"terminal"
|
||||||
|
"editor"
|
||||||
|
"desktop"
|
||||||
|
"fenrir"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
{
|
|
||||||
username,
|
|
||||||
hostname,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
networking = {
|
|
||||||
hostName = hostname;
|
|
||||||
computerName = hostname;
|
|
||||||
localHostName = hostname;
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users."${username}" = {
|
|
||||||
home = "/Users/${username}";
|
|
||||||
description = username;
|
|
||||||
};
|
|
||||||
|
|
||||||
nix.settings.trusted-users = [username];
|
|
||||||
}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
nix = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.nix;
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
experimental-features = [
|
|
||||||
"nix-command"
|
|
||||||
"flakes"
|
|
||||||
];
|
|
||||||
substituters = ["https://nix-community.cachix.org"];
|
|
||||||
trusted-public-keys = [
|
|
||||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
|
||||||
];
|
|
||||||
builders-use-substitutes = true;
|
|
||||||
auto-optimise-store = false; # issue https://github.com/NixOS/nix/issues/7273
|
|
||||||
};
|
|
||||||
|
|
||||||
gc = {
|
|
||||||
automatic = lib.mkDefault true;
|
|
||||||
options = lib.mkDefault "--delete-older-than 7d";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
208
hosts/system.nix
208
hosts/system.nix
|
|
@ -1,208 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
config,
|
|
||||||
username,
|
|
||||||
hostname,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
time.timeZone = "Asia/Seoul";
|
|
||||||
|
|
||||||
system = {
|
|
||||||
primaryUser = username;
|
|
||||||
stateVersion = 6;
|
|
||||||
|
|
||||||
# symlink /Applications/Nix Apps to /Applications for Spotlight
|
|
||||||
activationScripts.extraActivation.text = ''
|
|
||||||
# activateSettings -u will reload the settings from the database and apply them to the current session,
|
|
||||||
# so we do not need to logout and login again to make the changes take effect.
|
|
||||||
sudo -u ${username} /System/Library/PrivateFrameworks/SystemAdministration.framework/Resources/activateSettings -u
|
|
||||||
'';
|
|
||||||
|
|
||||||
activationScripts.applications.text = let
|
|
||||||
env = pkgs.buildEnv {
|
|
||||||
name = "system-applications";
|
|
||||||
paths = config.environment.systemPackages;
|
|
||||||
pathsToLink = ["/Applications"];
|
|
||||||
};
|
|
||||||
in
|
|
||||||
pkgs.lib.mkForce ''
|
|
||||||
# Set up applications.
|
|
||||||
echo "setting up /Applications..." >&2
|
|
||||||
rm -rf /Applications/Nix\ Apps
|
|
||||||
mkdir -p /Applications/Nix\ Apps
|
|
||||||
find ${env}/Applications -maxdepth 1 -type l -exec readlink '{}' + |
|
|
||||||
while read -r src; do
|
|
||||||
app_name=$(basename "$src")
|
|
||||||
echo "copying $src" >&2
|
|
||||||
${pkgs.mkalias}/bin/mkalias "$src" "/Applications/Nix Apps/$app_name"
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
|
|
||||||
defaults = {
|
|
||||||
loginwindow = {
|
|
||||||
GuestEnabled = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
controlcenter = {
|
|
||||||
AirDrop = false;
|
|
||||||
BatteryShowPercentage = false;
|
|
||||||
Bluetooth = false;
|
|
||||||
Display = false;
|
|
||||||
FocusModes = false;
|
|
||||||
NowPlaying = false;
|
|
||||||
Sound = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
menuExtraClock = {
|
|
||||||
Show24Hour = true;
|
|
||||||
ShowDayOfWeek = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
dock = {
|
|
||||||
autohide = true;
|
|
||||||
autohide-delay = 0.01;
|
|
||||||
autohide-time-modifier = 0.1;
|
|
||||||
mineffect = "suck";
|
|
||||||
show-recents = false;
|
|
||||||
tilesize = 50;
|
|
||||||
magnification = true;
|
|
||||||
largesize = 70;
|
|
||||||
showMissionControlGestureEnabled = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
finder = {
|
|
||||||
AppleShowAllFiles = true;
|
|
||||||
AppleShowAllExtensions = true;
|
|
||||||
ShowStatusBar = true;
|
|
||||||
ShowPathbar = true;
|
|
||||||
FXPreferredViewStyle = "clmv";
|
|
||||||
FXRemoveOldTrashItems = true;
|
|
||||||
_FXEnableColumnAutoSizing = true;
|
|
||||||
_FXShowPosixPathInTitle = true;
|
|
||||||
_FXSortFoldersFirst = true;
|
|
||||||
_FXSortFoldersFirstOnDesktop = true;
|
|
||||||
FXEnableExtensionChangeWarning = false;
|
|
||||||
FXDefaultSearchScope = "SCcf";
|
|
||||||
NewWindowTarget = "Other";
|
|
||||||
NewWindowTargetPath = "/Users/${username}/Downloads";
|
|
||||||
ShowExternalHardDrivesOnDesktop = true;
|
|
||||||
ShowHardDrivesOnDesktop = true;
|
|
||||||
ShowMountedServersOnDesktop = true;
|
|
||||||
ShowRemovableMediaOnDesktop = true;
|
|
||||||
QuitMenuItem = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
trackpad = {
|
|
||||||
Clicking = true;
|
|
||||||
TrackpadRightClick = true; # two finger right click
|
|
||||||
TrackpadThreeFingerDrag = true;
|
|
||||||
TrackpadFourFingerHorizSwipeGesture = 2; # swipe between full-screen applications
|
|
||||||
TrackpadFourFingerVertSwipeGesture = 2; # down for Mission Control, up for App Expose
|
|
||||||
TrackpadPinch = true;
|
|
||||||
TrackpadThreeFingerHorizSwipeGesture = 0; # disable for three finger drag
|
|
||||||
TrackpadThreeFingerVertSwipeGesture = 0; # disable for three finger drag
|
|
||||||
TrackpadTwoFingerDoubleTapGesture = true; # smart zoom
|
|
||||||
TrackpadTwoFingerFromRightEdgeSwipeGesture = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
screensaver = {
|
|
||||||
askForPassword = true;
|
|
||||||
askForPasswordDelay = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
smb = {
|
|
||||||
NetBIOSName = hostname;
|
|
||||||
ServerDescription = hostname;
|
|
||||||
};
|
|
||||||
|
|
||||||
WindowManager = {
|
|
||||||
AppWindowGroupingBehavior = true;
|
|
||||||
EnableStandardClickToShowDesktop = false;
|
|
||||||
EnableTilingByEdgeDrag = false;
|
|
||||||
EnableTilingOptionAccelerator = false;
|
|
||||||
EnableTopTilingByEdgeDrag = false;
|
|
||||||
StandardHideDesktopIcons = true;
|
|
||||||
StandardHideWidgets = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Customize settings that not supported by nix-darwin directly
|
|
||||||
# source: https://github.com/yannbertrand/macos-defaults
|
|
||||||
NSGlobalDomain = {
|
|
||||||
AppleInterfaceStyle = "Dark";
|
|
||||||
AppleKeyboardUIMode = 2;
|
|
||||||
ApplePressAndHoldEnabled = false;
|
|
||||||
InitialKeyRepeat = 15;
|
|
||||||
KeyRepeat = 2;
|
|
||||||
|
|
||||||
AppleShowScrollBars = "WhenScrolling";
|
|
||||||
AppleScrollerPagingBehavior = true;
|
|
||||||
AppleEnableMouseSwipeNavigateWithScrolls = true;
|
|
||||||
AppleEnableSwipeNavigateWithScrolls = true;
|
|
||||||
AppleSpacesSwitchOnActivate = true;
|
|
||||||
|
|
||||||
NSAutomaticCapitalizationEnabled = false;
|
|
||||||
NSAutomaticDashSubstitutionEnabled = false;
|
|
||||||
NSAutomaticPeriodSubstitutionEnabled = false;
|
|
||||||
NSAutomaticQuoteSubstitutionEnabled = false;
|
|
||||||
NSAutomaticSpellingCorrectionEnabled = false;
|
|
||||||
NSNavPanelExpandedStateForSaveMode = true;
|
|
||||||
NSNavPanelExpandedStateForSaveMode2 = true;
|
|
||||||
NSTableViewDefaultSizeMode = 2;
|
|
||||||
|
|
||||||
"com.apple.keyboard.fnState" = true;
|
|
||||||
"com.apple.sound.beep.feedback" = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Customize settings that not supported by nix-darwin directly
|
|
||||||
CustomSystemPreferences = {
|
|
||||||
"com.apple.desktopservices" = {
|
|
||||||
DSDontWriteNetworkStores = true;
|
|
||||||
DSDontWriteUSBStores = true;
|
|
||||||
};
|
|
||||||
"com.apple.AdLib" = {
|
|
||||||
allowApplePersonalizedAdvertising = false;
|
|
||||||
};
|
|
||||||
# Prevent Photos from opening automatically when devices are plugged in
|
|
||||||
"com.apple.ImageCapture".disableHotPlug = true;
|
|
||||||
"com.apple.dock" = {
|
|
||||||
springboard-columns = 10;
|
|
||||||
springboard-rows = 10;
|
|
||||||
ResetLaunchPad = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
keyboard = {
|
|
||||||
enableKeyMapping = true; # enable key mapping so that we can use `option` as `control`
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Add ability to used TouchID for sudo authentication
|
|
||||||
security.pam.services.sudo_local = {
|
|
||||||
touchIdAuth = true;
|
|
||||||
watchIdAuth = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.zsh = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
environment = {
|
|
||||||
shells = [
|
|
||||||
pkgs.zsh
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
fonts = {
|
|
||||||
packages = with pkgs; [
|
|
||||||
material-design-icons
|
|
||||||
font-awesome
|
|
||||||
pretendard
|
|
||||||
nerd-fonts.symbols-only
|
|
||||||
nerd-fonts.jetbrains-mono
|
|
||||||
nerd-fonts.d2coding
|
|
||||||
nerd-fonts.iosevka
|
|
||||||
nerd-fonts.meslo-lg
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
13
modules/aspects/_cli-tools/default.nix
Normal file
13
modules/aspects/_cli-tools/default.nix
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./zoxide.nix
|
||||||
|
./bat.nix
|
||||||
|
./eza.nix
|
||||||
|
./fd.nix
|
||||||
|
./fzf.nix
|
||||||
|
./jq.nix
|
||||||
|
./lazygit.nix
|
||||||
|
./mise.nix
|
||||||
|
./ripgrep.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,8 @@ let
|
||||||
markdown = import ./markdown.nix;
|
markdown = import ./markdown.nix;
|
||||||
html = import ./html.nix;
|
html = import ./html.nix;
|
||||||
yaml = import ./yaml.nix;
|
yaml = import ./yaml.nix;
|
||||||
|
toml = import ./toml.nix;
|
||||||
|
just = import ./just.nix;
|
||||||
in {
|
in {
|
||||||
inherit
|
inherit
|
||||||
nix
|
nix
|
||||||
|
|
@ -15,5 +17,7 @@ in {
|
||||||
markdown
|
markdown
|
||||||
html
|
html
|
||||||
yaml
|
yaml
|
||||||
|
toml
|
||||||
|
just
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
9
modules/aspects/_editor/nvf/lsp/languages/just.nix
Normal file
9
modules/aspects/_editor/nvf/lsp/languages/just.nix
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
# just
|
||||||
|
enable = true;
|
||||||
|
lsp = {
|
||||||
|
enable = true;
|
||||||
|
servers = ["just-lsp"];
|
||||||
|
};
|
||||||
|
treesitter.enable = true;
|
||||||
|
}
|
||||||
13
modules/aspects/_editor/nvf/lsp/languages/toml.nix
Normal file
13
modules/aspects/_editor/nvf/lsp/languages/toml.nix
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
# toml
|
||||||
|
enable = true;
|
||||||
|
lsp = {
|
||||||
|
enable = true;
|
||||||
|
servers = ["taplo"];
|
||||||
|
};
|
||||||
|
format = {
|
||||||
|
enable = true;
|
||||||
|
type = ["taplo"];
|
||||||
|
};
|
||||||
|
treesitter.enable = true;
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,12 @@
|
||||||
grammars = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
|
grammars = with pkgs.vimPlugins.nvim-treesitter.builtGrammars; [
|
||||||
nix
|
nix
|
||||||
lua
|
lua
|
||||||
|
markdown
|
||||||
|
html
|
||||||
|
python
|
||||||
yaml
|
yaml
|
||||||
|
toml
|
||||||
|
just
|
||||||
];
|
];
|
||||||
fold = true;
|
fold = true;
|
||||||
highlight = {
|
highlight = {
|
||||||
6
modules/aspects/_git/default.nix
Normal file
6
modules/aspects/_git/default.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./git.nix
|
||||||
|
./gh.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
5
modules/aspects/_secrets/default.nix
Normal file
5
modules/aspects/_secrets/default.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./sops.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
sops = {
|
sops = {
|
||||||
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
||||||
|
|
||||||
defaultSopsFile = ../secrets/poby.yaml;
|
defaultSopsFile = config.repo.user.secretFile;
|
||||||
|
|
||||||
secrets = {
|
secrets = {
|
||||||
"github_ssh_key" = {};
|
"github_ssh_key" = {};
|
||||||
6
modules/aspects/_shell/default.nix
Normal file
6
modules/aspects/_shell/default.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./zsh.nix
|
||||||
|
./starship.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
5
modules/aspects/_ssh/default.nix
Normal file
5
modules/aspects/_ssh/default.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./ssh.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
5
modules/aspects/_terminal/default.nix
Normal file
5
modules/aspects/_terminal/default.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./terminal.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
31
modules/aspects/activation.nix
Normal file
31
modules/aspects/activation.nix
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.activation = {
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
system.activationScripts.extraActivation.text = ''
|
||||||
|
sudo -u ${config.repo.user.name} /System/Library/PrivateFrameworks/SystemAdministration.framework/Resources/activateSettings -u
|
||||||
|
'';
|
||||||
|
|
||||||
|
system.activationScripts.applications.text = let
|
||||||
|
env = pkgs.buildEnv {
|
||||||
|
name = "system-applications";
|
||||||
|
paths = config.environment.systemPackages;
|
||||||
|
pathsToLink = ["/Applications"];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkForce ''
|
||||||
|
echo "setting up /Applications..." >&2
|
||||||
|
rm -rf /Applications/Nix\ Apps
|
||||||
|
mkdir -p /Applications/Nix\ Apps
|
||||||
|
find ${env}/Applications -maxdepth 1 -type l -exec readlink '{}' + |
|
||||||
|
while read -r src; do
|
||||||
|
app_name=$(basename "$src")
|
||||||
|
echo "copying $src" >&2
|
||||||
|
${pkgs.mkalias}/bin/mkalias "$src" "/Applications/Nix Apps/$app_name"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
33
modules/aspects/base.nix
Normal file
33
modules/aspects/base.nix
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
{lib, ...}: {
|
||||||
|
flake.modules.darwin.base = {config, ...}: {
|
||||||
|
time.timeZone = "Asia/Seoul";
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = config.repo.host.name;
|
||||||
|
computerName = config.repo.host.name;
|
||||||
|
localHostName = config.repo.host.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users."${config.repo.user.name}" = {
|
||||||
|
home = config.repo.user.homeDirectory;
|
||||||
|
description = config.repo.user.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
nix.settings.trusted-users = [config.repo.user.name];
|
||||||
|
|
||||||
|
system = {
|
||||||
|
primaryUser = config.repo.user.name;
|
||||||
|
stateVersion = config.repo.user.darwinStateVersion;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
repo.homeModules.base = {config, ...}: {
|
||||||
|
home = {
|
||||||
|
username = lib.mkDefault config.repo.user.name;
|
||||||
|
homeDirectory = lib.mkDefault config.repo.user.homeDirectory;
|
||||||
|
stateVersion = lib.mkDefault config.repo.user.homeStateVersion;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.home-manager.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
7
modules/aspects/cli-tools.nix
Normal file
7
modules/aspects/cli-tools.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.cli-tools = {
|
||||||
|
imports = [
|
||||||
|
./_cli-tools
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
159
modules/aspects/desktop.nix
Normal file
159
modules/aspects/desktop.nix
Normal file
|
|
@ -0,0 +1,159 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.desktop = {
|
||||||
|
programs.aerospace = {
|
||||||
|
enable = true;
|
||||||
|
userSettings = {
|
||||||
|
start-at-login = true;
|
||||||
|
accordion-padding = 10;
|
||||||
|
default-root-container-layout = "tiles";
|
||||||
|
default-root-container-orientation = "auto";
|
||||||
|
on-focused-monitor-changed = ["move-mouse monitor-lazy-center"];
|
||||||
|
automatically-unhide-macos-hidden-apps = false;
|
||||||
|
|
||||||
|
key-mapping = {
|
||||||
|
preset = "qwerty";
|
||||||
|
};
|
||||||
|
|
||||||
|
gaps = {
|
||||||
|
inner.horizontal = 3;
|
||||||
|
inner.vertical = 3;
|
||||||
|
outer.left = 3;
|
||||||
|
outer.bottom = 3;
|
||||||
|
outer.top = 3;
|
||||||
|
outer.right = 3;
|
||||||
|
};
|
||||||
|
|
||||||
|
mode.main.binding = {
|
||||||
|
alt-slash = "layout tiles horizontal vertical";
|
||||||
|
alt-comma = "layout accordion horizontal vertical";
|
||||||
|
alt-h = "focus left";
|
||||||
|
alt-j = "focus down";
|
||||||
|
alt-k = "focus up";
|
||||||
|
alt-l = "focus right";
|
||||||
|
alt-shift-h = "move left";
|
||||||
|
alt-shift-j = "move down";
|
||||||
|
alt-shift-k = "move up";
|
||||||
|
alt-shift-l = "move right";
|
||||||
|
alt-minus = "resize smart -50";
|
||||||
|
alt-equal = "resize smart +50";
|
||||||
|
alt-1 = "workspace 1";
|
||||||
|
alt-2 = "workspace 2";
|
||||||
|
alt-3 = "workspace 3";
|
||||||
|
alt-4 = "workspace 4";
|
||||||
|
alt-5 = "workspace 5";
|
||||||
|
alt-6 = "workspace 6";
|
||||||
|
alt-7 = "workspace 7";
|
||||||
|
alt-8 = "workspace 8";
|
||||||
|
alt-9 = "workspace 9";
|
||||||
|
alt-shift-1 = [
|
||||||
|
"move-node-to-workspace 1"
|
||||||
|
"workspace 1"
|
||||||
|
];
|
||||||
|
alt-shift-2 = [
|
||||||
|
"move-node-to-workspace 2"
|
||||||
|
"workspace 2"
|
||||||
|
];
|
||||||
|
alt-shift-3 = [
|
||||||
|
"move-node-to-workspace 3"
|
||||||
|
"workspace 3"
|
||||||
|
];
|
||||||
|
alt-shift-4 = [
|
||||||
|
"move-node-to-workspace 4"
|
||||||
|
"workspace 4"
|
||||||
|
];
|
||||||
|
alt-shift-5 = [
|
||||||
|
"move-node-to-workspace 5"
|
||||||
|
"workspace 5"
|
||||||
|
];
|
||||||
|
alt-shift-6 = [
|
||||||
|
"move-node-to-workspace 6"
|
||||||
|
"workspace 6"
|
||||||
|
];
|
||||||
|
alt-shift-7 = [
|
||||||
|
"move-node-to-workspace 7"
|
||||||
|
"workspace 7"
|
||||||
|
];
|
||||||
|
alt-shift-8 = [
|
||||||
|
"move-node-to-workspace 8"
|
||||||
|
"workspace 8"
|
||||||
|
];
|
||||||
|
alt-shift-9 = [
|
||||||
|
"move-node-to-workspace 9"
|
||||||
|
"workspace 9"
|
||||||
|
];
|
||||||
|
alt-tab = "workspace-back-and-forth";
|
||||||
|
alt-shift-tab = "move-node-to-monitor --wrap-around next";
|
||||||
|
alt-shift-semicolon = "mode service";
|
||||||
|
};
|
||||||
|
|
||||||
|
mode.service.binding = {
|
||||||
|
esc = [
|
||||||
|
"reload-config"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
r = [
|
||||||
|
"flatten-workspace-tree"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
f = [
|
||||||
|
"layout floating tiling"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
backspace = [
|
||||||
|
"close-all-windows-but-current"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
alt-shift-h = [
|
||||||
|
"join-with left"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
alt-shift-j = [
|
||||||
|
"join-with down"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
alt-shift-k = [
|
||||||
|
"join-with up"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
alt-shift-l = [
|
||||||
|
"join-with right"
|
||||||
|
"mode main"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
on-window-detected = [
|
||||||
|
{
|
||||||
|
"if".app-id = "com.apple.finder";
|
||||||
|
check-further-callbacks = true;
|
||||||
|
run = ["layout floating"];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"if".app-id = "com.apple.Notes";
|
||||||
|
check-further-callbacks = true;
|
||||||
|
run = ["layout floating"];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"if".app-id = "com.daymore.Across";
|
||||||
|
check-further-callbacks = true;
|
||||||
|
run = ["layout floating"];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"if".app-id = "com.bitwarden.desktop";
|
||||||
|
check-further-callbacks = true;
|
||||||
|
run = ["layout floating"];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"if".app-id = "org.hammerspoon.Hammerspoon";
|
||||||
|
check-further-callbacks = true;
|
||||||
|
run = ["layout floating"];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"if".app-id = "com.utmapp.UTM";
|
||||||
|
check-further-callbacks = true;
|
||||||
|
run = ["layout floating"];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
7
modules/aspects/editor.nix
Normal file
7
modules/aspects/editor.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.editor = {
|
||||||
|
imports = [
|
||||||
|
./_editor/nvf
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
17
modules/aspects/fenrir.nix
Normal file
17
modules/aspects/fenrir.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.fenrir = {
|
||||||
|
programs = {
|
||||||
|
aerospace.userSettings.workspace-to-monitor-force-assignment = {
|
||||||
|
"1" = ["secondary" "main"];
|
||||||
|
"2" = ["secondary" "main"];
|
||||||
|
"3" = ["secondary" "main"];
|
||||||
|
"4" = ["secondary" "main"];
|
||||||
|
"5" = ["secondary" "main"];
|
||||||
|
"6" = "main";
|
||||||
|
"7" = "main";
|
||||||
|
"8" = "main";
|
||||||
|
"9" = "main";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
14
modules/aspects/fonts.nix
Normal file
14
modules/aspects/fonts.nix
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.fonts = {pkgs, ...}: {
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
material-design-icons
|
||||||
|
font-awesome
|
||||||
|
pretendard
|
||||||
|
nerd-fonts.symbols-only
|
||||||
|
nerd-fonts.jetbrains-mono
|
||||||
|
nerd-fonts.d2coding
|
||||||
|
nerd-fonts.iosevka
|
||||||
|
nerd-fonts.meslo-lg
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
7
modules/aspects/git.nix
Normal file
7
modules/aspects/git.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.git = {
|
||||||
|
imports = [
|
||||||
|
./_git
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
52
modules/aspects/homebrew.nix
Normal file
52
modules/aspects/homebrew.nix
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
{inputs, ...}: {
|
||||||
|
flake.modules.darwin.homebrew = {config, ...}: {
|
||||||
|
nix-homebrew = {
|
||||||
|
enable = true;
|
||||||
|
enableRosetta = true;
|
||||||
|
user = config.repo.user.name;
|
||||||
|
taps = {
|
||||||
|
"homebrew/homebrew-core" = inputs.homebrew-core;
|
||||||
|
"homebrew/homebrew-cask" = inputs.homebrew-cask;
|
||||||
|
};
|
||||||
|
mutableTaps = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
homebrew = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
onActivation = {
|
||||||
|
autoUpdate = true;
|
||||||
|
cleanup = "zap";
|
||||||
|
};
|
||||||
|
|
||||||
|
masApps = {
|
||||||
|
KakaoTalk = 869223134;
|
||||||
|
Across = 6444851827;
|
||||||
|
Bitwarden = 1352778147;
|
||||||
|
};
|
||||||
|
|
||||||
|
taps = builtins.attrNames config.nix-homebrew.taps;
|
||||||
|
|
||||||
|
brews = [
|
||||||
|
"gemini-cli"
|
||||||
|
];
|
||||||
|
|
||||||
|
casks = [
|
||||||
|
"batfi"
|
||||||
|
"hammerspoon"
|
||||||
|
"shottr"
|
||||||
|
"arc"
|
||||||
|
"codex"
|
||||||
|
"claude-code"
|
||||||
|
"telegram"
|
||||||
|
"raycast"
|
||||||
|
"jordanbaird-ice"
|
||||||
|
"keka"
|
||||||
|
"kekaexternalhelper"
|
||||||
|
"stats"
|
||||||
|
"iina"
|
||||||
|
"utm"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
136
modules/aspects/macos-defaults.nix
Normal file
136
modules/aspects/macos-defaults.nix
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.macos-defaults = {config, ...}: {
|
||||||
|
system = {
|
||||||
|
defaults = {
|
||||||
|
loginwindow = {
|
||||||
|
GuestEnabled = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
controlcenter = {
|
||||||
|
AirDrop = false;
|
||||||
|
BatteryShowPercentage = false;
|
||||||
|
Bluetooth = false;
|
||||||
|
Display = false;
|
||||||
|
FocusModes = false;
|
||||||
|
NowPlaying = false;
|
||||||
|
Sound = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
menuExtraClock = {
|
||||||
|
Show24Hour = true;
|
||||||
|
ShowDayOfWeek = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
dock = {
|
||||||
|
autohide = true;
|
||||||
|
autohide-delay = 0.01;
|
||||||
|
autohide-time-modifier = 0.1;
|
||||||
|
mineffect = "suck";
|
||||||
|
show-recents = false;
|
||||||
|
tilesize = 50;
|
||||||
|
magnification = true;
|
||||||
|
largesize = 70;
|
||||||
|
showMissionControlGestureEnabled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
finder = {
|
||||||
|
AppleShowAllFiles = true;
|
||||||
|
AppleShowAllExtensions = true;
|
||||||
|
ShowStatusBar = true;
|
||||||
|
ShowPathbar = true;
|
||||||
|
FXPreferredViewStyle = "clmv";
|
||||||
|
FXRemoveOldTrashItems = true;
|
||||||
|
_FXEnableColumnAutoSizing = true;
|
||||||
|
_FXShowPosixPathInTitle = true;
|
||||||
|
_FXSortFoldersFirst = true;
|
||||||
|
_FXSortFoldersFirstOnDesktop = true;
|
||||||
|
FXEnableExtensionChangeWarning = false;
|
||||||
|
FXDefaultSearchScope = "SCcf";
|
||||||
|
NewWindowTarget = "Other";
|
||||||
|
NewWindowTargetPath = "${config.repo.user.homeDirectory}/Downloads";
|
||||||
|
ShowExternalHardDrivesOnDesktop = true;
|
||||||
|
ShowHardDrivesOnDesktop = true;
|
||||||
|
ShowMountedServersOnDesktop = true;
|
||||||
|
ShowRemovableMediaOnDesktop = true;
|
||||||
|
QuitMenuItem = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
trackpad = {
|
||||||
|
Clicking = true;
|
||||||
|
TrackpadRightClick = true;
|
||||||
|
TrackpadThreeFingerDrag = true;
|
||||||
|
TrackpadFourFingerHorizSwipeGesture = 2;
|
||||||
|
TrackpadFourFingerVertSwipeGesture = 2;
|
||||||
|
TrackpadPinch = true;
|
||||||
|
TrackpadThreeFingerHorizSwipeGesture = 0;
|
||||||
|
TrackpadThreeFingerVertSwipeGesture = 0;
|
||||||
|
TrackpadTwoFingerDoubleTapGesture = true;
|
||||||
|
TrackpadTwoFingerFromRightEdgeSwipeGesture = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
screensaver = {
|
||||||
|
askForPassword = true;
|
||||||
|
askForPasswordDelay = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
smb = {
|
||||||
|
NetBIOSName = config.repo.host.name;
|
||||||
|
ServerDescription = config.repo.host.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
WindowManager = {
|
||||||
|
AppWindowGroupingBehavior = true;
|
||||||
|
EnableStandardClickToShowDesktop = false;
|
||||||
|
EnableTilingByEdgeDrag = false;
|
||||||
|
EnableTilingOptionAccelerator = false;
|
||||||
|
EnableTopTilingByEdgeDrag = false;
|
||||||
|
StandardHideDesktopIcons = true;
|
||||||
|
StandardHideWidgets = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
NSGlobalDomain = {
|
||||||
|
AppleInterfaceStyle = "Dark";
|
||||||
|
AppleKeyboardUIMode = 2;
|
||||||
|
ApplePressAndHoldEnabled = false;
|
||||||
|
InitialKeyRepeat = 15;
|
||||||
|
KeyRepeat = 2;
|
||||||
|
AppleShowScrollBars = "WhenScrolling";
|
||||||
|
AppleScrollerPagingBehavior = true;
|
||||||
|
AppleEnableMouseSwipeNavigateWithScrolls = true;
|
||||||
|
AppleEnableSwipeNavigateWithScrolls = true;
|
||||||
|
AppleSpacesSwitchOnActivate = true;
|
||||||
|
NSAutomaticCapitalizationEnabled = false;
|
||||||
|
NSAutomaticDashSubstitutionEnabled = false;
|
||||||
|
NSAutomaticPeriodSubstitutionEnabled = false;
|
||||||
|
NSAutomaticQuoteSubstitutionEnabled = false;
|
||||||
|
NSAutomaticSpellingCorrectionEnabled = false;
|
||||||
|
NSNavPanelExpandedStateForSaveMode = true;
|
||||||
|
NSNavPanelExpandedStateForSaveMode2 = true;
|
||||||
|
NSTableViewDefaultSizeMode = 2;
|
||||||
|
"com.apple.keyboard.fnState" = true;
|
||||||
|
"com.apple.sound.beep.feedback" = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
CustomSystemPreferences = {
|
||||||
|
"com.apple.desktopservices" = {
|
||||||
|
DSDontWriteNetworkStores = true;
|
||||||
|
DSDontWriteUSBStores = true;
|
||||||
|
};
|
||||||
|
"com.apple.AdLib" = {
|
||||||
|
allowApplePersonalizedAdvertising = false;
|
||||||
|
};
|
||||||
|
"com.apple.ImageCapture".disableHotPlug = true;
|
||||||
|
"com.apple.dock" = {
|
||||||
|
springboard-columns = 10;
|
||||||
|
springboard-rows = 10;
|
||||||
|
ResetLaunchPad = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keyboard = {
|
||||||
|
enableKeyMapping = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
30
modules/aspects/nix-core.nix
Normal file
30
modules/aspects/nix-core.nix
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.nix-core = {
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
nix = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.nix;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
experimental-features = [
|
||||||
|
"nix-command"
|
||||||
|
"flakes"
|
||||||
|
];
|
||||||
|
substituters = ["https://nix-community.cachix.org"];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||||
|
];
|
||||||
|
builders-use-substitutes = true;
|
||||||
|
auto-optimise-store = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
gc = {
|
||||||
|
automatic = lib.mkDefault true;
|
||||||
|
options = lib.mkDefault "--delete-older-than 7d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
7
modules/aspects/secrets.nix
Normal file
7
modules/aspects/secrets.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.secrets = {
|
||||||
|
imports = [
|
||||||
|
./_secrets
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
15
modules/aspects/shell.nix
Normal file
15
modules/aspects/shell.nix
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.shell = {pkgs, ...}: {
|
||||||
|
programs.zsh.enable = true;
|
||||||
|
|
||||||
|
environment.shells = [
|
||||||
|
pkgs.zsh
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
repo.homeModules.shell = {
|
||||||
|
imports = [
|
||||||
|
./_shell
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
7
modules/aspects/ssh.nix
Normal file
7
modules/aspects/ssh.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.ssh = {
|
||||||
|
imports = [
|
||||||
|
./_ssh
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
8
modules/aspects/sudo-auth.nix
Normal file
8
modules/aspects/sudo-auth.nix
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.sudo-auth = {
|
||||||
|
security.pam.services.sudo_local = {
|
||||||
|
touchIdAuth = true;
|
||||||
|
watchIdAuth = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
16
modules/aspects/system-packages.nix
Normal file
16
modules/aspects/system-packages.nix
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{...}: {
|
||||||
|
flake.modules.darwin.system-packages = {pkgs, ...}: {
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
systemPackages = with pkgs; [
|
||||||
|
git
|
||||||
|
neovim
|
||||||
|
just
|
||||||
|
tree
|
||||||
|
fastfetchMinimal
|
||||||
|
];
|
||||||
|
variables.EDITOR = "nvim";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
7
modules/aspects/terminal.nix
Normal file
7
modules/aspects/terminal.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{...}: {
|
||||||
|
repo.homeModules.terminal = {
|
||||||
|
imports = [
|
||||||
|
./_terminal
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
70
modules/flake/darwin-configurations.nix
Normal file
70
modules/flake/darwin-configurations.nix
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
userName = config.repo.user.name;
|
||||||
|
|
||||||
|
mkDarwinConfiguration = hostName: hostConfig: let
|
||||||
|
hostContext = {
|
||||||
|
name = hostName;
|
||||||
|
system = hostConfig.system;
|
||||||
|
features = hostConfig.features;
|
||||||
|
};
|
||||||
|
|
||||||
|
darwinModules = builtins.map (feature: config.flake.modules.darwin.${feature} or {}) hostConfig.features;
|
||||||
|
homeModules = builtins.map (feature: config.repo.homeModules.${feature} or {}) hostConfig.features;
|
||||||
|
in
|
||||||
|
inputs.darwin.lib.darwinSystem {
|
||||||
|
system = hostConfig.system;
|
||||||
|
modules =
|
||||||
|
[
|
||||||
|
./darwin-context.nix
|
||||||
|
{
|
||||||
|
repo = {
|
||||||
|
user = config.repo.user;
|
||||||
|
host = hostContext;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]
|
||||||
|
++ darwinModules
|
||||||
|
++ [
|
||||||
|
inputs.nix-homebrew.darwinModules.nix-homebrew
|
||||||
|
inputs.home-manager.darwinModules.home-manager
|
||||||
|
{
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
backupFileExtension = "backup";
|
||||||
|
sharedModules = [
|
||||||
|
inputs.nvf.homeManagerModules.nvf
|
||||||
|
inputs.sops-nix.homeManagerModules.sops
|
||||||
|
./home-context.nix
|
||||||
|
];
|
||||||
|
users.${userName}.imports =
|
||||||
|
[
|
||||||
|
{
|
||||||
|
repo = {
|
||||||
|
user = {
|
||||||
|
inherit
|
||||||
|
(config.repo.user)
|
||||||
|
name
|
||||||
|
email
|
||||||
|
homeDirectory
|
||||||
|
homeStateVersion
|
||||||
|
secretFile
|
||||||
|
;
|
||||||
|
};
|
||||||
|
host = hostContext;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
]
|
||||||
|
++ homeModules;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
flake.darwinConfigurations = lib.mapAttrs mkDarwinConfiguration config.repo.hosts;
|
||||||
|
}
|
||||||
39
modules/flake/darwin-context.nix
Normal file
39
modules/flake/darwin-context.nix
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
{lib, ...}: let
|
||||||
|
inherit (lib) mkOption;
|
||||||
|
types = lib.types;
|
||||||
|
in {
|
||||||
|
options.repo = {
|
||||||
|
user = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
email = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
homeDirectory = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
homeStateVersion = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
darwinStateVersion = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
secretFile = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
host = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
system = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
features = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
6
modules/flake/default.nix
Normal file
6
modules/flake/default.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{...}: {
|
||||||
|
imports = [
|
||||||
|
./options.nix
|
||||||
|
./darwin-configurations.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
36
modules/flake/home-context.nix
Normal file
36
modules/flake/home-context.nix
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
{lib, ...}: let
|
||||||
|
inherit (lib) mkOption;
|
||||||
|
types = lib.types;
|
||||||
|
in {
|
||||||
|
options.repo = {
|
||||||
|
user = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
email = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
homeDirectory = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
homeStateVersion = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
secretFile = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
host = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
system = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
features = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
60
modules/flake/options.nix
Normal file
60
modules/flake/options.nix
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkDefault mkOption;
|
||||||
|
types = lib.types;
|
||||||
|
in {
|
||||||
|
options.repo = {
|
||||||
|
user = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
email = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
homeDirectory = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
homeStateVersion = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
darwinStateVersion = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
secretFile = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hosts = mkOption {
|
||||||
|
type = types.attrsOf (types.submodule {
|
||||||
|
options = {
|
||||||
|
system = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
features = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
homeModules = mkOption {
|
||||||
|
type = types.lazyAttrsOf types.deferredModule;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config.repo.user = {
|
||||||
|
name = mkDefault "poby";
|
||||||
|
email = mkDefault "smg981024@gmail.com";
|
||||||
|
homeDirectory = mkDefault "/Users/${config.repo.user.name}";
|
||||||
|
homeStateVersion = mkDefault "25.11";
|
||||||
|
darwinStateVersion = mkDefault 6;
|
||||||
|
secretFile = mkDefault ../../secrets/poby.yaml;
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue