A status-page schema for tracking the health of self-hosted services. Components are the spine, with incidents, scheduled maintenance, subscriptions, and metric charts all hanging off them.
What this Cachet schema covers
Component and component-group health
Incident reporting and threaded status updates
Scheduled maintenance windows
Subscribers and per-component notifications
User-defined metrics and time-series points
Outbound webhooks and API key access
A few decisions the diagram can't show:
updates is morphable via updateable_type/updateable_id, so one status update can attach to an incident or a maintenance schedule. It was renamed from incident_updates once schedules gained updates.
incident_components snapshots each affected component's component_status at incident time, separate from the component's live status, so history survives a later recovery.
Tagging is polymorphic through taggables (taggable_type/taggable_id), replacing the old component_tag pivot; tags enforces a unique (name, slug).
settings is a spatie/laravel-settings key/value store with a unique (group, name) and a payload JSON column.
Incidents carry external_provider/external_id and a unique guid, so third-party monitors push incidents without duplicating them.
Good fork target for a status page with morphable updates and per-component subscriptions. Settings live in JSON, so you'll need JSON functions to query a single key in SQL.
Self-hosted status page system — Cachet is the open-source, self-hosted status page system. Teams run it to report incidents, post maintenance windows, and track service health.