{ config, pkgs, lib, ... }: let desiredFlatpaks = [ "ch.threema.threema-web-desktop" ]; flatpakScript = pkgs.writeScript "nix-flatpak-management" '' #!${pkgs.runtimeShell} -e ${pkgs.flatpak}/bin/flatpak remote-add \ --if-not-exists flathub \ https://dl.flathub.org/repo/flathub.flatpakrepo # Get currently installed Flatpaks installedFlatpaks=$(${pkgs.flatpak}/bin/flatpak list --app --columns=application) # Users can decide what flatpaks they want to install so this is disabled # Remove Flatpaks not in the desired list # for installed in $installedFlatpaks; do # if ! echo ${lib.concatStringsSep " " desiredFlatpaks} | grep -q "$installed"; then # echo "Removing $installed because it's not in the desiredFlatpaks list." # ${pkgs.flatpak}/bin/flatpak uninstall -y --noninteractive "$installed" # fi # done # Install or re-install desired Flatpaks for app in ${lib.concatStringsSep " " desiredFlatpaks}; do echo "Ensuring $app is installed." ${pkgs.flatpak}/bin/flatpak install -y --noninteractive flathub "$app" done # Remove unused Flatpaks ${pkgs.flatpak}/bin/flatpak uninstall --unused -y --noninteractive # Update all installed Flatpaks ${pkgs.flatpak}/bin/flatpak update -y --noninteractive ''; in { ############################################################ # Flatpak Management Service ############################################################ systemd.services.nix-flatpak-management = { description = "Manage Flatpak installations"; wants = [ "network-online.target" ]; after = [ "network-online.target" ]; serviceConfig = { Type = "oneshot"; RemainAfterExit = "yes"; ExecStart = "${flatpakScript}"; }; wantedBy = [ "multi-user.target" ]; }; ############################################################ # Flatpak Management Timer ############################################################ systemd.timers.nix-flatpak-management = { description = "Run flatpak management periodically"; wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = "2min"; OnUnitActiveSec = "5min"; Persistent = true; }; }; }