Built with Quickshell and Go
DankCalendar is a standalone calendar app that brings your Local, Google, Microsoft, CalDAV, and iCloud calendars together in one place. It runs as a lightweight daemon with a tray icon, keeps your accounts in sync, and reminds you about events — all with the look and feel of DankMaterialShell.
This is a monorepo containing both the calendar interface and the core backend services:
dankcalendar/
├── quickshell/ # QML-based calendar interface
│ ├── Modules/ # UI components (calendar views, sidebar, tray)
│ ├── Modals/ # Settings, account, event, and search dialogs
│ ├── Services/ # IPC bridge and shell-side state
│ ├── Widgets/ # Reusable Dank UI controls
│ ├── Common/ # Shared resources, themes, and i18n
│ └── translations/ # POEditor-managed string catalogs
├── core/ # Go backend, daemon, and CLI
│ ├── cmd/dcal/ # dcal CLI and daemon entrypoint
│ ├── internal/ # Providers, sync engine, reminders, IPC, OAuth
│ ├── api/ # HUMA + chi HTTP API
│ ├── ent/ # Ent ORM schema and generated code
│ └── repo/ # Repository-pattern data access
├── assets/ # Icons, desktop entry, systemd unit
└── Makefile # Build, install, and dev targets
# Prebuilt binary
yay -S dankcalendar-bin
# Build from latest git
yay -S dankcalendar-gitsudo make installThis installs:
dcalbinary to/usr/local/bin- Quickshell config to
/usr/local/share/quickshell/dankcal - Desktop entry + icon
Override the prefix with PREFIX=/usr sudo make install.
Optional session service (starts the daemon at login, restarts on failure):
make install-systemd
systemctl --user enable --now dcalYou can also toggle Start at login from Settings → General, which manages
an XDG autostart entry that launches dcal run -d --hidden.
- Quickshell (
qs) - Qt 6 declarative (including
Qt.labs.platformfor the tray icon) - Go 1.25+ (build only — the binary is pure Go, no CGO)
Multiple Providers Connect Local, Google, Microsoft, CalDAV, and iCloud accounts and view every calendar in a single unified agenda.
Background Sync A lightweight daemon keeps your accounts in sync and serves the UI over IPC. Closing the window only hides it — sync and reminders keep running.
Event Reminders Native desktop notifications for upcoming events, with per-event and per-calendar reminder configuration.
Tray Integration A system tray icon to show, hide, and quit the app, plus quick access to upcoming events.
Secure Credentials OAuth tokens and account secrets are stored in your system keyring, never in plaintext.
Keyboard Navigation Full keyboard-driven navigation with a shortcuts overlay, plus spotlight-style search across your events.
Localized User-facing strings are translatable and managed through POEditor.
dcal # launch, or show/focus the window if already running
dcal show # same as above
dcal show --view day # open (or focus) directly on a view: month|week|day|agenda
dcal toggle # toggle window visibility
dcal run # run in the foreground (logs to the terminal)
dcal run -d # run as a background daemon
dcal restart # restart the running shell
dcal kill # stop everythingClosing the window only hides it — the daemon and tray icon keep running.
Reopen from the tray icon, the desktop entry, or dcal show. Quit entirely
from the tray menu or dcal kill.
Manage accounts and sync from the command line:
dcal account list # list connected accounts
dcal account add local ~/cal # add a local calendar directory
dcal account add caldav # add a CalDAV / iCloud account
dcal account setup google # OAuth setup for Google
dcal account setup microsoft # OAuth setup for Microsoft
dcal account remove <account-id> # remove an account
dcal sync [account-id] # force a sync
dcal reminders # list upcoming remindersThe daemon exposes a scriptable IPC surface — handy for keybinds and automation:
dcal ipc ui.toggle
dcal ipc ui.show
dcal ipc ui.show view=day # open on a specific view: month|week|day|agenda
dcal ipc events.list from=2026-06-01 to=2026-06-30
dcal ipc accounts.list
dcal ipc reminders.upcoming
dcal ipc system.autostartmake run # build and run against the in-repo quickshell config
make test # run the Go test suite
make fmt # format Go codeTip: Run with hot reload to pick up QML changes without restarting:
# from core/ DCAL_ENABLE_HOTRELOAD=1 go run ./cmd/dcal run -c ../quickshell
Install prek and activate the hooks:
prek installThe hooks run gofmt -s, go vet, go mod tidy, and the Go test suite for
changes under core/, plus generic whitespace/YAML checks.
See CONTRIBUTING.md for editor setup, the i18n workflow, and Go style guidelines.
Contributions welcome. Bug fixes, widgets, features, providers, and translations all help.
- Fork the repository
- Make your changes
- Test thoroughly (
make test) - Open a pull request
Include screenshots or video in your PR when the change is user-facing.
- Quickshell - Shell framework
- DankMaterialShell - Design language and widgets
- Ent - Go ORM
- HUMA - HTTP API framework
MIT License - See LICENSE for details.