A Vaadin Flow calendar component that does what most others don’t: it treats CalDAV as a first-class backend, not an afterthought. Drop it into your Vaadin app, point it at iCloud / Nextcloud / Radicale / Baïkal, done.

Positioning

There’s no shortage of calendar UI libraries — FullCalendar, TOAST UI, DHTMLX, Kendo, Bryntum. They render beautifully. They all stop at the backend boundary: “events come from somewhere, you wire it up.”

ChronoGrid takes the other half seriously. It ships:

  • A native Vaadin Flow composite — Java API, route-free embedding, Lumo-themable, no JavaScript wrapper work
  • A real CalDAV clientPUT/GET/DELETE/REPORT/PROPFIND wire protocol, ETag-based optimistic concurrency, XML-hardened response parsing
  • Multi-server, multi-subscription — connect to several CalDAV servers at once, each with its own credentials; subscriptions visible/colored individually
  • In-app discovery — three-step PROPFIND chain (principal → calendar-home-set → list) behind a Discover calendars button
  • Provider quick-connect — one-click presets for common CalDAV providers (Apple iCloud shipped; extension point for Nextcloud / Radicale / Baïkal …)

It is not trying to be a better FullCalendar at rendering, and it is not a resource scheduler. The nische is Java + Vaadin + CalDAV + On-Prem + EU-friendly — and that nische is wide open.

Architecture — three modules

ModuleWhat it isCoordinates
chronogrid-coreHeadless CalDAV client + iCalendar mapping + service façade. Runs without Vaadin — pull it into CLI tools, sync jobs, Spring Boot services.com.svenruppert.chronogrid:chronogrid-core
chronogridThe Vaadin Flow add-on: ChronoGrid composite, sub-components, bundled CSS.com.svenruppert.chronogrid:chronogrid
chronogrid-demoConsuming application + end-to-end integration harness.com.svenruppert:chronogrid-demo

The split matters: the core can be used without Vaadin. A cron-driven sync job that reconciles two CalDAV servers? Pull chronogrid-core. A Vaadin dashboard that needs an embedded calendar? Pull chronogrid.

What the demo shows

  • Month / Week / Day / N-days view with a custom Lumo-themed nav bar (FullCalendar’s default toolbar is disabled)
  • Edit-dialog + drag / drop / resize with conflict notification on ETag mismatch (412 → ConcurrentModificationException)
  • Runtime CalDAV settings — switch collection URI and HTTP Basic credentials at runtime, persisted on VaadinSession
  • All-connections status board — one row per server, live status pill probed every 15 s
  • Per-subscription colour picker with persistence; falls back to the server’s <C:calendar-color> or a deterministic palette
  • Per-event target calendar — when multiple subscriptions are active, the New-event dialog grows a Server + Calendar filter so you control where the PUT lands
  • Zebra calendar grid — subtle alternating tint, CSS-only, scoped to FullCalendar’s class names

Ecosystem play

ChronoGrid sits at the centre of two other small projects on this site:

  • caldav-testbench — the in-memory CalDAV server the demo uses for local development. Same wire protocol as Nextcloud / Radicale, no auth, no persistence. Boot in one terminal, develop against it in another.
  • nano-vaadin-jetty — embedded Jetty launcher the demo wraps to ship as a single executable JAR.

The “real provider” the blog series connects to is Apple iCloud — plain CalDAV with HTTP Basic + app-specific password, no special-casing needed.

Why a separate component

This started as an internal Vaadin app that needed a CalDAV-backed calendar. The realisation: every Vaadin app that ever needs calendar functionality hits this same gap. FullCalendar gives you rendering. Everything between rendering and a real iCloud/Nextcloud account — wire protocol, discovery, conflict handling, multi-source merging, connection lifecycle — is work each project re-invents. ChronoGrid is that work, extracted and packaged.

Status

🟡 WIP — actively developed (created June 2026). API surface is stabilising; expect pre-1.0 breaking changes in the handler, report and xml packages of chronogrid-core. The public API surface is:

  • com.svenruppert.chronogrid.client — the wire client
  • com.svenruppert.chronogrid.service — the orchestration façade
  • com.svenruppert.chronogrid.ui.ChronoGrid — the Vaadin composite

License is EUPL-1.2 — copyleft-style, EU-approved equivalent to LGPL. A blog series walking through the architecture is in the works.

Further reading

  • Roadmap — what’s coming next, and what’s deliberately out of scope. Derived from the competitive analysis.
  • Comparison matrix — head-to-head against FullCalendar Flow, Scheduler, TOAST UI, DHTMLX, Kendo and Bryntum. Rendering, event interaction, backend integration, Vaadin support — all four dimensions.