{ config, lib, pkgs, ... }: let cfg = config.custom.ntfy-notify; in { options.custom.ntfy-notify = { enable = lib.mkEnableOption "ntfy desktop notification subscriber"; server = lib.mkOption { type = lib.types.str; default = "ntfy.sh"; description = "ntfy server base URL (e.g. ntfy.sh or self-hosted)."; }; subscriptions = lib.mkOption { type = lib.types.listOf (lib.types.submodule { options = { topic = lib.mkOption { type = lib.types.str; description = "ntfy topic to subscribe to."; }; priority = lib.mkOption { type = lib.types.enum [ "low" "normal" "critical" ]; default = "normal"; description = "Urgency level passed to notify-send -u."; }; }; }); default = [ { topic = "joao-kanban"; priority = "critical"; } ]; description = '' List of ntfy topics to subscribe to. Each topic gets a notify-send command that feeds into the desktop notification daemon (SwayNC). ''; }; }; config = lib.mkIf cfg.enable { home.packages = [ pkgs.ntfy-sh ]; # Client config with subscription → notify-send command mappings. # ntfy subscribe (without args) reads subscriptions from client.yml. xdg.configFile."ntfy/client.yml" = { text = '' # Generated by ndots ntfy-notify module. # Each message spawns notify-send → your notification daemon. subscribe: '' + lib.concatMapStringsSep "\n" (sub: let cmd = "notify-send -a Kanban -u ${sub.priority} \"Kanban Update\" \"$m\""; in " - topic: ${cfg.server}/${sub.topic}\n" + " command: ${cmd}" ) cfg.subscriptions; }; systemd.user.services.ntfy-notify = { Unit = { Description = "ntfy push notification subscriber (kanban → notify-send)"; After = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ]; }; Service = { Type = "simple"; ExecStart = "${pkgs.ntfy-sh}/bin/ntfy subscribe"; Restart = "on-failure"; RestartSec = 10; }; Install.WantedBy = [ "graphical-session.target" ]; }; }; }