{ config, pkgs, lib, ... }: let p = import ./conf/packages.conf { inherit pkgs; }; remote = p.flatpakRemote; apps = p.flatpakApps; q = lib.escapeShellArg; appArgs = lib.concatStringsSep " " (map q apps); moduleName = "hm-flatpak"; in { services.flatpak.enable = true; # Make network-online.target meaningful on NetworkManager systems systemd.services.NetworkManager-wait-online.enable = true; systemd.services.flatpak-sync = { description = "Sync Flatpak remote and apps"; wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ]; after = [ "network-online.target" ]; # re-run when system changes (useful when app list changes) #restartTriggers = [ config.system.build.toplevel ]; serviceConfig = { Type = "oneshot"; TimeoutStartSec = 300; }; script = '' set -euo pipefail FLATPAK=${pkgs.flatpak}/bin/flatpak # wait for DNS (prevents your exact error) for i in $(seq 1 30); do if ${pkgs.getent}/bin/getent hosts dl.flathub.org >/dev/null 2>&1; then break fi sleep 1 done "$FLATPAK" remote-add --system --if-not-exists ${q remote.name} ${q remote.url} || true installed="$("$FLATPAK" list --system --app --columns=application 2>/dev/null || true)" for app in ${appArgs}; do if echo "$installed" | grep -qx "$app"; then echo "flatpak: already installed: $app" else echo "flatpak: installing: $app" "$FLATPAK" install --system -y ${q remote.name} "$app" fi done ''; }; home.file.".nixlog/loaded.${moduleName}-module-loaded".text = "loaded\n"; }