Files
ndots/modules/home-manager/ntfy-notify/default.nix
T
2026-07-31 10:14:25 -03:00

97 lines
2.8 KiB
Nix

{
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" ];
};
};
}