Skip to content

cjennings/chime

Repository files navigation

CHIME Heralds Imminent Modeline Events

Features | Installation | Quick Start | Documentation | Development & Testing | History

assets/made-for-emacs-badge.svg

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.

Features

  • 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

Installation

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.

package-vc-install (Emacs 29+)

(unless (package-installed-p 'chime)
  (package-vc-install "https://github.com/cjennings/chime"))

use-package with :vc (Emacs 29+)

(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.el

(straight-use-package
 '(chime :type git :host github :repo "cjennings/chime"))

quelpa

(quelpa '(chime :fetcher github :repo "cjennings/chime"))

Manual installation

git clone https://github.com/cjennings/chime.git ~/path/to/chime
(add-to-list 'load-path "~/path/to/chime")
(require 'chime)
(chime-mode 1)

Quick Start

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

Documentation

  • 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

Minimal Configuration Examples

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

Development & Testing

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 coverage

See TESTING.org for the full test guide.

History

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.

Migration from org-wild-notifier

If you’re migrating from org-wild-notifier, update your configuration:

  1. Change package name:
    • (require 'org-wild-notifier)(require 'chime)
  2. Update all configured variable names:
    • org-wild-notifier-*chime-*
  3. Update configured function names:
    • org-wild-notifier-modechime-mode
    • org-wild-notifier-checkchime-check
  4. The per-event reminder property is back. :CHIME_NOTIFY_BEFORE: N on a heading (N = a non-negative integer number of minutes) overrides chime-alert-intervals for 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”.

License

GPL-3.0

About

Emacs chimes, notifications, and modeline reminders so you don't miss events

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors