Drop-in JS Calendar. Zero Dependencies. No Bloat.

Full internationalization. Framework wrappers for React, Vue & Angular. Built-in date & range picker modes. Everything you need in ~14 KB of gzipped JavaScript.

Zero dependencies · Free for personal use · Commercial license per project

Loading calendar...

Using this in a commercial project? A license is required →

Features

Zero Dependencies

Pure vanilla JavaScript. No external libraries required. Just ~18 KB gzipped.

Internationalization

Native Intl.DateTimeFormat API support for any locale. RTL languages included.

Framework Ready

Official React, Vue 3, and Angular components included in the package.

Async Events

Fetch events dynamically with async/await. Perfect for API integrations.

Fully Customizable

CSS custom properties for easy theming. Dark mode ready out of the box.

Responsive

Works perfectly on desktop, tablet, and mobile. Touch-friendly interface.

And Much More

4 View Modes — Month, Week, Day & List
Drag & Drop — Move events between dates
Event Resizing — Adjust event duration
Tooltips — Rich hover information
34+ Locales — Native Intl API support
RTL Languages — Arabic, Hebrew & more
Dark Mode — CSS variables theming
Year Picker — Quick year navigation
View Switcher — Toggle between views
Grid Controls — Show/hide borders
12/24 Hour — Flexible time formats
Weekday Formats — Narrow, short or long
Timed Events — List or block style
Async Events — API integration ready
Timezone Support — Display in any timezone
Customizable Toolbar — Show/hide elements
Touch Friendly — Mobile optimized
No Dependencies — Pure vanilla JS

A lighter JavaScript calendar

The views most apps need, in a fraction of the size of the usual choices.

SimpleCalendarJSFullCalendarReact Big Calendar
Gzipped JS size~14 KB~40 KB~52 KB
DependenciesNonePreact + Temporal polyfill16 packages
Works withAny framework or plain JSAny framework (adapters)React only
Month, week & day views
List viewAgenda
Built-in date & range picker
Drag & dropAdd-on
LicenseFree personal / paid commercialMIT core / paid PremiumMIT

JavaScript only, gzipped, per bundlephobia (November 2026): fullcalendar 7.1, react-big-calendar 1.20. Full comparison →

Simple, Honest Pricing

Free for personal projects. A per-project commercial license is required when you ship SimpleCalendarJS in a paid product, client site, or SaaS application.

No license needed

Personal projects, side projects with no revenue, learning, and open source. The npm package is free and fully functional.

License required

Commercial products, client websites, SaaS, internal company tools, or any project that generates revenue. One license covers one project.

Free

$0 / forever

For personal projects, learning, and open source.

  • Full calendar component
  • Month, week, day & list views
  • Date & range picker modes
  • All framework wrappers (React, Vue, Angular)
  • Community support
  • For personal, educational & open source use
Get Started Free

Annual

$49 / per year, per project

For commercial projects that need ongoing support and updates.

  • Everything in Free
  • Commercial use license — no attribution required
  • Priority email support
  • All updates during subscription
  • Commercial license certificate
  • 1 license = 1 commercial project
Buy Annual License
Best Value

Lifetime

$199 / one-time, per project

Pay once, use forever. No renewals, no surprises.

  • Everything in Annual
  • Lifetime access — pay once
  • All future updates included
  • Priority email support
  • Commercial license certificate
  • 1 license = 1 commercial project
Buy Lifetime License

Date & Range Selection

Perfect for date pickers, booking systems, and range selection

Date Picker

Loading calendar...

Range Picker

Loading calendar...

Quick Start

Get started in seconds with your favorite framework

Terminal
npm install simple-calendar-js

Example Code

import SimpleCalendarJs from 'simple-calendar-js';
import 'simple-calendar-js/dist/simple-calendar-js.min.css';

// <div id="calendar" style="height: 600px"></div>
const calendar = new SimpleCalendarJs('#calendar', {
  defaultView: 'month',
  locale: 'en-US',
  fetchEvents: async (start, end) => {
    const res = await fetch(`/api/events?start=${start.toISOString()}&end=${end.toISOString()}`);
    return await res.json(); // [{ id, title, start, end }, ...]
  },
  onEventClick: (event) => {
    console.log('Event clicked:', event);
  },
  onSlotClick: (date) => {
    console.log('Slot clicked:', date);
  }
});