Skip to content
SuperScheduler

Start hereApplies toLite and Pro

What is a resource scheduler?

A resource scheduler is a timeline with one row per resource (a room, a person, a machine, a vehicle) and time running across, so every booking or job is a bar on the row that does the work. An appointment calendar shows one agenda in day, week or month grids; a resource scheduler compares many resources side by side and lets people move work between them. SuperScheduler is such a component for React: Lite is a public, read-only daily timeline on npm, and Pro adds editing, zoom, trees and planning modules.

Verified against v0.1.0 · reviewed October 7, 2026.md

A resource scheduler answers one question: which resource does what, and when is it free? Resources are rows, time runs horizontally, and each piece of work is a bar placed on the row of the resource that does it. A hotel front desk sees rooms and stays, a workshop sees bays and repair jobs, a dispatcher sees technicians and visits.

This page explains how that layout differs from a calendar, when your product needs it, what SuperScheduler takes care of and what stays in your application, and the difference between the two editions. It ends with the vocabulary the rest of the documentation uses.

How it differs from an appointment calendar

Both show events on a time axis, but they are built for different questions.

Appointment calendarResource scheduler
Main questionWhat is on this agenda?Which resource does what, and where is there free capacity?
LayoutDays as columns, hours down the pageResources as rows, time across the page
RowsOne agenda, sometimes a few side by sideTens to thousands of resources, often grouped in a tree
Typical actionOpen or create an appointmentMove work to another resource, change its dates, spot a conflict
HorizonA day, a week or a monthFrom minutes to months, often in the same view with zoom
OverlapsDrawn side by side in a day columnStacked inside the row, or refused by your rules

A calendar is organized around the person who reads it. A resource scheduler is organized around the things that have limited capacity. As soon as users need to compare many of them at once and move work from one to another, the calendar layout stops working: a week view of 80 rooms is 80 calendars.

When you need one

You need a resource scheduler when several of these are true:

  • Capacity is the problem. Rooms, beds, bays, crews, studios, machines, vehicles, berths or instruments can each do one thing at a time, or a limited number of things.
  • Work moves between resources. A booking goes from Room 101 to Room 102, a repair moves to a bay with a lift, a visit is reassigned to another technician.
  • Many resources are compared at once. Dozens to thousands of rows, often grouped by site, floor, team or type.
  • Durations vary widely. Fifteen-minute slots and multi-week assignments live in the same data, so the view must go from minutes to months.
  • Rules decide what may go where. A stay cannot move into the past, a job needs a certified technician, two surgeries cannot share a theatre.

A plain calendar is enough when one person manages one agenda, when the main need is invitations and recurring meetings, or when nobody compares resources. In that case a resource scheduler adds a dimension nobody uses.

Hotel room planningA shower leaks in Room 104. Rehouse the next guest, block the room for the plumber and find the nights that are already full. Physiotherapy clinic appointmentsA patient cannot make 10:00 AM. Find the next slot that respects breaks and room cleaning.

What the library does and what your application does

SuperScheduler is a user interface component. It renders, measures and interacts; it does not own your data or your business.

SuperSchedulerYour application
Draws resource rows, time headers and event bars, and virtualizes both axes so only what is on screen exists in the DOMLoads data from your backend and saves changes back
Stacks overlapping events inside a rowDecides who may see and change what
Handles pointer, touch and keyboard gestures (Pro) and asks your callbacks before committing a changeImplements business rules in those callbacks, and validates again on the server
Shows refusals, conflicts and disabled time (Pro)Decides what counts as a conflict or a closed period
Formats civil dates in the configured localeConverts zoned instants to civil wall-clock times and back

Lite and Pro

SuperScheduler comes in two editions with the same component name and the same date and data conventions.

CapabilityLitePro
Time axisDay cells only (scale: 'Day')Minutes, custom cell durations, hours, days, weeks, months and years
ResourcesFlat list (id, name)Flat lists, trees, frozen and split rows, row header columns
EventsRead-only bars with basic colors, class and tooltipDrag, resize, create by selection, delete, custom HTML, areas and menus
CallbacksonEventClick, onTimeRangeClickThe full set: before and after each change, while dragging, rendering hooks
Overlapping eventsStacked automaticallyStacked, or refused with allowEventOverlap: false, with conflict feedback
Business rules while draggingNot applicableonEventMoving, onEventResizing, disabled cells, per-event locks, async confirmation
ZoomNoneZoom levels, pinch and Ctrl/Cmd+wheel gestures, level of detail, zoom widgets
KeyboardArrow keys move the active cell; Enter or Space activates itFull keyboard model, including moving and resizing events
VirtualizationRows, days and eventsRows, time and events, plus infinite scrolling
SelectionNoneEvents, rows, time ranges, rectangles, several ranges at once
Links between eventsNoneDrawn from your data (finish-to-start and the other three types)
ModulesNoneMinimap, panes, undo and redo, saved views, range loading, React render slots, state hooks
ThemingSix CSS custom propertiesFull token set, dark mode, density presets, Tailwind preset
Unsupported optionsThrow an errorReserved APIs are typed and warn once in development

Neither edition imposes a limit on the number of resources or events. Lite throws when it receives an option it does not implement, so a Pro configuration never silently half-works on Lite. Pro keeps a small set of reserved APIs that are typed for compatibility but not implemented (for example inline text editing, interactive link creation and export to images or spreadsheets); they warn once in development, and the API reference marks them.

For commercial questions about Pro, see pricing.

The data in one picture

Everything the scheduler draws comes from two arrays: resources and events. An event points to its resource by id.

src/planning-data.tsts
import type { SuperScheduler } from 'super-scheduler'

// Rows: anything that can only do one thing at a time, or has a limited capacity.
export const resources: SuperScheduler.ResourceData[] = [
  { id: 'room-101', name: 'Room 101' },
  { id: 'room-102', name: 'Room 102' },
  { id: 'van-3', name: 'Van 3' },
]

// Bars: one interval on one row. `end` is exclusive, so the stay below ends at 11:00 on
// 5 October and a booking that starts at 11:00 that day does not overlap it.
export const events: SuperScheduler.EventData[] = [
  {
    id: 'booking-1042',
    resource: 'room-101',
    start: '2026-10-02T14:00:00',
    end: '2026-10-05T11:00:00',
    text: 'Booking 1042',
  },
  {
    id: 'route-7',
    resource: 'van-3',
    start: '2026-10-03T08:00:00',
    end: '2026-10-03T12:30:00',
    text: 'Delivery route 7',
  },
]

Rendered on a day axis, you would see three rows and two bars: one across 2 to 5 October on Room 101, and one on 3 October on Van 3. The data model guide covers ids, intervals and custom fields in detail.

Glossary

These terms are used with the same meaning across the documentation and the API.

Resource

A row of the scheduler: anything that can do work over time. In the API it is ResourceData, with an id and a name. In Pro, resources can have children (a tree), be frozen at the top or bottom, or be split into sub-rows. Some APIs say row: a row is the rendered resource.

Event

A bar on a resource row: a booking, a shift, a job, a reservation. In the API it is EventData, with an id, text, start, end and the resource it belongs to. In callbacks you usually receive a wrapper (SuperScheduler.Event) whose data property is your object.

Interval

The span of an event, from start to end. Intervals are half-open, [start, end): the start belongs to the event, the end does not. An event ending at 11:00 and another starting at 11:00 do not overlap.

Cell

One step of the time grid on one row: a day, an hour or a 15-minute slot, depending on the scale. Cells are what you click to select time, what snapping aligns to, and what you can disable or decorate with onBeforeCellRender (Pro).

Scale

The size of a cell: Day in Lite; in Pro also Hour, Minute, Week, Month, Year, or CellDuration with a custom number of minutes. The scale is independent of how headers are labeled. See Hours, minutes, days and zoom.

Zoom level

A named set of time-axis options (scale, cell duration, cell width, headers) that Pro applies together. Gestures and control.zoom move between zoom levels, or zoom continuously between them.

Control

The scheduler instance, SuperScheduler.Scheduler. The React component creates one when it mounts and disposes it when it unmounts. You call its methods to scroll, select, update or zoom; handlers receive it as args.control. See React integration.

Next steps