| Booking pages | Public /b/<handle>, invitee books with no account |
| Calendar provider | Google (scopes: calendar.events, calendar.freebusy) |
| Free/busy | Polled live at booking time (no reliance on lossy webhooks) |
| Double-booking guard | Re-checked against the live calendar at confirm |
| Meeting link | Google Meet link created on every booking |
| Both calendars updated | Real event with both parties as attendees |
| Dual time-zone display | Every time confirmed in host zone AND invitee zone |
| Reschedule / cancel | Private capability-key link on every booking, no login |
| Meeting types & availability | Per-host name/length/buffer and weekly rules |
| Host meetings list | Dashboard shows every booking, upcoming and past, with guest, type, and time |
| Custom invitee questions | Per meeting type, required or optional; answered before booking confirms |
| Web calendar | Day, week, and month at /calendar. In the browser, no install, any operating system |
| Multiple calendars | Every calendar you grant, each in its own colour, shown or hidden as you like and saved on the free tier |
| Editing | Create, edit, drag to move, drag to resize, delete. A drag writes only the times, never the rest of the event |
| Repeating events | RFC 5545 RRULE via rrule.js, described in plain English with the next dates previewed. Generated in the event's own zone, so a 9am meeting stays 9am across a daylight-saving change |
| Sync | Google incremental sync tokens, automatic resync when a token expires or its window runs out, and the last sync time shown to you |
| Natural language | A language model reads the phrase. A vague time ("in the evening") is ASKED about, never silently assigned. If the model is unavailable a simple pattern reader takes over and says so |
| Grid | FullCalendar 6.1.19 (MIT), pinned by exact version and subresource-integrity hash |
| Say it once | Plain English rules: keep Friday afternoons clear, no meetings before 9am, nothing after 6pm on weekdays, keep meetings under 90 minutes. Each is restated back so you can check it was understood |
| Prevent (automatic) | A rule becomes real busy time on your booking page, enforced both where slots are shown AND where a booking is confirmed, so a direct request cannot walk through it. No message is sent to anyone |
| Surface (never automatic) | Meetings already on your calendar that break a rule are listed for you. Cachet never declines them and never writes to the organizer |
| Who else has this | Only Microsoft Copilot, which is new and needs an M365 seat. No personal calendar client has it, and none can do the prevent half, because none of them also runs the booking surface |
Free tier live (one link, core scheduling, Google sync, "Powered by Cachet" signature). Paid tiers in design, not yet on sale.