FullCalendar’s resource timeline and resource columns are Premium: a commercial app needs a paid license key. Its license page lists the free options, for apps that are entirely AGPL and for registered non-profits. The Needless UI scheduler has both under MIT, with repeating events and iCalendar files. This guide moves an Angular app from one to the other: what carries over, what doesn’t, and the data to convert.

It uses FullCalendar 7’s names, with version 6’s in brackets where they differ. FullCalendar’s Angular connector supports Angular 16 to 22; Needless UI needs Angular 22.

What you get

FullCalendar and the Needless UI scheduler
FeatureFullCalendarNeedless UI
Resource timeline: a row per room or personPremiumYes: a day, a week or a month
Resources as columns in the day and week viewsPremiumYes
Month, week and day viewsFreeYes
Drag to move and resizeFree; onto another resource with PremiumYes, onto other resources too. The end resizes, the start doesn’t.
Select time to create an eventFreeYes, with a pointer, a long press or the keyboard
Rules such as no overlapsFree: overlap and constraint optionsYes: one allow function, asked before every change
Move and resize events from the keyboardNot in its accessibility docs, which cover ARIA labels and Tab focusYes, announced to screen readers
Repeating eventsFree, with the rrule plugin and libraryBuilt in: RFC 5545 rules, without EXRULE, RDATE or rules by the hour
iCalendar (.ics)Free: reads a feedReads and writes .ics files
List and year viewsFreeAn agenda of the coming days; no year views
Time zonesFree: local, UTC or namedNo: it shows the wall-clock times it gets
Grouped, nested or multi-column resourcesPremiumNo: one column, drawn by your template
External drag and drop, background eventsFreeNo
Printing, virtual renderingPremiumNo
FrameworksAngular 16 to 22, React, Vue, plain JavaScript and moreAngular 22 and React 19

What maps to what

FullCalendar options and their Needless UI counterparts
FullCalendarNeedless UI scheduler
<full-calendar [options]>, plugins, schedulerLicenseKey<nui-scheduler>, with an input for each option; no plugins and no key
initialView: 'resourceTimelineDay'view="timeline", and timelineSpan for a week or a month
initialView: 'timeGridWeek'view="week"; [(view)] is two-way
resources, events[resources], [events]
resourceId, extendedPropsresource, data
editable, selectableeditable, selectable
select(slotSelect): { start, end, allDay, resource }
eventDrop, eventResize(eventChange): nothing moves until you update events
eventClick(eventClick)
eventOverlap, selectOverlap, eventAllow[allow]: one function for moves, resizes and selections
slotDuration, snapDurationslotMinutes, snapMinutes, in minutes
slotMinTime, slotMaxTime, scrollTimedayStart, dayEnd, scrollHour, in hours
businessHours[businessHours], with weekdays from 1 (Monday) to 7
datesSet(rangeChange)
eventContent, resourceCellContent [resourceLabelContent]nuiSchedulerEvent and nuiSchedulerResource templates
locale, firstDaylocale (any BCP 47 tag), firstDay from 1 to 7, and labels for its words

A room booking timeline, both ways

Rooms are resources and bookings are events. People drag across a room to book it and drag a booking to move it, and a room holds one booking at a time. With FullCalendar 7 and its Premium resource timeline:

With the Needless UI scheduler:

Two things work differently. FullCalendar moves a booking itself, and the app copies the change; the Needless UI scheduler only reports it, and updating events keeps it, so your data stays the one source. And allow is plain code, asked before every change from a pointer or the keyboard, so the rule is yours to test. The booking calendar guide builds this app step by step.

Converting the data

FullCalendar data and what the scheduler expects
FullCalendarNeedless UI
An all-day end is the day after the eventAn all-day end is its last day: take a day off
Times may end in Z or an offset such as +02:00Wall-clock times without an offset, such as 2026-11-02T09:30
Weekdays from 0 (Sunday) to 6, in businessHours and firstDayWeekdays from 1 (Monday) to 7 (Sunday)
Durations as strings, such as '00:30'Numbers: minutes or hours
Resources sorted by id, then titleResources in the order of the array
rrule as an object, and exruleAn RFC 5545 string, such as FREQ=WEEKLY;BYDAY=MO,FR, and exdate
A time zone such as America/New_YorkConvert the times first. nuiSchedulerFromIcs(text, { timeZone }) converts .ics files as it reads them.

If you need what’s missing

If your app depends on time zones, grouped resources, external drag and drop or printing, the scheduler can’t replace FullCalendar yet. Open an issue for what you need. For everything else, the scheduler’s page has every input, output and example.