Events with structure.
Keep appointments, metadata, and calendar state together. Query a date window or reconcile a complete snapshot without recreating unchanged events.
Calendar · Event · EventStore · StateManagerBehind every good calendar.
Recurrence. Timezones. Overlapping appointments. Put the calendar logic your enterprise app needs in one headless JavaScript engine.
Core 2.5.7 · Open source · MIT
CRM appointments
Events · resources · metadata
Normalize / index / expand / query
Your UI · server code
Salesforce adapter · agent caller
01 / inspect the engine
Choose an operation. These examples run the installed Core package in your browser with synthetic events. The output is calculated live.
import { Calendar } from '@forcecalendar/core';
const calendar = new Calendar({ timeZone: 'UTC' });
calendar.addEvent({
id: 'review', title: 'Customer review',
start: '2026-10-05T09:00:00Z',
end: '2026-10-05T09:30:00Z',
recurrenceRule: 'FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=6',
});
const next = calendar.takeOccurrences('review', 6, {
after: new Date('2026-10-05T00:00:00Z'),
});
console.log(next.map(event => event.start.toISOString()));
calendar.destroy();A Monday / Wednesday / Friday series, expanded into its first six occurrences. This example uses UTC.
Loading the engine…
02 / the building blocks
Use the Calendar API to bring it together, or work directly with the exported modules. Your application keeps control of the data and the decisions.
Keep appointments, metadata, and calendar state together. Query a date window or reconcile a complete snapshot without recreating unchanged events.
Calendar · Event · EventStore · StateManagerExpand RRULE recurrence, apply exceptions, and ask for the next occurrence. Lazy iterators let you take a bounded slice of a series.
RecurrenceEngine · RecurrenceEngineV2 · RRuleParserWork with IANA timezones, offsets, and daylight-saving transitions. Keep the event’s timezone explicit as it moves through your application.
TimezoneManager · DateUtilsInspect time, attendee, resource, and location overlaps. Your application decides whether a conflict is a warning or a blocked booking.
ConflictDetectorSearch event content and filter the results. Worker-backed search is available for browser applications that need to move indexing off the main thread.
EventSearch · SearchWorkerManager · InvertedIndexImport and export iCalendar files through the ICS utilities. Use file exchange in your integration; live provider sync requires a separate connection.
ICSParser · ICSHandler · EnhancedCalendar03 / a deliberate boundary
The engine understands calendars. Your system understands your business.
Find your integration pathEvent models, date windows, recurrence expansion, overlap detection, search, and ICS files.
Identity, authorization, persistence, server validation, and the rules that make a booking valid.
Your application code or an agent can invoke the engine through your adapter. Access and execution belong to your application.
04 / a useful first event
Install the package, add a record, and query the dates you need. Add Interface when you’re ready to put a calendar on screen.
import { Calendar } from '@forcecalendar/core';
const calendar = new Calendar({ timeZone: 'UTC' });
calendar.addEvent({
id: 'customer-review',
title: 'Northstar · account review',
start: '2026-10-05T09:00:00Z',
end: '2026-10-05T09:45:00Z',
});
const appointments = calendar.getEventsInRange(
new Date('2026-10-05T00:00:00Z'),
new Date('2026-10-05T23:59:59.999Z'),
);
console.log(appointments);
calendar.destroy(); // Release when finished.Choose with evidence. Review the workloads and scope behind published measurements.
Benchmarks Security review