<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on Viklund</title><link>https://viklund.fi/projects/</link><description>Recent content in Projects on Viklund</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 22 Oct 2026 09:00:00 +0300</lastBuildDate><atom:link href="https://viklund.fi/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>estorm: Event Storming boards as plain text</title><link>https://viklund.fi/projects/estorm/</link><pubDate>Thu, 22 Oct 2026 09:00:00 +0300</pubDate><guid>https://viklund.fi/projects/estorm/</guid><description>&lt;p&gt;Event Storming workshops are great. What comes after them usually isn&amp;rsquo;t: a few&#10;photos of a wall full of stickies that nobody looks at again, and that go stale&#10;the moment the model changes.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/ville6000/estorm" rel="noopener external"&gt;estorm&lt;/a&gt; is my attempt at fixing that. You&#10;write the flow as plain text and get a board of stickies, rendered as SVG:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;== Sales ==&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Customer: Place order -&amp;gt; (Order) -&amp;gt; OrderPlaced&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; after 30 minutes unless PaymentCaptured&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; then Cancel unpaid order -&amp;gt; (Order) -&amp;gt; OrderCancelled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;== Payments ==&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;when OrderPlaced&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; then Charge card -&amp;gt; [Payment provider] -&amp;gt; PaymentCaptured&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ! What if the charge succeeds but our callback times out?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Actors, commands, aggregates, external systems, policies, read models and&#10;hotspots each have a short notation, and bounded contexts become swimlanes.&lt;/p&gt;</description></item></channel></rss>