Desktop notifications for org-agenda events. Get reminded before your events, just like a calendar app.
;; Install from MELPA, then:
(org-wild-notifier-mode)That’s it. You’ll now receive notifications 10 minutes before any TODO item with a scheduled time or deadline.
- Notifications at configurable intervals before events (e.g., 10, 30, 60 minutes)
- Per-entry notification overrides via org properties
- Absolute notification times (remind me at 9am, regardless of when the event is)
- Day-wide event support (events without specific times)
- Filter by keywords, tags, or custom predicates
- Uses the alert package for cross-platform notifications
- Async processing to avoid blocking Emacs
- Programmatic API for custom integrations
Notifications fire N minutes before an event:
;; Notify 10 and 30 minutes before events
(setq org-wild-notifier-alert-time '(10 30))Override per-entry with the WILD_NOTIFIER_NOTIFY_BEFORE property:
* TODO Team meeting
SCHEDULED: <2024-01-21 Sun 14:00>
:PROPERTIES:
:WILD_NOTIFIER_NOTIFY_BEFORE: 60 30 5
:END:
Notifications at specific times, regardless of when the event occurs:
* TODO Prepare slides
DEADLINE: <2024-01-22 Mon 09:00>
:PROPERTIES:
:WILD_NOTIFIER_NOTIFY_AT: <2024-01-21 Sun 20:00> <2024-01-22 Mon 07:00>
:END:
Repeating timestamps work too: <2024-01-21 Sun 09:00 +1d>
For events without a specific time, configure when to be reminded:
;; Remind about day-wide events at 9am and 2pm
(setq org-wild-notifier-day-wide-alert-times '("09:00" "14:30"))Control which entries generate notifications.
;; Only notify for these keywords
(setq org-wild-notifier-keyword-whitelist '("TODO" "NEXT"))
;; Never notify for these keywords
(setq org-wild-notifier-keyword-blacklist '("WAITING"))(setq org-wild-notifier-tags-whitelist '("work" "urgent"))
(setq org-wild-notifier-tags-blacklist '("noremind"));; Only deadlines (ignore SCHEDULED and plain timestamps)
(setq org-wild-notifier-entries '("DEADLINE"))Override per-entry with the WILD_NOTIFIER_ENTRIES property (supports inheritance):
* Project
:PROPERTIES:
:WILD_NOTIFIER_ENTRIES: DEADLINE
:END:
** TODO All children inherit deadline-only filtering
;; Exclude habits
(add-to-list 'org-wild-notifier-predicate-blacklist
(lambda (marker)
(string= "habit" (org-entry-get marker "STYLE"))))Note: Completed items are excluded by default via org-wild-notifier-done-keywords-predicate.
org-wild-notifier-mode- Toggle automatic checking (once per minute)org-wild-notifier-check- Check for notifications noworg-wild-notifier-schedule-at-point- Schedule a one-off notification for the heading at point (N minutes from now)org-wild-notifier-schedule-at-point-at-time- Schedule a one-off notification for a specific time
Customize how notifications appear using the alert package:
;; Notification title and icon
(setq org-wild-notifier-notification-title "Org Reminder")
(setq org-wild-notifier-notification-icon "/path/to/icon.png")
;; Alert severity: 'high, 'medium, or 'low
(setq org-wild-notifier--alert-severity 'high)
;; Pass additional arguments to alert
(setq org-wild-notifier-extra-alert-plist '(:persistent t))| Variable | Description | Default |
|---|---|---|
| org-wild-notifier-alert-time | Minutes before event to notify | ‘(10) |
| org-wild-notifier-notification-title | Notification title | “Agenda” |
| org-wild-notifier-notification-icon | Path to notification icon | nil |
| org-wild-notifier–alert-severity | Alert severity (high/medium/low) | ‘medium |
| org-wild-notifier-extra-alert-plist | Additional args for alert | nil |
| org-wild-notifier-keyword-whitelist | Only notify for these TODO keywords | nil |
| org-wild-notifier-keyword-blacklist | Never notify for these TODO keywords | nil |
| org-wild-notifier-tags-whitelist | Only notify for these tags | nil |
| org-wild-notifier-tags-blacklist | Never notify for these tags | nil |
| org-wild-notifier-predicate-whitelist | Only notify when predicate returns non-nil | nil |
| org-wild-notifier-predicate-blacklist | Never notify when predicate returns non-nil | ‘(org-wild-notifier-done-keywords-predicate) |
| org-wild-notifier-entries | Timestamp types to check | ’(“DEADLINE” “SCHEDULED” “TIMESTAMP”) |
| org-wild-notifier-entries-property | Property for per-entry timestamp type override | “WILD_NOTIFIER_ENTRIES” |
| org-wild-notifier-alert-times-property | Property for per-entry notification times | “WILD_NOTIFIER_NOTIFY_BEFORE” |
| org-wild-notifier-notify-at-property | Property for absolute notification times | “WILD_NOTIFIER_NOTIFY_AT” |
| org-wild-notifier-day-wide-alert-times | Times to alert for day-wide events | nil |
| org-wild-notifier-show-any-overdue-with-day-wide-alerts | Include overdue items in day-wide alerts | t |
| org-wild-notifier-display-time-format-string | Time format in notifications | “%I:%M %p” |
For custom integrations:
org-wild-notifier-get-upcoming-notifications- Get all upcoming notifications. Accepts optional time argument.org-wild-notifier-get-notifications-for-marker- Get notifications for a specific org entry.
Returns plists with: :notify-at, :event-time, :type (relative/absolute/day-wide), :title, :marker, :file, :pos, :id.
- org-alert - Repeating deadline reminders every N minutes
- org-notify - Feature-rich notification system from org-contrib
org-wild-notifier focuses on calendar-style notifications: remind me 10 minutes before my meeting, not every 5 minutes until it happens.