aboutsummaryrefslogtreecommitdiffstats
path: root/modules/darwin
diff options
context:
space:
mode:
authorCopilot <198982749+Copilot@users.noreply.github.com>2026-03-01 18:56:27 +0100
committerGitHub <noreply@github.com>2026-03-01 18:56:27 +0100
commit011486787f639f2d2474bbaf5a6ef3d77fb45a43 (patch)
treec443f2c41053e2ed7599e9e676302dfa30dc89d4 /modules/darwin
parenteb7c55e9dc97524cca7c5b6a268cd66af147b12e (diff)
downloaddotfiles-011486787f639f2d2474bbaf5a6ef3d77fb45a43.tar.gz
dotfiles-011486787f639f2d2474bbaf5a6ef3d77fb45a43.zip
Refactor dotfiles to declarative Nix management (nix-darwin + home-manager) (#5)
Diffstat (limited to 'modules/darwin')
-rw-r--r--modules/darwin/default.nix27
-rw-r--r--modules/darwin/homebrew.nix191
-rw-r--r--modules/darwin/macos.nix139
3 files changed, 357 insertions, 0 deletions
diff --git a/modules/darwin/default.nix b/modules/darwin/default.nix
new file mode 100644
index 0000000..5474b91
--- /dev/null
+++ b/modules/darwin/default.nix
@@ -0,0 +1,27 @@
+{ pkgs, ... }:
+
+{
+ imports = [
+ ./homebrew.nix
+ ./macos.nix
+ ];
+
+ # Enable experimental Nix features
+ nix.settings.experimental-features = "nix-command flakes";
+
+ # Allow unfree packages
+ nixpkgs.config.allowUnfree = true;
+
+ # System state version – do not change after first installation
+ system.stateVersion = 5;
+
+ # Enable Touch ID for sudo
+ security.pam.enableSudoTouchIdAuth = true;
+
+ # Core system packages available to all users
+ environment.systemPackages = with pkgs; [
+ curl
+ git
+ wget
+ ];
+}
diff --git a/modules/darwin/homebrew.nix b/modules/darwin/homebrew.nix
new file mode 100644
index 0000000..3c3f469
--- /dev/null
+++ b/modules/darwin/homebrew.nix
@@ -0,0 +1,191 @@
+{ ... }:
+
+{
+ homebrew = {
+ enable = true;
+
+ onActivation = {
+ autoUpdate = true;
+ upgrade = true;
+ cleanup = "zap";
+ };
+
+ taps = [
+ "bramstein/webfonttools"
+ "danielgtaylor/restish"
+ "oven-sh/bun"
+ "pulumi/tap"
+ "go-task/tap"
+ "tursodatabase/tap"
+ "yakitrak/yakitrak"
+ "simenandre/tools"
+ ];
+
+ brews = [
+ # Editors and terminal multiplexers
+ "neovim"
+ "tmux"
+
+ # Shells and shell utilities
+ "zsh"
+ "bash"
+ "bash-completion"
+ "ghq"
+ "moreutils"
+
+ # GNU tools
+ "findutils"
+ "gnu-sed"
+ "grep"
+
+ # Networking tools
+ "openssh"
+ "nmap"
+ "wget"
+
+ # Security and encryption
+ "gnupg"
+ "git-secret"
+ "ssh-copy-id"
+
+ # Compression libraries and tools
+ "lz4"
+ "zlib"
+ "zstd"
+ "libffi"
+ "p7zip"
+ "pigz"
+ "zopfli"
+
+ # Programming languages and runtimes
+ "golang"
+ "golangci-lint"
+ "python@3.11"
+ "rust"
+ "zig"
+ "pkl"
+
+ # Font tools
+ "sfnt2woff"
+ "sfnt2woff-zopfli"
+ "woff2"
+
+ # JavaScript runtimes and package managers
+ "bun"
+ "pnpm"
+ "volta"
+ "corepack"
+ "deno"
+
+ # REST API clients
+ "danielgtaylor/restish/restish"
+
+ # Version control
+ "git"
+ "git-lfs"
+ "lazygit"
+ "microplane"
+
+ # Search tools
+ "ripgrep"
+ "ack"
+ "fzf"
+
+ # JSON/YAML processing tools
+ "jq"
+ "yq"
+
+ # Cloud and IaC tools
+ "pulumi"
+ "crd2pulumi"
+ "kube2pulumi"
+ "pulumictl"
+ "tf2pulumi"
+ "azure-cli"
+ "kubectl"
+ "helm"
+ "cilium-cli"
+ "doctl"
+ "flyctl"
+
+ # Container tools
+ "podman"
+ "podman-compose"
+
+ # Task runners and automation
+ "go-task"
+ "act"
+
+ # Databases and database tools
+ "turso"
+ "libpq"
+ "sqld"
+
+ # Terminal tools
+ "pv"
+ "rename"
+ "rlwrap"
+ "tree"
+ "screen"
+ "vbindiff"
+ "tmate"
+ "asciinema"
+ "dasel"
+ "tldr"
+ "starship"
+ "gh"
+
+ # HTTP and web servers
+ "caddy"
+ "goreleaser"
+
+ # Specific toolsets
+ "whalebrew"
+ "gd"
+ "ghostscript"
+ "rclone"
+ "graphviz"
+
+ # Mac App Store CLI
+ "mas"
+ ];
+
+ casks = [
+ "spotify"
+ "slack"
+ "sonos"
+ "figma"
+ "discord"
+ "grammarly"
+ "microsoft-remote-desktop"
+ "postico"
+ "cyberduck"
+ "adobe-creative-cloud"
+ "1password-cli"
+ "protonvpn"
+ "openvpn-connect"
+ "raycast"
+ "rectangle"
+ "google-chrome"
+ "google-drive"
+ "karabiner-elements"
+ "postman"
+ "ghostty"
+ "proton-mail"
+ "claude"
+ "font-symbols-only-nerd-font"
+ "font-jetbrains-mono"
+ "google-cloud-sdk"
+ "docker"
+ "podman-desktop"
+ "microsoft-teams"
+ "zoom"
+ "obsidian"
+ ];
+
+ masApps = {
+ "Outline" = 1356178125;
+ "Remote Desktop" = 409907375;
+ };
+ };
+}
diff --git a/modules/darwin/macos.nix b/modules/darwin/macos.nix
new file mode 100644
index 0000000..8927903
--- /dev/null
+++ b/modules/darwin/macos.nix
@@ -0,0 +1,139 @@
+{ ... }:
+
+{
+ system.defaults = {
+ NSGlobalDomain = {
+ # Sidebar icon size: medium
+ NSTableViewDefaultSizeMode = 2;
+ # Always show scrollbars
+ AppleShowScrollBars = "Always";
+ # Expand save panel by default
+ NSNavPanelExpandedStateForSaveMode = true;
+ NSNavPanelExpandedStateForSaveMode2 = true;
+ # Expand print panel by default
+ PMPrintingExpandedStateForPrint = true;
+ PMPrintingExpandedStateForPrint2 = true;
+ # Save to disk (not to iCloud) by default
+ NSDocumentSaveNewDocumentsToCloud = false;
+ # Disable auto-correct
+ NSAutomaticSpellingCorrectionEnabled = false;
+ # Font smoothing
+ AppleFontSmoothing = 1;
+ };
+
+ dock = {
+ # Minimize windows into their application's icon
+ minimize-to-application = true;
+ # Show indicator lights for open applications in the Dock
+ show-process-indicators = true;
+ # Wipe all default app icons from the Dock
+ persistent-apps = [ ];
+ # Speed up Mission Control animations
+ expose-animation-duration = 0.1;
+ # Remove the auto-hiding Dock delay
+ autohide-delay = 0.0;
+ # Remove the animation when hiding/showing the Dock
+ autohide-time-modifier = 0.0;
+ # Automatically hide and show the Dock
+ autohide = true;
+ # Make Dock icons of hidden applications translucent
+ showhidden = true;
+ # Don't show recent applications in Dock
+ show-recents = false;
+ };
+
+ finder = {
+ # Show status bar
+ ShowStatusBar = true;
+ # Show path bar
+ ShowPathbar = true;
+ # Search the current folder by default
+ FXDefaultSearchScope = "SCcf";
+ # Disable warning when changing a file extension
+ FXEnableExtensionChangeWarning = false;
+ };
+
+ screencapture = {
+ # Save screenshots to ~/Screenshots
+ location = "~/Screenshots";
+ # Save screenshots as JPG
+ type = "jpg";
+ };
+
+ trackpad = {
+ # Enable tap to click for this user and the login screen
+ Clicking = true;
+ };
+
+ ActivityMonitor = {
+ # Show the main window when launching Activity Monitor
+ OpenMainWindow = true;
+ # Visualize CPU usage in the Activity Monitor Dock icon
+ IconType = 5;
+ # Show all processes in Activity Monitor
+ ShowCategory = 0;
+ # Sort Activity Monitor results by CPU usage
+ SortColumn = "CPUUsage";
+ SortDirection = 0;
+ };
+
+ LaunchServices = {
+ # Disable the "Are you sure you want to open this application?" dialog
+ LSQuarantine = false;
+ };
+
+ CustomUserPreferences = {
+ "com.apple.print.PrintingPrefs" = {
+ # Automatically quit printer app once the print jobs complete
+ "Quit When Finished" = true;
+ };
+ "com.apple.desktopservices" = {
+ # Avoid creating .DS_Store files on network or USB volumes
+ DSDontWriteNetworkStores = true;
+ DSDontWriteUSBStores = true;
+ };
+ "com.apple.Safari" = {
+ # Privacy: don't send search queries to Apple
+ UniversalSearchEnabled = false;
+ SuppressSearchSuggestions = true;
+ };
+ "com.apple.TimeMachine" = {
+ # Prevent Time Machine from prompting to use new hard drives
+ DoNotOfferNewDisksForBackup = true;
+ };
+ "com.apple.TextEdit" = {
+ PlainTextEncoding = 4;
+ PlainTextEncodingForWrite = 4;
+ };
+ "com.apple.SoftwareUpdate" = {
+ AutomaticCheckEnabled = true;
+ ScheduleFrequency = 1;
+ AutomaticDownload = 1;
+ CriticalUpdateInstall = 1;
+ };
+ "com.apple.commerce" = {
+ AutoUpdate = true;
+ AutoUpdateRestartRequired = true;
+ };
+ "com.apple.helpviewer" = {
+ DevMode = true;
+ };
+ "com.apple.BluetoothAudioAgent" = {
+ "Apple Bitpool Min (editable)" = 40;
+ };
+ "com.google.Chrome" = {
+ # Disable the all too sensitive backswipe on trackpads and Magic Mouse
+ AppleEnableSwipeNavigateWithScrolls = false;
+ AppleEnableMouseSwipeNavigateWithScrolls = false;
+ # Expand the print dialog by default
+ PMPrintingExpandedStateForPrint2 = true;
+ };
+ "com.apple.messageshelper.MessageController" = {
+ SOInputLineSettings = {
+ automaticQuoteSubstitutionEnabled = false;
+ continuousSpellCheckingEnabled = false;
+ };
+ };
+ };
+ };
+}