Initial commit

This commit is contained in:
Sangmin Kim 2025-04-04 05:25:20 +09:00
commit 6c503c465b
9 changed files with 493 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

63
flake.lock generated Normal file
View file

@ -0,0 +1,63 @@
{
"nodes": {
"darwin": {
"inputs": {
"nixpkgs": [
"nixpkgs-darwin"
]
},
"locked": {
"lastModified": 1743496612,
"narHash": "sha256-emPWa5lmKbnyuj8c1mSJUkzJNT+iJoU9GMcXwjp2oVM=",
"owner": "lnl7",
"repo": "nix-darwin",
"rev": "73d59580d01e9b9f957ba749f336a272869c42dd",
"type": "github"
},
"original": {
"owner": "lnl7",
"repo": "nix-darwin",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1743568003,
"narHash": "sha256-ZID5T65E8ruHqWRcdvZLsczWDOAWIE7om+vQOREwiX0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b7ba7f9f45c5cd0d8625e9e217c28f8eb6a19a76",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs-darwin": {
"locked": {
"lastModified": 1743568003,
"narHash": "sha256-ZID5T65E8ruHqWRcdvZLsczWDOAWIE7om+vQOREwiX0=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "b7ba7f9f45c5cd0d8625e9e217c28f8eb6a19a76",
"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
}

56
flake.nix Normal file
View file

@ -0,0 +1,56 @@
{
description = "Nix for macOS configuration";
##################################################################################################################
#
# Want to know Nix in details? Looking for a beginner-friendly tutorial?
# Check out https://github.com/ryan4yin/nixos-and-flakes-book !
#
##################################################################################################################
# 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";
darwin = {
url = "github:lnl7/nix-darwin";
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,
darwin,
...
}: let
# TODO replace with your own username, system and hostname
username = "poby";
system = "aarch64-darwin";
hostname = "pobys-macbook-pro";
specialArgs =
inputs
// {
inherit username hostname;
};
in {
darwinConfigurations."${hostname}" = darwin.lib.darwinSystem {
inherit system specialArgs;
modules = [
./modules/nix-core.nix
./modules/system.nix
./modules/apps.nix
./modules/host-users.nix
];
};
# nix code formatter
formatter.${system} = nixpkgs.legacyPackages.${system}.alejandra;
};
}

BIN
modules/.DS_Store vendored Normal file

Binary file not shown.

109
modules/apps.nix Normal file
View file

@ -0,0 +1,109 @@
{ pkgs, ... }: {
##########################################################################
#
# Install all apps and packages here.
#
# TODO Fell free to modify this file to fit your needs.
#
##########################################################################
# 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
neovim
git
just # use Justfile to simplify nix-darwin's commands
nodejs-slim
ffmpeg
fzf
bat
fastfetch
gh
lsd
jdk
jdk17
jdk11
mkalias
python310
tldr
tmux
tree
zoxide
# GUI
alt-tab-macos
bitwarden-desktop
bruno
discord
pretendard
google-chrome
iina
jetbrains.idea-ultimate
ice-bar
keka
postman
raycast
rectangle
slack
stats
telegram-desktop
vscode
zoom-us
];
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
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;
};
taps = [ ];
# `brew install`
brews = [
"wget"
"curl" # do not install curl via nixpkgs, it's not working well on macOS!
];
# `brew install --cask`
casks = [
"claude"
"docker"
"daisydisk"
"ghostty"
"hammerspoon"
"hancom-docs"
"logi-options+"
"notion"
"onyx"
"readdle-spark"
"shottr"
"zen-browser"
];
};
}

23
modules/host-users.nix Normal file
View file

@ -0,0 +1,23 @@
{
username,
hostname,
...
} @ args:
#############################################################
#
# Host & Users configuration
#
#############################################################
{
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];
}

20
modules/nix-core.nix Normal file
View file

@ -0,0 +1,20 @@
{ pkgs, ... }:
{
nix.settings = {
# enable flakes globally
experimental-features = ["nix-command" "flakes"];
};
# Allow unfree packages
nixpkgs.config = {
allowUnfree = true;
allowBroken = true;
};
# Auto upgrade nix package and the daemon service.
nix.package = pkgs.nix;
# Enable Determinate
nix.enable = false;
}

221
modules/system.nix Normal file
View file

@ -0,0 +1,221 @@
{ pkgs, config, ... }:
###################################################################################
#
# 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 = {
stateVersion = 5;
# activationScripts are executed every time you boot the system or run `nixos-rebuild` / `darwin-rebuild`.
activationScripts.postUserActivation.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.
/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 = {
# login window
loginwindow = {
GuestEnabled = false; # disable guest user
SHOWFULLNAME = true; # show full name in login window
};
# control center
controlcenter = {
Sound = false;
Bluetooth = false;
AirDrop = false;
Display = false;
NowPlaying = false;
};
# clock
menuExtraClock = {
Show24Hour = true;
ShowAMPM = false;
ShowDayOfWeek = false;
};
# dock
dock = {
autohide = true;
autohide-delay = 0.01;
autohide-time-modifier = 0.1;
mineffect = "suck";
show-recents = false;
tilesize = 50;
magnification = true;
largesize = 70;
wvous-bl-corner = 11;
};
# finder
finder = {
AppleShowAllFiles = true;
ShowStatusBar = true;
ShowPathbar = true;
FXPreferredViewStyle = "Nlsv";
AppleShowAllExtensions = true;
QuitMenuItem = true;
_FXShowPosixPathInTitle = true;
_FXSortFoldersFirst = true;
FXEnableExtensionChangeWarning = false;
NewWindowTarget = "Home";
};
# trackpad
trackpad = {
Clicking = true;
TrackpadRightClick = true; # enable two finger right click
TrackpadThreeFingerDrag = true; # enable three finger drag
};
# customize settings that not supported by nix-darwin directly
# Incomplete list of macOS `defaults` commands :
# https://github.com/yannbertrand/macos-defaults
NSGlobalDomain = {
# `defaults read NSGlobalDomain "xxx"`
"com.apple.swipescrolldirection" = true;
AppleInterfaceStyle = "Dark";
AppleKeyboardUIMode = 3;
ApplePressAndHoldEnabled = false;
InitialKeyRepeat = 15;
KeyRepeat = 2;
AppleShowScrollBars = "WhenScrolling";
AppleScrollerPagingBehavior = true;
NSAutomaticCapitalizationEnabled = false;
NSAutomaticDashSubstitutionEnabled = false;
NSAutomaticPeriodSubstitutionEnabled = false;
NSAutomaticQuoteSubstitutionEnabled = false;
NSAutomaticSpellingCorrectionEnabled = false;
NSNavPanelExpandedStateForSaveMode = true;
NSNavPanelExpandedStateForSaveMode2 = true;
NSTableViewDefaultSizeMode = 2;
"com.apple.keyboard.fnState" = true;
};
# 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";
};
"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;
};
# 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 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
};
};
# Add ability to used TouchID for sudo authentication
security.pam.services.sudo_local.touchIdAuth = true;
# Create /etc/zshrc that loads the nix-darwin environment.
# this is required if you want to use darwin's default shell - zsh
programs.zsh.enable = true;
environment.shells = [
pkgs.zsh
];
# Set your time zone.
time.timeZone = "Asia/Seoul";
# Fonts
fonts = {
packages = with pkgs; [
# icon fonts
material-design-icons
font-awesome
# nerdfonts
nerd-fonts.symbols-only
nerd-fonts.meslo-lg
nerd-fonts.d2coding
nerd-fonts.fira-code
nerd-fonts.jetbrains-mono
];
};
}

1
result Symbolic link
View file

@ -0,0 +1 @@
/nix/store/wqavdqq4f3j9gwymsj724hz9jkjwa3gf-darwin-system-25.05.73d5958