Fix events displaying with +1h offset (e.g. 14h→15h) caused by icsDateToJsDate() returning fake UTC (local.date) which then got the browser offset applied again by dateToLocalISOString(). Changes: - Return true UTC (icsDate.date) from icsDateToJsDate() instead of fake UTC (local.date) - Add getDateComponentsInTimezone() using Intl.DateTimeFormat with formatter caching for correct cross-timezone write path - Refactor jsDateToIcsDate() to use Intl instead of isFakeUtc flag - Replace optimistic updates with refetchEvents() after modal save to avoid fake UTC leaking into the display path - Align standalone helper jsDateToIcsDate() with adapter conversion - Narrow useCallback dependencies in useSchedulerHandlers - Remove dead code addDurationToDate() - Add 42 timezone conversion tests covering DST transitions, cross-timezone round-trips, half-hour/45min offsets Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Chat on Matrix - Documentation - Getting started - Reach out
La Suite Calendars
A modern calendar application for managing events and schedules.
Why use Calendars ❓
Calendars empowers teams to manage events and schedules while maintaining full control over their data through a user-friendly, open-source platform.
Manage Events
- 📅 Create and manage events and schedules
- 🌐 Access your calendar from anywhere with our web-based interface
Organize
- 📂 Organized calendar structure with intuitive navigation
Collaborate
- 🤝 Share calendars with your team members
- 👥 Granular access control to ensure your information is secure and only shared with the right people
- 🏢 Create workspaces to organize team collaboration
Self-host
- 🚀 Easy to install, scalable and secure calendar solution
Getting started 🔧
Prerequisite
Make sure you have a recent version of Docker and Docker Compose installed on your laptop:
$ docker -v
Docker version 27.5.1, build 9f9e405
$ docker compose version
Docker Compose version v2.32.4
⚠️ You may need to run the following commands with
sudobut this can be avoided by assigning your user to thedockergroup.
Bootstrap project
The easiest way to start working on the project is to use GNU Make:
$ make bootstrap
This command builds the backend-dev and frontend-dev containers, installs dependencies, performs
database migrations and compile translations. It's a good idea to use this
command each time you are pulling code from the project repository to avoid
dependency-related or migration-related issues.
Your Docker services should now be up and running! 🎉
You can access the project by going to http://localhost:8920.
You will be prompted to log in. The default credentials are:
username: calendars
password: calendars
Note that if you need to run them afterward, you can use the eponym Make rule:
$ make run
You can check all available Make rules using:
$ make help
⚠️ For the frontend developer, it is often better to run the frontend in development mode locally.
To do so, install the frontend dependencies with the following command:
$ make frontend-development-install
And run the frontend locally in development mode with the following command:
$ make run-frontend-development
To start all the services, except the frontend container, you can use the following command:
$ make run-backend
Django admin
You can access the Django admin site at http://localhost:8921/admin.
You first need to create a superuser account:
$ make superuser
You can then login with sub admin@example.com and password admin.
Feedback 🙋♂️🙋♀️
We'd love to hear your thoughts and hear about your experiments, so come and say hi on Matrix.
Contributing 🙌
This project is intended to be community-driven, so please, do not hesitate to get in touch if you have any question related to our implementation or design decisions.
License 📝
This work is released under the MIT License (see LICENSE).
While Calendars is a public driven initiative our licence choice is an invitation for private sector actors to use, sell and contribute to the project.
Credits ❤️
Calendars is built on top of Django Rest Framework, Next.js. We thank the contributors of all these projects for their awesome work!