<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Notes on Seamless Notes</title><link>https://seamlessnotes.dev/posts/</link><description>Recent content in Notes on Seamless Notes</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sun, 26 Jul 2026 14:30:00 +0200</lastBuildDate><atom:link href="https://seamlessnotes.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Macros Without Magic</title><link>https://seamlessnotes.dev/2026/07/macros-without-magic/</link><pubDate>Sun, 26 Jul 2026 14:30:00 +0200</pubDate><guid>https://seamlessnotes.dev/2026/07/macros-without-magic/</guid><description>&lt;p&gt;The previous two design pillars of Seamless are crash-safety and immutability. Both are about reducing cognitive load, removing hidden order of execution and spooky action at a distance, and thus maximizing the ability to reason locally.&lt;/p&gt;
&lt;p&gt;The next design pillar is extensibility.&lt;/p&gt;
&lt;p&gt;Language extensibility is about being able to fit the language and program structure to the problem domain, instead of fitting the domain into a rigid set of structures and language abstractions. As &lt;a href="https://www.paulgraham.com/icad.html" target="_blank" rel="noopener noreferrer"&gt;Paul Graham argued&lt;/a&gt;, regularity in a program that does not follow the shape of the problem domain is probably a sign of a missing abstraction.&lt;/p&gt;</description></item><item><title>Why Mutation Should Stay Local</title><link>https://seamlessnotes.dev/2026/07/why-mutation-should-stay-local/</link><pubDate>Fri, 17 Jul 2026 13:20:00 +0200</pubDate><guid>https://seamlessnotes.dev/2026/07/why-mutation-should-stay-local/</guid><description>&lt;p&gt;The previous post explored crash-safety and explicit failure as a main design pillar of Seamless.&lt;/p&gt;
&lt;p&gt;The next pillar is immutability: ordinary application data should be immutable by default.&lt;/p&gt;
&lt;p&gt;Shared mutable state makes code hard to reason about. If a value can be changed from somewhere else, every use of that value has to consider what else might have happened. That is exactly the kind of uncertainty I want ordinary Seamless code to avoid.&lt;/p&gt;</description></item><item><title>Don't let it crash</title><link>https://seamlessnotes.dev/2026/07/dont-let-it-crash/</link><pubDate>Thu, 09 Jul 2026 08:00:00 +0200</pubDate><guid>https://seamlessnotes.dev/2026/07/dont-let-it-crash/</guid><description>&lt;p&gt;One of the primary design pillars of Seamless is crash-safety.&lt;/p&gt;
&lt;p&gt;Ordinary Seamless code should never crash the program.&lt;/p&gt;
&lt;p&gt;If an operation can fail in a recoverable way, the caller should be able to see that in the value it returns.&lt;/p&gt;
&lt;p&gt;A common version of this is selecting an item from application data:&lt;/p&gt;


&lt;div class="seamless-code" data-lang="js"&gt;
 
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;selectedPlanName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plans&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;selectedId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;plansWithId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plans&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;selectedId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;/div&gt;
&lt;p&gt;Is it safe? Are we &lt;em&gt;really&lt;/em&gt; sure that the matches will &lt;em&gt;never&lt;/em&gt; be empty?&lt;/p&gt;</description></item><item><title>A small tour of Seamless</title><link>https://seamlessnotes.dev/2026/07/a-small-tour-of-seamless/</link><pubDate>Thu, 02 Jul 2026 09:00:00 +0200</pubDate><guid>https://seamlessnotes.dev/2026/07/a-small-tour-of-seamless/</guid><description>&lt;p&gt;This is a short orientation to the language as it exists today.&lt;/p&gt;
&lt;p&gt;It is not meant to be a complete tutorial. The syntax is still moving, names are still provisional, and some parts of the language are more mature than others. The goal here is only to make the examples in these notes easier to follow.&lt;/p&gt;
&lt;h2 id="values-and-primitive-types"&gt;Values and primitive types&lt;/h2&gt;
&lt;p&gt;Seamless is statically typed, and the types are inferred. Values have types such as:&lt;/p&gt;</description></item><item><title>An apple pie from scratch</title><link>https://seamlessnotes.dev/2026/07/an-apple-pie-from-scratch/</link><pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate><guid>https://seamlessnotes.dev/2026/07/an-apple-pie-from-scratch/</guid><description>&lt;blockquote&gt;
&lt;p&gt;If you wish to make an apple pie from scratch, you must first invent the universe.&lt;/p&gt;
&lt;p&gt;— Carl Sagan&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That quote kept coming back to me because the deeper I pushed on the web-stack problem, the more the “reasonable” solution started to look like inventing the universe.&lt;/p&gt;
&lt;p&gt;The component model always felt like the right direction for UI: local state, composition, data flowing into views, and interfaces described from application state instead of manually coordinated DOM updates.&lt;/p&gt;</description></item></channel></rss>