PHPackages                             laravel-enso/calendar - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. laravel-enso/calendar

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

laravel-enso/calendar
=====================

Calendar and event management for Laravel Enso

3.5.10(1w ago)440.2k↓37.5%8MITPHPPHP ^8.3

Since Mar 26Pushed 1w ago3 watchersCompare

[ Source](https://github.com/laravel-enso/calendar)[ Packagist](https://packagist.org/packages/laravel-enso/calendar)[ Docs](https://github.com/laravel-enso/calendar)[ RSS](/packages/laravel-enso-calendar/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependencies (37)Versions (109)Used By (0)

Calendar
========

[](#calendar)

[![License](https://camo.githubusercontent.com/31954ae953f9d26744a69396dafcf202cd6cbde8266f07e14096e02068212b09/68747470733a2f2f706f7365722e707567782e6f72672f6c61726176656c2d656e736f2f63616c656e6461722f6c6963656e7365)](LICENSE)[![Stable](https://camo.githubusercontent.com/94c60b5a9b767cea53d541049366fd89ecf1667a8a2a8b5d718248e1ddd6ad0f/68747470733a2f2f706f7365722e707567782e6f72672f6c61726176656c2d656e736f2f63616c656e6461722f76657273696f6e)](https://packagist.org/packages/laravel-enso/calendar)[![Downloads](https://camo.githubusercontent.com/9370aca9d1b9bc28b048bdbd1c39bd20b6abbb9eee79698b1eb31e6b06ebcbec/68747470733a2f2f706f7365722e707567782e6f72672f6c61726176656c2d656e736f2f63616c656e6461722f646f776e6c6f616473)](https://packagist.org/packages/laravel-enso/calendar)[![PHP](https://camo.githubusercontent.com/76d2504e4f304c14866dd7295641dd6812652d93a1848a27fc8e2a08d6732731/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d382e332532422d3737376262342e737667)](composer.json)[![Issues](https://camo.githubusercontent.com/04136383789a0214381a699b5e3ce637163b04a277f66f41a0b5e92fccc86a49/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f6c61726176656c2d656e736f2f63616c656e6461722e737667)](https://github.com/laravel-enso/calendar/issues)[![Merge Requests](https://camo.githubusercontent.com/5f9d980181fdc1426883442c3eac236c282cfd3f695dba4abe187fa619f903a8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f6c61726176656c2d656e736f2f63616c656e6461722e737667)](https://github.com/laravel-enso/calendar/pulls)

Description
-----------

[](#description)

Calendar adds calendar and event management to Laravel Enso.

The package supports persisted calendars and events, recurring event sequences, attendees, reminders, all-day events, and custom readonly calendar sources that can project data from outside the `calendar_events` table.

It also ships with a builtin Birthday calendar, reminder notifications delivered through mail, database, and broadcast channels, plus the backend API and form metadata consumed by the Enso calendar frontend.

Installation
------------

[](#installation)

This package is normally installed as part of the Enso ecosystem.

For standalone installation in an Enso-based application:

```
composer require laravel-enso/calendar
```

Optional publishes:

```
php artisan vendor:publish --tag=calendar-provider
php artisan vendor:publish --tag=calendar-config
php artisan vendor:publish --tag=calendar-mail
php artisan vendor:publish --tag=calendar-factories
```

Birthday calendar configuration:

```
return [
    'birthdays' => [
        'roles' => ['*'],
    ],
];
```

The package also registers the reminder command:

```
php artisan enso:calendar:send-reminders
```

Features
--------

[](#features)

- Manages calendars with configurable colors and privacy flags.
- Manages events with title, body, location, attendees, reminders, geocoordinates, and all-day support.
- Supports recurring events with `Once`, `Daily`, `Weekdays`, `Weekly`, `Monthly`, and `Yearly` frequencies.
- Supports recurrence update scopes: `Only This`, `This And Future`, and `All`.
- Generates and reshapes recurring sequences through dedicated create, update, delete, and extraction services.
- Exposes a builtin readonly Birthday calendar sourced from `Person` records.
- Allows registering additional custom calendars that return readonly event projections.
- Sends overdue reminders through queued mail, database, and broadcast notifications.
- Registers reminder mail previews through `laravel-enso/mails`.
- Registers form metadata and API resources used by the Enso calendar frontend.

Usage
-----

[](#usage)

Create and manage native calendars and events through the provided API routes, or register custom readonly calendars through the published provider:

```
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Calendars\OrdersCalendar;

class CalendarServiceProvider extends ServiceProvider
{
    protected array $register = [
        OrdersCalendar::class,
    ];
}
```

A custom calendar must implement `LaravelEnso\Calendar\Contracts\CustomCalendar` and return event objects that implement `LaravelEnso\Calendar\Contracts\ProvidesEvent`.

To dispatch due reminders manually:

```
php artisan enso:calendar:send-reminders
```

::: tip Tip Use custom calendars for readonly projections coming from other bounded contexts. If users need to create or edit the events themselves, store them as native `Calendar` and `Event` records instead. :::

::: warning Note Reminder notifications depend on Laravel's scheduler. If the scheduler is not running, overdue reminders will remain pending until `enso:calendar:send-reminders` is executed. :::

API
---

[](#api)

### Commands

[](#commands)

- `enso:calendar:send-reminders`

### Calendar Routes

[](#calendar-routes)

All routes are registered under the `core.calendar.` name prefix and `/api/core/calendar` path prefix.

- `GET /api/core/calendar` -&gt; `core.calendar.index`
- `GET /api/core/calendar/create` -&gt; `core.calendar.create`
- `POST /api/core/calendar` -&gt; `core.calendar.store`
- `GET /api/core/calendar/{calendar}/edit` -&gt; `core.calendar.edit`
- `PATCH /api/core/calendar/{calendar}` -&gt; `core.calendar.update`
- `DELETE /api/core/calendar/{calendar}` -&gt; `core.calendar.destroy`
- `GET /api/core/calendar/options` -&gt; `core.calendar.options`

### Event Routes

[](#event-routes)

Event routes are registered under the `core.calendar.events.` name prefix.

- `GET /api/core/calendar/events` -&gt; `core.calendar.events.index`
- `GET /api/core/calendar/events/create` -&gt; `core.calendar.events.create`
- `POST /api/core/calendar/events` -&gt; `core.calendar.events.store`
- `GET /api/core/calendar/events/{event}/edit` -&gt; `core.calendar.events.edit`
- `PATCH /api/core/calendar/events/{event}` -&gt; `core.calendar.events.update`
- `DELETE /api/core/calendar/events/{event}` -&gt; `core.calendar.events.destroy`

### Models

[](#models)

#### Calendar

[](#calendar-1)

`LaravelEnso\Calendar\Models\Calendar`

Key relations:

- `events()`

Exposed state:

- `name()`
- `color()`
- `private()`
- `readonly()`

#### Event

[](#event)

`LaravelEnso\Calendar\Models\Event`

Key relations:

- `parent()`
- `events()`
- `attendees()`
- `calendar()`
- `reminders()`

Key methods:

- `store(?int $updateType = null)`
- `remove(?int $updateType)`
- `attendeeList()`
- `updateReminders($reminders)`

Supported frequencies:

- `Once`
- `Daily`
- `Weekdays`
- `Weekly`
- `Monthly`
- `Yearly`

Supported recurrence update scopes:

- `Only This`
- `This And Future`
- `All`

#### Reminder

[](#reminder)

`LaravelEnso\Calendar\Models\Reminder`

Key methods and scopes:

- `send()`
- `scopeNotSent()`
- `scopeOverdue()`
- `scopeShouldSend()`

### Custom Calendar Contracts

[](#custom-calendar-contracts)

- `LaravelEnso\Calendar\Contracts\Calendar`
- `LaravelEnso\Calendar\Contracts\CustomCalendar`
- `LaravelEnso\Calendar\Contracts\ProvidesEvent`
- `LaravelEnso\Calendar\Contracts\Routable`

The builtin `BirthdayCalendar` is the reference implementation for readonly custom calendars.

### Event Payload

[](#event-payload)

The event resource returned to the frontend includes:

- `id`
- `title`
- `parentId`
- `isLast`
- `body`
- `start`
- `end`
- `location`
- `frequency`
- `recurrenceEnds`
- `allDay`
- `readonly`
- `class`
- `route`
- `deletable`
- `resizable`

### Validation Rules

[](#validation-rules)

The event request validates:

- calendar membership
- supported frequency ids
- start and end dates
- start and end times
- attendee ids
- recurrence end dates
- update scope

It also prevents:

- recurring metadata on singular events
- invalid subsequence backdating when updating future events

### Configuration

[](#configuration)

`config/enso/calendar.php`

Keys:

- `birthdays.roles`

Depends On
----------

[](#depends-on)

Required Enso packages:

- [`laravel-enso/core`](https://docs.laravel-enso.com/backend/core.html) [↗](https://github.com/laravel-enso/core)
- [`laravel-enso/dynamic-methods`](https://docs.laravel-enso.com/backend/dynamic-methods.html) [↗](https://github.com/laravel-enso/dynamic-methods)
- [`laravel-enso/enums`](https://docs.laravel-enso.com/backend/enums.html) [↗](https://github.com/laravel-enso/enums)
- [`laravel-enso/forms`](https://docs.laravel-enso.com/backend/forms.html) [↗](https://github.com/laravel-enso/forms)
- [`laravel-enso/helpers`](https://docs.laravel-enso.com/backend/helpers.html) [↗](https://github.com/laravel-enso/helpers)
- [`laravel-enso/mails`](https://github.com/laravel-enso/mails) [↗](https://github.com/laravel-enso/mails)
- [`laravel-enso/migrator`](https://docs.laravel-enso.com/backend/migrator.html) [↗](https://github.com/laravel-enso/migrator)
- [`laravel-enso/people`](https://docs.laravel-enso.com/backend/people.html) [↗](https://github.com/laravel-enso/people)
- [`laravel-enso/permissions`](https://docs.laravel-enso.com/backend/permissions.html) [↗](https://github.com/laravel-enso/permissions)
- [`laravel-enso/rememberable`](https://docs.laravel-enso.com/backend/rememberable.html) [↗](https://github.com/laravel-enso/rememberable)
- [`laravel-enso/select`](https://docs.laravel-enso.com/backend/select.html) [↗](https://github.com/laravel-enso/select)
- [`laravel-enso/track-who`](https://docs.laravel-enso.com/backend/track-who.html) [↗](https://github.com/laravel-enso/track-who)
- [`laravel-enso/users`](https://docs.laravel-enso.com/backend/users.html) [↗](https://github.com/laravel-enso/users)

Companion frontend package:

- [`@enso-ui/calendar`](https://docs.laravel-enso.com/frontend/calendar.html) [↗](https://github.com/enso-ui/calendar)

Contributions
-------------

[](#contributions)

are welcome. Pull requests are great, but issues are good too.

Thank you to all the people who already contributed to Enso!

###  Health Score

65

—

FairBetter than 99% of packages

Maintenance98

Actively maintained with recent releases

Popularity34

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity92

Battle-tested with a long release history

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~27 days

Recently: every ~15 days

Total

98

Last Release

11d ago

Major Versions

1.5.11 → 2.0.02020-06-29

2.2.6 → 3.0.02022-02-25

PHP version history (2 changes)1.0.0PHP &gt;=7.1.3

3.5.3PHP ^8.3

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/16073274?v=4)[Adrian Ocneanu](/maintainers/aocneanu)[@aocneanu](https://github.com/aocneanu)

---

Top Contributors

[![aocneanu](https://avatars.githubusercontent.com/u/16073274?v=4)](https://github.com/aocneanu "aocneanu (125 commits)")[![raftx24](https://avatars.githubusercontent.com/u/10864136?v=4)](https://github.com/raftx24 "raftx24 (73 commits)")[![gandesc](https://avatars.githubusercontent.com/u/14071925?v=4)](https://github.com/gandesc "gandesc (43 commits)")[![vmcvlad](https://avatars.githubusercontent.com/u/37445394?v=4)](https://github.com/vmcvlad "vmcvlad (21 commits)")[![AbdullahiAbdulkabir](https://avatars.githubusercontent.com/u/33360580?v=4)](https://github.com/AbdullahiAbdulkabir "AbdullahiAbdulkabir (7 commits)")[![GITmanuela](https://avatars.githubusercontent.com/u/44998004?v=4)](https://github.com/GITmanuela "GITmanuela (4 commits)")[![StyleCIBot](https://avatars.githubusercontent.com/u/11048387?v=4)](https://github.com/StyleCIBot "StyleCIBot (2 commits)")[![heyner29](https://avatars.githubusercontent.com/u/12703614?v=4)](https://github.com/heyner29 "heyner29 (1 commits)")[![tedipop16](https://avatars.githubusercontent.com/u/71398467?v=4)](https://github.com/tedipop16 "tedipop16 (1 commits)")

---

Tags

calendarensolaravellaravel-ensolaraveleventscalendarreminderslaravel-enso

### Embed Badge

![Health badge](/badges/laravel-enso-calendar/health.svg)

```
[![Health](https://phpackages.com/badges/laravel-enso-calendar/health.svg)](https://phpackages.com/packages/laravel-enso-calendar)
```

###  Alternatives

[laravel-enso/localisation

Language and translation management for Laravel Enso

1362.8k10](/packages/laravel-enso-localisation)[laravel-enso/core

The backend shell of a Laravel Enso application

3465.3k205](/packages/laravel-enso-core)[laravel-enso/data-import

Excel Importer dependency for Laravel Enso

2044.0k6](/packages/laravel-enso-data-import)[laravel-enso/roles

Role management for Laravel Enso

1044.9k32](/packages/laravel-enso-roles)[laravel-enso/tutorials

Tutorial management backend for Laravel Enso

1140.7k](/packages/laravel-enso-tutorials)[laravel-enso/permissions

Permission management for Laravel Enso

1244.2k51](/packages/laravel-enso-permissions)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
