From 248170c877d0643e6d8d07ef92f9fcf63f32384c Mon Sep 17 00:00:00 2001 From: Sangmin Kim Date: Wed, 4 Mar 2026 18:02:39 +0900 Subject: [PATCH] feat: nix-darwin-kickstarter minimal --- .DS_Store | Bin 6148 -> 0 bytes flake.lock | 63 ----------------- flake.nix | 33 ++++----- modules/.DS_Store | Bin 6148 -> 0 bytes modules/apps.nix | 99 ++++---------------------- modules/host-users.nix | 15 +--- modules/nix-core.nix | 32 +++++---- modules/system.nix | 157 +++++++++++++++++------------------------ result | 1 - 9 files changed, 111 insertions(+), 289 deletions(-) delete mode 100644 .DS_Store delete mode 100644 flake.lock delete mode 100644 modules/.DS_Store delete mode 120000 result diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 29d63c76efe089fad48c536e80e79c78124ec02e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8zEL;p&0Z1N%F(jFwBAg)ez-FW}=rQCmWHMBE=0N2} zsnHM^4S~TM0-(Ih$&kj7!;r|3&484D^OKWu@{^!N!+Hh=2EG4a0QL$yLoP!;LkdGF zLk>eKLvd1haRF5Ij--N|%;FLQgKLaT%q*;I?ChNE-0ZQz8TsYGC5a`a#ZHMu(I8$( zetu38jGdSimYG@}FCgNapI4HYnU`7wQWBh*lA4rQ6ce7Amy%!ZlwX>cQViA$mEh#$ z;EWfLsIE3Kw9rv7H#ex&QK+^wGSE>lu{5f!<>U}m*0&Cd&(6us%kKian}LxLLNo9} zX&BYbz`%g!tCZs8oTU7Ga7l(Hm6L85oSdIq0Mm`BIXBM!k>%}C z-;RdBXb2Dy0-*9i0a~RvKw=SYXC6g8KmsAUTj$5Dn4_qCr|2 z7(pzs8DOmpj8LtN;BE*=AE-+LqQTl37#YCY85kMB+Tj&ABSbp`Bh+R_Xb*)EqMd;e zqMd;eq8;YEQF=54MneD^0?ZIv0960GGBDuk|3g%blA|Fo8Un*I1Q=Odf?b@zl`?k! zf$CaNeVPE32G#zc>X;E!Peb&9lz?TKAOngLU=BnMq!m={gR5dj21rdl+7N(+&?r3` I0`w070QpRe&Hw-a diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 70619e6..0000000 --- a/flake.lock +++ /dev/null @@ -1,63 +0,0 @@ -{ - "nodes": { - "darwin": { - "inputs": { - "nixpkgs": [ - "nixpkgs-darwin" - ] - }, - "locked": { - "lastModified": 1758102940, - "narHash": "sha256-wwqf3+A8EiqwWpcAaPN20QXJLlpGPpwtLTrzgnngI2o=", - "owner": "lnl7", - "repo": "nix-darwin", - "rev": "ebd0bfc11fc2b5cff37401e9b3703881ad5fabbd", - "type": "github" - }, - "original": { - "owner": "lnl7", - "repo": "nix-darwin", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1758262103, - "narHash": "sha256-aBGl3XEOsjWw6W3AHiKibN7FeoG73dutQQEqnd/etR8=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "12bd230118a1901a4a5d393f9f56b6ad7e571d01", - "type": "github" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs-darwin": { - "locked": { - "lastModified": 1758262103, - "narHash": "sha256-aBGl3XEOsjWw6W3AHiKibN7FeoG73dutQQEqnd/etR8=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "12bd230118a1901a4a5d393f9f56b6ad7e571d01", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "darwin": "darwin", - "nixpkgs": "nixpkgs", - "nixpkgs-darwin": "nixpkgs-darwin" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix index 63f48c5..84db232 100644 --- a/flake.nix +++ b/flake.nix @@ -1,29 +1,21 @@ { - description = "Nix for macOS configuration"; + description = "Nix for Poby's MacOS"; - ################################################################################################################## - # - # Want to know Nix in details? Looking for a beginner-friendly tutorial? - # Check out https://github.com/ryan4yin/nixos-and-flakes-book ! - # - ################################################################################################################## + nixConfig = { + substituters = [ "https://cache.nixos.org" ]; + }; - # This is the standard format for flake.nix. `inputs` are the dependencies of the flake, - # Each item in `inputs` will be passed as a parameter to the `outputs` function after being pulled and built. - inputs = { - nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-unstable"; - # nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-24.05-darwin"; + inputs = let + stableVersion = "25.11"; # FIXME to bump to latest stable version + in { + # nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-unstable"; # comment out for unstable version + nixpkgs-darwin.url = "github:nixos/nixpkgs/nixpkgs-${stableVersion}-darwin"; darwin = { - url = "github:lnl7/nix-darwin"; + url = "github:lnl7/nix-darwin/nix-darwin-${stableVersion}"; inputs.nixpkgs.follows = "nixpkgs-darwin"; }; }; - # The `outputs` function will return all the build results of the flake. - # A flake can have many use cases and different types of outputs, - # parameters in `outputs` are defined in `inputs` and can be referenced by their names. - # However, `self` is an exception, this special parameter points to the `outputs` itself (self-reference) - # The `@` syntax here is used to alias the attribute set of the inputs's parameter, making it convenient to use inside the function. outputs = inputs @ { self, nixpkgs, @@ -32,7 +24,7 @@ }: let username = "poby"; system = "aarch64-darwin"; - hostname = "pobys-macbook-pro"; + hostname = "fenrir"; # TODO break down to multiple hosts specialArgs = inputs @@ -49,7 +41,6 @@ ./modules/host-users.nix ]; }; - # nix code formatter formatter.${system} = nixpkgs.legacyPackages.${system}.alejandra; }; -} \ No newline at end of file +} diff --git a/modules/.DS_Store b/modules/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmZQzU|@7AO)+F(5MW?n;9!8z45|!R0Z1N%F(jFgL>QrFAPJ2!M?+vV1V%$(Gz3ON zU^D~25V%SxcdJP zRior+2#kinunYl47MEZbCs3t{!+W4QHvuXKVuPw;Mo^s$(F3lEVT}ML$bg~*R5_@+ b2Uo?6kTwK}57Iu`5P${HC_Nei0}uiLNUI8I diff --git a/modules/apps.nix b/modules/apps.nix index e41b251..0881f28 100644 --- a/modules/apps.nix +++ b/modules/apps.nix @@ -1,116 +1,46 @@ { pkgs, ... }: { - ########################################################################## - # - # Install all apps and packages here. - # - ########################################################################## - - # Install packages from nix's official package repository. - # - # The packages installed here are available to all users, and are reproducible across machines, and are rollbackable. - # But on macOS, it's less stable than homebrew. - # - # Related Discussion: https://discourse.nixos.org/t/darwin-again/29331 environment.systemPackages = with pkgs; [ - # CLI git just # use Justfile to simplify nix-darwin's commands - ffmpeg - fzf - bat - fastfetch - gh - lsd - mkalias - python310 - tldr - tmux - tree - zoxide - zsh-powerlevel10k - zsh-fzf-tab - commitizen + vim + curl ]; - environment.variables.EDITOR = "nvim"; - # TODO To make this work, homebrew need to be installed manually, see https://brew.sh - # - # The apps installed by homebrew are not managed by nix, and not reproducible! - # But on macOS, homebrew has a much larger selection of apps than nixpkgs, especially for GUI apps! homebrew = { enable = true; onActivation = { - autoUpdate = true; # Fetch the newest stable branch of Homebrew's git repo - upgrade = true; # Upgrade outdated casks, formulae, and App Store apps - # 'zap': uninstalls all formulae(and related files) not listed in the generated Brewfile + autoUpdate = true; cleanup = "zap"; }; # Applications to install from Mac App Store using mas. - # You need to install all these Apps manually first so that your apple account have records for them. - # otherwise Apple Store will refuse to install them. - # For details, see https://github.com/mas-cli/mas masApps = { KakaoTalk = 869223134; Across = 6444851827; - Flighty = 1358823008; - Numbers = 409203825; - Pages = 409201541; - Keynote = 409183694; Bitwarden = 1352778147; }; taps = [ ]; - # `brew install` + # WARNING only include those not in nixpkgs brews = [ - "wget" - "curl" # do not install curl via nixpkgs, it's not working well on macOS! - "nvm" - "uv" - "openjdk" - "openjdk@21" - "openjdk@17" - "neovim" - "ripgrep" - "tree-sitter" + # "neovim" + # "ripgrep" + # "fd" ]; - # `brew install --cask` casks = [ - "alt-tab" - "bruno" - "discord" - "google-chrome" - "iina" - "intellij-idea" - "jordanbaird-ice" - "keka" - "raycast" - "rectangle" - "slack" - "stats" - "telegram" - "visual-studio-code" - "zoom" - "claude" "batfi" - "docker-desktop" - "cursor" - "daisydisk" - "ghostty" "hammerspoon" - "hancom-docs" - "logi-options+" - "notion" - "onyx" - "shottr" - "arc" - "obsidian" - "antigravity" - "figma" + # "google-chrome" + # "iina" + # "jordanbaird-ice" + # "keka" + # "shottr" + # "raycast" + # "stats" # Fonts "font-fontawesome" @@ -121,6 +51,7 @@ "font-symbols-only-nerd-font" "font-material-design-icons-webfont" "font-pretendard" + "font-maple-mono-nf" ]; }; } diff --git a/modules/host-users.nix b/modules/host-users.nix index 079befd..0276164 100644 --- a/modules/host-users.nix +++ b/modules/host-users.nix @@ -1,23 +1,12 @@ -{ - username, - hostname, - ... -} @ args: -############################################################# -# -# Host & Users configuration -# -############################################################# +{ username, hostname, ... }: { networking.hostName = hostname; networking.computerName = hostname; - system.defaults.smb.NetBIOSName = hostname; - # Define a user account. Don't forget to set a password with ‘passwd’. users.users."${username}" = { home = "/Users/${username}"; description = username; }; - nix.settings.trusted-users = [username]; + nix.settings.trusted-users = [ username ]; } diff --git a/modules/nix-core.nix b/modules/nix-core.nix index 721ee99..5463f09 100644 --- a/modules/nix-core.nix +++ b/modules/nix-core.nix @@ -1,20 +1,22 @@ -{ pkgs, ... }: - +{ pkgs, lib, ... }: { - nix.settings = { - # enable flakes globally - experimental-features = ["nix-command" "flakes"]; + 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-user-substitutes = true; + auto-optimise-store = false; # issue https://github.com/NixOS/nix/issues/7273 + }; }; - # Allow unfree packages - nixpkgs.config = { - allowUnfree = true; - allowBroken = true; + gc = { + automatic = lib.mkDefault true; + options = lib.mkDefault "--delete-older-than 7d"; }; - - # Auto upgrade nix package and the daemon service. - nix.package = pkgs.nix; - - # Enable Determinate - nix.enable = false; } diff --git a/modules/system.nix b/modules/system.nix index f41a4d2..70e914f 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -1,21 +1,10 @@ -{ pkgs, config, username, ... }: +{ pkgs, config, username, hostname, ... }: - ################################################################################### - # - # macOS's System configuration - # - # All the configuration options are documented here: - # https://daiderd.com/nix-darwin/manual/index.html#sec-options - # Incomplete list of macOS `defaults` commands : - # https://github.com/yannbertrand/macos-defaults - # - ################################################################################### { system = { primaryUser = username; stateVersion = 6; - # activationScripts are executed every time you boot the system or run `nixos-rebuild` / `darwin-rebuild`. 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. @@ -30,26 +19,24 @@ }; 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 - ''; + # 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 = { - # login window + loginwindow = { - GuestEnabled = false; # disable guest user - SHOWFULLNAME = true; # show full name in login window + GuestEnabled = false; }; - # control center controlcenter = { Sound = false; Bluetooth = false; @@ -58,14 +45,11 @@ NowPlaying = false; }; - # clock menuExtraClock = { Show24Hour = true; - ShowAMPM = false; ShowDayOfWeek = false; }; - - # dock + dock = { autohide = true; autohide-delay = 0.01; @@ -75,38 +59,69 @@ tilesize = 50; magnification = true; largesize = 70; - wvous-bl-corner = 11; + showMissionControlGestureEnabled = true; }; - # finder finder = { AppleShowAllFiles = true; + AppleShowAllExtensions = true; ShowStatusBar = true; ShowPathbar = true; - FXPreferredViewStyle = "Nlsv"; - AppleShowAllExtensions = true; - QuitMenuItem = true; + FXPreferredViewStyle = "clmv"; + FXRemoveOldTrashItems = true; + _FXEnableColumnAutoSizing = true; _FXShowPosixPathInTitle = true; _FXSortFoldersFirst = true; + _FXSortFoldersFirstOnDesktop = true; FXEnableExtensionChangeWarning = false; - NewWindowTarget = "Home"; + FXDefaultSearchScope = "SCcf"; + NewWindowTarget = "Other"; + NewWindowTargetPath = "/Users/${username}/Downloads"; + ShowExternalHardDrivesOnDesktop = true; + ShowHardDrivesOnDesktop = true; + ShowMountedServersOnDesktop = true; + ShowRemovableMediaOnDesktop = true; + QuitMenuItem = true; }; - # trackpad trackpad = { Clicking = true; - TrackpadRightClick = true; # enable two finger right click - TrackpadThreeFingerDrag = true; # enable three finger drag + 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; + TrackpadThreeFingerHorizSwipGesture = 0; # disable for three finger drag + TrackpadThreeFingerVertSwipeGesture = 0; # disable for three finger drag + TrackpadTwoFingerDoubleTapGesture = true; # smart zoom + TrackpadTwoFingerFromRightEdgeSwipeGesture = 0; }; - # customize settings that not supported by nix-darwin directly - # Incomplete list of macOS `defaults` commands : - # https://github.com/yannbertrand/macos-defaults + 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 = { - # `defaults read NSGlobalDomain "xxx"` - "com.apple.swipescrolldirection" = true; AppleInterfaceStyle = "Dark"; - AppleKeyboardUIMode = 3; + AppleKeyboardUIMode = 2; ApplePressAndHoldEnabled = false; InitialKeyRepeat = 15; KeyRepeat = 2; @@ -115,6 +130,7 @@ AppleScrollerPagingBehavior = true; AppleEnableMouseSwipeNavigateWithScrolls = true; AppleEnableSwipeNavigateWithScrolls = true; + AppleSpacesSwitchOnActivate = true; NSAutomaticCapitalizationEnabled = false; NSAutomaticDashSubstitutionEnabled = false; @@ -129,46 +145,11 @@ }; # Customize settings that not supported by nix-darwin directly - # see the source code of this project to get more undocumented options: - # https://github.com/rgcr/m-cli - # - # All custom entries can be found by running `defaults read` command. - # or `defaults read xxx` to read a specific domain. - CustomUserPreferences = { - ".GlobalPreferences" = { - # automatically switch to a new space when switching to the application - AppleSpacesSwitchOnActivate = true; - }; - NSGlobalDomain = { - # Add a context menu item for showing the Web Inspector in web views - WebKitDeveloperExtras = true; - }; - "com.apple.finder" = { - ShowExternalHardDrivesOnDesktop = true; - ShowHardDrivesOnDesktop = true; - ShowMountedServersOnDesktop = true; - ShowRemovableMediaOnDesktop = true; - _FXSortFoldersFirst = true; - # When performing a search, search the current folder by default - FXDefaultSearchScope = "SCcf"; - }; + CustomSystemPreferences = { "com.apple.desktopservices" = { - # Avoid creating .DS_Store files on network or USB volumes DSDontWriteNetworkStores = true; DSDontWriteUSBStores = true; }; - "com.apple.WindowManager" = { - EnableStandardClickToShowDesktop = 0; # Click wallpaper to reveal desktop - StandardHideDesktopIcons = 0; # Show items on desktop - HideDesktop = 0; # Do not hide items on desktop & stage manager - StageManagerHideWidgets = 0; - StandardHideWidgets = 0; - }; - "com.apple.screensaver" = { - # Require password immediately after sleep or screen saver begins - askForPassword = 1; - askForPasswordDelay = 0; - }; "com.apple.AdLib" = { allowApplePersonalizedAdvertising = false; }; @@ -182,15 +163,8 @@ }; }; - # keyboard settings is not very useful on macOS - # the most important thing is to remap option key to alt key globally, - # but it's not supported by macOS yet. keyboard = { enableKeyMapping = true; # enable key mapping so that we can use `option` as `control` - - # NOTE: do NOT support remap capslock to both control and escape at the same time - remapCapsLockToControl = false; # remap caps lock to control, useful for emac users - remapCapsLockToEscape = false; # remap caps lock to escape, useful for vim users }; }; @@ -208,9 +182,8 @@ enableFzfGit = true; enableFzfHistory = true; promptInit = '' - fastfetch - source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme - source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh + source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme + source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh ''; }; diff --git a/result b/result deleted file mode 120000 index 6007f38..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/wqavdqq4f3j9gwymsj724hz9jkjwa3gf-darwin-system-25.05.73d5958 \ No newline at end of file