<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Calendar on Sven Ruppert</title><link>https://svenruppert.com/tags/calendar/</link><description>Sven Ruppert — Java Veteran, Speaker, Trainer &amp; Bushcrafter. Articles, talks, workshops and videos on Core Java, Cybersecurity, Vaadin and Developer Relations.</description><generator>Hugo</generator><language>en</language><managingEditor>sven.ruppert@gmail.com (Sven Ruppert)</managingEditor><webMaster>sven.ruppert@gmail.com (Sven Ruppert)</webMaster><copyright>© 2026 Sven Ruppert</copyright><atom:link href="https://svenruppert.com/tags/calendar/index.xml" rel="self" type="application/rss+xml"/><image><url>https://svenruppert.com/img/sven-ruppert.jpg</url><title>Sven Ruppert</title><link>https://svenruppert.com/tags/calendar/</link></image><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><item><title>ChronoGrid</title><link>https://svenruppert.com/projects/chronogrid/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><author>sven.ruppert@gmail.com (Sven Ruppert)</author><dc:creator>Sven Ruppert</dc:creator><guid isPermaLink="true">https://svenruppert.com/projects/chronogrid/</guid><description>A Java-first Vaadin Flow calendar component with built-in CalDAV connectivity. Multi-server, multi-subscription, real-time discovery, per-subscription colours — and a headless core that runs without Vaadin.</description><content:encoded>&lt;![CDATA[<p>A<strong>Vaadin Flow calendar component</strong> that does what most others don&rsquo;t: it
treats<strong>CalDAV as a first-class backend</strong>, not an afterthought. Drop it
into your Vaadin app, point it at iCloud / Nextcloud / Radicale / Baïkal,
done.</p><h2 id="positioning">Positioning</h2><p>There&rsquo;s no shortage of calendar UI libraries — FullCalendar, TOAST UI,
DHTMLX, Kendo, Bryntum. They render beautifully. They all stop at the
backend boundary: &ldquo;events come from somewhere, you wire it up.&rdquo;</p><p>ChronoGrid takes the other half seriously. It ships:</p><ul><li><strong>A native Vaadin Flow composite</strong> — Java API, route-free embedding,
Lumo-themable, no JavaScript wrapper work</li><li><strong>A real CalDAV client</strong> —<code>PUT</code>/<code>GET</code>/<code>DELETE</code>/<code>REPORT</code>/<code>PROPFIND</code> wire
protocol, ETag-based optimistic concurrency, XML-hardened response parsing</li><li><strong>Multi-server, multi-subscription</strong> — connect to several CalDAV servers
at once, each with its own credentials; subscriptions visible/colored
individually</li><li><strong>In-app discovery</strong> — three-step<code>PROPFIND</code> chain (principal →
calendar-home-set → list) behind a<em>Discover calendars</em> button</li><li><strong>Provider quick-connect</strong> — one-click presets for common CalDAV providers
(Apple iCloud shipped; extension point for Nextcloud / Radicale / Baïkal …)</li></ul><p>It is<strong>not</strong> trying to be a better FullCalendar at rendering, and it is<strong>not</strong> a resource scheduler. The nische is<strong>Java + Vaadin + CalDAV +
On-Prem + EU-friendly</strong> — and that nische is wide open.</p><h2 id="architecture--three-modules">Architecture — three modules</h2><table><thead><tr><th>Module</th><th>What it is</th><th>Coordinates</th></tr></thead><tbody><tr><td><strong><code>chronogrid-core</code></strong></td><td>Headless CalDAV client + iCalendar mapping + service façade. Runs without Vaadin — pull it into CLI tools, sync jobs, Spring Boot services.</td><td><code>com.svenruppert.chronogrid:chronogrid-core</code></td></tr><tr><td><strong><code>chronogrid</code></strong></td><td>The Vaadin Flow add-on:<code>ChronoGrid</code> composite, sub-components, bundled CSS.</td><td><code>com.svenruppert.chronogrid:chronogrid</code></td></tr><tr><td><strong><code>chronogrid-demo</code></strong></td><td>Consuming application + end-to-end integration harness.</td><td><code>com.svenruppert:chronogrid-demo</code></td></tr></tbody></table><p>The split matters: the core can be used<strong>without</strong> Vaadin. A<code>cron</code>-driven
sync job that reconciles two CalDAV servers? Pull<code>chronogrid-core</code>.
A Vaadin dashboard that needs an embedded calendar? Pull<code>chronogrid</code>.</p><h2 id="what-the-demo-shows">What the demo shows</h2><ul><li><strong>Month / Week / Day / N-days view</strong> with a custom Lumo-themed nav bar
(FullCalendar&rsquo;s default toolbar is disabled)</li><li><strong>Edit-dialog + drag / drop / resize</strong> with conflict notification on
ETag mismatch (412 →<code>ConcurrentModificationException</code>)</li><li><strong>Runtime CalDAV settings</strong> — switch collection URI and HTTP Basic
credentials at runtime, persisted on<code>VaadinSession</code></li><li><strong>All-connections status board</strong> — one row per server, live status pill
probed every 15 s</li><li><strong>Per-subscription colour picker</strong> with persistence; falls back to the
server&rsquo;s<code>&lt;C:calendar-color&gt;</code> or a deterministic palette</li><li><strong>Per-event target calendar</strong> — when multiple subscriptions are active,
the New-event dialog grows a<em>Server</em> +<em>Calendar</em> filter so you control
where the<code>PUT</code> lands</li><li><strong>Zebra calendar grid</strong> — subtle alternating tint, CSS-only, scoped to
FullCalendar&rsquo;s class names</li></ul><h2 id="ecosystem-play">Ecosystem play</h2><p>ChronoGrid sits at the centre of two other small projects on this site:</p><ul><li><strong><a href="/projects/caldav-testbench/">caldav-testbench</a></strong> — 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.</li><li><strong><a href="/projects/nano-vaadin-jetty/">nano-vaadin-jetty</a></strong> — embedded Jetty
launcher the demo wraps to ship as a single executable JAR.</li></ul><p>The &ldquo;real provider&rdquo; the blog series connects to is<strong>Apple iCloud</strong> — plain
CalDAV with HTTP Basic + app-specific password, no special-casing needed.</p><h2 id="why-a-separate-component">Why a separate component</h2><p>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.</p><h2 id="status">Status</h2><p>🟡<strong>WIP</strong> — actively developed (created June 2026). API surface is
stabilising; expect pre-1.0 breaking changes in the<code>handler</code>,<code>report</code>
and<code>xml</code> packages of<code>chronogrid-core</code>. The public API surface is:</p><ul><li><code>com.svenruppert.chronogrid.client</code> — the wire client</li><li><code>com.svenruppert.chronogrid.service</code> — the orchestration façade</li><li><code>com.svenruppert.chronogrid.ui.ChronoGrid</code> — the Vaadin composite</li></ul><p>License is<strong>EUPL-1.2</strong> — copyleft-style, EU-approved equivalent to LGPL.
A blog series walking through the architecture is in the works.</p><h2 id="further-reading">Further reading</h2><ul><li><strong><a href="/projects/chronogrid-roadmap/">Roadmap</a></strong> — what&rsquo;s coming next, and
what&rsquo;s deliberately out of scope. Derived from the competitive analysis.</li><li><strong><a href="/projects/chronogrid-comparison/">Comparison matrix</a></strong> — head-to-head
against FullCalendar Flow, Scheduler, TOAST UI, DHTMLX, Kendo and Bryntum.
Rendering, event interaction, backend integration, Vaadin support — all
four dimensions.</li></ul>
]]></content:encoded></item></channel></rss>