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
hermes list
# View notification history (inbox)
hermes inbox
hermes inbox --json
# Show a demo notification (no service needed)
hermes demohermes --locale ja --local testdata/localized-restart.jsonhermes --local '{"heading":"Test","message":"Quick local test."}'
hermes --local testdata/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). UI updates live. |
| Do Not Disturb | Detects OS Focus/DND mode. Default: wait and retry. Also: skip or ignore. |
| Settings URIs | url:ms-settings:windowsupdate (Windows), url:x-apple.systempreferences:... (macOS). Platform-filtered at runtime. |
| Countdown timer | Auto-action after timeout. Configurable value returned to calling script. |
| Inbox / history | Completed notifications are persisted. View past actions via hermes inbox (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 (cmd: or url: 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. |
| 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. ↩

