launchd: restore gui domain defaults

User-domain agents are not rediscovered from the user LaunchAgents directory after reboot. Let built-in agents inherit the GUI default while keeping explicit user-domain configuration available.
This commit is contained in:
Austin Horstman
2026-07-15 10:29:26 -05:00
parent 6dc9e081ba
commit 165228b0ef
47 changed files with 11 additions and 83 deletions
+3 -3
View File
@@ -16,9 +16,9 @@ This release has the following notable changes:
- On Darwin, Home Manager launchd agents now support
[](#opt-launchd.agents._name_.domain) to choose either the user's GUI or
background launchd domain. Background services provided by Home Manager now
use the user domain, which allows activations from contexts such as SSH
sessions without requiring an active graphical login session.
background launchd domain. Agents use the GUI domain by default. Set the
domain to `user` for agents that should run without an active graphical login
session.
## State Version Changes {#sec-release-26.11-state-version-changes}
@@ -6,10 +6,8 @@
message = ''
Home Manager launchd agents now support the
`launchd.agents.<name>.domain` option. Background services provided by Home
Manager use the user launchd domain by default, so they can be managed from
SSH and other non-graphical sessions. Set
`launchd.agents.<name>.domain = "gui"` for agents that need the graphical
session.
`launchd.agents.<name>.domain` option. Agents use the GUI launchd domain by
default. Set `launchd.agents.<name>.domain = "user"` for agents that should
run without an active graphical login session.
'';
}
-1
View File
@@ -303,7 +303,6 @@ in
launchd.agents.atuin-daemon = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [ (lib.getExe cfg.package) ] ++ daemonArgs;
EnvironmentVariables = lib.optionalAttrs (daemonCfg.logLevel != null) {
-3
View File
@@ -609,7 +609,6 @@ in
{
"git-maintenance-hourly" = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = baseArguments ++ [ "--schedule=hourly" ];
StartCalendarInterval = map (hour: {
@@ -620,7 +619,6 @@ in
};
"git-maintenance-daily" = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = baseArguments ++ [ "--schedule=daily" ];
StartCalendarInterval = map (weekday: {
@@ -632,7 +630,6 @@ in
};
"git-maintenance-weekly" = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = baseArguments ++ [ "--schedule=weekly" ];
StartCalendarInterval = [
-1
View File
@@ -151,7 +151,6 @@ in
launchd.agents.nh-clean = lib.mkIf cfg.clean.enable {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${lib.getExe cfg.package}"
-1
View File
@@ -631,7 +631,6 @@ in
launchd.agents = mkIf webCfg.enable {
opencode-web = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments =
let
-2
View File
@@ -160,7 +160,6 @@ let
in
{
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe rcloneSidecarWrapper)
@@ -620,7 +619,6 @@ in
mkLaunchdConfigService = lib.mkIf (cfg.remotes != { }) {
rclone-config = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [ (lib.getExe rcloneConfigScript) ];
RunAtLoad = true;
-1
View File
@@ -87,7 +87,6 @@ in
launchd.agents.borgmatic = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe programConfig.package)
-1
View File
@@ -265,7 +265,6 @@ in
name: profile:
lib.nameValuePair "colima-${name}" {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${lib.getExe cfg.package}"
-1
View File
@@ -218,7 +218,6 @@ in
launchd.agents.emacs = {
enable = true;
domain = lib.mkDefault (if cfg.startWithUserSession == "graphical" then "gui" else "user");
config = {
ProgramArguments = [
"${cfg.package}/bin/emacs"
-1
View File
@@ -60,7 +60,6 @@ in
launchd.agents.exo = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [ (lib.getExe cfg.package) ] ++ cfg.extraArgs;
EnvironmentVariables = cfg.environmentVariables;
-1
View File
@@ -108,7 +108,6 @@ in
launchd.agents = services (
_name: repo: {
enable = true;
domain = lib.mkDefault "user";
config = {
StartInterval = repo.interval;
ProcessType = "Background";
-1
View File
@@ -87,7 +87,6 @@ in
launchd.agents.glance = mkIf (cfg.package != null) {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(getExe cfg.package)
@@ -105,7 +105,6 @@ in
launchd.agents.home-manager-auto-expire = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [ (toString script) ];
ProcessType = "Background";
-1
View File
@@ -65,7 +65,6 @@ let
name = "imapnotify-${name}";
value = {
enable = true;
domain = lib.mkDefault "user";
config = {
# Use the nix store path for config to ensure service restarts when it changes
ProgramArguments = [
-1
View File
@@ -254,7 +254,6 @@ in
launchd.agents.mpd = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe cfg.package)
-1
View File
@@ -121,7 +121,6 @@ in
launchd.agents.nix-gc = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${nixPackage}/bin/nix-collect-garbage"
-1
View File
@@ -107,7 +107,6 @@ in
launchd.agents.ollama = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${lib.getExe ollamaPackage}"
-1
View File
@@ -311,7 +311,6 @@ in
name: machine:
nameValuePair "podman-machine-${name}" {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [ "${mkWatchdogScript name machine}" ];
KeepAlive = {
-1
View File
@@ -57,7 +57,6 @@ in
launchd.agents.pueued = lib.mkIf (cfg.package != null) {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
-1
View File
@@ -105,7 +105,6 @@ in
launchd.agents.ssh-agent = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe pkgs.bash)
-1
View File
@@ -943,7 +943,6 @@ in
launchd.agents = {
syncthing = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${pkgs.writers.writeBash "syncthing-wrapper" ''
-1
View File
@@ -62,7 +62,6 @@ in
launchd.agents.tldr-update = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe cfg.package)
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.git-maintenance-daily</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.git-maintenance-hourly</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.git-maintenance-weekly</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.nh-clean</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.opencode-web</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.opencode-web</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.borgmatic</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -22,8 +22,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.colima-default</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -18,8 +18,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.colima-default</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.emacs</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.git-sync-test</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -18,12 +18,10 @@
serviceFile=$(normalizeStorePaths $serviceFile)
assertFileExists "$serviceFile"
assertFileContent "$serviceFile" ${./glance.plist}
assertFileContains "$serviceFile" '<key>LimitLoadToSessionType</key>'
assertFileContains "$serviceFile" '<string>Background</string>'
domainFile=LaunchAgentDomains/org.nix-community.home.glance.domain
assertFileContent "$domainFile" ${builtins.toFile "expected-domain" "user\n"}
assertFileContains activate 'domain="user/$(id -u)"'
assertFileContent "$domainFile" ${builtins.toFile "expected-domain" "gui\n"}
assertFileContains activate 'domain="gui/$(id -u)"'
assertFileContains activate 'launchctl kickstart -k "$domain/org.nix-community.home.glance"'
'')
];
@@ -2,13 +2,13 @@
{
services.glance.enable = true;
launchd.agents.glance.domain = "gui";
launchd.agents.glance.domain = "user";
nmt.script = lib.mkIf pkgs.stdenv.hostPlatform.isDarwin ''
domainFile=LaunchAgentDomains/org.nix-community.home.glance.domain
assertFileExists "$domainFile"
assertFileContent "$domainFile" ${builtins.toFile "expected-domain" "gui\n"}
assertFileContains activate 'domain="gui/$(id -u)"'
assertFileContent "$domainFile" ${builtins.toFile "expected-domain" "user\n"}
assertFileContains activate 'domain="user/$(id -u)"'
assertFileContains activate 'launchctl kickstart -k "$domain/org.nix-community.home.glance"'
'';
}
@@ -6,8 +6,6 @@
<true/>
<key>Label</key>
<string>org.nix-community.home.glance</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.home-manager-auto-expire</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -13,8 +13,6 @@
<true/>
<key>Label</key>
<string>org.nix-community.home.imapnotify-hm-example.com</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -4,8 +4,6 @@
<dict>
<key>Label</key>
<string>org.nix-community.home.nix-gc</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
@@ -20,8 +20,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.ollama</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.podman-machine-podman-machine-default</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.podman-machine-dev-machine</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.ssh-agent</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.ssh-agent</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.ssh-agent</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>
@@ -11,8 +11,6 @@
</dict>
<key>Label</key>
<string>org.nix-community.home.syncthing</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>ProcessType</key>
<string>Background</string>
<key>ProgramArguments</key>