| 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 | Six views at /calendar: agenda, day, week, month, quarter, and year. In the browser, no install, any operating system |
| Multiple calendars | Every calendar you grant, each in its own color, 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 |
| Negotiation page | Invite-only /c/<handle>: N people converge on one contiguous block inside a coordinator-set window |
| Verified membership | Personal capability link per member, bound to their email; anonymous visitors see only a gate. The free poll cluster identifies people by display name with an optional password |
| Privacy model | Counts only: no member ever sees whose calendar blocks a slot |
| Availability sources | Painted grid, Google free/busy merged server-side, and any travel iCal feed (Trip Underway, TripIt): all-day travel events block the whole day window |
| Candidate ranking | Live full-block scoring, quorum-aware; ties are surfaced to the coordinator, never auto-resolved |
| Per-block discussion | A comment thread on every candidate block |
| Decide books it | One Google event with every member as attendee and a Meet link; honest manual fallback without a Google grant |
| 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.