Skip to content

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)

  1. In the calendar module, choose + Add feed.
  2. 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.
  3. 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 (plus ENABLE_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.