<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: KentaroMorishita</title>
    <description>The latest articles on DEV Community by KentaroMorishita (@kentaromorishita).</description>
    <link>https://dev.to/kentaromorishita</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2575219%2F37668208-be8c-4ff6-8949-f08726e9adbc.jpeg</url>
      <title>DEV Community: KentaroMorishita</title>
      <link>https://dev.to/kentaromorishita</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kentaromorishita"/>
    <language>en</language>
    <item>
      <title>What If Programs Were Mostly Just Values Flowing Through Functions?</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:56:44 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/what-if-programs-were-mostly-just-values-flowing-through-functions-3ebb</link>
      <guid>https://dev.to/kentaromorishita/what-if-programs-were-mostly-just-values-flowing-through-functions-3ebb</guid>
      <description>&lt;p&gt;I've never particularly enjoyed reading code that makes me suddenly switch from following values to chasing control flow.&lt;/p&gt;

&lt;p&gt;A variable gets assigned halfway through.&lt;/p&gt;

&lt;p&gt;A function returns halfway through.&lt;/p&gt;

&lt;p&gt;An &lt;code&gt;if&lt;/code&gt; redirects the path.&lt;/p&gt;

&lt;p&gt;Then the value gets another name.&lt;/p&gt;

&lt;p&gt;None of this is difficult to understand.&lt;/p&gt;

&lt;p&gt;But when I'm tired, I eventually end up asking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"So where did this value come from, and where is it going?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started wondering whether it would simply be easier if the code showed how a value changes as it moves through the program.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript can already feel like this
&lt;/h2&gt;

&lt;p&gt;For example, filtering, mapping, and reducing an array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;even&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;add&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I like this a lot.&lt;/p&gt;

&lt;p&gt;The transformations are visible in order.&lt;/p&gt;

&lt;p&gt;But once the value isn't an Array anymore, or ordinary functions need to enter the chain, method chaining stops being a universal model.&lt;/p&gt;

&lt;p&gt;So we add a &lt;code&gt;pipe&lt;/code&gt; helper or install a library.&lt;/p&gt;

&lt;p&gt;Then there is another library-specific convention to learn.&lt;/p&gt;

&lt;p&gt;This was one of the things I kept thinking about while I was building F-Box.&lt;/p&gt;

&lt;p&gt;The old F-Box projects are still here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/f-box-core" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/f-box-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/f-box-react" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/f-box-react&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In Seseragi, I wanted the value to keep flowing
&lt;/h2&gt;

&lt;p&gt;The current Tour contains a sample like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;arrays&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s"&gt;"std/array"&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;even&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arrays&lt;/span&gt;&lt;span class="py"&gt;.filter&lt;/span&gt; &lt;span class="n"&gt;even&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's basically it.&lt;/p&gt;

&lt;p&gt;The value moves from left to right.&lt;/p&gt;

&lt;p&gt;Filter it, map it, reduce it.&lt;/p&gt;

&lt;p&gt;This isn't Array-specific magic.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;|&amp;gt;&lt;/code&gt; is ordinary function application written in a way that makes the direction of the data easier to read. If the functions stay small, the same shape can keep going.&lt;/p&gt;

&lt;h2&gt;
  
  
  I like &lt;code&gt;$&lt;/code&gt; for the same reason
&lt;/h2&gt;

&lt;p&gt;Another operator I use constantly in Seseragi is &lt;code&gt;$&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There isn't a grand theoretical claim hiding here. A lot of the time I simply want fewer parentheses.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;println(foo(bar(baz(x))))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would rather read:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;println $ foo $ bar $ baz x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My eyes find that easier.&lt;/p&gt;

&lt;p&gt;Maybe this is an age-related feature request.&lt;/p&gt;

&lt;p&gt;But Seseragi pays a lot of attention to things that are theoretically small and practically visible every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  I care more about making ordinary code pleasant than making unusual code impressive
&lt;/h2&gt;

&lt;p&gt;When people hear "I made a programming language," it's natural to expect an exotic type system or some syntax nobody has seen before.&lt;/p&gt;

&lt;p&gt;Seseragi does have things that sound intimidating when listed out: type classes, Effect, Signal, and so on.&lt;/p&gt;

&lt;p&gt;But some of the parts that make me happiest are much more boring.&lt;/p&gt;

&lt;p&gt;Write a function.&lt;/p&gt;

&lt;p&gt;Give it a value.&lt;/p&gt;

&lt;p&gt;Send the result to the next function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make ordinary processing feel ordinary and pleasant.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If that foundation is uncomfortable, adding sophisticated abstractions on top of it probably won't make the language enjoyable to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Play with it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the sample above and try things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change &lt;code&gt;even&lt;/code&gt; to &lt;code&gt;value &amp;gt; 3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;make &lt;code&gt;double&lt;/code&gt; triple the value instead&lt;/li&gt;
&lt;li&gt;add another &lt;code&gt;map double&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;break the pipeline across lines&lt;/li&gt;
&lt;li&gt;remove the pipeline and rewrite it as nested function application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one isn't a feature test.&lt;/p&gt;

&lt;p&gt;It's a preference test.&lt;/p&gt;

&lt;p&gt;But language design is, in the end, partly an accumulation of preferences like that.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Why Should the Language Change the Moment I Build a UI?</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:56:42 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/why-should-the-language-change-the-moment-i-build-a-ui-fgd</link>
      <guid>https://dev.to/kentaromorishita/why-should-the-language-change-the-moment-i-build-a-ui-fgd</guid>
      <description>&lt;p&gt;In ordinary application code, I create values, pass them to functions, and distinguish between cases.&lt;/p&gt;

&lt;p&gt;Then Web UI begins, and sometimes the whole world changes.&lt;/p&gt;

&lt;p&gt;Component.&lt;/p&gt;

&lt;p&gt;Hooks.&lt;/p&gt;

&lt;p&gt;JSX.&lt;/p&gt;

&lt;p&gt;Store.&lt;/p&gt;

&lt;p&gt;Lifecycle.&lt;/p&gt;

&lt;p&gt;Subscription.&lt;/p&gt;

&lt;p&gt;All of these things exist for reasons.&lt;/p&gt;

&lt;p&gt;I've used React and Vue for years, so this isn't an argument that they should all disappear.&lt;/p&gt;

&lt;p&gt;But at some point I started wondering:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do I have to join a different programming religion the moment the thing I'm building becomes UI?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Couldn't a component just be a function?
&lt;/h2&gt;

&lt;p&gt;In Seseragi's Web UI Tour, a small piece of UI can be an ordinary function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Model&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="py"&gt;.Html&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="py"&gt;.p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="py"&gt;.status&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It receives &lt;code&gt;model&lt;/code&gt; and returns &lt;code&gt;Html&amp;lt;Action&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;There is no special "declare a component" syntax here.&lt;/p&gt;

&lt;p&gt;It's an ordinary function whose result happens to be Html.&lt;/p&gt;

&lt;p&gt;I like that a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Couldn't Html just be a value?
&lt;/h2&gt;

&lt;p&gt;The same idea continues upward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Model&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="py"&gt;.Html&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="py"&gt;.main&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"mx-auto max-w-xl p-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;html.main&lt;/code&gt; is not a template-language escape hatch.&lt;/p&gt;

&lt;p&gt;The props-like part is a record. &lt;code&gt;children&lt;/code&gt; is a value. The resulting &lt;code&gt;html.Html&amp;lt;Action&amp;gt;&lt;/code&gt; is a value too.&lt;/p&gt;

&lt;p&gt;That means I can move it into an ordinary function, return it from &lt;code&gt;match&lt;/code&gt;, combine it with other values, and generally keep using the language I was already using.&lt;/p&gt;

&lt;p&gt;I think what I wanted was less "a convenient UI DSL" and more &lt;strong&gt;ordinary language features continuing to work all the way into UI&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Action is ordinary data too
&lt;/h2&gt;

&lt;p&gt;The form in the Tour uses values such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DraftChanged String&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PinnedChanged Bool&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Submitted&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;They aren't hidden inside a special event-system type.&lt;/p&gt;

&lt;p&gt;They're ordinary data constructors, so ordinary &lt;code&gt;match&lt;/code&gt; can handle them.&lt;/p&gt;

&lt;p&gt;If you looked only at that part of the code, it would barely look like Web UI.&lt;/p&gt;

&lt;p&gt;That's a feature to me.&lt;/p&gt;

&lt;p&gt;I cover the state and Action code in other articles, so I won't paste the entire form sample again here. Repeating the same giant sample until every article looks identical would defeat the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  If state changes, make it Signal
&lt;/h2&gt;

&lt;p&gt;Of course a UI doesn't render once and freeze forever.&lt;/p&gt;

&lt;p&gt;Inputs change. Buttons get clicked. State moves.&lt;/p&gt;

&lt;p&gt;That's where Signal appears.&lt;/p&gt;

&lt;p&gt;But I didn't want Signal to become "the UI framework's store," with a completely separate worldview attached to it.&lt;/p&gt;

&lt;p&gt;If a value changes over time, model a value that changes over time.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model
↓
Signal&amp;lt;Model&amp;gt;
↓
map with an ordinary function
↓
Signal&amp;lt;Html&amp;lt;Action&amp;gt;&amp;gt;
↓
DOM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The responsibilities are different.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Model&lt;/code&gt; and &lt;code&gt;Signal&amp;lt;Model&amp;gt;&lt;/code&gt; are not the same thing. Html and DOM are not the same thing.&lt;/p&gt;

&lt;p&gt;But every responsibility boundary does not need to become a programming-model boundary for the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm not trying to build React again
&lt;/h2&gt;

&lt;p&gt;Once Seseragi can render interactive Web UI, comparing it with React or Elm is inevitable.&lt;/p&gt;

&lt;p&gt;Those comparisons can be useful.&lt;/p&gt;

&lt;p&gt;But I didn't begin with "I want to build a React alternative."&lt;/p&gt;

&lt;p&gt;Seseragi already had data types.&lt;/p&gt;

&lt;p&gt;It had &lt;code&gt;match&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It had ordinary functions.&lt;/p&gt;

&lt;p&gt;It had Effect.&lt;/p&gt;

&lt;p&gt;Then Signal.&lt;/p&gt;

&lt;p&gt;Then Html as a value.&lt;/p&gt;

&lt;p&gt;I connected those things, and eventually a Web application moved on screen.&lt;/p&gt;

&lt;p&gt;That order matters to me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It feels less like I placed a framework on top of the language and more like I kept using ordinary language features until the development experience started looking framework-like.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's one of the strangest and most interesting parts of the project right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the form in the Playground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/tour/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/tour/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Continue through the Web UI / feature-state part of the Tour and you can interact with a real form sample.&lt;/p&gt;

&lt;p&gt;Good things to change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add another &lt;code&gt;Action&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;add another field to &lt;code&gt;Model&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;change the status after submit&lt;/li&gt;
&lt;li&gt;split &lt;code&gt;form&lt;/code&gt; into smaller functions&lt;/li&gt;
&lt;li&gt;switch the rendered output with &lt;code&gt;match&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In particular, try splitting the UI into smaller functions.&lt;/p&gt;

&lt;p&gt;There is no extra "component mechanism" to think about while doing it.&lt;/p&gt;

&lt;p&gt;You're just splitting functions, and the UI keeps composing.&lt;/p&gt;

&lt;p&gt;That feels much better than I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's still experimental
&lt;/h2&gt;

&lt;p&gt;Seseragi's Web UI and runtime are both still evolving, and the Playground is evolving with them.&lt;/p&gt;

&lt;p&gt;I can't promise that the exact surface syntax will look identical six months from now.&lt;/p&gt;

&lt;p&gt;But that is also why it's interesting to work on right now.&lt;/p&gt;

&lt;p&gt;The question I started with was, "Why should UI make the language feel different?"&lt;/p&gt;

&lt;p&gt;The current Seseragi answer is getting surprisingly close to something I like.&lt;/p&gt;

&lt;p&gt;From here, I mostly need to keep using it.&lt;/p&gt;

&lt;p&gt;And when something starts feeling ugly, change it.&lt;/p&gt;

&lt;p&gt;That's more or less how this project works.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>programming</category>
      <category>rust</category>
      <category>webdev</category>
    </item>
    <item>
      <title>TypeScript Can Express Almost Anything. That's Part of the Problem.</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:56:10 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/typescript-can-express-almost-anything-thats-part-of-the-problem-28je</link>
      <guid>https://dev.to/kentaromorishita/typescript-can-express-almost-anything-thats-part-of-the-problem-28je</guid>
      <description>&lt;p&gt;I like TypeScript a lot.&lt;/p&gt;

&lt;p&gt;I've used it for a long time, and I still think it's incredibly useful.&lt;/p&gt;

&lt;p&gt;So this is not an article about beating up TypeScript.&lt;/p&gt;

&lt;p&gt;But after using it for years, I sometimes catch myself thinking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can express almost anything. Maybe it can express a little too much.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can throw exceptions.&lt;/p&gt;

&lt;p&gt;You have Promises.&lt;/p&gt;

&lt;p&gt;You can make things mutable.&lt;/p&gt;

&lt;p&gt;You can model state with as many booleans as you want.&lt;/p&gt;

&lt;p&gt;Once React enters the picture, you can add JSX, hooks, stores, and whatever else the application needs.&lt;/p&gt;

&lt;p&gt;All of those things exist for good reasons.&lt;/p&gt;

&lt;p&gt;But "I can write this" and "this is how I want to write it" are not quite the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Take state, for example
&lt;/h2&gt;

&lt;p&gt;This is perfectly normal TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="na"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="na"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It compiles.&lt;/p&gt;

&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But the type also admits something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isLoading = true
isLoggedIn = true
hasError = true
user = undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What state are you even in?&lt;/p&gt;

&lt;p&gt;Of course, the implementation can promise never to create that combination.&lt;/p&gt;

&lt;p&gt;A reducer can enforce the invariant. Validation can enforce it. Tests can help enforce it.&lt;/p&gt;

&lt;p&gt;But if the states I actually mean are only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loading&lt;/li&gt;
&lt;li&gt;Guest&lt;/li&gt;
&lt;li&gt;LoggedIn User&lt;/li&gt;
&lt;li&gt;Failed Error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then I increasingly want to write exactly those four states from the beginning.&lt;/p&gt;

&lt;p&gt;In Seseragi, I can start with the shape itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Loading&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Guest&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;LoggedIn&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before working hard on control flow, reduce the number of states that can exist at all.&lt;/p&gt;

&lt;p&gt;I find that much easier to reason about.&lt;/p&gt;

&lt;p&gt;There is a whole separate article in this series about the shape of state, so I won't turn this one into the ADT article too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Take "there might not be a value"
&lt;/h2&gt;

&lt;p&gt;TypeScript has &lt;code&gt;undefined&lt;/code&gt; and &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Again, useful.&lt;/p&gt;

&lt;p&gt;But they enter the world of ordinary values so naturally that it's easy to arrive somewhere later and realize, "Oh right, this was one of those values that might not exist."&lt;/p&gt;

&lt;p&gt;Seseragi has &lt;code&gt;Maybe&amp;lt;A&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Nothing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one line tells me, at minimum, that &lt;code&gt;name&lt;/code&gt; is not an ordinary &lt;code&gt;String&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What I like is that &lt;strong&gt;"there might be no value" is visible directly in the shape of the type&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How to &lt;code&gt;match&lt;/code&gt; it or &lt;code&gt;map&lt;/code&gt; it is a separate question. I have another article for that.&lt;/p&gt;

&lt;p&gt;If I paste the same Maybe example into three different articles, the articles themselves start becoming the ugly part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Take the outside world
&lt;/h2&gt;

&lt;p&gt;Sometimes I just want to make an HTTP request, but the implementation layer makes me think about Promises and &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In a browser there is &lt;code&gt;fetch&lt;/code&gt;. On Node there are other runtime details.&lt;/p&gt;

&lt;p&gt;Those details matter somewhere.&lt;/p&gt;

&lt;p&gt;But I started wondering whether the person writing Seseragi code should have to carry all of them every time they merely want to say, "this interacts with the outside world."&lt;/p&gt;

&lt;p&gt;That line of thought eventually leads into Seseragi's &lt;code&gt;Effect&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe what I wanted wasn't restriction, but shape
&lt;/h2&gt;

&lt;p&gt;While building Seseragi, I sometimes ask myself whether I'm trying to create a more restrictive language.&lt;/p&gt;

&lt;p&gt;I don't think that's quite it.&lt;/p&gt;

&lt;p&gt;I'm less interested in banning things than in being able to write &lt;strong&gt;the thing I'm thinking about in roughly the same shape that I'm thinking about it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If there are four states, write four states.&lt;/p&gt;

&lt;p&gt;If a value may be absent, use Maybe.&lt;/p&gt;

&lt;p&gt;If something can fail, let the type show failure.&lt;/p&gt;

&lt;p&gt;If it touches the outside world, make that visible as Effect.&lt;/p&gt;

&lt;p&gt;If it changes over time, make it Signal.&lt;/p&gt;

&lt;p&gt;If it's UI, make it Html.&lt;/p&gt;

&lt;p&gt;I want responsibilities to be separated clearly.&lt;/p&gt;

&lt;p&gt;What I don't want is to jump into a completely different programming worldview every time the responsibility changes.&lt;/p&gt;

&lt;p&gt;That may be one of the parts of Seseragi I find most interesting right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Play with it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/tour/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/tour/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A good path is to start with the ADT and &lt;code&gt;match&lt;/code&gt; sections of the Tour.&lt;/p&gt;

&lt;p&gt;Then open the Maybe examples and switch between &lt;code&gt;Just&lt;/code&gt; and &lt;code&gt;Nothing&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After that, continue into Web UI.&lt;/p&gt;

&lt;p&gt;By then, I think you can start to see what Seseragi is trying not to hide, and what it prefers to make visible as a shape in the language.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>typescript</category>
    </item>
    <item>
      <title>TypeScript Is a Backend, Not the Language</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:56:08 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/typescript-is-a-backend-not-the-language-db9</link>
      <guid>https://dev.to/kentaromorishita/typescript-is-a-backend-not-the-language-db9</guid>
      <description>&lt;p&gt;Seseragi currently uses TypeScript / JavaScript as one of its execution targets.&lt;/p&gt;

&lt;p&gt;If that's the first thing you hear about it, a reasonable reaction is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"So is it basically TypeScript syntax sugar?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At one point, it almost was.&lt;/p&gt;

&lt;p&gt;The first implementation stayed very close to TypeScript because that was by far the easiest way to get something running.&lt;/p&gt;

&lt;p&gt;Parse a little syntax.&lt;/p&gt;

&lt;p&gt;Transform it.&lt;/p&gt;

&lt;p&gt;Emit TypeScript.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;That worked surprisingly well for a while.&lt;/p&gt;

&lt;p&gt;Then the language grew, and the architecture started feeling wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is this a Seseragi rule or a TypeScript workaround?
&lt;/h2&gt;

&lt;p&gt;The early compiler was simple.&lt;/p&gt;

&lt;p&gt;Then Maybe arrived.&lt;/p&gt;

&lt;p&gt;Either arrived.&lt;/p&gt;

&lt;p&gt;Effect arrived.&lt;/p&gt;

&lt;p&gt;Type classes arrived.&lt;/p&gt;

&lt;p&gt;Signal arrived.&lt;/p&gt;

&lt;p&gt;Web UI arrived.&lt;/p&gt;

&lt;p&gt;And the transformation code gradually started mixing three different questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what a Seseragi program means&lt;/li&gt;
&lt;li&gt;how that meaning should be represented in TypeScript&lt;/li&gt;
&lt;li&gt;what the JavaScript runtime needs in order to execute it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small change in one place would break something surprisingly far away.&lt;/p&gt;

&lt;p&gt;That is usually the point where my internal design detector emits its most sophisticated diagnostic:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This feels ugly.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So I rebuilt the compiler
&lt;/h2&gt;

&lt;p&gt;The current Seseragi compiler is being rebuilt in Rust.&lt;/p&gt;

&lt;p&gt;Very roughly, the path looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source
  ↓
CST / AST
  ↓
name resolution / type checking
  ↓
Typed HIR
  ↓
Core IR
  ↓
TypeScript IR
  ↓
TypeScript + source map
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listing all those names makes this article sound much more like a compiler article than the way I originally learned the idea.&lt;/p&gt;

&lt;p&gt;At the beginning I barely knew what IR was supposed to buy me.&lt;/p&gt;

&lt;p&gt;The useful realization was much simpler:&lt;/p&gt;

&lt;p&gt;I need one place for &lt;strong&gt;what this means in Seseragi&lt;/strong&gt;, and another place for &lt;strong&gt;how TypeScript happens to implement that meaning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There needs to be a boundary between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript is not the enemy
&lt;/h2&gt;

&lt;p&gt;This part matters.&lt;/p&gt;

&lt;p&gt;I am not trying to escape TypeScript because I dislike it.&lt;/p&gt;

&lt;p&gt;I use it constantly.&lt;/p&gt;

&lt;p&gt;The JavaScript ecosystem is enormous. Browsers run it. Servers run it. Tooling is everywhere.&lt;/p&gt;

&lt;p&gt;I want to take advantage of that.&lt;/p&gt;

&lt;p&gt;What I don't want is for every person writing Seseragi to carry Promise details, JavaScript ABI details, and backend-runtime decisions all the way up into their source code.&lt;/p&gt;

&lt;p&gt;The semantics I want the language to guarantee should live on the Seseragi side.&lt;/p&gt;

&lt;p&gt;How those semantics execute is a backend problem.&lt;/p&gt;

&lt;p&gt;That separation is the important part.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm not promising every backend under the sun
&lt;/h2&gt;

&lt;p&gt;Once a compiler has a Core IR and a backend boundary, the obvious questions appear immediately:&lt;/p&gt;

&lt;p&gt;"Could you add LLVM?"&lt;/p&gt;

&lt;p&gt;"Could it compile to native code?"&lt;/p&gt;

&lt;p&gt;"Could you emit WASM directly?"&lt;/p&gt;

&lt;p&gt;Architecturally, those questions are easier to ask now than they were before.&lt;/p&gt;

&lt;p&gt;That does not make them implemented.&lt;/p&gt;

&lt;p&gt;Memory management exists.&lt;/p&gt;

&lt;p&gt;ABIs exist.&lt;/p&gt;

&lt;p&gt;Async exists.&lt;/p&gt;

&lt;p&gt;Runtime semantics exist.&lt;/p&gt;

&lt;p&gt;Saying "another backend should be possible" is much easier than building one correctly.&lt;/p&gt;

&lt;p&gt;So right now I want TypeScript to become a solid first backend.&lt;/p&gt;

&lt;p&gt;Designing an architecture that leaves room for the future is not the same thing as pretending the future has already been implemented.&lt;/p&gt;

&lt;p&gt;Codex occasionally starts dreaming ahead here too, and I have to pull it back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not knowing compiler architecture made the lesson more interesting
&lt;/h2&gt;

&lt;p&gt;I wasn't a compiler expert when I started Seseragi.&lt;/p&gt;

&lt;p&gt;The original plan was more or less:&lt;/p&gt;

&lt;p&gt;"Parse this and generate TypeScript. That should be enough."&lt;/p&gt;

&lt;p&gt;Then I got to experience exactly why it stops being enough as the system grows.&lt;/p&gt;

&lt;p&gt;Only after that did I start understanding why the responsibilities in compiler architecture are separated the way they are.&lt;/p&gt;

&lt;p&gt;I actually like that path.&lt;/p&gt;

&lt;p&gt;I didn't memorize an architecture diagram and then implement it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The changes started feeling ugly, I investigated why, and compiler architecture appeared at the bottom of the hole.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lot of Seseragi has developed that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playground runs through the same compiler boundary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The compiler used in the Playground isn't intended to be a separate toy implementation.&lt;/p&gt;

&lt;p&gt;The CLI, LSP, WASM Playground, and other surfaces are being built around the same compiler-driver boundary.&lt;/p&gt;

&lt;p&gt;That matters to me too.&lt;/p&gt;

&lt;p&gt;A language where one sample works in the Playground, VS Code reports different types, and the CLI behaves differently would be miserable to use.&lt;/p&gt;

&lt;p&gt;I didn't begin this project because I wanted to study compiler internals.&lt;/p&gt;

&lt;p&gt;I just kept finding more places where the language's meaning needed a clear owner.&lt;/p&gt;

&lt;p&gt;The symptoms continue to progress nicely.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>If There Are Four States, Why Not Write Four States?</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:55:36 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/if-there-are-four-states-why-not-write-four-states-27do</link>
      <guid>https://dev.to/kentaromorishita/if-there-are-four-states-why-not-write-four-states-27do</guid>
      <description>&lt;p&gt;When you build web applications, booleans tend to multiply.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="na"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing unusual about that.&lt;/p&gt;

&lt;p&gt;I've written plenty of code like it myself.&lt;/p&gt;

&lt;p&gt;But sometimes I look at a type like this and imagine the values it permits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;already loaded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What state are you even in?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course, you can decide that your implementation will never create that combination.&lt;/p&gt;

&lt;p&gt;You can protect the invariant in a reducer. You can validate it. You can test it.&lt;/p&gt;

&lt;p&gt;But if the real states are simply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Idle&lt;/li&gt;
&lt;li&gt;Loading&lt;/li&gt;
&lt;li&gt;Loaded&lt;/li&gt;
&lt;li&gt;Failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;why not write four states in the first place?&lt;/p&gt;

&lt;p&gt;That has gradually started to feel more natural to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide the shape before managing the booleans
&lt;/h2&gt;

&lt;p&gt;In Seseragi, I might write this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;RequestState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Idle&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Loading&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Loaded&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RequestState&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Idle&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Idle"&lt;/span&gt;
    &lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Loading..."&lt;/span&gt;
    &lt;span class="n"&gt;Loaded&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;Loaded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
    &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;Loaded&lt;/span&gt; &lt;span class="s"&gt;"Seseragi"&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;RequestState&lt;/code&gt; has four possible shapes.&lt;/p&gt;

&lt;p&gt;If data has arrived, it's &lt;code&gt;Loaded String&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the request failed, it's &lt;code&gt;Failed String&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is no state where &lt;code&gt;Loading&lt;/code&gt; and &lt;code&gt;Loaded&lt;/code&gt; are simultaneously true, because I never created such a state in the model.&lt;/p&gt;

&lt;p&gt;I like the feeling of &lt;strong&gt;deciding the shape of the world before working hard on its control flow&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branch using the same shape
&lt;/h2&gt;

&lt;p&gt;Another thing I like here is that &lt;code&gt;match&lt;/code&gt; is not a special state-management feature.&lt;/p&gt;

&lt;p&gt;It's just a normal data type being matched by a normal expression.&lt;/p&gt;

&lt;p&gt;If I add another constructor to the type, places that handle this value have another case to think about.&lt;/p&gt;

&lt;p&gt;The code and the thought in my head — "how many forms can this value take?" — stay fairly close together.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript can do this too. Of course it can.
&lt;/h2&gt;

&lt;p&gt;TypeScript has discriminated unions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RequestState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;loaded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is already much better.&lt;/p&gt;

&lt;p&gt;So this is absolutely not a "Seseragi can do something TypeScript can't" argument.&lt;/p&gt;

&lt;p&gt;Almost the opposite.&lt;/p&gt;

&lt;p&gt;The more I wrote TypeScript this way, the more I started thinking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wouldn't it feel good if this sat closer to the center of the language?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Seseragi, I wanted ADTs and pattern matching to feel less like a technique you remember to reach for and more like ordinary tools for describing data.&lt;/p&gt;

&lt;h2&gt;
  
  
  I want the same model to survive all the way to the UI
&lt;/h2&gt;

&lt;p&gt;The reason this matters to me isn't limited to state modeling.&lt;/p&gt;

&lt;p&gt;UI is the same story.&lt;/p&gt;

&lt;p&gt;Take a &lt;code&gt;RequestState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;match&lt;/code&gt; on its shape.&lt;/p&gt;

&lt;p&gt;Return Html.&lt;/p&gt;

&lt;p&gt;I don't want to use an ADT to model state and then throw the model away the moment UI begins.&lt;/p&gt;

&lt;p&gt;Define the shape of the data.&lt;/p&gt;

&lt;p&gt;Transform it with ordinary functions.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;match&lt;/code&gt; when cases matter.&lt;/p&gt;

&lt;p&gt;I want that same way of thinking to continue into Signal and Html.&lt;/p&gt;

&lt;p&gt;That continuity has become a fairly large part of what Seseragi is trying to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break it in the Playground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the example above and first change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;Loaded&lt;/span&gt; &lt;span class="s"&gt;"Seseragi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;Loading&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add another constructor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Cancelled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave &lt;code&gt;label&lt;/code&gt; unchanged and compile it.&lt;/p&gt;

&lt;p&gt;What the compiler complains about is a pretty direct demonstration of why I prefer this model over collecting boolean flags and promising that their combinations stay sensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  This sounds like state management, but I think it's really data design
&lt;/h2&gt;

&lt;p&gt;These days, before asking which state-management library I should use, I increasingly want to ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How many states does this thing actually have?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of decomposing the state into booleans and then defending the valid combinations, define the possible shapes first.&lt;/p&gt;

&lt;p&gt;I want Seseragi to make that question easy to ask very early.&lt;/p&gt;

&lt;p&gt;Maybe I never really wanted fewer &lt;code&gt;if&lt;/code&gt; statements.&lt;/p&gt;

&lt;p&gt;Maybe I wanted to organize the world before I had to write them.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Why Does State Management Suddenly Need a Whole New Programming Model?</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:55:34 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/why-does-state-management-suddenly-need-a-whole-new-programming-model-1792</link>
      <guid>https://dev.to/kentaromorishita/why-does-state-management-suddenly-need-a-whole-new-programming-model-1792</guid>
      <description>&lt;p&gt;When I write Web UI, the code often begins with ordinary values.&lt;/p&gt;

&lt;p&gt;There is a String.&lt;/p&gt;

&lt;p&gt;There is a Record.&lt;/p&gt;

&lt;p&gt;There is a function.&lt;/p&gt;

&lt;p&gt;So far, everything makes sense.&lt;/p&gt;

&lt;p&gt;Then the screen starts moving and suddenly the vocabulary changes.&lt;/p&gt;

&lt;p&gt;Hook.&lt;/p&gt;

&lt;p&gt;Store.&lt;/p&gt;

&lt;p&gt;Subscription.&lt;/p&gt;

&lt;p&gt;Dispatch.&lt;/p&gt;

&lt;p&gt;Selector.&lt;/p&gt;

&lt;p&gt;Provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wait. A moment ago this was just a value.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That feeling has bothered me for a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  I don't hate state-management libraries
&lt;/h2&gt;

&lt;p&gt;I've used React, Vue, and plenty of state-management libraries.&lt;/p&gt;

&lt;p&gt;They're useful. They solve real problems.&lt;/p&gt;

&lt;p&gt;The part I kept wondering about was more basic:&lt;/p&gt;

&lt;p&gt;If I want to represent &lt;strong&gt;a value that changes over time&lt;/strong&gt;, why does that moment sometimes require the programming model of the whole application to change too?&lt;/p&gt;

&lt;p&gt;What if:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;simply became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Signal&amp;lt;A&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;when time enters the picture?&lt;/p&gt;

&lt;h2&gt;
  
  
  Seseragi has Signal
&lt;/h2&gt;

&lt;p&gt;In Seseragi, a value that changes over time can be represented as &lt;code&gt;Signal&amp;lt;A&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A String is &lt;code&gt;String&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A String whose current value can change over time is &lt;code&gt;Signal&amp;lt;String&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wanted that to feel less like moving the value into another universe and more like adding one more dimension to the thing we already had.&lt;/p&gt;

&lt;p&gt;The Tour contains a deliberately small example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s"&gt;"std/signal"&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="py"&gt;.make&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;
  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;doubled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="py"&gt;.map&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;
  &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="py"&gt;.read&lt;/span&gt; &lt;span class="n"&gt;doubled&lt;/span&gt;
  &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;mapped&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's almost disappointingly ordinary.&lt;/p&gt;

&lt;p&gt;I like that.&lt;/p&gt;

&lt;p&gt;There is a value, &lt;code&gt;21&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It becomes a value that can vary over time.&lt;/p&gt;

&lt;p&gt;An ordinary &lt;code&gt;double&lt;/code&gt; function is mapped over it.&lt;/p&gt;

&lt;p&gt;When I need the current value, I read it.&lt;/p&gt;

&lt;p&gt;It doesn't feel like "state management has begun." It feels like an ordinary value gained a time axis.&lt;/p&gt;

&lt;p&gt;That continuity is what I wanted.&lt;/p&gt;

&lt;h2&gt;
  
  
  I didn't want Signal to become Effect
&lt;/h2&gt;

&lt;p&gt;While designing Signal, I also didn't want to throw every interesting behavior into Effect.&lt;/p&gt;

&lt;p&gt;Making one HTTP request and representing a value that keeps changing on screen are related in the broad sense that both are more than pure arithmetic, but they are not the same responsibility.&lt;/p&gt;

&lt;p&gt;One thing interacts with the outside world at a particular point.&lt;/p&gt;

&lt;p&gt;Another thing has a current value that changes over time.&lt;/p&gt;

&lt;p&gt;I want those responsibilities separated.&lt;/p&gt;

&lt;p&gt;But I don't want separating them to force the programmer to learn two completely unrelated worldviews either.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate responsibilities. Keep the worldview connected.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I keep coming back to that sentence while building Seseragi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ordinary functions should survive in UI too
&lt;/h2&gt;

&lt;p&gt;On the Web UI side, an ordinary view function sits on top of the Signal.&lt;/p&gt;

&lt;p&gt;Conceptually, the path looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model
↓
Signal&amp;lt;Model&amp;gt;
↓
map view
↓
Signal&amp;lt;Html&amp;lt;Action&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function from &lt;code&gt;Model&lt;/code&gt; to &lt;code&gt;Html&amp;lt;Action&amp;gt;&lt;/code&gt; is still just a function.&lt;/p&gt;

&lt;p&gt;I don't want the existence of Signal to force that function into a component-specific spiritual dimension.&lt;/p&gt;

&lt;p&gt;There is a separate article about the UI side of this, so I won't paste the same form sample here too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playground makes this much easier to feel
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/tour/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/tour/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the sample above and try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;changing &lt;code&gt;21&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;making &lt;code&gt;double&lt;/code&gt; triple instead&lt;/li&gt;
&lt;li&gt;adding another &lt;code&gt;signals.map&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;continuing through the Tour to &lt;code&gt;set&lt;/code&gt; and &lt;code&gt;combine&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then continue into Web UI and the pieces start connecting: Model, Action, Signal, Html, DOM.&lt;/p&gt;

&lt;p&gt;You begin with ordinary values and ordinary functions, and somehow the screen moves at the other end.&lt;/p&gt;

&lt;p&gt;Lately, when I play with that path in the Playground, I keep having the same reaction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Yeah. This is enough."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's not finished.&lt;/p&gt;

&lt;p&gt;But I like the direction a lot.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Can Barely Read Rust, but I'm Building a Compiler in Rust</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:55:02 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/i-can-barely-read-rust-but-im-building-a-compiler-in-rust-1d59</link>
      <guid>https://dev.to/kentaromorishita/i-can-barely-read-rust-but-im-building-a-compiler-in-rust-1d59</guid>
      <description>&lt;p&gt;The Seseragi compiler is currently written in Rust.&lt;/p&gt;

&lt;p&gt;I can barely read Rust.&lt;/p&gt;

&lt;p&gt;Written as two sentences, this project sounds deeply questionable.&lt;/p&gt;

&lt;h2&gt;
  
  
  I don't think this would have worked before
&lt;/h2&gt;

&lt;p&gt;If you're building your own compiler, the obvious assumption is that you should understand the implementation language very well.&lt;/p&gt;

&lt;p&gt;That is still an advantage. A huge one.&lt;/p&gt;

&lt;p&gt;But in the Seseragi rewrite, Codex writes a large part of the Rust implementation.&lt;/p&gt;

&lt;p&gt;My job is not to personally type every line.&lt;/p&gt;

&lt;p&gt;I spend much more time on questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what should this mean in Seseragi?&lt;/li&gt;
&lt;li&gt;which layer owns that responsibility?&lt;/li&gt;
&lt;li&gt;does this syntax feel good?&lt;/li&gt;
&lt;li&gt;are backend concerns leaking into the public surface?&lt;/li&gt;
&lt;li&gt;will this implementation choice trap us later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if the result feels wrong, I make it go back.&lt;/p&gt;

&lt;h2&gt;
  
  
  "AI can write it, so architecture matters less" turned out to be completely wrong
&lt;/h2&gt;

&lt;p&gt;At first, part of me wondered whether AI implementation meant I could be more relaxed about internal structure.&lt;/p&gt;

&lt;p&gt;Local implementation is astonishingly fast now.&lt;/p&gt;

&lt;p&gt;That speed is exactly what makes careless architecture dangerous.&lt;/p&gt;

&lt;p&gt;If you put a responsibility in the wrong place, &lt;strong&gt;the wrong architecture can become fully implemented at incredible speed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes it even comes with tests.&lt;/p&gt;

&lt;p&gt;It looks polished.&lt;/p&gt;

&lt;p&gt;It is still wrong.&lt;/p&gt;

&lt;p&gt;That is terrifying in a very modern way.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I spend more time writing Issues
&lt;/h2&gt;

&lt;p&gt;Before handing work to Codex, I now think much harder about the shape of the task.&lt;/p&gt;

&lt;p&gt;What is actually in scope?&lt;/p&gt;

&lt;p&gt;What is the source of truth?&lt;/p&gt;

&lt;p&gt;What should explicitly wait for a future Issue?&lt;/p&gt;

&lt;p&gt;Does this change break an assumption needed by the next piece of work?&lt;/p&gt;

&lt;p&gt;AI made code production faster, so the human side of the loop moved further toward designing the entrance to the work.&lt;/p&gt;

&lt;p&gt;It's strange, but I think I spend more time thinking about architecture now than I did when I personally wrote more of the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is not an argument that I never need to learn Rust
&lt;/h2&gt;

&lt;p&gt;I want to be clear about this.&lt;/p&gt;

&lt;p&gt;Understanding Rust would obviously make me stronger at this project.&lt;/p&gt;

&lt;p&gt;It helps when debugging low-level behavior, looking at performance, reviewing ownership choices, or encountering &lt;code&gt;unsafe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When I need to understand something, I read it.&lt;/p&gt;

&lt;p&gt;The interesting part to me is not "you don't need to know your tools anymore."&lt;/p&gt;

&lt;p&gt;It's that &lt;strong&gt;I can move a language implementation forward by holding onto the semantics and architecture even when I don't completely control the implementation language&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once AI enters the implementation loop this deeply, the question "what does the author actually do?" starts to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  I care more about the surface syntax than thousands of lines of Rust
&lt;/h2&gt;

&lt;p&gt;Codex can produce a large Rust diff and I can review it fairly calmly.&lt;/p&gt;

&lt;p&gt;Then I look at a Seseragi sample and see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;one character that feels unnecessary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;an ugly line break
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and suddenly I become extremely opinionated.&lt;/p&gt;

&lt;p&gt;I think the reason is simple.&lt;/p&gt;

&lt;p&gt;I'm not primarily trying to create &lt;strong&gt;a Rust compiler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm trying to create &lt;strong&gt;Seseragi as an interface that humans use&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The compiler is the machinery that protects that meaning.&lt;/p&gt;

&lt;p&gt;So I'm harsher on the surface than on implementation details I can delegate.&lt;/p&gt;

&lt;p&gt;This seems logically consistent to me.&lt;/p&gt;

&lt;p&gt;Codex may have a different opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Somehow, it actually runs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/seseragi" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/seseragi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project now has a Rust compiler, CLI, LSP, formatter, and WASM Playground sharing the same compiler-driver direction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't feel that the language stops being mine because I didn't personally write every line of Rust.&lt;/p&gt;

&lt;p&gt;I keep ownership of questions like:&lt;/p&gt;

&lt;p&gt;What does the language mean?&lt;/p&gt;

&lt;p&gt;What is allowed?&lt;/p&gt;

&lt;p&gt;What feels wrong enough to change?&lt;/p&gt;

&lt;p&gt;An AI-assisted homemade programming language is a very strange kind of software project.&lt;/p&gt;

&lt;p&gt;I think we're only beginning to find out how strange.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
      <category>rust</category>
    </item>
    <item>
      <title>My Language Playground Somehow Turned Into a Place to Build Web Apps</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:55:00 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/my-language-playground-somehow-turned-into-a-place-to-build-web-apps-87a</link>
      <guid>https://dev.to/kentaromorishita/my-language-playground-somehow-turned-into-a-place-to-build-web-apps-87a</guid>
      <description>&lt;p&gt;When I hear "Playground for a homemade programming language," I imagine something simple.&lt;/p&gt;

&lt;p&gt;Write code on the left.&lt;/p&gt;

&lt;p&gt;Press Run.&lt;/p&gt;

&lt;p&gt;See the result on the right or underneath.&lt;/p&gt;

&lt;p&gt;Early Seseragi felt more or less like that.&lt;/p&gt;

&lt;p&gt;The browser could compile code written in the language I was building.&lt;/p&gt;

&lt;p&gt;That alone made me happy.&lt;/p&gt;

&lt;p&gt;Recently, though, things have become a little strange.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Playground has become a place where I can casually build Web applications in my own language.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes I genuinely lose track of what I'm making.&lt;/p&gt;

&lt;h2&gt;
  
  
  At first, "it runs!" was enough
&lt;/h2&gt;

&lt;p&gt;Hello World runs.&lt;/p&gt;

&lt;p&gt;FizzBuzz runs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;match&lt;/code&gt; runs.&lt;/p&gt;

&lt;p&gt;Maybe runs.&lt;/p&gt;

&lt;p&gt;Those were straightforward homemade-language victories.&lt;/p&gt;

&lt;p&gt;Paste some code into the Playground, press Run, see output.&lt;/p&gt;

&lt;p&gt;Of course my own language should eventually be able to run its own code, but it still feels a little magical every time another piece starts working.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then HTML Preview started working
&lt;/h2&gt;

&lt;p&gt;Seseragi can construct Html as a value.&lt;/p&gt;

&lt;p&gt;At first, merely producing server-rendered-looking Html was interesting enough.&lt;/p&gt;

&lt;p&gt;Then the DOM runtime connected.&lt;/p&gt;

&lt;p&gt;Events started firing.&lt;/p&gt;

&lt;p&gt;Signals started changing.&lt;/p&gt;

&lt;p&gt;The screen started updating.&lt;/p&gt;

&lt;p&gt;At that point the Playground stopped feeling like a compiler test page.&lt;/p&gt;

&lt;p&gt;It became a place where I could think, "I wonder what this UI would look like," and just write it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now a button can just update the screen
&lt;/h2&gt;

&lt;p&gt;A cleaned-up version of the DOM sample in the Tour looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s"&gt;"std/web/dom"&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s"&gt;"std/web/html"&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s"&gt;"std/signal"&lt;/span&gt;
&lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;MutableSignal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s"&gt;"std/signal"&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Increment&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="py"&gt;.Html&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="py"&gt;.button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"increment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MutableSignal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Increment&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="nf"&gt;.update&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;domError&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="py"&gt;.DomError&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;runtimeError&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="py"&gt;.DomRuntimeError&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Never&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Unit&lt;/span&gt;
  &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="py"&gt;.Dom&lt;/span&gt;
  &lt;span class="n"&gt;fails&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="py"&gt;.make&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="py"&gt;.map&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="nf"&gt;.defaultOptions&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="py"&gt;.query&lt;/span&gt; &lt;span class="s"&gt;"#app"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mapError&lt;/span&gt; &lt;span class="n"&gt;domError&lt;/span&gt;

    &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="py"&gt;.run&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="nf"&gt;target&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
      &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mapError&lt;/span&gt; &lt;span class="n"&gt;runtimeError&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this into the Playground with HTML Preview enabled and the count increases every time you click the button.&lt;/p&gt;

&lt;p&gt;Looking at this code, the Playground feels very far away from "a place where I inspect compiler output."&lt;/p&gt;

&lt;h2&gt;
  
  
  Forms were where it became genuinely fun
&lt;/h2&gt;

&lt;p&gt;Further into the Tour, input, checkbox, submit, and other ordinary form interactions started working too.&lt;/p&gt;

&lt;p&gt;There is a Model describing state.&lt;/p&gt;

&lt;p&gt;There is an Action describing events.&lt;/p&gt;

&lt;p&gt;An ordinary &lt;code&gt;match&lt;/code&gt; updates the Model.&lt;/p&gt;

&lt;p&gt;Signal carries change over time.&lt;/p&gt;

&lt;p&gt;Html reacts to it.&lt;/p&gt;

&lt;p&gt;Somewhere around here, my own use of the Playground changed.&lt;/p&gt;

&lt;p&gt;It stopped being a place where I verify the compiler and became &lt;strong&gt;a place where I play with Seseragi&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  I like having both Tour and Discover
&lt;/h2&gt;

&lt;p&gt;The Playground has a Tour for walking through features in order and Discover for jumping directly to samples by purpose.&lt;/p&gt;

&lt;p&gt;The Tour starts at Hello World and gradually moves forward.&lt;/p&gt;

&lt;p&gt;Discover is where I go when I think, "Show me Maybe," "I want the Web UI sample," or "Where was that form example again?"&lt;/p&gt;

&lt;p&gt;This is useful even while building the language.&lt;/p&gt;

&lt;p&gt;Sometimes I forget exactly how one of my own features is currently written, open my own Playground, and let my own Tour remind me.&lt;/p&gt;

&lt;p&gt;I built a language and then built a tutorial to teach its author how to use it.&lt;/p&gt;

&lt;p&gt;This is all going very well.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Playground exposes ugliness immediately
&lt;/h2&gt;

&lt;p&gt;A specification document can hide awkward syntax surprisingly well.&lt;/p&gt;

&lt;p&gt;Actually typing the language does not.&lt;/p&gt;

&lt;p&gt;"Are there too many parentheses here?"&lt;/p&gt;

&lt;p&gt;"Why does this line break look terrible?"&lt;/p&gt;

&lt;p&gt;"What is this error message even trying to tell me?"&lt;/p&gt;

&lt;p&gt;"Why is the spacing in this UI so weird?"&lt;/p&gt;

&lt;p&gt;The moment the language becomes something I can touch, those problems surface immediately.&lt;/p&gt;

&lt;p&gt;That's been extremely useful.&lt;/p&gt;

&lt;p&gt;I probably spend more time complaining about the Seseragi code I see in the Playground than reading every line of Rust inside the compiler.&lt;/p&gt;

&lt;p&gt;But the surface is what people eventually use, so I think that priority is defensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Please break it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/tour/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/tour/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the counter above, try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change &lt;code&gt;+ 1&lt;/code&gt; to &lt;code&gt;+ 10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;add a &lt;code&gt;Decrement&lt;/code&gt; Action&lt;/li&gt;
&lt;li&gt;change the button text&lt;/li&gt;
&lt;li&gt;split &lt;code&gt;view&lt;/code&gt; into smaller functions&lt;/li&gt;
&lt;li&gt;add another Action and argue with the compiler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then open random Discover samples and break Maybe, forms, or Web UI.&lt;/p&gt;

&lt;p&gt;I don't think you have to approach it as a carefully structured tutorial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breaking things and arguing with the compiler&lt;/strong&gt; is a perfectly good way to learn it.&lt;/p&gt;

&lt;h2&gt;
  
  
  As the Playground grows, the language grows with it
&lt;/h2&gt;

&lt;p&gt;I'm still changing the Playground itself quite a lot.&lt;/p&gt;

&lt;p&gt;Search. Explorer. Preview. Mobile behavior. Tour. Discover.&lt;/p&gt;

&lt;p&gt;Those can look like concerns separate from a language implementation, but in practice they feed directly back into it.&lt;/p&gt;

&lt;p&gt;Is the language awkward, or is the Playground awkward?&lt;/p&gt;

&lt;p&gt;Is the error bad, or is the presentation of the error bad?&lt;/p&gt;

&lt;p&gt;Is the sample wrong, or is the syntax wrong?&lt;/p&gt;

&lt;p&gt;Once there is a place where the language can be used every day, I keep stepping on these questions.&lt;/p&gt;

&lt;p&gt;Then a Playground problem sends me back into the compiler.&lt;/p&gt;

&lt;p&gt;I fix the compiler and return to the Playground.&lt;/p&gt;

&lt;p&gt;That's more or less the current loop.&lt;/p&gt;

&lt;p&gt;We've come a long way from "I pressed Run and Hello World appeared."&lt;/p&gt;

&lt;p&gt;It's still unfinished, though.&lt;/p&gt;

&lt;p&gt;Which may make this the best time to play with it.&lt;/p&gt;

&lt;p&gt;If you find something weird, there's a decent chance I'll look at the same thing later and say, "Yeah, that's ugly."&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Best Feeling Is When Ordinary Features Compose Into Something Bigger</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:54:28 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/the-best-feeling-is-when-ordinary-features-compose-into-something-bigger-17cn</link>
      <guid>https://dev.to/kentaromorishita/the-best-feeling-is-when-ordinary-features-compose-into-something-bigger-17cn</guid>
      <description>&lt;p&gt;There is a moment I enjoy more than adding a new feature to Seseragi.&lt;/p&gt;

&lt;p&gt;It's when I realize:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I don't need a new special feature at all. The things already in the language compose into the thing I wanted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That feels much better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a dedicated feature always looks easy at first
&lt;/h2&gt;

&lt;p&gt;A new use case appears.&lt;/p&gt;

&lt;p&gt;Add syntax.&lt;/p&gt;

&lt;p&gt;Add a keyword.&lt;/p&gt;

&lt;p&gt;Add a special runtime rule.&lt;/p&gt;

&lt;p&gt;In the short term, this can be the fastest solution.&lt;/p&gt;

&lt;p&gt;But every special feature also creates another thing to learn.&lt;/p&gt;

&lt;p&gt;And if it gets its own semantics, six months later someone — probably me — looks at it and asks:&lt;/p&gt;

&lt;p&gt;"Why is this one thing special?"&lt;/p&gt;

&lt;p&gt;Whenever old versions of Seseragi started smelling like that, it bothered me a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Web UI made this especially obvious
&lt;/h2&gt;

&lt;p&gt;When I started exploring Web UI, I didn't begin by designing component syntax.&lt;/p&gt;

&lt;p&gt;The language already had ordinary functions.&lt;/p&gt;

&lt;p&gt;Records.&lt;/p&gt;

&lt;p&gt;ADTs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;match&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Arrays.&lt;/p&gt;

&lt;p&gt;So I wondered whether Html could simply be another value built from those same tools.&lt;/p&gt;

&lt;p&gt;The component model in the Tour can be summarized like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data
  ↓
function / match
  ↓
Html&amp;lt;Action&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No special component declaration is required for that path to go surprisingly far.&lt;/p&gt;

&lt;p&gt;There is a separate article where I show the actual component code. Repeating the exact same sample here would make the article less focused, not more complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  I didn't want state to become another universe either
&lt;/h2&gt;

&lt;p&gt;Once UI can render, the next request is obvious: make it change.&lt;/p&gt;

&lt;p&gt;Instead of immediately adding a whole "state-management framework," Seseragi has &lt;code&gt;Signal&amp;lt;A&amp;gt;&lt;/code&gt; for values that change over time.&lt;/p&gt;

&lt;p&gt;That turns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A
↓
function
↓
Html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Signal&amp;lt;A&amp;gt;
↓
map function
↓
Signal&amp;lt;Html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a new responsibility.&lt;/p&gt;

&lt;p&gt;But there isn't necessarily a completely new way of thinking.&lt;/p&gt;

&lt;p&gt;That is much closer to the kind of language I want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effect follows the same principle
&lt;/h2&gt;

&lt;p&gt;Interaction with the outside world is not the same thing as ordinary value transformation.&lt;/p&gt;

&lt;p&gt;So it deserves a separate responsibility.&lt;/p&gt;

&lt;p&gt;But separating it doesn't mean I want to invent a giant Effect-only worldview either.&lt;/p&gt;

&lt;p&gt;It should still compose as a value where that makes sense and connect back to ordinary functions at clear boundaries.&lt;/p&gt;

&lt;p&gt;Maybe and Either are different again.&lt;/p&gt;

&lt;p&gt;Their meanings are not interchangeable.&lt;/p&gt;

&lt;p&gt;But where they share ordinary operations — &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;match&lt;/code&gt;, function application — I would rather reuse those language ideas than invent a separate miniature language for every type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate responsibilities, not worldviews
&lt;/h2&gt;

&lt;p&gt;This is probably the sentence that best captures what I've been doing lately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate the responsibilities, but don't make each responsibility its own programming worldview.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Effect and Signal are not the same thing.&lt;/p&gt;

&lt;p&gt;Html and DOM are not the same thing.&lt;/p&gt;

&lt;p&gt;Maybe and Either are not the same thing.&lt;/p&gt;

&lt;p&gt;I do not want to blur all of them into one abstraction just for the sake of uniformity.&lt;/p&gt;

&lt;p&gt;But I also don't want every boundary to say:&lt;/p&gt;

&lt;p&gt;"From here on, use another framework."&lt;/p&gt;

&lt;p&gt;"From here on, learn another DSL."&lt;/p&gt;

&lt;p&gt;"From here on, composition follows unrelated rules."&lt;/p&gt;

&lt;p&gt;I want the responsibilities to stay distinct while ordinary types, values, and functions connect them.&lt;/p&gt;

&lt;p&gt;Looking back, I think I've been trying to do that throughout Seseragi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fewer special features is not a moral achievement
&lt;/h2&gt;

&lt;p&gt;I will add syntax when the language actually needs syntax.&lt;/p&gt;

&lt;p&gt;Seseragi has &lt;code&gt;match&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It has &lt;code&gt;do&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It has &lt;code&gt;effect fn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is not a competition to minimize the keyword count.&lt;/p&gt;

&lt;p&gt;The question I want to ask before adding a concept is simply:&lt;/p&gt;

&lt;p&gt;Does this introduce genuinely new meaning, or can the meaning already be expressed by composing things we have?&lt;/p&gt;

&lt;p&gt;If the second answer works, I'm happy.&lt;/p&gt;

&lt;p&gt;That's all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Look for the boring parts in the Playground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open one of the Web UI samples and you may notice an unexpectedly large number of ordinary functions.&lt;/p&gt;

&lt;p&gt;A demo for a homemade programming language could probably look more impressive if every screen contained exotic syntax.&lt;/p&gt;

&lt;p&gt;But the reaction I would most like is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Huh. I can just read this."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't make a language because I wanted ordinary programming to look strange.&lt;/p&gt;

&lt;p&gt;I made it because I wanted ordinary programming to feel better.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Why Does null Get to Pretend It's a Normal Value?</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:54:26 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/why-does-null-get-to-pretend-its-a-normal-value-2cpj</link>
      <guid>https://dev.to/kentaromorishita/why-does-null-get-to-pretend-its-a-normal-value-2cpj</guid>
      <description>&lt;p&gt;If you write TypeScript, &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; are just part of life.&lt;/p&gt;

&lt;p&gt;That's normal.&lt;/p&gt;

&lt;p&gt;But I've always found them slightly uncomfortable.&lt;/p&gt;

&lt;p&gt;A value may exist.&lt;/p&gt;

&lt;p&gt;It may not exist.&lt;/p&gt;

&lt;p&gt;So far, so good.&lt;/p&gt;

&lt;p&gt;What bothers me is how naturally "not there" can walk into the same world as ordinary values and sit down like nothing happened.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TypeScript complains, correctly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;user&lt;/code&gt; may be &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This isn't TypeScript failing to help. TypeScript is being nice here.&lt;/p&gt;

&lt;p&gt;But if every encounter with absence turns into another branch like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then the code gradually becomes more about avoiding a null-like value than about the actual fact I wanted to model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;there may be no user.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I never liked that very much.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it may be missing, I want that to be the shape
&lt;/h2&gt;

&lt;p&gt;I was already using Maybe for this kind of thing when I built F-Box.&lt;/p&gt;

&lt;p&gt;The old implementation is still here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/f-box-core" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/f-box-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/f-box-react" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/f-box-react&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seseragi follows the same idea. If a value may be absent, I want that visible as &lt;code&gt;Maybe&amp;lt;A&amp;gt;&lt;/code&gt; from the beginning.&lt;/p&gt;

&lt;p&gt;The Tour has a small sample like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;withDefault&lt;/span&gt; &lt;span class="n"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Nothing&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fallback&lt;/span&gt;
    &lt;span class="n"&gt;Just&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Nothing&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;effect&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;withDefault&lt;/span&gt; &lt;span class="s"&gt;"Guest"&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing fancy is happening.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;name&lt;/code&gt; is not a String.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;a value that may contain a String&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So the code using it handles &lt;code&gt;Nothing&lt;/code&gt; and &lt;code&gt;Just item&lt;/code&gt; as ordinary cases.&lt;/p&gt;

&lt;p&gt;That "ordinary" part matters to me.&lt;/p&gt;

&lt;p&gt;I don't want a special null-checking language bolted onto the rest of the language.&lt;/p&gt;

&lt;p&gt;There is a data shape called &lt;code&gt;Maybe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is an ordinary expression called &lt;code&gt;match&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I'd like that to be enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transforming only the present value shouldn't require a new control structure either
&lt;/h2&gt;

&lt;p&gt;Maybe can be mapped.&lt;/p&gt;

&lt;p&gt;If a value exists, transform it.&lt;/p&gt;

&lt;p&gt;If it is &lt;code&gt;Nothing&lt;/code&gt;, keep it &lt;code&gt;Nothing&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Seseragi lets you write that with &lt;code&gt;map&lt;/code&gt;, or with &lt;code&gt;&amp;lt;$&amp;gt;&lt;/code&gt; if you like the operator form.&lt;/p&gt;

&lt;p&gt;There is more to say about Functor there, but I'd rather keep that in an article where Functor is actually the point.&lt;/p&gt;

&lt;p&gt;If an article about Maybe starts pasting three nearly identical Maybe examples, the article itself becomes the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm not trying to ban null
&lt;/h2&gt;

&lt;p&gt;Discussions like this can turn into "is null evil?" very quickly.&lt;/p&gt;

&lt;p&gt;I'm not interested in that religious war.&lt;/p&gt;

&lt;p&gt;If the outside world contains null, then of course a boundary has to deal with it.&lt;/p&gt;

&lt;p&gt;JSON has it. JavaScript has it.&lt;/p&gt;

&lt;p&gt;What I don't want is to carry that external representation through the entire inner model of the program.&lt;/p&gt;

&lt;p&gt;Accept the outside world's shape at the boundary.&lt;/p&gt;

&lt;p&gt;Then turn it into something meaningful on the inside.&lt;/p&gt;

&lt;p&gt;That's all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break it in the Playground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/tour/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/tour/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the &lt;code&gt;withDefault&lt;/code&gt; example and first change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;Nothing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;Just&lt;/span&gt; &lt;span class="s"&gt;"Kentaro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then try things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change the example to &lt;code&gt;Maybe&amp;lt;Int&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;remove the &lt;code&gt;Nothing&lt;/code&gt; arm from the &lt;code&gt;match&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;continue through the Tour until you reach &lt;code&gt;map&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;nest &lt;code&gt;Just&lt;/code&gt; inside &lt;code&gt;Just&lt;/code&gt; and enjoy the immediate feeling that you've probably modeled the wrong thing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think Maybe is easier to understand by touching it than by beginning with category theory.&lt;/p&gt;

&lt;p&gt;For what it's worth, I once spent about three months of train rides thinking about this family of ideas.&lt;/p&gt;

&lt;p&gt;Looking back, I apparently had a lot of free mental bandwidth.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Is Seseragi a Functional Programming Language? I'm Not Sure.</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:53:52 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/is-seseragi-a-functional-programming-language-im-not-sure-738</link>
      <guid>https://dev.to/kentaromorishita/is-seseragi-a-functional-programming-language-im-not-sure-738</guid>
      <description>&lt;p&gt;Seseragi has Maybe.&lt;/p&gt;

&lt;p&gt;It has Either.&lt;/p&gt;

&lt;p&gt;It has Functor, Applicative, and Monad.&lt;/p&gt;

&lt;p&gt;It has &lt;code&gt;&amp;lt;$&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;*&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It has &lt;code&gt;match&lt;/code&gt; and ADTs.&lt;/p&gt;

&lt;p&gt;Once I list all of that, there is a very predictable response:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"So it's a functional programming language."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fair.&lt;/p&gt;

&lt;p&gt;Even I would probably make that assumption.&lt;/p&gt;

&lt;p&gt;And yet I don't really think of Seseragi that way while I'm designing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  I am not going to pretend I don't like Monad
&lt;/h2&gt;

&lt;p&gt;That would be impossible to defend.&lt;/p&gt;

&lt;p&gt;I do.&lt;/p&gt;

&lt;p&gt;There was a period when I spent about three months of train rides talking through Monad with GPT.&lt;/p&gt;

&lt;p&gt;Then I built F-Box.&lt;/p&gt;

&lt;p&gt;The old implementation is still here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/f-box-core" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/f-box-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/KentaroMorishita/f-box-react" rel="noopener noreferrer"&gt;https://github.com/KentaroMorishita/f-box-react&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So "I'm not really interested in this stuff" would obviously be a lie.&lt;/p&gt;

&lt;p&gt;But I did not add Monad to Seseragi because I wanted the language to look more functionally programmed.&lt;/p&gt;

&lt;p&gt;I wanted to connect values.&lt;/p&gt;

&lt;p&gt;I wanted failures to stay values.&lt;/p&gt;

&lt;p&gt;I wanted interactions with the outside world to compose.&lt;/p&gt;

&lt;p&gt;I kept following those problems, and eventually found abstractions that already had names.&lt;/p&gt;

&lt;p&gt;At that point, using the existing abstraction seemed better than inventing a private version of the same idea.&lt;/p&gt;

&lt;p&gt;That's closer to how it happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  I didn't start with a paradigm
&lt;/h2&gt;

&lt;p&gt;I never wrote "Seseragi is a language in paradigm X" at the top of a document and derived the features from there.&lt;/p&gt;

&lt;p&gt;The process tends to run in the opposite direction.&lt;/p&gt;

&lt;p&gt;I write ordinary software and think:&lt;/p&gt;

&lt;p&gt;"This is annoying."&lt;/p&gt;

&lt;p&gt;"Wouldn't it be nicer if this were shaped differently?"&lt;/p&gt;

&lt;p&gt;Then I keep digging.&lt;/p&gt;

&lt;p&gt;If there are several possible states, I want an ADT.&lt;/p&gt;

&lt;p&gt;If a value may be absent, I want Maybe.&lt;/p&gt;

&lt;p&gt;If something can fail, I want Either or typed failure to make that visible.&lt;/p&gt;

&lt;p&gt;If a value changes over time, I want Signal.&lt;/p&gt;

&lt;p&gt;If code crosses into the outside world, I want Effect to show the boundary.&lt;/p&gt;

&lt;p&gt;If I'm writing UI, I still want ordinary data and functions to work.&lt;/p&gt;

&lt;p&gt;Those responsibilities are different.&lt;/p&gt;

&lt;p&gt;What I dislike is being forced into an unrelated mental model every time the responsibility changes.&lt;/p&gt;

&lt;p&gt;That feels much closer to the actual motivation behind Seseragi than any paradigm label.&lt;/p&gt;

&lt;h2&gt;
  
  
  I do care about being declarative
&lt;/h2&gt;

&lt;p&gt;There is one direction I can state more confidently.&lt;/p&gt;

&lt;p&gt;When I read code, I like &lt;strong&gt;what something is&lt;/strong&gt; to appear before instructions about how to manipulate it.&lt;/p&gt;

&lt;p&gt;I prefer seeing the shape of data, transformations of values, and explicit cases over tracing a long sequence of commands.&lt;/p&gt;

&lt;p&gt;That preference naturally overlaps with a lot of tools associated with functional programming.&lt;/p&gt;

&lt;p&gt;But I don't want the conclusion to become, "You must know FP etiquette before you're allowed to use the language."&lt;/p&gt;

&lt;p&gt;Ideally, the theory can arrive later.&lt;/p&gt;

&lt;p&gt;You use something because it reads naturally, and at some point somebody says:&lt;/p&gt;

&lt;p&gt;"By the way, that's a Functor."&lt;/p&gt;

&lt;p&gt;Fine by me.&lt;/p&gt;

&lt;h2&gt;
  
  
  You don't need to know &lt;code&gt;&amp;lt;$&amp;gt;&lt;/code&gt; to use it
&lt;/h2&gt;

&lt;p&gt;For example, the Tour includes code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="nf"&gt;double&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Just&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Just&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Maybe&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Nothing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;&amp;lt;$&amp;gt;&lt;/code&gt; means nothing to you, use &lt;code&gt;map&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you already like the operator, use the operator.&lt;/p&gt;

&lt;p&gt;I don't want Seseragi to become a language where memorizing symbols is an entrance exam.&lt;/p&gt;

&lt;p&gt;I also don't want to take the symbols away from people who like them.&lt;/p&gt;

&lt;p&gt;That would inconvenience me personally.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what is Seseragi, then?
&lt;/h2&gt;

&lt;p&gt;The description that currently feels closest is something like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a language where I want useful abstractions to remain ordinary language features that can compose all the way through the program.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is not a very useful category label.&lt;/p&gt;

&lt;p&gt;Marketing departments would probably ask for another draft.&lt;/p&gt;

&lt;p&gt;But the language is still evolving, and I don't see much value in narrowing its identity just to make the label cleaner.&lt;/p&gt;

&lt;p&gt;If Seseragi ever becomes mature enough that somebody else wants to classify it, they can do that.&lt;/p&gt;

&lt;p&gt;I'll probably still be arguing about where a line break should go.&lt;/p&gt;

</description>
      <category>functional</category>
      <category>programming</category>
      <category>software</category>
    </item>
    <item>
      <title>I'm Building a Programming Language, and Somehow I Keep Obsessing Over Spacing</title>
      <dc:creator>KentaroMorishita</dc:creator>
      <pubDate>Sun, 16 Aug 2026 13:53:50 +0000</pubDate>
      <link>https://dev.to/kentaromorishita/im-building-a-programming-language-and-somehow-i-keep-obsessing-over-spacing-1mnl</link>
      <guid>https://dev.to/kentaromorishita/im-building-a-programming-language-and-somehow-i-keep-obsessing-over-spacing-1mnl</guid>
      <description>&lt;p&gt;Seseragi is a programming language, so naturally there is a compiler.&lt;/p&gt;

&lt;p&gt;There is a parser.&lt;/p&gt;

&lt;p&gt;Type inference.&lt;/p&gt;

&lt;p&gt;Effect.&lt;/p&gt;

&lt;p&gt;Signal.&lt;/p&gt;

&lt;p&gt;A runtime.&lt;/p&gt;

&lt;p&gt;And yet one of the things I say most often while building it is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"The spacing looks wrong."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Once the Playground worked, "working" stopped being enough
&lt;/h2&gt;

&lt;p&gt;At first, being able to compile and run Seseragi in a browser was exciting by itself.&lt;/p&gt;

&lt;p&gt;That is already a ridiculous thing to see when the language is your own.&lt;/p&gt;

&lt;p&gt;But humans adapt quickly.&lt;/p&gt;

&lt;p&gt;Once it worked, I started looking at everything around the Run button.&lt;/p&gt;

&lt;p&gt;The search panel feels cluttered.&lt;/p&gt;

&lt;p&gt;The gap between Editor and Preview feels wrong.&lt;/p&gt;

&lt;p&gt;These cards are too close together.&lt;/p&gt;

&lt;p&gt;Those elements are too far apart.&lt;/p&gt;

&lt;p&gt;The text feels cramped.&lt;/p&gt;

&lt;p&gt;On mobile it feels even worse.&lt;/p&gt;

&lt;p&gt;And eventually I say:&lt;/p&gt;

&lt;p&gt;"Why is there no space here?"&lt;/p&gt;

&lt;h2&gt;
  
  
  This isn't only a UI problem
&lt;/h2&gt;

&lt;p&gt;The funny part is that I do almost exactly the same thing to the language itself.&lt;/p&gt;

&lt;p&gt;Too many parentheses.&lt;/p&gt;

&lt;p&gt;Too many commas.&lt;/p&gt;

&lt;p&gt;Awkward line breaks.&lt;/p&gt;

&lt;p&gt;Function application that's harder to scan than it should be.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;match&lt;/code&gt; arms breaking in visually strange places.&lt;/p&gt;

&lt;p&gt;Apparently I spend a lot of time worrying about &lt;strong&gt;visual noise&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If two forms mean the same thing, I usually prefer the one that asks my eyes to process less accidental structure.&lt;/p&gt;

&lt;p&gt;But removing too much structure can make meaning disappear.&lt;/p&gt;

&lt;p&gt;So I'm constantly looking for the line between "quiet" and "ambiguous."&lt;/p&gt;

&lt;h2&gt;
  
  
  Even Tailwind classes become language noise in a demo
&lt;/h2&gt;

&lt;p&gt;When I was writing Web UI samples in the Playground, dumping long Tailwind class strings into every element quickly made the examples unreadable.&lt;/p&gt;

&lt;p&gt;So I started moving classes into arrays, combining them with &lt;code&gt;cx&lt;/code&gt;, and splitting UI into smaller functions.&lt;/p&gt;

&lt;p&gt;That has nothing to do with the compiler's semantics.&lt;/p&gt;

&lt;p&gt;But if a demo is visually noisy, a reader doesn't think:&lt;/p&gt;

&lt;p&gt;"This Tailwind sample could use refactoring."&lt;/p&gt;

&lt;p&gt;They think:&lt;/p&gt;

&lt;p&gt;"Seseragi code looks noisy."&lt;/p&gt;

&lt;p&gt;I don't want the demo to become an accidental argument against the language.&lt;/p&gt;

&lt;p&gt;Presentation is part of the first impression of the syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Playground keeps turning into an IDE
&lt;/h2&gt;

&lt;p&gt;Originally, it was one file and a Run button.&lt;/p&gt;

&lt;p&gt;Then search appeared.&lt;/p&gt;

&lt;p&gt;Then I wanted an Explorer.&lt;/p&gt;

&lt;p&gt;Then module splitting.&lt;/p&gt;

&lt;p&gt;Then full-screen Preview.&lt;/p&gt;

&lt;p&gt;Then a Tour.&lt;/p&gt;

&lt;p&gt;It keeps becoming more IDE-like.&lt;/p&gt;

&lt;p&gt;Even I sometimes ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"How far am I planning to take this?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But a good Playground lowers the cost of touching a new language dramatically.&lt;/p&gt;

&lt;p&gt;No installation.&lt;/p&gt;

&lt;p&gt;No reading an entire README first.&lt;/p&gt;

&lt;p&gt;Open it, paste code, press Run.&lt;/p&gt;

&lt;p&gt;That matters a lot when an article tries to move someone from "this idea is interesting" to "let me change one value and see what happens."&lt;/p&gt;

&lt;h2&gt;
  
  
  Language UX is bigger than syntax
&lt;/h2&gt;

&lt;p&gt;I used to think "language design" mostly meant syntax and semantics.&lt;/p&gt;

&lt;p&gt;Those are obviously the core.&lt;/p&gt;

&lt;p&gt;But once a human actually uses the language, the experience includes questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;can I understand the errors?&lt;/li&gt;
&lt;li&gt;does the formatter produce code I want to read?&lt;/li&gt;
&lt;li&gt;can the editor show useful type information?&lt;/li&gt;
&lt;li&gt;can I try something immediately in the Playground?&lt;/li&gt;
&lt;li&gt;does the interface survive on mobile?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that becomes part of what the language feels like.&lt;/p&gt;

&lt;p&gt;Which is why I can spend ten minutes thinking about a compiler issue, switch tabs, and immediately become angry about padding in the search panel.&lt;/p&gt;

&lt;p&gt;It's a busy project.&lt;/p&gt;

&lt;h2&gt;
  
  
  If something feels awkward, tell me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://seseragi.vercel.app/tour/" rel="noopener noreferrer"&gt;https://seseragi.vercel.app/tour/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback doesn't need to be about deep type-system theory.&lt;/p&gt;

&lt;p&gt;If you use the Playground and think:&lt;/p&gt;

&lt;p&gt;"This is hard to use."&lt;/p&gt;

&lt;p&gt;"That display looks strange."&lt;/p&gt;

&lt;p&gt;"Why is the spacing like this?"&lt;/p&gt;

&lt;p&gt;I consider that useful language feedback too.&lt;/p&gt;

&lt;p&gt;There is a non-zero chance it will bother me more than a sophisticated compiler-theory observation.&lt;/p&gt;

&lt;p&gt;And there is an even better chance that an Issue will exist by the next day.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>design</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
