<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>kotlin.website</title>
    <link>https://kotlin.website/blog</link>
    <description>Notes on Kotlin, Kotlin/Native and the libraries I maintain.</description>
    <language>en</language>
    <atom:link href="https://kotlin.website/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Kotlin/Native under load, and what I measured wrong</title>
      <link>https://kotlin.website/blog/native-under-load</link>
      <guid isPermaLink="true">https://kotlin.website/blog/native-under-load</guid>
      <description>28 ms to first response and 20 MiB idle. Then the load arrived — and three of my own measurements turned out to be wrong.</description>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The bugs that don't fail</title>
      <link>https://kotlin.website/blog/bugs-that-dont-fail</link>
      <guid isPermaLink="true">https://kotlin.website/blog/bugs-that-dont-fail</guid>
      <description>294 tests, 71 specification scenarios, and four bugs that only a real mongod would show — because none of them threw anything.</description>
      <pubDate>Fri, 7 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Logs shaped for an agent to read</title>
      <link>https://kotlin.website/blog/logs-for-an-agent-to-read</link>
      <guid isPermaLink="true">https://kotlin.website/blog/logs-for-an-agent-to-read</guid>
      <description>Handing a coding agent a dashboard link is handing it nothing. tracy makes MCP the primary read path — and that single decision changes what the storage has to store.</description>
      <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A broker that fits in one head</title>
      <link>https://kotlin.website/blog/a-broker-that-fits-in-one-head</link>
      <guid isPermaLink="true">https://kotlin.website/blog/a-broker-that-fits-in-one-head</guid>
      <description>booblik reproduces what makes an append-only log fast and leaves out everything that makes Kafka a cluster — including three features that are incompatible with zero-copy by construction.</description>
      <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Percentiles don't average</title>
      <link>https://kotlin.website/blog/percentiles-dont-average</link>
      <guid isPermaLink="true">https://kotlin.website/blog/percentiles-dont-average</guid>
      <description>metrik costs the monitored service 106 nanoseconds per request and a UDP packet a minute — and the reason it merges percentiles instead of averaging them is that averaging them is simply wrong.</description>
      <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>What is left in the system if you die halfway</title>
      <link>https://kotlin.website/blog/what-is-left-if-you-die-halfway</link>
      <guid isPermaLink="true">https://kotlin.website/blog/what-is-left-if-you-die-halfway</guid>
      <description>A saga engine built around one question. Steps as interceptors, compensation in reverse, and an outbox that makes &quot;the work happened but the notification never went out&quot; structurally impossible.</description>
      <pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Writing SMTP from the RFC instead of around it</title>
      <link>https://kotlin.website/blog/smtp-from-the-spec</link>
      <guid isPermaLink="true">https://kotlin.website/blog/smtp-from-the-spec</guid>
      <description>A Kotlin/Native service has two ways to send mail — shell out to sendmail, or wrap libcurl. Both hide the protocol exactly where it has to be visible.</description>
      <pubDate>Sun, 1 Mar 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The screenshot in the README is the test</title>
      <link>https://kotlin.website/blog/the-screenshot-is-the-test</link>
      <guid isPermaLink="true">https://kotlin.website/blog/the-screenshot-is-the-test</guid>
      <description>mani is a Kotlin Multiplatform demo where the same server compiles to the JVM and to a native binary — and where the picture advertising the interface cannot drift from it.</description>
      <pubDate>Sun, 8 Feb 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A Telegram bot is a state machine pretending not to be</title>
      <link>https://kotlin.website/blog/bots-as-state-machines</link>
      <guid isPermaLink="true">https://kotlin.website/blog/bots-as-state-machines</guid>
      <description>telek models a conversation as pure transitions with effects on the side — which is what makes a wizard resumable, testable and portable between two transports.</description>
      <pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>A crash tracker that fits on one box</title>
      <link>https://kotlin.website/blog/crash-tracker-kotlin-native</link>
      <guid isPermaLink="true">https://kotlin.website/blog/crash-tracker-kotlin-native</guid>
      <description>katcher — Kotlin/Native, Ktor and HTMX, in one binary small enough that nobody has to justify running it.</description>
      <pubDate>Sat, 6 Dec 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Screenshot tests without an emulator</title>
      <link>https://kotlin.website/blog/screenshots-without-an-emulator</link>
      <guid isPermaLink="true">https://kotlin.website/blog/screenshots-without-an-emulator</guid>
      <description>viddik renders Compose Multiplatform through a real Compose Desktop window instead of LayoutLib, so goldens stay the same on macOS, Linux and Windows.</description>
      <pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Ask the desktop, don't guess it</title>
      <link>https://kotlin.website/blog/ask-the-desktop</link>
      <guid isPermaLink="true">https://kotlin.website/blog/ask-the-desktop</guid>
      <description>A custom title bar for Compose Desktop has to know which side the buttons go on. On Linux there is no answer — so appframe asks GNOME directly.</description>
      <pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
