Beta

garnotify

Desktop Notification Daemon

A notification daemon implementing the FreeDesktop Desktop Notifications Specification. Features smooth fade/slide animations, urgency-based styling, action buttons, notification history, and a powerful rule engine for filtering and modifying notifications. Integrates with gar via shared Lua configuration and automatic spawning.

Features

  • FreeDesktop Notifications Spec 1.2 compliant
  • D-Bus integration (org.freedesktop.Notifications)
  • Smooth fade and slide animations
  • Urgency-based styling (low, normal, critical)
  • Action buttons with hover effects
  • Notification history with persistence
  • Rule engine for filtering and modification
  • Do Not Disturb mode with pause levels
  • Pango markup support in body text
  • Icon loading (PNG, JPEG, SVG, theme icons)
  • Multi-monitor support (primary, mouse, named)
  • IPC control via garnotifyctl
  • Lua + TOML configuration
  • gar integration with auto-spawn
  • Replacement notifications (progress bars)
  • 6 position options (corners + center)

Installation

garnotify is included in the desktop install preset. Build from source:

Build
cd garnotify
cargo build --release

# Binaries produced:
# target/release/garnotify      - Notification daemon
# target/release/garnotifyctl   - Control client

Quick Start

With gar, simply add a gar.notification table to your config. garnotify will be spawned automatically:

~/.config/gar/init.lua
-- Enable garnotify with default settings
gar.notification = {}

-- Or customize
gar.notification = {
    position = "top-right",
    width = 350,
    timeout = 5000,

    colors = {
        background = "#1e1e2e",
        foreground = "#cdd6f4",
    },

    animation = {
        enabled = true,
        fade_in = 150,
        slide = "down",
    },
}

Or run standalone:

# Start the daemon
garnotify

# Test with notify-send
notify-send "Hello" "This is a test notification"

# Control via garnotifyctl
garnotifyctl close-all
garnotifyctl set-paused true

Configuration Priority

garnotify loads configuration in this order (first found wins):

  1. --config CLI flag
  2. ~/.config/gar/init.lua (gar ecosystem)
  3. ~/.config/garnotify/config.toml
  4. Built-in defaults