{ config, lib, pkgs, ... }: let cfg = config.custom.ntfy-notify; ntfy-notify = pkgs.writeShellApplication { name = "ntfy-notify-authenticated"; runtimeInputs = with pkgs; [ ntfy-sh rbw ]; text = '' username="$(rbw get --field username ntfy.joaoporta.com)" password="$(rbw get ntfy.joaoporta.com)" export NTFY_USER="$username:$password" exec ntfy subscribe --from-config ''; }; 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."; }; title = lib.mkOption { type = lib.types.str; description = "Notification title for this topic"; }; 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"; title = "Kanban Update"; } ]; 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 = "${lib.getExe pkgs.libnotify} -a ntfy -u ${sub.priority} \"${sub.title}\" \"$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 = "${ntfy-notify}/bin/ntfy-notify-authenticated"; Restart = "on-failure"; RestartSec = 10; }; Install.WantedBy = [ "graphical-session.target" ]; }; }; }