SchedKit Architecture
Platform Overview
SchedKit is an API-first incident and assignment coordination platform — not a calendar app. The scheduling layer exists to solve a specific ops problem: getting the right person on-scene or on-call as fast as possible, with a full audit trail, SLA tracking, and real-time awareness. The pitch is intentionally tactical:SchedKit: API-FirstResponder. Signal in. Assignment out. No clicks required.Every capability in the platform — booking, dispatching, incident tracking, org management — is a first-class API resource. The dashboard is a read/write UI built on the same endpoints your agents and automation scripts call.
Core Concepts
Signals
Signals are the input layer — raw events from devices, operators, or automated systems.
Beacon pings are not stored per-ping — only
beacon_on (first activation) and beacon_off (stop) are persisted for audit. Live position is broadcast via SSE only.
All signals are org-scoped: only members of the relevant org receive them on the SSE stream.
Beacons
Beacons are the continuous-tracking variant of signals. An active beacon:- Fires a
beaconsignal on the first ping, writingbeacon_onto the log - Broadcasts live position to org SSE subscribers on every subsequent ping (no DB write)
- Writes
beacon_offwhen stopped, clearing the operator from the live map
Incidents / Tickets
Incidents and tickets are the same object in the same database table — just two mental models over one schema./v1/tickets— for helpdesk/ITSM async flows/v1/incidents— for real-time dispatch + SSE war-room flows
title,description,status(open → in_progress → resolved → closed)priority(low / normal / high / urgent)source(api / email / webhook / alert)sla_due_at,sla_breached,sla_status— computed SLA window based on prioritylat,lng,location_name— incident coordinatescustomer_token— magic link for a public status page (no login required)assignee_id— responder assigned to this incident
Assignments / Bookings
Bookings are the dispatch output — a scheduled assignment linking an attendee (responder) to a host (coordinator) at a specific time. Booking flow:GET /v1/slots/:username/:event_slug?date=YYYY-MM-DD— available windowsPOST /book/:username/:event_slug— submit booking- Email confirmation sent to attendee; optional host confirmation step
cancel_urlandreschedule_urlincluded in all confirmation emails
requires_confirmation: true on the event type, status is held as pending until the host clicks confirm/decline from their email.
Team bookings (/v1/book/:org_slug/:team_slug/:event_slug) auto-assign to an available team member using the team’s routing strategy: round_robin or random.
Orgs / Teams
Multi-tenant scoping works like this:Technology Stack
SSE Architecture
Key Design Principles
1. API-First
Every feature is a durable HTTP endpoint before it’s a UI element. The dashboard is a consumer of the API, not the other way around. This makes the platform agent-native by default.2. Org-Scoped Everything
No data leaks between orgs. SSE streams, signal feeds, ticket lists, booking access — all filtered by org membership. There’s no global admin query.3. Agent-Native
SchedKit was designed for automation from day one:- API key auth on every endpoint
- Machine-readable responses (no HTML-only paths except public booking pages)
- Webhook delivery on booking create/cancel
- SSE streams suitable for
EventSourceconsumption from any agent runtime customer_tokenon incidents for zero-login status polling
4. No Click-Ops Deploys
Infrastructure is GitOps only.git push origin main triggers Plesk webhook → deploy.sh. No SSH-and-restart, no Plesk UI deploy buttons.
5. Fail Gracefully, Log Everything
- Emails, webhooks, Google Calendar sync, and push notifications are all non-blocking (try/catch, fire-and-forget)
- Core booking/signal operations return success even if downstream delivery fails
- Failures are logged via
fastify.log.error