React On-Call Schedule Board
The board that answers “who do I wake at 3am”, and the escalation panel that answers “and who after them”. Built so a swap someone arranged last week reads differently from the published rota — because at 3am, that difference is the whole point.
On-call rotation
Week of 20 Jul| Mon | Tue | Wed | Thu | Fri | Sat | Sun | |
|---|---|---|---|---|---|---|---|
| Primary | MOM. | MOM. | ALA. | JRJ. | JRJ. | JRJ. | JRJ. |
| Secondary | SKS. | SKS. | SKS. | SKS. | SKS. | ALA. | ALA. |
Escalation policy
- +5m Secondary
- →+15m Shift lead
- →+30m Eng. manager
Installation
Props
| Prop | Type | Description |
|---|---|---|
| people | OnCallPerson[] | { id, name, initials } |
| shifts | Shift[] | { personId, day, tier } — day 0–6, Mon-first |
| overrides | Override[] | { personId, day, tier, reason } |
| escalation | EscalationRule[] | { afterMinutes, target } |
| today | number | 0–6, highlights the current column |
An override is not a schedule edit
When someone covers a shift, the board keeps the original rotation underneath and draws the override on top — amber, with the reason on hover — rather than silently replacing the name. This is deliberate. A page that goes to the wrong person because a swap was quietly merged into the rota is a page that gets missed, and the operator staring at the board needs to see that today is not the normal pattern. A running count of overrides sits below the grid so nobody is surprised by a busy week.
The current day is highlighted top-to-bottom so your eye lands on the right column immediately, and the tier column is sticky so the Primary/Secondary labels stay put as the week scrolls on a narrow screen.
The escalation path is on the same screen
Knowing who is primary is half the answer; the other half is what happens when they don't pick up. The escalation policy renders as an explicit chain — Secondary at +5m, shift lead at +15m, manager at +30m — next to the roster, so the full answer to "who handles this" lives in one place instead of in a runbook nobody opens mid-incident.
New components every week
Get the week's new Kelvin UI components and templates in one short email. No spam, unsubscribe anytime.