Skip to content

emacsorphanage/org-wild-notifier

Repository files navigation

org-wild-notifier.el

https://github.com/emacsorphanage/org-wild-notifier/actions/workflows/test.yml/badge.svg https://stable.melpa.org/packages/org-wild-notifier-badge.svg https://melpa.org/packages/org-wild-notifier-badge.svg

Desktop notifications for org-agenda events. Get reminded before your events, just like a calendar app.

Quick Start

;; 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.

Features

  • 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

Notification Types

Relative Notifications (default)

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:

Absolute Notifications

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>

Day-Wide Events

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"))

Filtering

Control which entries generate notifications.

By Keyword

;; 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"))

By Tag

(setq org-wild-notifier-tags-whitelist '("work" "urgent"))
(setq org-wild-notifier-tags-blacklist '("noremind"))

By Timestamp Type

;; 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

By Custom Predicate

;; 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.

Interactive Commands

  • org-wild-notifier-mode - Toggle automatic checking (once per minute)
  • org-wild-notifier-check - Check for notifications now
  • org-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

Alert Customization

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))

Configuration Reference

VariableDescriptionDefault
org-wild-notifier-alert-timeMinutes before event to notify‘(10)
org-wild-notifier-notification-titleNotification title“Agenda”
org-wild-notifier-notification-iconPath to notification iconnil
org-wild-notifier–alert-severityAlert severity (high/medium/low)‘medium
org-wild-notifier-extra-alert-plistAdditional args for alertnil
org-wild-notifier-keyword-whitelistOnly notify for these TODO keywordsnil
org-wild-notifier-keyword-blacklistNever notify for these TODO keywordsnil
org-wild-notifier-tags-whitelistOnly notify for these tagsnil
org-wild-notifier-tags-blacklistNever notify for these tagsnil
org-wild-notifier-predicate-whitelistOnly notify when predicate returns non-nilnil
org-wild-notifier-predicate-blacklistNever notify when predicate returns non-nil‘(org-wild-notifier-done-keywords-predicate)
org-wild-notifier-entriesTimestamp types to check’(“DEADLINE” “SCHEDULED” “TIMESTAMP”)
org-wild-notifier-entries-propertyProperty for per-entry timestamp type override“WILD_NOTIFIER_ENTRIES”
org-wild-notifier-alert-times-propertyProperty for per-entry notification times“WILD_NOTIFIER_NOTIFY_BEFORE”
org-wild-notifier-notify-at-propertyProperty for absolute notification times“WILD_NOTIFIER_NOTIFY_AT”
org-wild-notifier-day-wide-alert-timesTimes to alert for day-wide eventsnil
org-wild-notifier-show-any-overdue-with-day-wide-alertsInclude overdue items in day-wide alertst
org-wild-notifier-display-time-format-stringTime format in notifications“%I:%M %p”

Programmatic API

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.

Alternatives

  • 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.

About

Alert notifications for org-agenda

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

 
 
 

Contributors