Features | Installation | Quick Start | Documentation | Development & Testing | History
” I love deadlines. I love the whooshing noise they make as they go by. ” — Douglas Adams
CHIME (backronym: CHIME Heralds Imminent Modeline Events) makes sure your org-agenda events don’t whoosh by unnoticed. You get desktop notifications, an audible chime, and your next event shows up in the modeline.
- Desktop notifications with configurable alert intervals and urgency
- Optional audible chime sound, using the bundled WAV or a custom file
- Interactive modeline display for the next timed event
- Hover tooltip with upcoming events grouped by day
- Left-click calendar URL and right-click jump-to-org-entry actions
- SCHEDULED, DEADLINE, plain timestamp, and repeating timestamp support
- 12-hour and 24-hour org timestamp parsing
- All-day event notifications for birthdays, holidays, and multi-day events
- Filtering by TODO keywords, tags, and custom predicates
- Async agenda checks so Emacs stays responsive
- Well-tested, including with org-gcal
Not on MELPA yet, but coming soon.
Requirements: Emacs 27.1+, org-mode 9.0+, and the alert, dash, and async packages. Package managers pull these automatically.
(unless (package-installed-p 'chime)
(package-vc-install "https://github.com/cjennings/chime"))(use-package chime
:vc (:url "https://github.com/cjennings/chime" :rev :newest)
:after alert
:commands (chime-mode chime-check chime-refresh-modeline)
:bind ("C-c A" . chime-check)
:config
;; Notify 5 minutes before and at event time.
(setq chime-alert-intervals '((5 . medium) (0 . high)))
;; Keep the modeline focused on imminent events.
(setq chime-modeline-lookahead-minutes 120)
(setq chime-tooltip-lookahead-hours 168)
;; Default exclude rules skip done items and declined invitations.
(setq chime-exclude-filters
'((predicates . (chime-done-keywords-predicate
chime-declined-events-predicate))))
(chime-mode 1))(straight-use-package
'(chime :type git :host github :repo "cjennings/chime"))(quelpa '(chime :fetcher github :repo "cjennings/chime"))git clone https://github.com/cjennings/chime.git ~/path/to/chime(add-to-list 'load-path "~/path/to/chime")
(require 'chime)
(chime-mode 1)Once you’ve installed chime, the only thing you actually need is:
(chime-mode 1)The defaults are intentionally usable: chime checks org-agenda-files every 60 seconds, notifies 10 minutes before events and again at event time, plays the bundled chime sound, and shows the next timed event in the modeline. Make sure your calendar org files are in org-agenda-files.
Modeline interaction:
- Hover to see upcoming events grouped by day
- Left-click to open
chime-calendar-url, when configured - Right-click to jump to the next event’s org entry
Manual commands:
M-x chime-check ; refresh and send due notifications
M-x chime-refresh-modeline ; refresh modeline only, without notifications
M-x chime-validate-configuration- Configuration — alert intervals, modeline, tooltip, filtering, all-day events, and advanced settings
- Architecture — state flow, async retrieval, event data structures, and subsystem boundaries
- Integrations — org-gcal and org-contacts setup notes
- Troubleshooting — debug mode, missing notifications, sound issues, event detection, and duplicate notifications
- Testing — running and writing the ERT test suite
Notify at event time only:
(setq chime-alert-intervals '((0 . high)))Use a compact modeline:
(setq chime-modeline-format " ⏰ %s")
(setq chime-notification-text-format "%t (%u)")
(setq chime-time-left-formats
'((at-event . "now")
(short . "%mm")
(long . "%hh%mm")))Disable sound:
(setq chime-sound-file nil)Filter out done items and declined invitations:
(setq chime-exclude-filters
'((predicates . (chime-done-keywords-predicate
chime-declined-events-predicate))))Clone the repo and load from source:
git clone https://github.com/cjennings/chime.git(add-to-list 'load-path "~/path/to/chime")
(require 'chime)Quick test commands:
make test
make test-file FILE=modeline
make coverageSee TESTING.org for the full test guide.
CHIME started life as org-wild-notifier, written by Artem Khramov. I relied on it daily for years, so when Artem archived the repo and stopped responding to issues in August 2025, I adopted it rather than let it rot. One bug fix led to another, features crept in, and eventually it had changed enough to deserve its own name.
Org-wild-notifier itself has since been picked back up under the Emacs Orphanage. Chime continues on its own line because it has materially diverged — see the Features list for what it adds.
All credit for the original idea and architecture goes to Artem. I’m just the person who couldn’t let it go.
Bug reports, feature requests, and PRs are welcome — consider this repo CHIME’s permanent home.
If you’re migrating from org-wild-notifier, update your configuration:
- Change package name:
(require 'org-wild-notifier)→(require 'chime)
- Update all configured variable names:
org-wild-notifier-*→chime-*
- Update configured function names:
org-wild-notifier-mode→chime-modeorg-wild-notifier-check→chime-check
- The per-event reminder property is back.
:CHIME_NOTIFY_BEFORE: Non a heading (N = a non-negative integer number of minutes) overrideschime-alert-intervalsfor that heading. The old:WILD_NOTIFIER_NOTIFY_BEFORE:name still works as a deprecated alias (chime warns once per session). See Configuration → “Per-Event Override”.