Skip to main content
Version: 2.0

Dux Calendar

IPC

IPC

The dcal daemon exposes a scriptable IPC surface, handy for compositor keybinds and automation. Invoke a method and pass params as key=value pairs:

dcal ipc ui.toggle
dcal ipc events.list from=2026-06-01T00:00:00Z to=2026-06-30T23:59:59Z
dcal ipc reminders.upcoming limit=5

List every available method and its params:

dcal ipc list

Results are printed as JSON, so they pipe cleanly into jq and friends.

Common Methods​

UI​

MethodDescription
ui.showShow the calendar window — view (month|week|day|agenda)
ui.hideHide the calendar window
ui.toggleToggle the calendar window — view (month|week|day|agenda)
ui.openOpen a webcal:// or https ICS subscription link — url*
ui.openEventOpen a specific event's details window — uid*, start (RFC3339)
ui.quitQuit the running daemon

ui.openEvent addresses events by their iCal UID (events.list includes it as uid), so external tools like bar widgets can jump straight to an event's native details view. Recurring occurrences share the series UID; pass the occurrence's start to pin a specific instance:

dcal ipc ui.openEvent uid=[email protected]
dcal ipc ui.openEvent uid=[email protected] start=2026-07-06T09:00:00Z

If the calendar window isn't open yet, it launches and navigates once loaded.

Events​

MethodParams
events.listquery, from (RFC3339), to (RFC3339), limit, offset (all optional)
events.getuid*, calendarId, start (occurrence start RFC3339 for recurring events)
events.createcalendarId*, summary*, start*, end*, description, location, allDay, status (confirmed|tentative|cancelled), reminders, recurrence (RRULE list)
events.updateid*, plus any of the create fields, plus occurrenceStart (RFC3339 — shift a single occurrence of a recurring series)
events.deleteid*
events.rsvpid*, response* (accept|decline|tentative) — reply to a meeting invitation

Tasks​

MethodParams
tasks.listquery, calendarId, includeCompleted (true|false, default true), limit, offset (all optional)
tasks.getid*
tasks.createcalendarId*, summary*, description, location, due (RFC3339), start (RFC3339), allDay, priority (0-9), status (needs_action|in_process|completed|cancelled), parentUid, reminders, recurrence
tasks.updateid*, plus any of the create fields, plus percentComplete (0-100)
tasks.completeid*, completed (true|false, default true)
tasks.deleteid*

Calendars​

MethodParams
calendars.list—
calendars.createaccountId*, name* (create a calendar in a local account)
calendars.setHiddencalendarId*, hidden* (true|false)
calendars.renamecalendarId*, name (empty clears the override)
calendars.setReminderscalendarId*, overrides (omit to inherit global settings)
calendars.deletecalendarId*

Accounts​

MethodParams
accounts.list—
accounts.refreshaccountId (empty syncs all)

Reminders​

MethodParams
reminders.upcominglimit (default 20)
reminders.testFire a test notification

System​

MethodParams
system.autostart.getReport autostart status
system.autostart.setenabled* (true|false)
system.colorScheme.getCurrent portal color scheme (0 no preference, 1 dark, 2 light)
system.openUriuri* — open a URI with the desktop portal's default handler

Live Updates​

Subscribe to push events instead of polling. Handy for bar widgets that mirror calendar state:

MethodParams
subscribetopics — comma list of accounts,calendars,events,tasks,sync,ui (all if omitted)
unsubscribetopics — topics to stop receiving
pingLiveness check
versionDaemon and API version
describeList every method and its params (same data as ipc list)
tip

* marks a required param. Run dcal ipc list for the complete, always-up-to-date set of methods on your installed version.

Keybind Example​

Bind a key in your compositor to toggle the calendar. For niri:

binds {
Mod+Shift+C { spawn "dcal" "ipc" "ui.toggle"; }
}