hermes 1 renders system notifications inside a pretty Wails v2 webview instead of platform-specific toasts. Defines configs in JSON or YAML and produces consistent-looking notifications across Linux, macOS, and Windows.
Disclaimer: This was created as a fun side project, not affiliated with any company.
Download from Releases and run the installer:
| Platform | Install |
|---|---|
| Windows | Execute hermes.msi |
| Linux | sudo dpkg -i hermes.deb |
| macOS | Open hermes.pkg (universal, Intel + Apple Silicon) |
# Start the service daemon
hermes serve
# Send a notification (blocks until user responds)
hermes notify '{"heading":"Restart Required","message":"Please restart.","buttons":[{"label":"Restart","value":"restart","style":"primary"}]}'
# Or use --config
hermes --config notification.json
# List active notifications (numbered)
hermes list
# Show details and available actions by position number
hermes list --details 1
# Respond by position number (or interactively with no value)
hermes respond 1
# View notification history
hermes history
hermes history --json
# Show a demo notification (no service needed)
hermes demohermes --locale ja --local testdata/examples/localized-restart.jsonhermes --local '{"heading":"Test","message":"Quick local test."}'
hermes --local testdata/examples/restart-notification.jsonhermes notify '{"heading":"Restart","message":"Please restart.","defer_deadline":"24h","max_defers":3,"buttons":[{"label":"Defer 1h","value":"defer_1h","style":"secondary"},{"label":"Restart","value":"restart","style":"primary"}]}'The service tracks deferrals per notification, persisted to disk. When the user defers, the notification reappears after the specified interval — even across service restarts. After max_defers or defer_deadline, the notification auto-actions.
| Feature | Description |
|---|---|
| Buttons & dropdowns | Primary, secondary, danger styles. Dropdown menus for defer options. |
| Deferrals | User can defer N times within a deadline. State persists across restarts. |
| Image carousel | Embed slides/screenshots via HTTPS URLs or data URIs. Arrow key navigation. |
| Filesystem watch | Monitor paths for changes (e.g. wait for install receipt). Shimmer on accent bar indicates active watching, stops on first event. |
| Do Not Disturb | Detects OS Focus/DND mode. Default: wait and retry. Also: skip or ignore. |
| Settings URIs | uri:ms-settings:windowsupdate (Windows), uri:x-apple.systempreferences:... (macOS). Platform-filtered at runtime. |
| Countdown timer | Accent bar shrinks visually over the timeout period (scaleX, GPU composited). Auto-action after timeout. |
| History | Completed notifications are persisted. View past actions via hermes history (UI or JSON). Auto-pruned by age and count. |
| Offline queue | Service unreachable? Notification is persisted locally and delivered on next startup. Exit 203. |
| Priority | Control delivery order (0-10). Higher priority notifications drain first. |
| Escalation ladder | Progressive urgency after repeated deferrals — shorter timeout, warning color, urgency text. |
| Action chaining | Map user responses to automatic follow-up actions (action: or uri: prefix). |
| Quiet hours | Time-based delivery suppression. Overnight ranges supported. |
| Localization | heading_localized / message_localized maps + --locale flag for multi-language notifications. |
| Dependencies | Sequential workflows: notification B waits for notification A to complete. |
| Broadcast | Run as SYSTEM/root, auto-delivers to all active user sessions. No wrapper scripts needed. |
| Terminal CLI | Full interaction without a GUI: hermes list, show, respond, cancel with numbered positions. Interactive TTY picker. MOTD login banner for SSH sessions. |
| System tray icon | Persistent notification-area icon with pending count and quick history access. Auto-detected on desktop sessions, skipped on headless. |
| App launcher shortcut | "Hermes Notifications" in Start Menu / Spotlight / GNOME Activities. Searchable by name and "notifications" keyword. |
| Native notifications | hermes | |
|---|---|---|
| Look | Different on every OS | Identical everywhere -- your HTML/CSS |
| Interactivity | Limited (approve/dismiss) | Buttons, dropdowns, countdown, links |
| Branding | OS-controlled | Fully yours -- colors, layout, fonts |
| Portability | Rewrite per platform | Single HTML/CSS/JS, ships in the binary |
- Examples -- screenshots of every notification type
- Usage -- JSON/YAML config, subcommands, flags, exit codes
- Architecture -- service daemon, gRPC, deployment, packages
- Broadcast -- SYSTEM/root to user delivery
- Development -- building, testing, dev workflow
- Platforms -- webview engines, per-OS deployment
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Footnotes
-
Named after Hermes, the Greek messenger god. ↩

