<feed xmlns='http://www.w3.org/2005/Atom'>
<title>chime/chime.el, branch v0.7.0</title>
<subtitle>Emacs chimes, notifications, and modeline reminders so you don't miss events
</subtitle>
<id>https://git.cjennings.net/chime/atom?h=v0.7.0</id>
<link rel='self' href='https://git.cjennings.net/chime/atom?h=v0.7.0'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/'/>
<updated>2026-05-05T10:20:34+00:00</updated>
<entry>
<title>chore: bump version to 0.7.0</title>
<updated>2026-05-05T10:20:34+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:20:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=1487cbc03d1c447e9c4b31bfbe44330df10a6d29'/>
<id>urn:sha1:1487cbc03d1c447e9c4b31bfbe44330df10a6d29</id>
<content type='text'>
Header version in chime.el and the Eask manifest both move from 0.6.0 to
0.7.0 for the v0.7.0 release.
</content>
</entry>
<entry>
<title>fix: skip declined events in tooltip, modeline, and notifications</title>
<updated>2026-05-05T10:15:59+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:15:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=e4a254453dedacafcca883a3b20302762c872280'/>
<id>urn:sha1:e4a254453dedacafcca883a3b20302762c872280</id>
<content type='text'>
org-gcal writes `:STATUS: declined' on calendar entries the user has declined,
and chime was happily showing them in the tooltip, modeline, and notification
stream — which defeats the whole point of declining a meeting.

I added `chime-declined-events-predicate', mirroring the shape of
`chime-done-keywords-predicate', and put it on the default
`chime-predicate-blacklist'. The match is on the literal lowercase value
because that's what real org-gcal exports use; uppercase or other values pass
through. Users who want declined events back can pop the predicate off the
blacklist.

Tests cover all four STATUS values seen in real org-gcal data (accepted,
declined, needs-action, tentative), plus the no-property, empty-property,
todo-keyword-still-attached, gibberish-value, case-sensitivity, and
default-blacklist-membership cases.
</content>
</entry>
<entry>
<title>chore: drop non-standard keywords from chime.el header</title>
<updated>2026-05-05T10:06:48+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T10:06:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=f320da4632d014cfd576ce9ba7e65185d14f530a'/>
<id>urn:sha1:f320da4632d014cfd576ce9ba7e65185d14f530a</id>
<content type='text'>
Eask flagged `agenda`, `chime`, and `sound` as unknown finder keywords. The
Eask manifest already lists the canonical set (notification, alert, org,
org-agenda, calendar), so I trimmed the in-file header to match.
</content>
</entry>
<entry>
<title>fix: remove unused `title` lexical in chime--process-notifications</title>
<updated>2026-05-05T09:57:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T09:57:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=8ac0dcdade83e791f2daf9720839e1b603d898b2'/>
<id>urn:sha1:8ac0dcdade83e791f2daf9720839e1b603d898b2</id>
<content type='text'>
`make compile' flagged it. The variable was bound but never referenced
in the bundled-notification branch, so I dropped the `let' binding.
Whether the bundled notification should actually carry that title is
a separate concern, not this fix.
</content>
</entry>
<entry>
<title>fix: trim chime--find-soonest-modeline-event docstring to &lt;=80 cols</title>
<updated>2026-05-05T09:57:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T09:57:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=4d3f8fa2b0f08fb9e67cd17240d0d6b93cb86f5f'/>
<id>urn:sha1:4d3f8fa2b0f08fb9e67cd17240d0d6b93cb86f5f</id>
<content type='text'>
`make compile' flagged the summary line at 86 chars. I split it across
two lines, with the lookahead clause and the return-value sentence on
the lines after.
</content>
</entry>
<entry>
<title>refactor: rewrite chime--time-left without threading-pcase</title>
<updated>2026-05-05T09:56:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-05T09:56:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=d8fd744b0669c6a4b3fb08fb4d75ab421c3a0416'/>
<id>urn:sha1:d8fd744b0669c6a4b3fb08fb4d75ab421c3a0416</id>
<content type='text'>
Edebug's defun parser rejects the `(-&gt; seconds (pcase ...) ...)' form,
so undercover can't instrument chime.el and `make coverage' produces
nothing. The let-bound rewrite is equivalent and parses cleanly.

I left an inline note so the form doesn't get folded back later.
</content>
</entry>
<entry>
<title>refactor: move 12 internal helpers from chime- to chime-- prefix</title>
<updated>2026-04-22T14:43:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T14:43:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=74ca4e066bc41ce0a6e94e2d4bc0c838df45a838'/>
<id>urn:sha1:74ca4e066bc41ce0a6e94e2d4bc0c838df45a838</id>
<content type='text'>
Before MELPA submission, tighten the public API surface. Single-dash chime-foo is the convention for user-facing commands and predicates that external code can bind. Anything that is not meant to be bound externally should use the double-dash chime--foo prefix so byte-compile warnings, docstrings, and MELPA package inspection all point in the same direction.

Twelve helpers in chime.el had single-dash names but no user-facing role. They are not mentioned in README, they carry no interactive declaration, and their docstrings do not promise a behavior contract. Rename them: chime-get-minutes-into-day, chime-get-hours-minutes-from-time, chime-set-hours-minutes-for-time, chime-current-time-matches-time-of-day-string, chime-current-time-is-day-wide-time, chime-day-wide-notifications, chime-display-as-day-wide-event, chime-event-has-any-day-wide-timestamp, chime-event-within-advance-notice-window, chime-event-has-any-passed-time, chime-event-is-today, chime-environment-regex.

The public API surface is now intentional. It covers chime-mode, chime-validate-configuration, chime-refresh-modeline, chime-done-keywords-predicate, and the chime-debug-* interactive commands in chime-debug.el.

Breaking change. No alias shims because there are no downstream users yet.
</content>
</entry>
<entry>
<title>refactor: extract chime--day-label-for-event-time from chime--group-events-by-day</title>
<updated>2026-04-22T12:19:41+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T12:19:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=4ae0429b6a32377cefbfb3d46d3bc9a5cb8613e9'/>
<id>urn:sha1:4ae0429b6a32377cefbfb3d46d3bc9a5cb8613e9</id>
<content type='text'>
The date-string computation mixed the today/tomorrow/weekday label selection in with the grouping loop and carried its own pre-decoded copies of NOW and TOMORROW through five let-bindings before it could decide which branch to take. Lift the selection into chime--day-label-for-event-time (event-time now tomorrow). The outer function becomes pure grouping, the label logic gets its own test target, and future label tweaks (localized strings, a "Yesterday" branch for overdue items) edit one helper.

The outer function drops from 36 to 15 lines. The redundant (when event-decoded) guard is replaced by (when event-time) because decode-time always returns a struct for valid time values.
</content>
</entry>
<entry>
<title>refactor: extract async result helpers from chime--fetch-and-process</title>
<updated>2026-04-22T11:24:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T11:24:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=c0a96481c78b790666fe2d6b1a7fa9b652f02343'/>
<id>urn:sha1:c0a96481c78b790666fe2d6b1a7fa9b652f02343</id>
<content type='text'>
chime--fetch-and-process inlined two near-identical 7-line failure-handling blocks inside the async callback. They differed only in the log prefix ("Async error" for errors surfaced by the async process, "Error processing events" for errors thrown by the callback). Lift the shared body into chime--record-async-failure (err prefix) so the sequence lives in one place, and lift the success path into chime--handle-async-success (callback events) so the callback lambda becomes pure dispatch.

The outer function drops from 44 lines to 22.
</content>
</entry>
<entry>
<title>refactor: extract chime--render-modeline-string from chime--update-modeline</title>
<updated>2026-04-22T01:48:03+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-22T01:48:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/chime/commit/?id=68c899a69c2f36250caffd179efa780a159fc475'/>
<id>urn:sha1:68c899a69c2f36250caffd179efa780a159fc475</id>
<content type='text'>
chime--update-modeline grew to mix orchestration with the modeline-string formation logic. Extract the formation block into its own helper so the orchestrator reads as pure orchestration: build upcoming, find soonest, render, force update.

The helper handles both branches. When a soonest event is in the modeline window, format and propertize via chime--propertize-modeline-string. Otherwise, when chime-modeline-no-events-text is set, propertize that with the appropriate tooltip and click handlers (mouse-1 always, mouse-3 only when there are upcoming events to jump to).

The orchestrator drops from 45 to 25 lines.
</content>
</entry>
</feed>
