Skip to content

Releases: DouglasdeMoura/chroncal

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 26 Aug 02:43

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

The old --compact output: three columns with the ID in brackets

After

The new --compact output: a colored table with ID, DATE, TIME, CATEGORIES, CALENDAR, and SUMMARY columns

What changed

  • The table prints a header row. Pass --no-header to omit it.
  • The table always shows the ID column. --show-id still 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_COLOR and TERM=dumb also 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 account command group is now stable, and account calendars gained a --default flag.

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

Choose a tag to compare

@github-actions github-actions released this 25 Aug 11:08

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

Choose a tag to compare

@github-actions github-actions released this 21 Aug 13: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

Choose a tag to compare

@github-actions github-actions released this 21 Aug 09:54

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_start in config.toml or CHRONCAL_UI_WEEK_START to 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

Choose a tag to compare

@github-actions github-actions released this 20 Aug 21:59

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

Choose a tag to compare

@github-actions github-actions released this 19 Aug 20:55

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-id now 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

Choose a tag to compare

@github-actions github-actions released this 19 Aug 17:47

About this release

  • The new account reauth and account credentials commands renew a login or replace a stored secret.
  • calendar hide and calendar show control the sidebar view of a calendar.
  • sync run --account <name> syncs only the calendars of one account.
  • In the TUI, press p to copy the details of the selected event.
  • Sync now preserves a foreign VALARM. event update --clear-foreign-alarms deletes 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

Choose a tag to compare

@github-actions github-actions released this 17 Aug 20:10

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

Choose a tag to compare

@github-actions github-actions released this 17 Aug 17:55

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

Choose a tag to compare

@github-actions github-actions released this 17 Aug 17:20

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