Orbit Calendar
Orbit Calendar is your self-hosted calendar — a real CalDAV server (RFC 4791) backing the Calendar app you already use in the OS. Subscribe from Apple Calendar, Thunderbird/Lightning, GNOME Calendar, or iOS and your Quazzar calendar shows up as a native account. No proprietary sync, no third-party calendar service.
This is the third app in Quazzar Workspace, alongside Drive and Mail.
What you get
- CalDAV mount surface at
https://<host>/dav/cal/<username>/. Same app passwords as Drive (mint one in Settings → WebDAV access). - Recurring events with RRULE — Daily / Weekly / Monthly / Yearly with optional COUNT or UNTIL terminator. By-weekday for Weekly, by-month-day for Monthly. Stored as standard
RRULE:so external clients render exactly what the web UI shows. - Attendee invites (iMIP) — add attendees by email; each one receives a
text/calendar; method=REQUESTemail through your Orbit Mail (or other configured outbound mail) stack. Recipients RSVP from their own calendar app — standards all the way. - One-click ICS download — every event has a Download
.icsbutton. Mints an HMAC-signed token URL valid for 24 hours so you can share single events with anyone who doesn’t run CalDAV. - ctag-driven incremental sync — every mutation bumps the collection’s
getctag, so clients sync only what changed instead of re-pulling everything.
Mounting the calendar
You’ll need an app password first. Open Settings → WebDAV access, click Mint password, and copy it. The mount URL is shown in the same panel — usually https://<your-host>/dav/cal/<your-username>/.
Apple Calendar (macOS)
- Open Calendar → Calendar → Add Account… → Other CalDAV Account.
- Account Type: Manual.
- Username: your Quazzar username. Password: the app password.
- Server Address:
<your-host>(no scheme, no path — Calendar.app prependshttps://and probes/.well-known/caldav). - Click Sign In. The default
personalcollection appears in the sidebar.
iOS / iPadOS
- Settings → Calendar → Accounts → Add Account → Other → Add CalDAV Account.
- Server:
<your-host>. Username/Password: your Quazzar username + app password. - Save. iOS auto-discovers the principal URL and adds the calendar.
Thunderbird / Lightning
- File → New → Calendar → On the Network → CalDAV.
- Location:
https://<your-host>/dav/cal/<your-username>/personal/. - Username: your Quazzar username. Password: the app password.
- Click Find Calendars to import them in one go.
GNOME Calendar / Evolution
- Online Accounts → Add Account → CalDAV.
- URL:
https://<your-host>/dav/cal/<your-username>/. Same Basic-auth credentials.
Inviting attendees
In the event modal, type or paste an email into the Attendees field. When you save, the OS sends each attendee an iMIP REQUEST email through your configured outbound mail. The recipient’s calendar app will show RSVP buttons (Accept / Decline / Tentative) — those replies come back as iMIP REPLY emails to your Quazzar mailbox.
Outbound mail required. If no mail stack is configured, the Send invite button is greyed out with a hint pointing at Server Mode → Mail. The event still saves locally either way; only the email side is gated.
Recurring events
Pick a repeat rule from the Repeat dropdown in the event modal:
- Daily — optional
COUNT=N(run N times) orUNTIL=<date>(stop on date). - Weekly — optional weekday selector (
BYDAY=MO,WE,FR). - Monthly — optional
BYMONTHDAY=N(Nth day of the month). - Yearly.
These map straight onto the RFC 5545 RRULE property, so anything that reads CalDAV (Apple, Google, Fantastical, BusyCal, …) will show the same recurrences.
Sharing a single event
Click Download .ics in any event’s detail pane. The button mints a 24-hour HMAC-signed URL like https://<host>/api/calendar/events/<id>/ics?token=…. Send the link or the downloaded file to anyone — they can import it into any calendar app.
Data model & migrations
calendar_collections— one row per (user, collection) with actagthat bumps on every mutation.calendar_event_extensions— RRULE blob, attendee JSON, raw ICS for round-tripping properties the OS doesn’t natively model. Existing events auto-migrate into the defaultpersonalcollection on first boot.
Migrations 086_calendar_collections.sql and 087_calendar_event_extensions.sql apply automatically; no manual step.
Limitations & roadmap
- Free tier is single-calendar — multiple/shared/team calendars are gated to Pro+ and ship in 0.7.4. The CalDAV backend already supports them; it’s a UI + gate flip.
- No availability/free-busy view yet — that’s part of the Pro+ team-calendar overlay landing alongside multi-calendar.
- No external calendar import in this release — drag-and-drop ICS import comes in 0.7.4 alongside CardDAV (Orbit Contacts).
API surface
GET /api/calendar/collections— list this user’s collections (with ctag).POST /api/calendar/invite— send iMIPREQUESTfor an existing event.GET /api/calendar/events/{id}/ics?token=…— download a single event as.ics(HMAC-signed token, 24 h expiry)./dav/cal/{user}/...— full CalDAV surface (PROPFIND / REPORT / PUT / DELETE / MKCALENDAR), Basic auth using app passwords.