The logic layer / @forcecalendar/coreSource on GitHub

Behind every good calendar.

Make time
make sense.

Recurrence. Timezones. Overlapping appointments. Put the calendar logic your enterprise app needs in one headless JavaScript engine.

Core 2.5.7 · Open source · MIT

Your inputsRecords with dates

CRM appointments
Events · resources · metadata

@forcecalendar/coreA calendar engine

Normalize / index / expand / query

Your consumersUse the result anywhere

Your UI · server code
Salesforce adapter · agent caller

0runtime dependencies
Headlessno UI required
.d.tsTypeScript declarations
MITyour product, your code

01 / inspect the engine

Less hand waving.
More return values.

Choose an operation. These examples run the installed Core package in your browser with synthetic events. The output is calculated live.

Core 2.5.7 / live execution
recurrence.js
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();
Result / synthetic dataset

One rule. Six appointments.

A Monday / Wednesday / Friday series, expanded into its first six occurrences. This example uses UTC.

Loading the engine…

Waiting for results

02 / the building blocks

The hard parts,
in one place.

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.

01

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 · StateManager
02

One series. Many dates.

Expand RRULE recurrence, apply exceptions, and ask for the next occurrence. Lazy iterators let you take a bounded slice of a series.

RecurrenceEngine · RecurrenceEngineV2 · RRuleParser
03

Time has a context.

Work with IANA timezones, offsets, and daylight-saving transitions. Keep the event’s timezone explicit as it moves through your application.

TimezoneManager · DateUtils
04

Find the collision.

Inspect time, attendee, resource, and location overlaps. Your application decides whether a conflict is a warning or a blocked booking.

ConflictDetector
05

Find the appointment.

Search 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 · InvertedIndex
06

Let calendars travel.

Import and export iCalendar files through the ICS utilities. Use file exchange in your integration; live provider sync requires a separate connection.

ICSParser · ICSHandler · EnhancedCalendar
Explore the API reference

03 / a deliberate boundary

Your application
stays in charge.

The engine understands calendars. Your system understands your business.

Find your integration path
Core handles

Event models, date windows, recurrence expansion, overlap detection, search, and ICS files.

Your app handles

Identity, authorization, persistence, server validation, and the rules that make a booking valid.

Optional callers

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

Start with
your next appointment.

Install the package, add a record, and query the dates you need. Add Interface when you’re ready to put a calendar on screen.

appointments.js
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