Calendar — Temporal Spine¶
The Glassy calendar ("Temporal Spine") lives on the Today dashboard. It unifies local events, ICS-subscribed external calendars, note reminders, and AI agents around one timeline: what's now, what's next, and what an agent should do when something starts.
The Cockpit¶
The calendar module on the Today dashboard includes:
- Now / Next hero — the current or next event at a glance
- Week strip — your week at a glance, with legacy note-reminder dots
- Month grid and agenda views
- Layer toggles — show or hide each calendar independently (persisted per user)
- Drag-to-schedule — drag any note from Today onto a day to schedule it; the event links back to the note
- + Add feed — subscribe to an ICS URL or a two-way CalDAV collection in place
Every write broadcasts an events_updated SSE event, so all open tabs stay in sync — including writes made by AI agents through MCP.
Creating and Editing Events¶
Click any day or event to open the editor. Events have a title, notes, start/end times, an optional linked note, and (with the Agent Gateway enabled) an agent task — see below. Local events are available on every tier.
Subscribing to External Calendars (Pro)¶
- In the calendar module, choose + Add feed.
- Paste a public ICS/Webcal URL — Google Calendar's "secret address in iCal format", an Apple Calendar public calendar, an Outlook shared calendar, or any CalDAV-exported feed.
- Pick a name and color.
CalDAV two-way (beta.23)¶
Beyond read-only ICS, a calendar can be connected as a full CalDAV collection: Glassy syncs incrementally (RFC 6578 sync-token REPORTs), adopts remote events, and writes back locally-created events — create, edit, and delete propagate to the server as <event-id>.ics. Locally-owned events win on conflict (last-writer-wins in phase 1), our own pushed writes are never re-adopted as duplicates, and credentials are encrypted at rest. Pro-gated like ICS; self-hosted appliances unlock everything.
Real reminders (beta.23)¶
Rule push_reminder actions now deliver real Web Push notifications (in addition to the in-app SSE live update) — open Settings → Push Notifications to subscribe. Self-hosted instances set a VAPID key pair in the compose env (npx web-push generate-vapid-keys); without keys behavior is unchanged (SSE only). iOS delivers push to installed home-screen apps (iOS ≥ 16.4).
Glassy fetches each feed hourly with ETag-conditional requests, expands recurring events (RRULE) over a rolling ±90-day window, and prunes events that disappear from the feed. Feed URLs are SSRF-validated (internal addresses rejected), and sync problems are recorded per feed and shown in the module — a broken feed never breaks the dashboard. ICS subscriptions are a Pro feature on hosted tiers; the self-hosted appliance unlocks everything.
Event-Triggered Agent Dispatch¶
The dispatch itself is self-host only. Event-triggered dispatch requires the Agent Gateway, which runs on the appliance. The calendar (local events + ICS subscriptions) and the MCP time tools work on every instance.
Give an event an agent task — "when this event starts, run…" — and Glassy dispatches it through your connected Agent Gateway agent at event start. Delivery is at-most-once: every dispatch is written to the agent_dispatch_log ledger before the task is sent, so server restarts never double-fire an event. Outcomes appear in the same Agent Gateway activity feed as manual dispatches.
- Requires
ENABLE_CALENDAR_AUTOMATION=true(plusENABLE_AGENT_GATEWAY=true); off by default, and the calendar is fully functional without it. - The task payload follows the same validation as manual dispatch (up to 10,000 characters).
- The self-hosted appliance ships with the flag pre-set in
.env.example.
AI Temporal Capture¶
When the AI layer detects a date/time in what you write ("tomorrow at noon", "friday 10am for 30 minutes"), the calendar shows a confirmation chip — one click creates the event (source='extracted'). Propose-only by design: nothing is ever scheduled without your confirmation.
Rule Time Triggers¶
GlassyKeep rules can fire on on_due and on_overdue with calendar actions: create_event, dispatch_agent, and push_reminder. Rule dispatches are deduplicated through the same ledger as event-triggered dispatches, so a rule never double-fires either.
MCP Time Tools¶
Available on cloud too. The time tools ship in the 37-tool cloud lane; the appliance serves all 42 with no call budget.
AI agents can read and manage your schedule directly: glassy_get_schedule, confirm-gated glassy_create_event (returns a proposal unless confirm: true), glassy_update_event, glassy_delete_event, and (Pro) glassy_find_free_slots — plus the glassy_daily_briefing prompt and the glassy://calendar/today resource. Full reference: MCP Server.
Tiers and Self-Host¶
| Capability | Free | Pro | Self-host |
|---|---|---|---|
| Local events, cockpit, drag-to-schedule | ✓ | ✓ | ✓ |
| ICS feed subscriptions | — | ✓ | ✓ |
glassy_find_free_slots MCP tool |
— | ✓ | ✓ |
| Event-triggered agent dispatch | flag-gated | flag-gated | ✓ (flag pre-set) |
Privacy Notes¶
- ICS feeds are fetched server-side, SSRF-validated, and stored per account; credentials never leave your instance.
- All calendar data is account-scoped: every query and mutation is filtered by
account_id. - Two-way CalDAV/Google write-back is planned; the schema already reserves external identifiers for it.