<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering on BunnyCal Blog</title><link>https://bunnycal.io/blog/tags/engineering/</link><description>Recent content in Engineering on BunnyCal Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 08 Aug 2026 11:12:56 +0530</lastBuildDate><atom:link href="https://bunnycal.io/blog/tags/engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>The outbox pattern and the crash in between</title><link>https://bunnycal.io/blog/the-outbox-pattern-and-the-crash-in-between/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/the-outbox-pattern-and-the-crash-in-between/</guid><description>&lt;p&gt;When you build a calendar application, creating a booking is rarely just a
database operation.&lt;/p&gt;
&lt;p&gt;Imagine this simple flow:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bob creates a calendar booking with Alice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When the booking is created, we need to do at least two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Save the booking in the database.&lt;/li&gt;
&lt;li&gt;Notify Alice that she has been invited.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At first glance, this sounds straightforward.&lt;/p&gt;
&lt;p&gt;But once these operations cross system boundaries, things get surprisingly
interesting.&lt;/p&gt;
&lt;p&gt;What happens if the booking is saved successfully, but the application crashes
before the email is sent?&lt;/p&gt;</description></item><item><title>Every timezone bug is really a calendar bug</title><link>https://bunnycal.io/blog/timezone-bugs-are-calendar-bugs/</link><pubDate>Wed, 15 Jul 2026 00:00:00 +0000</pubDate><guid>https://bunnycal.io/blog/timezone-bugs-are-calendar-bugs/</guid><description>&lt;p&gt;Scheduling bugs cluster around two moments in the year, and they are the same
two moments for everyone: the second Sunday in March and the last Sunday in
October — give or take, depending on which hemisphere and which government.&lt;/p&gt;
&lt;h2 id="the-assumption-that-breaks"&gt;The assumption that breaks&lt;/h2&gt;
&lt;p&gt;The bug is almost always this: storing a meeting as a &lt;em&gt;wall-clock time plus an
offset&lt;/em&gt; rather than as an instant plus a timezone.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;startsAt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2026-10-24T09:00:00+01:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;recurrence&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WEEKLY&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That looks unambiguous, and for a single meeting it is. But the recurrence rule
has to answer &amp;ldquo;when is the next one?&amp;rdquo; — and on 25 October, &lt;code&gt;+01:00&lt;/code&gt; stops being
the correct offset for Europe/London. Naively adding seven days gives you
&lt;code&gt;2026-10-31T09:00:00+01:00&lt;/code&gt;, an instant that renders as &lt;strong&gt;8:00am&lt;/strong&gt; to the host.
Their weekly standup silently moves an hour earlier, and only for the half of
the team in a country that just changed its clocks.&lt;/p&gt;</description></item></channel></rss>