Compare commits

...

8 commits

Author SHA1 Message Date
cc173b20b9
dock (corianne): Switch to using Taskbar 2025-10-31 10:31:02 -05:00
beb8aa1303
feat (yt-dlp): Use unstable yt-dlp
YouTube constantly changes settings to mess with downloaders. Try to
mitigate that by using the most bleeding-edge version of yt-dlp
available.
2025-10-31 10:31:02 -05:00
c592c01f6e
refactor (yt-dlp): Move yt-dlp settings to own file 2025-10-31 10:31:01 -05:00
88873d06f2
refactor (AltTab.app): Use defaults module for AltTab.app 2025-10-31 10:31:01 -05:00
5866fd41de
config (Taskbar.app): add initial config for Taskbar.app 2025-10-31 10:31:01 -05:00
dafe6c0625
feat (module): add app restart to defaults module 2025-10-31 10:31:01 -05:00
8b173560bf
module: add defaults module
MacOS stores most of its preferences in plist files. While those plist
files can be manipulated directly, it is generally safer (albeit less
declarative) to manipulate app-level plists via the `defaults` cli. This
module allows for manipulation of arbitrary app configs via the
`defaults` cli appropriate for use in home-manager.
2025-10-31 10:31:01 -05:00
e0184ead26
config (darwin): add preferences to manage AltTab.app 2025-10-31 10:31:01 -05:00
7 changed files with 168 additions and 12 deletions

View file

@ -16,6 +16,7 @@ in {
./../programs/lsd.nix
./../programs/neovim.nix
./../programs/starship.nix
./../programs/yt-dlp.nix
];
home = {
stateVersion = "23.11";
@ -107,7 +108,6 @@ in {
gh.enable = true;
gpg.enable = true;
pandoc.enable = true;
yt-dlp.enable = true;
};
xdg = {
dataFile = { "julia/config/startup.jl".source = ./../dotfiles/startup.jl; };

View file

@ -1,4 +1,10 @@
{ config, lib, pkgs, pkgs-unstable, ... }: {
imports = [
./../modules/defaults.nix
./../programs/alttab.nix
./../programs/taskbar.nix
];
home = {
packages = with pkgs; [
asitop

93
modules/defaults.nix Normal file
View file

@ -0,0 +1,93 @@
# WARNING: This module was "vibe coded" by Claude Sonnet 4.5 Thinking
# Nix modules are mostly boilerplace, so the logic is (mostly) mine, and the
# rest comes from Claude. For reference, here was my prompt:
#
# I would like to write a new module for managing MacOS apps via the `defaults`
# cli. Ideally, the syntax that I want to include in my home-manager config
# should look like:
#
# ```nix
# darwin-defaults = {
# "com.fpfxtknjju.wbgcdolfev" = {
# centerTasksAndButtons = false;
# pinList = [
# { action = "finderNewWindow"; bundleIdentifier = "com.apple.finder"; }
# { action = "firefoxNewWindow"; bundleIdentifier = "org.mozilla.firefox"; }
# { action = "launchOrActivateApp"; bundleIdentifier = "com.electron.logseq"; }
# ];
# };
# "com.lwouis.alt-tab-macos" = {
# screenRecordingPermissionSkipped = true;
# nextWindowGesture = 1;
# };
# };
# ```
#
# This should be fairly easy to implement, as `defaults` accepts (escaped) plist
# strings, and Nix provides lib.generators.toPlist. Can you help me write the
# module, please?
{ config, lib, pkgs, ... }:
let
inherit (pkgs.stdenv.hostPlatform) isDarwin;
inherit (lib) mkOption types mkIf;
inherit (lib.generators) toPlist;
cfg = config.defaults;
# Convert domain settings to defaults import command
domainToScript = domain: settings:
let
plistContent = toPlist { escape = true; } settings;
escapedDomain = lib.escapeShellArg domain;
in ''
$DRY_RUN_CMD echo "Applying defaults for ${domain}..."
$DRY_RUN_CMD /usr/bin/defaults import -app ${escapedDomain} - <<'EOF'
${plistContent}
EOF
$DRY_RUN_CMD killall ${escapedDomain} && open -a ${escapedDomain}
'';
# Generate all activation scripts
activationScript =
lib.concatStringsSep "\n" (lib.mapAttrsToList domainToScript cfg);
in {
options.defaults = mkOption {
type = types.attrsOf (types.attrsOf types.anything);
default = { };
description = ''
Configuration for macOS defaults by domain.
Each attribute set key represents a domain (typically an app bundle identifier),
and its value is an attribute set of preference keys and values that will be
converted to a plist and imported using the `defaults` command.
This module only works on macOS (Darwin) systems.
'';
example = lib.literalExpression ''
{
"com.apple.dock" = {
autohide = true;
tilesize = 48;
orientation = "left";
};
"com.apple.finder" = {
AppleShowAllFiles = true;
ShowPathbar = true;
FXEnableExtensionChangeWarning = false;
};
}
'';
};
config = mkIf (isDarwin && cfg != { }) {
home.activation.defaults = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
if [[ -x /usr/bin/defaults ]]; then
${activationScript}
else
echo "Warning: /usr/bin/defaults not found. Skipping darwin-defaults configuration."
fi
'';
};
}

10
programs/alttab.nix Normal file
View file

@ -0,0 +1,10 @@
{ ... }: {
defaults."AltTab" = {
appearanceStyle = 0;
nextWindowGesture = 1;
screenRecordingPermissionSkipped = true;
showFullscreenWindows = 0;
showHiddenWindows = 1;
updatePolicy = 2;
};
}

49
programs/taskbar.nix Normal file
View file

@ -0,0 +1,49 @@
{ ... }: {
defaults."Taskbar" = {
centerTasksAndButtons = false;
hideReviewOptions = true;
permissionsResetOnce = true;
pinList = [
{
action = "finderNewWindow";
bundleIdentifier = "com.apple.finder";
}
{
action = "launchOrActivateApp";
bundleIdentifier = "com.apple.AppStore";
}
{
action = "firefoxNewWindow";
bundleIdentifier = "org.mozilla.firefox";
}
{
action = "launchOrActivateApp";
bundleIdentifier = "com.apple.systempreferences";
}
{
action = "launchOrActivateApp";
bundleIdentifier = "com.electron.logseq";
}
{
action = "launchOrActivateApp";
bundleIdentifier = "org.mozilla.thunderbird";
}
{
action = "launchOrActivateApp";
bundleIdentifier =
"com.apple.Safari.WebApp.2F51A6D0-087A-438F-92D3-A73FE09CB4CC";
}
{
action = "launchOrActivateApp";
bundleIdentifier =
"com.apple.Safari.WebApp.5EC6478E-03A6-4147-8A4D-6EF3DE3F06D3";
}
];
sendCrashReports = true;
showMenubarIcon = false;
showThumbnails = true;
showWindowTitleInThumbails = true;
taskViewMaxWidth = 200;
updatePolicy = 0;
};
}

6
programs/yt-dlp.nix Normal file
View file

@ -0,0 +1,6 @@
{ pkgs-unstable, ... }: {
programs.yt-dlp = {
enable = true;
package = pkgs-unstable.yt-dlp;
};
}

View file

@ -39,9 +39,10 @@ in {
system.primaryUser = "millironx";
system.defaults.dock = {
autohide = false;
autohide = true;
minimize-to-application = true;
mru-spaces = false;
orientation = "left";
persistent-apps = let
dedupDotApp = appName:
if pkgs.lib.strings.hasSuffix ".app" appName then
@ -69,20 +70,10 @@ in {
};
in [
(sysApp "Firefox")
(chromeApp "Messages")
(sysApp "Signal")
(sysApp "Thunderbird")
(localApp "Immich")
(sysApp "Logseq")
(sysApp "Zed")
(sysApp "Steam")
(sysApp "Amperfy")
(sysApp "Microsoft Word")
(sysApp "Microsoft Excel")
(sysApp "Microsoft PowerPoint")
(localApp "Canvas")
(sysApp "Zotero")
(localApp "VetPrep")
(chromeApp "Instinct Dashboard")
(chromeApp "Carestream")
];
@ -213,6 +204,7 @@ in {
"slack"
"stats"
"steam"
"taskbar"
"textmate"
"thunderbird@esr"
"ungoogled-chromium"