Releases: DouglasdeMoura/chroncal
Release list
v0.9.0
--compact is now a table — before and after
This release changes the output of --compact. The table shows the ID, so you can copy it and act on the row at once. Categories and a calendar column join the view, and a ↻ marker flags recurring rows.
Before
After
What changed
- The table prints a header row. Pass
--no-headerto omit it. - The table always shows the ID column.
--show-idstill works outside--compact. - Categories appear in their own column. The column disappears when no row carries a category.
- Column widths fit the content, and the summary truncates with an ellipsis on narrow terminals.
- Output stays plain text with no color codes when you pipe it.
NO_COLORandTERM=dumbalso disable color. - A
↻marker in the date column flags a recurring series or a moved override. - Categories list in alphabetical order.
Also in this release
- The
chroncal accountcommand group is now stable, and account calendars gained a--defaultflag.
Changelog
🚀 Features
- 694330f feat(cli): add a display-width compact table renderer
- 86d1908 feat(cli): add colored compact list tables
- 77f7d0a feat(cli): render event compact lists with the fitted table
- 9b6e61c feat(cli): render the journal compact list with the fitted table
- f551ba8 feat(cli): render the todo compact list with the fitted table
- e6a1fc7 feat(storage): keep the user's category order
🐛 Bug fixes
- 7dfd740 fix(cli): drop trailing padding after the compact summary column
- 6c22d30 fix(nix): update vendorHash after compact list tables merge
- 995d846 fix(nix): update vendorHash for github.com/mattn/go-runewidth 0.0.28
- 9da6e1b fix(nix): update vendorHash for go-runewidth 0.0.28
- d35c1f5 fix(nix): update vendorHash for modernc.org/sqlite 1.57.0
- 0cf49e0 fix(nix): update vendorHash for stretchr/testify 1.12.1
- fd92b83 fix(nix): update vendorHash for stretchr/testify 1.12.1
- 7a7ee7d fix(storage): alphabetize category output
Full Changelog: v0.8.0...v0.9.0
v0.8.0
Behavior changes in 0.8.0
This release changes two default behaviors. Read this section before you update.
Sync conflicts
sync.conflict_strategy now defaults to prompt. A full sync no longer replaces your local edits. It records a conflict and keeps the local edit. Run chroncal sync conflicts to resolve it.
Set conflict_strategy = "server-wins" under [sync] in config.toml to keep the old behavior.
Recurring deletes
event delete --recurrence-id and event delete --following now fail when the timestamp matches no occurrence. Before the fix, the command wrote a phantom EXDATE and exited with code 0. Check the error message for the next valid occurrence.
Notifications
Desktop notifications now show Chroncal as the sender name.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🚀 Features
- a671c65 feat(cli): add --skip-unreadable to ical export
- 169a7a3 feat(sync): add sync doctor escape hatch for wedged resources
- 11d6d28 feat(sync): wire push-failure bookkeeping and harden doctor push
🐛 Bug fixes
- 8f0c723 fix(alarm): reject non-positive daemon interval before the ticker starts
- e7d2a95 fix(alarm): suppress overridden slots for RDATE-only todo masters
- ff0060f fix(auth): narrow keyring probe absence match and clean legacy residue
- 53f36ff fix(auth): probe keyring availability without writing
- 44b7c90 fix(auth): sync plaintext credential temp file before rename
- 7e169ab fix(auth): write plaintext credentials atomically and enforce 0600
- 917d36e fix(caldav): abort cross-host redirects instead of stripping headers
- a49d1fa fix(caldav): merge properties across all 2xx propstats
- ea77a72 fix(calendar): propagate the event count error before the delete prompt
- acebd32 fix(ci): treat missing secret-service as no keyring
- 2f94775 fix(cli): complete the not-found taxonomy and dedupe exdate parsing
- e53db79 fix(cli): reject an inverted --from/--to date range
- 0258a37 fix(cli): satisfy linters in the skip-unreadable caveat builder
- ed61626 fix(cli): share one sync service constructor across sync commands
- 2ff3fba fix(cli): tag exdate and restore failures with the proper error code
- a46e946 fix(cli): unify the calendar not-found error code
- e5af212 fix(cmd): wire purgeByID on shared resource verbs
- c165523 fix(cmd,event): scope guards resolve override rows; --following honors overrides
- f3130a7 fix(event): abort DeleteInstance on a genuine override-lookup error
- d29d522 fix(event): abort DeleteSeries on a genuine master-lookup error
- 75131db fix(event): carry the override recurrence_id in DeleteWithUndo
- ac7fe3f fix(event): commit the instance-delete dirty mark inside the transaction
- 1c0235c fix(event): commit the update-path dirty marks inside the transaction
- eb34b01 fix(event): reconcile sync state when RestoreByUID finds no master row
- d9eba4c fix(event): reconcile sync state when the undo-series master row is gone
- c0c833d fix(event): reject zero and negative --duration
- 6bea0a6 fix(event,sync): reconcile the dirty-mark and probe-test merge seams
- 4f99cf0 fix(ical): abort export when recurring-master expansion fails
- f453baa fix(ical): clear the preserved-DTEND slot on local span edits
- ab0fcba fix(ical): reject out-of-range UTC-OFFSET components
- b0a1993 fix(ical): resolve floating TRIGGER against the record timezone on export
- 8ad310c fix(ical): sanitize free-text values in export parameters
- 5b2f9ab fix(ical): strip UTF-8 BOM before import decode
- 00da956 fix(ical): strip the mailto prefix in any letter case
- afa58c9 fix(icaltransfer): count a first-time override as a new row
- e48bb48 fix(icaltransfer): replace child collections unconditionally on import
- 3f40783 fix(notify): show Chroncal as the notification sender
- dc22380 fix(retry): cap the Retry-After sleep floor
- d4c6c3f fix(retry): classify transient errors on explicit markers only
- 490cd0d fix(storage): fail fast on scan column order mismatch
- c9448c4 fix(sync): derive the first-push href from the resource UID
- 9140675 fix(sync): do not withhold the token on uncanonical multiget misses
- e743088 fix(sync): harden the sync doctor against false wedges and lost consent
- d6228c6 fix(sync): keep conflicting local edits recoverable on 412
- 19ca858 fix(sync): keep pulled server changes recoverable during open conflicts
- 707442b fix(sync): keep resolve --pick local from losing edits
- 2285584 fix(sync): keep the original detection time on a pull refresh
- abd2a1a fix(sync): percent-encode unsafe UID bytes in remote object names
- 88f5f38 fix(sync): preserve the server DTEND when the parsed value is fabricated
- 7915fbe fix(sync): propagate organizer lookup failures instead of failing open
- c00b80a fix(sync): propagate the credential store error in sync read commands
- 0be1501 fix(sync): record organizer lookup failures as push failures
- ddd7d13 fix(sync): sanitize doctor output strings
- 3014e45 fix(sync): sanitize the doctor push confirmation text
- 0cb1dd6 fix(sync): satisfy linters in the conflict handler
- 505c3e1 fix(sync): skip pull over an open conflict
- 6e1a096 fix(sync): surface failed dirty marks in event and journal writes
- 6c19041 fix(sync): surface push finalize failures in the sync result
- 32d8114 fix(sync): write sync health with a cancellation-free context
- aa7ce6c fix(sync,cmd): default conflicts to prompt; reject phantom recurrence ids
- bd9a010 fix(sync,tui): raw-set occurrence guard, safe strategy fallbacks
- ddacb6a fix(tui): clamp the resting ButtonDanger label away from the pill
- 08d7416 fix(tui): clear calendar-move syncing when pending is dropped
- 7f15f90 fix(tui): clear pending keep-local ID when ctrl+c supersedes confirm
- cb4abcc fix(tui): ignore stale calendar-delete counts after pending is cleared
- 169139d fix(tui): inherit overlay idle-path and calendar-move ctrl+c fixes
- 199bdfe fix(tui): inherit overlay routing and calendar-delete count guards
- 8457b90 fix(tui): keep accent contrast polarity when no OSC 4 answer arrives
- ba43d9c fix(tui): make the default dark form label readable
- 681c555 fix(tui): stop LoadTheme fallback from writing to stderr
- 284a69f fix(tui): stop empty confirm results from deleting event 0
- 0818a6c fix(tui): surface held-back edits and dedupe the resolution stamp
- 18ce748 fix(tui,event,cmd): thermos round 4 polish
- 939cf0f fix(tui,event,cmd): thermos round 5 polish
- dce175d fix(tui,recurrence): make the scope guard live and start-based
⚡ Performance
- f078978 perf(tui): memoize the resting danger label clamp
Full Changelog: v0.7.12...v0.8.0
v0.7.12
About this release
- A color change for a Google calendar now syncs to Google. Before, the sync engine marked the color as changed but never sent it.
- A failed calendar-color fetch no longer stops the event sync. The first sync with Google now completes when this fetch fails.
- Error output for a CalDAV 403 now includes the response body and a hint to enable
caldav.googleapis.com.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🐛 Bug fixes
- c6c6c3c fix(sync): keep event sync when calendar-color PROPFIND 403s
- 5699b19 fix(sync): push Google calendar colors through CalendarList
Full Changelog: v0.7.11...v0.7.12
v0.7.11
Behavior changes in 0.7.11
- The month view, the week view, and the mini-calendar no longer force Sunday as the first day. Press W to toggle between Sunday and Monday.
- Set
ui.week_startinconfig.tomlorCHRONCAL_UI_WEEK_STARTto change the default. A choice stored in the TUI has priority over the config file. - The TUI now reloads events after each toggle. Before, cells for adjacent months could show no events.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🚀 Features
- 37c8c19 feat(tui): add Sunday/Monday week-start toggle
🐛 Bug fixes
- fed6083 fix(tui): reload events when week start changes
Full Changelog: v0.7.10...v0.7.11
v0.7.10
Behavior changes in 0.7.10
The sidebar mini-calendar no longer shows a dot on days that have events.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🚀 Features
- 387dfe8 feat(tui): remove event dots from the sidebar mini-calendar
Full Changelog: v0.7.9...v0.7.10
v0.7.9
About this release
This release fixes CalDAV account links, sync, and free/busy results.
- An account that returns now links back to its local calendars.
event update --recurrence-idnow creates an override for one occurrence.- Sync now finishes despite a stale 404 from the server for a deleted event.
- Free/busy data from Radicale now loads. An empty VFREEBUSY no longer marks the window busy.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🐛 Bug fixes
- 41e65a8 fix(account): apply live discovery metadata on calendar re-link
- 7c9b1da fix(account): keep sync identity so a re-link does not recreate hrefs
- 22685c9 fix(account): re-link local calendars when the same account returns
- 6d4677d fix(caldav): keep Radicale free/busy intervals from a REPORT
- af51e7f fix(cli): create an override from event update --recurrence-id
- 896c896 fix(freebusy): do not treat an RFC empty VFREEBUSY as busy
- e7e9e7c fix(sync): converge despite stale Google multiget 404s
Full Changelog: v0.7.8...v0.7.9
v0.7.8
About this release
- The new
account reauthandaccount credentialscommands renew a login or replace a stored secret. calendar hideandcalendar showcontrol the sidebar view of a calendar.sync run --account <name>syncs only the calendars of one account.- In the TUI, press
pto copy the details of the selected event. - Sync now preserves a foreign VALARM.
event update --clear-foreign-alarmsdeletes it on demand.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🚀 Features
- d0e5c4b feat(account): reauth OAuth accounts from the CLI
- ffae8e6 feat(account): rotate basic and bearer credentials
- 2478ab0 feat(calendar): hide and show from the CLI
- de30d24 feat(calendar): include account and hidden in JSON
- 45565b2 feat(cli): add --clear-foreign-alarms to remove a preserved alarm
- 04cad3b feat(sync): run CalDAV sync for one account
- c8c6e28 feat(tui): copy event details with p
🐛 Bug fixes
- c155056 fix(alarm): close the snooze-path gap, filter fetches, surface sync-only alarms
- 7e5dfec fix(alarm): filter sync-only state at read time, keep foreign counts
- fe1ec46 fix(alarm): guard, order, and degrade the alarm write path
- 11da5d0 fix(alarm): keep a foreign UID empty, guard the exported action
- f0401e2 fix(alarm): keep a foreign VALARM whole, batch the todo alarm read
- 676de0f fix(alarm): normalize a malformed stored action as the row loads
- 3678748 fix(alarm): repair a malformed action to a reserved x-name
- 9e56602 fix(alarm): repair a malformed stored action, keep every preserved row
- 0b29c83 fix(alarm): retire dead snoozes, filter fetches in SQL, keep action case
- 0e10768 fix(alarm): retire stuck pending states, close the round-4 findings
- e9aaa5d fix(alarm): retire sync-only state at the write point, keep CLI rows
- 0f31d48 fix(alarm): screen the todo span, correct the state comments
- 1daf2c9 fix(alarm): validate Action and Related at the service write boundary
- 7745ac9 fix(attendee): clamp the constrained parameters, guard the write
- 25c5652 fix(cli): keep OAuth banners off JSON stdout
- 86799c6 fix(duration): align every span gate on ValidateSpan, heal legacy rows
- c2dd063 fix(duration): keep dead trigger rows, add the span rule and year cap
- d7738af fix(duration): let the start own storability, heal spans in a migration
- 7de3f28 fix(duration): parse components as int64, purge dead trigger rows
- cec60c7 fix(duration): reject durations that overflow time.Duration
- 4627588 fix(duration): split the day and time ceilings, widen the trigger heal
- efaf2f0 fix(ical): correct REPEAT:0 handling, guard the repeat fire path
- 5c5a4d7 fix(ical): drop VALARM alarms with an unsupported ACTION
- 0cd8589 fix(ical): harden VALARM REPEAT, DURATION, and empty-ACTION handling
- f5ed9d6 fix(ical): preserve VALARMs with unsupported ACTION values across sync
- 4ff02b6 fix(ical): share the repeat-duration rule, warn on every alarm drop
- 46b3d1c fix(ical): validate VALARM RELATED and DURATION, share the action set
- 9b932ee fix(model): refuse a malformed alarm action at the write boundary
- 9dc04f1 fix(storage): drop the empty-action clause, guard both repair patterns
- 574411a fix(storage): heal legacy alarm rows on startup, defer the clamp warning
- e64904d fix(sync): resolve --account before opening the credential store
- a887348 fix(todo): wrap the span error so it stays inspectable
Full Changelog: v0.7.7...v0.7.8
v0.7.7
About this release
This release adds event launch flags to the root command. Run chroncal --event <id> to open the TUI on one event with its details open. Use --at or --recurrence-id to open one occurrence of an event series.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🚀 Features
- 0fe981e feat(tui): open the TUI on a given event
Full Changelog: v0.7.6...v0.7.7
v0.7.6
About this release
This release fixes the JSON output of event list. The output now includes the attendees of each event.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🐛 Bug fixes
- 1854182 fix(event): include attendees in event list JSON
Full Changelog: v0.7.5...v0.7.6
v0.7.5
About this release
This release adds the command chroncal event rsvp <id|uid>. Set the reply of the calendar owner with --status ACCEPTED|DECLINED|TENTATIVE. The command refuses an owner without an invitation. The command writes the local attendee row. It does not send an iTIP reply.
📦 Install: see the README. Prebuilt binaries and checksums.txt are attached below.
Changelog
🚀 Features
- df651b3 feat(event): add event rsvp CLI
Full Changelog: v0.7.4...v0.7.5

