8 Commits
9 changed files with 438 additions and 154 deletions
+1 -1
View File
@@ -137,7 +137,7 @@
"homebrew/homebrew-cask" = homebrew-cask; "homebrew/homebrew-cask" = homebrew-cask;
}; };
mutableTaps = false; mutableTaps = false;
autoMigrate = true; # autoMigrate = true;
}; };
home-manager.sharedModules = [ home-manager.sharedModules = [
# mac-app-util.homeManagerModules.default # mac-app-util.homeManagerModules.default
+1 -10
View File
@@ -24,6 +24,7 @@ in
imports = [ imports = [
../../modules/darwin/default.nix ../../modules/darwin/default.nix
../../modules/darwin/home-manager.nix ../../modules/darwin/home-manager.nix
# ../../modules/darwin/ai.nix
]; ];
# Setup user, packages, programs # Setup user, packages, programs
@@ -131,16 +132,6 @@ in
StandardOutPath = "/tmp/emacs.out.log"; StandardOutPath = "/tmp/emacs.out.log";
}; };
launchd.user.agents.ollama = {
command = "${pkgs.ollama}/bin/ollama serve";
serviceConfig = {
KeepAlive = true;
RunAtLoad = true;
StandardOutPath = "/tmp/ollama.out.log";
StandardErrorPath = "/tmp/ollama.err.log";
};
};
system = { system = {
stateVersion = 4; stateVersion = 4;
primaryUser = "${user}"; primaryUser = "${user}";
+25
View File
@@ -0,0 +1,25 @@
{ pkgs, llm-agents, ... }:
{
environment.systemPackages = [
ollama
# CLI coding agent from llm-agents.nix input
llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.hermes-agent
# Hermes desktop GUI
llm-agents.packages.${pkgs.stdenv.hostPlatform.system}.hermes-desktop
];
launchd.user.agents.ollama = {
command = "${pkgs.ollama}/bin/ollama serve";
serviceConfig = {
KeepAlive = true;
RunAtLoad = true;
StandardOutPath = "/tmp/ollama.out.log";
StandardErrorPath = "/tmp/ollama.err.log";
};
};
}
+139
View File
@@ -0,0 +1,139 @@
{ pkgs, ... }:
{
homebrew = {
enable = true;
global = {
brewfile = true;
};
brews = [ ];
onActivation = {
cleanup = "none";
autoUpdate = true;
upgrade = true;
};
masApps = {
# These app IDs are from using the mas CLI app
# mas = mac app store
# https://github.com/mas-cli/mas
#
# $ nix shell nixpkgs#mas
# $ mas search <app name>
#
# If you have previously added these apps to your Mac App Store profile (but not installed them on this system),
# you may receive an error message "Redownload Unavailable with This Apple ID".
# This message is safe to ignore.
"1Password for Safari" = 1569813296; # (8.10.82)
"Affinity Designer 2" = 1616831348;
"Affinity Photo 2: Image Editor" = 1616822987;
"Affinity Publisher 2" = 1606941598;
# "DaisyDisk" = 409907375; # (4.32) # Don't use this, we need the official version that is not sandboxed
"Fantastical - Calendar" = 975937182;
"Fedistar" = 6445863996; # (1.13.1)
"Home Assistant" = 1099568401; # (2025.7.1)
"Ice Cubes for Mastodon" = 6444915884; # (1.11.3)
"LibreOffice" = 1630474372;
"Monal - XMPP Chatting " = 1637078500;
"Microsoft Copilot" = 6738511300; # (25.7.440804001)
"Microsoft Outlook" = 985367838; # (16.111.3)
"Microsoft Excel" = 462058435; # (16.111.3)
"Microsoft Word" = 462054704; # (16.111.3)
"Microsoft PowerPoint" = 462062816; # (16.111.3)
"OneDrive" = 823766827; # (26.134.0713)
"MQTT Explorer" = 1455214828; # (0.3.5)
"Night Sky" = 475772902; # 475772902
"Native SQLite Manager" = 1416282836; # (1.31.0)
"Remarkable Desktop" = 1276493162; # (3.19.0)
"Slack for Desktop" = 803453959; # (4.45.60)
"WhatsApp Messenger" = 310633997; # (26.30.77)
"WiFi Explorer: Scanner" = 494803304; # (3.5.6)
"Windows App Installer" = 1295203466; # (1.0.16)
"Wireguard" = 1451685025; # (1.0.16)
### "1Password: Password Manager" = 1511601750; # (8.11.0) Does not seem to insta
};
casks = [
# Development Tools
"arduino-ide"
"docker-desktop"
"iterm2"
"oracle-jdk"
"visual-studio-code"
# Creative tools
"blender"
"gimp"
"inkscape"
"vcv-rack"
#"affinity-designer"
#"affinity-photo"
#"affinity-publisher"
# Communication Tools
"adium"
"discord"
"signal"
"webex"
"zoom"
# Utility Tools
"blackhole-16ch"
"blackhole-2ch"
"box-drive"
"box-tools"
"daisydisk"
"karabiner-elements"
"keybase"
"moonlight"
"spamsieve"
"syncthing-app"
"synology-drive"
"tigervnc"
#LLM
"ollama-app"
"hermes-desktop"
"jan"
# Entertainment Tools
"qobuz"
"steam"
"handbrake-app"
"jellyfin-media-player"
"mediaelch"
"obs"
"vimediamanager"
"vlc"
# Productivity Tools
"1Password"
"bitwarden"
"calibre"
"dbeaver-community"
"element"
"gpg-suite"
"macdown-3000"
"mailmate@beta"
"orcaslicer"
# "remanager"
"qmk-toolbox"
"smartsheet"
# "sqlitestudio" # Doesn't work without Rosetta
# "virtualbox" # build error?
# Browsers
"brave-browser"
"firefox"
"google-chrome"
# x11
"xquartz"
];
};
}
-79
View File
@@ -1,79 +0,0 @@
_:
[
# Development Tools
"arduino-ide"
"docker-desktop"
"iterm2"
"oracle-jdk"
"visual-studio-code"
# Creative tools
"blender"
"gimp"
"inkscape"
"vcv-rack"
#"affinity-designer"
#"affinity-photo"
#"affinity-publisher"
# Communication Tools
"adium"
"discord"
"signal"
"webex"
"whatsapp"
"zoom"
# Utility Tools
"blackhole-16ch"
"blackhole-2ch"
"box-drive"
"box-tools"
"daisydisk"
"karabiner-elements"
"keybase"
"spamsieve"
"syncthing-app"
"synology-drive"
# Entertainment Tools
"qobuz"
"steam"
"handbrake-app"
"jellyfin-media-player"
"mediaelch"
"obs"
"vimediamanager"
"vlc"
# Productivity Tools
"1Password"
"bitwarden"
"calibre"
"dbeaver-community"
"element"
"gpg-suite"
"macdown-3000"
"mailmate@beta"
"orcaslicer"
"remanager"
"qmk-toolbox"
"smartsheet"
# "sqlitestudio" # Doesn't work without Rosetta
# "virtualbox" # build error?
"copilot-cli"
# Browsers
"brave-browser"
"firefox"
"google-chrome"
# x11
"xquartz"
]
+1 -1
View File
@@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
let let
emacsOverlaySha256 = "0pqnl05j86pyvrlqh5kk4sximi749xqgiffq47grw7v98nqd2yin"; emacsOverlaySha256 = "07i9zb4rw9zwip9a49fv0q60ak025vn92r48vk7ns61was1mzn9s";
in in
{ {
home-manager.backupFileExtension = "nix-backup"; home-manager.backupFileExtension = "nix-backup";
+240 -61
View File
@@ -20,6 +20,7 @@ in
imports = [ imports = [
./dock ./dock
./brewery.nix
]; ];
# It me # It me
@@ -28,55 +29,18 @@ in
home = "/Users/${user}"; home = "/Users/${user}";
isHidden = false; isHidden = false;
shell = pkgs.zsh; shell = pkgs.zsh;
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILCEBZrQ9F3nLhEM9uqdPijut11vhYkdmLtj7gT/zgV3 Key Nov 2024"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA9vrzEHmWEX5sCVsp6J4tVrxEzzqMSRkijHEfVg2WrC cardno:36_431_811"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG5BytZleG7m1926MSNwVXyPJ0QD5Z919cFCp22BN5hV cardno:35_775_013"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAl/jn18uVPJ9Uyv8gqk80gVQaMHrcd1b+B/SB/6RsX8 cardno:36_431_751"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAILVdAx+U1xhcJmh1hRaF0CVB0ivIF/U0oIbAWYPwko4iAAAABHNzaDo= Yubikey 35775013"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIIjnJyJUDnia6ZWPRa5iSBKCb+DMGmFtiFa+9gkeiTwQAAAABHNzaDo= Yubikey 36431751"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIFhuPQUHUHchx8wHVCciMi6etzZStkpECbG/r/1imy+kAAAABHNzaDo= Yubikey 36431881"
];
}; };
homebrew = {
enable = true;
global = {
brewfile = true;
};
casks = pkgs.callPackage ./casks.nix { };
onActivation = {
cleanup = "none";
autoUpdate = true;
upgrade = true;
};
# These app IDs are from using the mas CLI app
# mas = mac app store
# https://github.com/mas-cli/mas
#
# $ nix shell nixpkgs#mas
# $ mas search <app name>
#
# If you have previously added these apps to your Mac App Store profile (but not installed them on this system),
# you may receive an error message "Redownload Unavailable with This Apple ID".
# This message is safe to ignore.
masApps = {
"1Password for Safari" = 1569813296; # (8.10.82)
"Affinity Designer 2" = 1616831348;
"Affinity Photo 2: Image Editor" = 1616822987;
"Affinity Publisher 2" = 1606941598;
# "DaisyDisk" = 409907375; # (4.32) # Don't use this, we need the official version that is not sandboxed
"Fantastical - Calendar" = 975937182;
" Fedistar" = 6445863996; # (1.13.1)
"Home Assistant" = 1099568401; # (2025.7.1)
"Ice Cubes for Mastodon" = 6444915884; # (1.11.3)
"LibreOffice" = 1630474372;
"Monal - XMPP Chatting " = 1637078500;
"MQTT Explorer" = 1455214828; # (0.3.5)
"Night Sky" = 475772902; # 475772902
"Native SQLite Manager" = 1416282836; # (1.31.0)
"Remarkable Desktop" = 1276493162; # (3.19.0)
"Slack for Desktop" = 803453959; # (4.45.60)
"WiFi Explorer: Scanner" = 494803304; # (3.5.6)
"Windows App Installer" = 1295203466; # (1.0.16)
"Wireguard" = 1451685025; # (1.0.16)
### "1Password: Password Manager" = 1511601750; # (8.11.0) Does not seem to insta
};
};
# Enable home-manager # Enable home-manager
home-manager = { home-manager = {
@@ -93,12 +57,123 @@ in
home = { home = {
enableNixpkgsReleaseCheck = false; enableNixpkgsReleaseCheck = false;
packages = pkgs.callPackage ./packages.nix { inherit llm-agents; }; packages = pkgs.callPackage ./packages.nix { inherit llm-agents; };
file = additionalFiles // { "emacs-launcher.command".source = myEmacsLauncher; }; file = additionalFiles // {
"emacs-launcher.command".source = myEmacsLauncher;
};
stateVersion = "23.11"; stateVersion = "23.11";
}; };
home.activation.ensureNpmCliTools = import ./npm.nix { inherit lib pkgs; };
catppuccin = {
autoEnable = true;
enable = true;
flavor = "mocha";
};
programs = { programs = {
gpg.enable = true; alacritty = {
enable = true;
settings = {
cursor = {
style = "Block";
};
window = {
opacity = 1.0;
padding = {
x = 24;
y = 24;
};
};
font = {
normal = {
family = "MesloLGS NF";
style = "Regular";
};
size = lib.mkMerge [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux 10)
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin 14)
];
};
dynamic_padding = true;
decorations = "full";
title = "Terminal";
class = {
instance = "Alacritty";
general = "Alacritty";
};
colors = {
primary = {
background = "0x1f2528";
foreground = "0xc0c5ce";
};
normal = {
black = "0x1f2528";
red = "0xec5f67";
green = "0x99c794";
yellow = "0xfac863";
blue = "0x6699cc";
magenta = "0xc594c5";
cyan = "0x5fb3b3";
white = "0xc0c5ce";
};
bright = {
black = "0x65737e";
red = "0xec5f67";
green = "0x99c794";
yellow = "0xfac863";
blue = "0x6699cc";
magenta = "0xc594c5";
cyan = "0x5fb3b3";
white = "0xd8dee9";
};
};
};
};
ssh = {
enable = true;
enableDefaultConfig = false;
settings = {
"*" = {
forwardAgent = false;
addKeysToAgent = "no";
compression = false;
serverAliveInterval = 0;
serverAliveCountMax = 3;
hashKnownHosts = false;
userKnownHostsFile = "~/.ssh/known_hosts";
controlMaster = "no";
controlPath = "~/.ssh/master-%r@%n:%p";
controlPersist = "no";
};
"moonunit.kolkman.org" = {
hostname = "moonunit.kolkman.org";
user = "root";
port = 2222;
};
};
includes = [
(lib.mkIf pkgs.stdenv.hostPlatform.isLinux "/home/${user}/.ssh/config_external")
(lib.mkIf pkgs.stdenv.hostPlatform.isDarwin "/Users/${user}/.ssh/config_external")
];
};
gpg = {
enable = true;
settings = {
default-key = "01B157D574FEDBB2";
no-emit-version = true;
auto-key-retrieve = true;
personal-digest-preferences = "SHA512 SHA384 SHA256 SHA224";
};
};
zsh = { zsh = {
enable = true; enable = true;
@@ -112,6 +187,7 @@ in
initContent = initContent =
let let
zshConfigEarlyInit = lib.mkOrder 500 '' zshConfigEarlyInit = lib.mkOrder 500 ''
ulimit -n 524288
if [[ -f /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]]; then if [[ -f /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]]; then
. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
. /nix/var/nix/profiles/default/etc/profile.d/nix.sh . /nix/var/nix/profiles/default/etc/profile.d/nix.sh
@@ -128,6 +204,9 @@ in
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
# Define variables for directories # Define variables for directories
export PATH=$HOME/.local/bin:$PATH
export PATH=$HOME/.pnpm-packages/bin:$HOME/.pnpm-packages:$PATH export PATH=$HOME/.pnpm-packages/bin:$HOME/.pnpm-packages:$PATH
export PATH=$HOME/.npm-packages/bin:$HOME/bin:$PATH export PATH=$HOME/.npm-packages/bin:$HOME/bin:$PATH
export PATH=$HOME/.local/share/bin:$PATH export PATH=$HOME/.local/share/bin:$PATH
@@ -258,7 +337,7 @@ in
let g:airline_powerline_fonts = 1 let g:airline_powerline_fonts = 1
"" Local keys and such "" Local keys and such
let mapleader="," let mapleader=","
let maplocalleader=" " let maplocalleader=" "
"" Change cursor on mode "" Change cursor on mode
@@ -289,28 +368,128 @@ in
nnoremap <C-j> <C-w>j nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l nnoremap <C-l> <C-w>l
"" Easier to yank entire line
nnoremap Y y$
"" Move buffers
nnoremap <tab> :bnext<cr>
nnoremap <S-tab> :bprev<cr>
"" Like a boss, sudo AFTER opening the file to write
cmap w!! w !sudo tee % >/dev/null
let g:startify_lists = [
\ { 'type': 'dir', 'header': [' Current Directory '. getcwd()] },
\ { 'type': 'sessions', 'header': [' Sessions'] },
\ { 'type': 'bookmarks', 'header': [' Bookmarks'] }
\ ]
let g:startify_bookmarks = [
\ '~/.local/share/src',
\ ]
let g:airline_theme='bubblegum'
let g:airline_powerline_fonts = 1
'';
};
tmux = {
enable = true;
plugins = with pkgs.tmuxPlugins; [
vim-tmux-navigator
sensible
yank
prefix-highlight
{
plugin = power-theme;
extraConfig = ''
set -g @tmux_power_theme 'gold'
'';
}
{
plugin = resurrect; # Used by tmux-continuum
# Use XDG data directory
# https://github.com/tmux-plugins/tmux-resurrect/issues/348
extraConfig = ''
set -g @resurrect-dir '$HOME/.cache/tmux/resurrect'
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-pane-contents-area 'visible'
'';
}
{
plugin = continuum;
extraConfig = ''
set -g @continuum-restore 'on'
set -g @continuum-save-interval '5' # minutes
'';
}
];
terminal = "screen-256color";
prefix = "C-x";
escapeTime = 10;
historyLimit = 50000;
extraConfig = ''
# Remove Vim mode delays
set -g focus-events on
# Enable full mouse support
set -g mouse on
# -----------------------------------------------------------------------------
# Key bindings
# -----------------------------------------------------------------------------
# Unbind default keys
unbind C-b
unbind '"'
unbind %
# Split panes, vertical or horizontal
bind-key x split-window -v
bind-key v split-window -h
# Move around panes with vim-like bindings (h,j,k,l)
bind-key -n M-k select-pane -U
bind-key -n M-h select-pane -L
bind-key -n M-j select-pane -D
bind-key -n M-l select-pane -R
# Smart pane switching with awareness of Vim splits.
# This is copy paste from https://github.com/christoomey/vim-tmux-navigator
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
| grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h' 'select-pane -L'
bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j' 'select-pane -D'
bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k' 'select-pane -U'
bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l' 'select-pane -R'
tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\' 'select-pane -l'"
if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
"bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\' 'select-pane -l'"
bind-key -T copy-mode-vi 'C-h' select-pane -L
bind-key -T copy-mode-vi 'C-j' select-pane -D
bind-key -T copy-mode-vi 'C-k' select-pane -U
bind-key -T copy-mode-vi 'C-l' select-pane -R
bind-key -T copy-mode-vi 'C-\' select-pane -l
''; '';
}; };
}; };
catppuccin = {
autoEnable = true;
enable = true;
flavor = "mocha";
};
services = { services = {
gpg-agent = { gpg-agent = {
enable = true; enable = true;
enableSshSupport = true; enableSshSupport = true;
extraConfig = '' extraConfig = ''
default-cache-ttl 600 default-cache-ttl 600
max-cache-ttl 7200 max-cache-ttl 7200
pinentry-program /Users/olaf/.nix-profile/bin/pinentry-mac pinentry-program /Users/olaf/.nix-profile/bin/pinentry-mac
''; '';
}; };
}; };
# Marked broken Oct 20, 2022 check later to remove this # Marked broken Oct 20, 2022 check later to remove this
# https://github.com/nix-community/home-manager/issues/3344 # https://github.com/nix-community/home-manager/issues/3344
manual.manpages.enable = false; manual.manpages.enable = false;
+30
View File
@@ -0,0 +1,30 @@
{ lib, pkgs }:
let
npmPackages = [
"@enact/cli"
"@webos-tools/cli"
"@anthropic-ai/claude-code"
"patch-package"
];
in
lib.hm.dag.entryAfter [ "writeBoundary" ] ''
# Ensure required npm CLI tools are installed in the user prefix.
NPM_BIN="${pkgs.nodejs}/bin/npm"
export NPM_CONFIG_PREFIX="$HOME/.npm-packages"
export PATH="${pkgs.nodejs}/bin:$NPM_CONFIG_PREFIX/bin:$PATH"
if [[ ! -x "$NPM_BIN" ]]; then
echo "npm not found; skipping npm CLI installation step"
exit 0
fi
for pkg in ${lib.concatStringsSep " " (map lib.escapeShellArg npmPackages)}; do
if "$NPM_BIN" list -g --depth=0 "$pkg" >/dev/null 2>&1; then
echo "npm package already installed: $pkg"
else
echo "installing npm package: $pkg"
"$NPM_BIN" install -g "$pkg"
fi
done
''
+1 -2
View File
@@ -127,8 +127,7 @@ with pkgs;
] ]
)) ))
# LLM
ollama # Launchd definition in hosts/darwin/default.nix
# Social # Social
pidgin pidgin