Release date: October 8, 2026

Performance optimizations

Faster loading of large Scheduler datasets

Opening a large booking or production plan now takes less time when resources have many events that do not overlap. The Scheduler applies the event-loading optimization automatically, so existing applications benefit without a new setting.

Use the React Scheduler performance sample to run benchmarks with 10,000, 50,000, or 100,000 events. Compare the loading diagnostics, then test scrolling, editing, moving, and resizing. Test with your own event distribution and content as well; event count alone does not determine performance.

Long timelines at an hourly scale

Plan across months or years while keeping an hourly view. The Scheduler and Gantt chart now render time headers progressively, reducing the work needed to open a long timeline. This is enabled by default.

Try the progressive time headers demo with a one-year hourly timeline (8,760 time cells) or ten years (87,648 time cells). Compare progressive rendering on and off, choose plain, rich, or interactive headers, and jump to the start, middle, or end. The initialization-time readout lets you compare configurations in your browser.

Faster row-header sizing and smoother scrolling

Automatic row-header sizing is faster, especially with many resources or several row-header columns. Use it to fit resource names and other header content without assigning every column a fixed width.

The release also improves Scheduler scrolling with floating event labels. Long bookings keep their labels visible as you scroll, including custom React, Vue, and DOM content, while preserving the content's state.

Features

Long timelines with progressive rendering of time headers

The Scheduler and Gantt chart now render time headers progressively during scrolling. This reduces the initial rendering work and the number of header elements on the page. Progressive rendering is enabled by default.

See the progressive time headers demo to test the performance. It displays up to ten years at an hourly scale (87,000+ time cells).

This new implemenation allows using a long fixed timeline instead of shifting the timeline automatically using infinite scrolling without a performance hit.

progressive time headers 7091
A ten-year hourly timeline with an interactive date header. The screenshot shows the visible start of the timeline; additional headers are prepared as you scroll.

See the Scheduler guide and Gantt guide for configuration. The timing of onBeforeTimeHeaderRender changes: it runs when a header is needed for display or export. Applications that require eager callbacks can set progressiveTimeHeaderRendering to false.

Automatic configuration for infinite scrolling

The new "Auto" value of infiniteScrollingEnabled now sets the infinite scrolling configuration automatically, based on the viewport (timeline buffer, shift distance and edge margin for the current viewport and time scale). It also adapts when the layout or scale changes.

The infinite scrolling mode needs to be used with dynamic event loading to load the required dates and resources. The infinite scrolling guide explains supported configurations, and the interactive demo lets you compare modes and navigation settings.

Smoother resource-tree animation

Expanding and collapsing resource groups now uses a new animation implementation with configurable duration and easing. Automatic duration adjusts to the height of the group.

resource tree animation
Compare groups of different sizes and change the animation settings in the live demo.

Animation remains enabled by default. Set treeAnimation to "Auto" to respect the system’s reduced-motion preference. Use treeAnimationDuration and treeAnimationEasing to adjust the transition. Try the resource tree animation demo or read the resource tree guide.

Custom content in floating event labels

Floating event labels keep event content visible as you scroll horizontally. Now they automatically display custom React components, Vue templates and custom DOM elements that you use to define the event content.

The label also follows the event padding, vertical alignment and font color.

Improvements

Scheduler

Gantt

General

  • Optimization of large grids: Reduce DayPilot.Date allocation overhead and accelerate timestamp access across all components. (2026.4.7080)

  • Improve HTML escaping performance by avoiding DOM allocation for strings that need no escaping. (2026.4.7080)

Fixes

Scheduler

Gantt

  • Fixed errors when dispose() is called while scrollToRow() or scrollToTask() requests are pending (core). (2026.4.7070)

Calendar

  • Fix an exception when calling selectTimeRange() before the first pointer interaction. (2026.4.7079)

Queue

  • Fix event list corruption when tapping the Queue after reordering events using touch. (2026.4.7079)

  • Fix events.remove() ignoring numeric event ID 0 and throwing when the requested ID does not exist. (2026.4.7081)

  • Fix multiselect.get() returning undefined instead of the selected DayPilot.Event. (2026.4.7086)

Kanban

  • Fix omitted card text rendering as undefined instead of empty content. (2026.4.7081)

General

  • Fix DayPilot.DatePicker throwing when a valid date is typed before the popup is opened for the first time. (2026.4.7081)

  • Include the original request in Calendar, Month, Scheduler and Gantt loading error callbacks for empty responses. (2026.4.7086)

  • Fix Calendar, Month, Scheduler and Gantt collection loaders silently ignoring non-array JSON responses. (2026.4.7086)

  • Fix DayPilot.Date returning incorrect results when the same timezone-bearing string is parsed in both local and UTC modes. (2026.4.7086)

  • Route malformed JSON responses through DayPilot.ajax() error callbacks and reject DayPilot.Http promises instead of leaving them pending. (2026.4.7086)

  • Fix DayPilot.Date accepting invalid strings such as constructor and __proto__ instead of reporting a parsing error. (2026.4.7086)

API Changes

Scheduler