launchd: restore gui domain defaults
Some checks are pending
/ triage (push) Waiting to run
GitHub Pages / publish (ubuntu-latest) (push) Waiting to run

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:25:32 -05:00
parent 6dc9e081ba
commit 165228b0ef
47 changed files with 11 additions and 83 deletions

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}

View file

@ -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.
'';
}

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) {

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 = [

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}"

View file

@ -631,7 +631,6 @@ in
launchd.agents = mkIf webCfg.enable {
opencode-web = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments =
let

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;

View file

@ -87,7 +87,6 @@ in
launchd.agents.borgmatic = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe programConfig.package)

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}"

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"

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;

View file

@ -108,7 +108,6 @@ in
launchd.agents = services (
_name: repo: {
enable = true;
domain = lib.mkDefault "user";
config = {
StartInterval = repo.interval;
ProcessType = "Background";

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)

View file

@ -105,7 +105,6 @@ in
launchd.agents.home-manager-auto-expire = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [ (toString script) ];
ProcessType = "Background";

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 = [

View file

@ -254,7 +254,6 @@ in
launchd.agents.mpd = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe cfg.package)

View file

@ -121,7 +121,6 @@ in
launchd.agents.nix-gc = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${nixPackage}/bin/nix-collect-garbage"

View file

@ -107,7 +107,6 @@ in
launchd.agents.ollama = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${lib.getExe ollamaPackage}"

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 = {

View file

@ -57,7 +57,6 @@ in
launchd.agents.pueued = lib.mkIf (cfg.package != null) {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [

View file

@ -105,7 +105,6 @@ in
launchd.agents.ssh-agent = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe pkgs.bash)

View file

@ -943,7 +943,6 @@ in
launchd.agents = {
syncthing = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
"${pkgs.writers.writeBash "syncthing-wrapper" ''

View file

@ -62,7 +62,6 @@ in
launchd.agents.tldr-update = {
enable = true;
domain = lib.mkDefault "user";
config = {
ProgramArguments = [
(lib.getExe cfg.package)

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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"'
'')
];

View file

@ -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"'
'';
}

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>