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