<?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: Art</title>
    <description>The latest articles on DEV Community by Art (@artanidos).</description>
    <link>https://dev.to/artanidos</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3817798%2Fc8737449-667c-4095-b2ec-393e198fbfb4.jpg</url>
      <title>DEV Community: Art</title>
      <link>https://dev.to/artanidos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/artanidos"/>
    <language>en</language>
    <item>
      <title>Why SML/SMS doesn't run on Windows - and why that's a feature</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Mon, 11 May 2026 17:31:46 +0000</pubDate>
      <link>https://dev.to/artanidos/why-smlsms-doesnt-run-on-windows-and-why-thats-a-feature-3plf</link>
      <guid>https://dev.to/artanidos/why-smlsms-doesnt-run-on-windows-and-why-thats-a-feature-3plf</guid>
      <description>&lt;p&gt;Let me tell you a story.&lt;/p&gt;

&lt;p&gt;I was leading a raid in World of Warcraft. 24 people. Everyone waiting on me. And Windows decided that exact moment was the perfect time for an update. No warning. No mercy. Just a reboot.&lt;/p&gt;

&lt;p&gt;I switched to Mac the next day.&lt;/p&gt;

&lt;p&gt;For years it was great. Steve Jobs understood something most tech CEOs never will: the user is not the product. The user is the guest. You treat guests with respect.&lt;/p&gt;

&lt;p&gt;Then Steve left us.&lt;/p&gt;

&lt;p&gt;And slowly - update by update, policy by policy - Apple became just another corporation. A beautiful one. But one that now decides what software you can run, what hardware you can repair, and what belongs to you and what belongs to them.&lt;/p&gt;

&lt;p&gt;So here we are.&lt;/p&gt;

&lt;p&gt;We are building SMS - a programming language that compiles to native binaries via LLVM. Open source. GPL-3. &lt;strong&gt;No telemetry. No stakeholders. No investors.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It runs on Mac and Linux. Not on Windows - and that is not an oversight. That is a choice.&lt;/p&gt;

&lt;p&gt;Because we are not building for a world where your OS reboots your raid.&lt;br&gt;
We are not building for a world where a corporation decides what runs on your machine.&lt;br&gt;
&lt;strong&gt;We are building for the world we actually want to live in.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ahimsa. Do no harm. Not even to your users.&lt;/p&gt;

&lt;p&gt;If you are on Windows and want to try SMS - WSL2 works fine. One small rebellion inside the machine.&lt;/p&gt;

&lt;p&gt;But if you are tired of building software on platforms that belong to someone else - come build with us.&lt;/p&gt;

&lt;p&gt;SMS is free. Linux is free. Your time is not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codeberg.org/CrowdWare/sms-cpp" rel="noopener noreferrer"&gt;https://codeberg.org/CrowdWare/sms-cpp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>linux</category>
      <category>showdev</category>
    </item>
    <item>
      <title>ForgeOS Dojo - learn AI-assisted development, build something that matters</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Mon, 11 May 2026 17:08:06 +0000</pubDate>
      <link>https://dev.to/artanidos/forgeos-dojo-learn-ai-assisted-development-build-something-that-matters-9fg</link>
      <guid>https://dev.to/artanidos/forgeos-dojo-learn-ai-assisted-development-build-something-that-matters-9fg</guid>
      <description>&lt;p&gt;&lt;em&gt;"No Stakeholders. No Investors. Just Users."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In 28 days we built a new programming language from scratch.&lt;br&gt;
Today it compiles itself.&lt;/p&gt;

&lt;p&gt;Now we want to go further - together.&lt;/p&gt;

&lt;p&gt;We are opening the ForgeOS Dojo: a learning community where you will master AI-assisted software architecture while building something real.&lt;/p&gt;

&lt;p&gt;Not a todo app. Not another CRUD API.&lt;/p&gt;

&lt;p&gt;An entire mobile OS. Free. No ads. No forced updates. No spyware.&lt;/p&gt;

&lt;p&gt;You will learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to work with AI as your architect (Claude) and your coder (Codex)&lt;/li&gt;
&lt;li&gt;Sustainable software design - less code, more intention&lt;/li&gt;
&lt;li&gt;SMS - our scripting language that now compiles itself to native binaries&lt;/li&gt;
&lt;li&gt;How to ship real software that respects its users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we build together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ForgeOS - a mobile OS built on SMS and C++&lt;/li&gt;
&lt;li&gt;Ahimsa as the single constitutional principle: do no harm - not even to your users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No prior OS experience needed. Just curiosity and the will to build something that matters.&lt;/p&gt;

&lt;p&gt;If you are tired of building software for companies that spy on their users - this is your Dojo.&lt;/p&gt;

&lt;p&gt;Drop a comment or follow CrowdWare on Codeberg:&lt;br&gt;
&lt;a href="https://codeberg.org/CrowdWare" rel="noopener noreferrer"&gt;https://codeberg.org/CrowdWare&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>career</category>
      <category>showdev</category>
    </item>
    <item>
      <title>We Wrote a Compiler in the Language It Compiles. It Works.</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Mon, 11 May 2026 16:49:00 +0000</pubDate>
      <link>https://dev.to/artanidos/we-wrote-a-compiler-in-the-language-it-compiles-it-works-46p</link>
      <guid>https://dev.to/artanidos/we-wrote-a-compiler-in-the-language-it-compiles-it-works-46p</guid>
      <description>&lt;p&gt;&lt;em&gt;Four sprints. One afternoon. 62 tests, all green.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ForgeIL is the compiler layer of Forge - an open source UI framework built around&lt;br&gt;
a radical simplicity: one language, one binary, no runtime installation.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;There is a test every language eventually faces. Not a benchmark. Not a syntax&lt;br&gt;
comparison. A question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the language compile itself?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A self-hosted compiler is the closest thing software has to a proof of maturity.&lt;br&gt;
If the language can express a lexer, a parser, and a code generator - and the&lt;br&gt;
result of running that code is a working binary - then the language has crossed&lt;br&gt;
a threshold. It is no longer a demo. It is a tool.&lt;/p&gt;

&lt;p&gt;SMS is the scripting language at the heart of Forge. It is interpreted at&lt;br&gt;
development time and compiled to LLVM IR at release time. We decided to test&lt;br&gt;
whether SMS could implement its own compiler front-end: a lexer, a parser, and&lt;br&gt;
an LLVM IR emitter - all written in SMS itself.&lt;/p&gt;

&lt;p&gt;Four sprints. One afternoon. It works.&lt;/p&gt;


&lt;h2&gt;
  
  
  What We Built
&lt;/h2&gt;

&lt;p&gt;The self-hosted compiler lives in the &lt;code&gt;forgeil/&lt;/code&gt; directory of&lt;br&gt;
&lt;a href="https://codeberg.org/CrowdWare/sms-cpp" rel="noopener noreferrer"&gt;sms-cpp&lt;/a&gt; - three SMS source files that&lt;br&gt;
together form a complete compilation pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SMS Source
    |
    v
tokenize(src)        sprint1-lexer.sms     -&amp;gt;  array of Token
    |
    v
parse(tokens)        sprint2-parser.sms    -&amp;gt;  AST of Node
    |
    v
codegen(ast)         sprint3-codegen.sms   -&amp;gt;  LLVM IR text
    |
    v
clang                                      -&amp;gt;  native binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single convenience function wraps it all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun compile(src) {
    return codegen(parse(tokenize(src)))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the entire public API. Give it SMS source text. Get back LLVM IR.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sprint 1: Lexer
&lt;/h2&gt;

&lt;p&gt;The lexer turned out to be the place where SMS's integer-character API became&lt;br&gt;
a design constraint rather than a limitation. &lt;code&gt;str.charAt(i)&lt;/code&gt; returns the&lt;br&gt;
integer char code of the character at position &lt;code&gt;i&lt;/code&gt;. So the entire lexer is&lt;br&gt;
built on integer comparisons - no regex, no character class library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun isAlpha(code) {
    return (code &amp;gt;= 65 &amp;amp;&amp;amp; code &amp;lt;= 90) || (code &amp;gt;= 97 &amp;amp;&amp;amp; code &amp;lt;= 122) || code == 95
}

fun isDigit(code) {
    return code &amp;gt;= 48 &amp;amp;&amp;amp; code &amp;lt;= 57
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two-character operators (&lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;) are handled with&lt;br&gt;
a single lookahead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (ch == 61) {  // '='
    if (i + 1 &amp;lt; len &amp;amp;&amp;amp; src.charAt(i + 1) == 61) {
        tokens.add(Token("OP", "==", line))
        i = i + 2
    } else {
        tokens.add(Token("ASSIGN", "=", line))
        i = i + 1
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result: &lt;code&gt;tokenize(src)&lt;/code&gt; returns an array of &lt;code&gt;Token(type, value, line)&lt;/code&gt; data&lt;br&gt;
class instances. 12 tests, all green on the first run.&lt;/p&gt;


&lt;h2&gt;
  
  
  Sprint 2: Parser
&lt;/h2&gt;

&lt;p&gt;A recursive descent parser, written in SMS, for SMS.&lt;/p&gt;

&lt;p&gt;The interesting constraint here: SMS does not allow forward declarations. Every&lt;br&gt;
function must be defined before it is called - except at the top level, where&lt;br&gt;
all definitions are registered before &lt;code&gt;main()&lt;/code&gt; runs. So mutual recursion between&lt;br&gt;
&lt;code&gt;parseExpr&lt;/code&gt; and &lt;code&gt;parseStmt&lt;/code&gt; works perfectly, because both are defined at the&lt;br&gt;
module level before any call site is reached.&lt;/p&gt;

&lt;p&gt;The precedence chain follows the standard pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parsePrimary -&amp;gt; parsePostfix -&amp;gt; parseUnary -&amp;gt; parseMul -&amp;gt;
parseAdd -&amp;gt; parseCompare -&amp;gt; parseEquality -&amp;gt; parseAnd -&amp;gt; parseOr -&amp;gt; parseExpr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One non-obvious detail: the parser cursor is a single-element array used as a&lt;br&gt;
mutable integer box. SMS arrays are passed by shared reference - field&lt;br&gt;
assignments inside helper functions are visible to the caller. This is how the&lt;br&gt;
cursor advances across the recursive descent without needing a global variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun curTok(cur, tokens) { return tokens[cur[0]] }
fun advance(cur)         { cur[0] = cur[0] + 1 }
fun consume(cur, tokens, expected) {
    var tok = curTok(cur, tokens)
    if (tok.type != expected) { ... }
    advance(cur)
    return tok
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;24 tests. All green.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sprint 3: LLVM IR Emitter
&lt;/h2&gt;

&lt;p&gt;The code generator takes an AST and produces a complete LLVM IR text string.&lt;br&gt;
Integer-only subset: every SMS value is &lt;code&gt;i64&lt;/code&gt;, variables use alloca (memory-form&lt;br&gt;
SSA), and &lt;code&gt;clang&lt;/code&gt;/&lt;code&gt;llc&lt;/code&gt; applies &lt;code&gt;mem2reg&lt;/code&gt; in the optimization pipeline.&lt;/p&gt;

&lt;p&gt;The context object accumulates emitted instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data class Ctx(tempCnt, labelCnt, code, terminated, loops)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because SMS data class instances use shared references (&lt;code&gt;shared_ptr&lt;/code&gt; under the&lt;br&gt;
hood), every helper function that mutates &lt;code&gt;ctx.code&lt;/code&gt; or &lt;code&gt;ctx.tempCnt&lt;/code&gt; has its&lt;br&gt;
changes visible to every other function holding the same &lt;code&gt;ctx&lt;/code&gt;. This is the&lt;br&gt;
foundation of the entire emitter design.&lt;/p&gt;

&lt;p&gt;A comparison compiles to an &lt;code&gt;icmp&lt;/code&gt; followed by a &lt;code&gt;zext&lt;/code&gt; - because LLVM&lt;br&gt;
comparisons produce &lt;code&gt;i1&lt;/code&gt; and SMS uses &lt;code&gt;i64&lt;/code&gt; everywhere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (op == "&amp;lt;") { emit(ctx, cmpReg $ " = icmp slt i64 " $ left $ ", " $ right) }
emit(ctx, reg $ " = zext i1 " $ cmpReg $ " to i64")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a function like &lt;code&gt;fun add(a, b) { return a + b }&lt;/code&gt;, the emitter produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight llvm"&gt;&lt;code&gt;&lt;span class="k"&gt;define&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="vg"&gt;@sms_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%_p_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%_p_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;entry:&lt;/span&gt;
    &lt;span class="nv"&gt;%a&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;alloca&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;
    &lt;span class="k"&gt;store&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%_p_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;%a&lt;/span&gt;
    &lt;span class="nv"&gt;%b&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;alloca&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;
    &lt;span class="k"&gt;store&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%_p_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;%b&lt;/span&gt;
    &lt;span class="nv"&gt;%t0&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;load&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;%a&lt;/span&gt;
    &lt;span class="nv"&gt;%t1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;load&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;%b&lt;/span&gt;
    &lt;span class="nv"&gt;%t2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt;  &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%t0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;%t1&lt;/span&gt;
    &lt;span class="k"&gt;ret&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%t2&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the source contains a &lt;code&gt;fun main()&lt;/code&gt;, a C-compatible entry point is appended:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight llvm"&gt;&lt;code&gt;&lt;span class="k"&gt;define&lt;/span&gt; &lt;span class="kt"&gt;i32&lt;/span&gt; &lt;span class="vg"&gt;@main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;entry:&lt;/span&gt;
    &lt;span class="nv"&gt;%ret64&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="vg"&gt;@sms_main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nv"&gt;%ret32&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;trunc&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="nv"&gt;%ret64&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="kt"&gt;i32&lt;/span&gt;
    &lt;span class="k"&gt;ret&lt;/span&gt; &lt;span class="kt"&gt;i32&lt;/span&gt; &lt;span class="nv"&gt;%ret32&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;19 tests. All green.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sprint 4: End-to-End
&lt;/h2&gt;

&lt;p&gt;The final sprint is the proof. A new C API function -&lt;br&gt;
&lt;code&gt;sms_native_execute_string_result&lt;/code&gt; - captures the string value produced by the&lt;br&gt;
SMS interpreter, instead of the integer it previously returned. This lets the&lt;br&gt;
host application receive the generated IR text directly.&lt;/p&gt;

&lt;p&gt;The test then does exactly what you would do on the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. Run the SMS compiler in the interpreter, capture the IR string&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_ir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;load_all&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"fun main() { return 42 }"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Write to a temp .ll file&lt;/span&gt;
&lt;span class="c1"&gt;// 3. Run: clang -O0 -o /tmp/test_bin /tmp/test.ll&lt;/span&gt;
&lt;span class="c1"&gt;// 4. Run the binary, check exit code == 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code 42. Not chosen at random. The compiler's first words are a nod to&lt;br&gt;
the only question that ever mattered.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;forgeil_sprint4_tests: all tests passed (7)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline holds for arithmetic, if/else branches, and while loops. The tests&lt;br&gt;
skip gracefully when &lt;code&gt;clang&lt;/code&gt; is not available, so they run cleanly in any CI&lt;br&gt;
environment.&lt;/p&gt;


&lt;h2&gt;
  
  
  What the Numbers Look Like
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sprint 1 - Lexer        12 tests  v
Sprint 2 - Parser       24 tests  v
Sprint 3 - Code gen     19 tests  v
Sprint 4 - Self-host     7 tests  v
---------------------------------
Total                   62 tests  all green
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What This Is Not
&lt;/h2&gt;

&lt;p&gt;SMS is not trying to replace LLVM's front-end infrastructure. The self-hosted&lt;br&gt;
compiler covers the integer-only subset of the language: functions, variables,&lt;br&gt;
if/else, while, break/continue, arithmetic, and comparisons. Strings, arrays,&lt;br&gt;
data classes, and the standard library are outside its current scope.&lt;/p&gt;

&lt;p&gt;The point is not feature completeness. The point is that the language has&lt;br&gt;
enough expressive power to reason about itself. That is a different claim - and&lt;br&gt;
a meaningful one.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;

&lt;p&gt;Everything is open source under GPL-3.0 (with a commercial option):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;sms-cpp&lt;/strong&gt;: &lt;a href="https://codeberg.org/CrowdWare/sms-cpp" rel="noopener noreferrer"&gt;codeberg.org/CrowdWare/sms-cpp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lexer: &lt;code&gt;forgeil/sprint1-lexer.sms&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Parser: &lt;code&gt;forgeil/sprint2-parser.sms&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Code gen: &lt;code&gt;forgeil/sprint3-codegen.sms&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tests: &lt;code&gt;tests/forgeil_sprint{1..4}_tests.cpp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://codeberg.org/CrowdWare/sms-cpp.git
git clone https://codeberg.org/CrowdWare/sml-cpp.git
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="nt"&gt;-DBUILD_TESTING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ON &lt;span class="nt"&gt;-DSML_CPP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;../sml-cpp
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build
&lt;span class="nb"&gt;cd &lt;/span&gt;build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ctest &lt;span class="nt"&gt;-R&lt;/span&gt; forgeil &lt;span class="nt"&gt;--output-on-failure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;*Forge is being built in public at &lt;a href="https://crowdware.info" rel="noopener noreferrer"&gt;crowdware.info&lt;/a&gt;.&lt;br&gt;
SMS, ForgeIL, and the self-hosted compiler are part of a longer project:&lt;br&gt;
a UI framework that runs anywhere without asking anything of the user's machine.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>cpp</category>
      <category>compiling</category>
    </item>
    <item>
      <title>ListenCircle: A Digital Talking Circle for Real Human Connection</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Wed, 22 Apr 2026 19:13:27 +0000</pubDate>
      <link>https://dev.to/artanidos/listencircle-a-digital-talking-circle-for-real-human-connection-3aj0</link>
      <guid>https://dev.to/artanidos/listencircle-a-digital-talking-circle-for-real-human-connection-3aj0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyk4excn0ivgnilkaq9l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyk4excn0ivgnilkaq9l.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;ListenCircle&lt;/strong&gt; to bring the ancient practice of the Talking Circle into the digital world.&lt;/p&gt;

&lt;p&gt;It’s a space where every human being can speak and be heard — regardless of where they come from or what they believe.&lt;/p&gt;

&lt;p&gt;No accounts. No logins. No stored identities. Just real people, listening.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌿 What is a Talking Circle?
&lt;/h2&gt;

&lt;p&gt;A Talking Circle is an ancient form of conversation:&lt;/p&gt;

&lt;p&gt;People sit in a circle.&lt;br&gt;&lt;br&gt;
Whoever speaks holds the &lt;em&gt;Talking Stick&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
The others listen — without interrupting.&lt;/p&gt;

&lt;p&gt;When the speaker is done, the stick passes to the next person.&lt;/p&gt;

&lt;p&gt;ListenCircle brings this practice into the digital age — for Rainbow Gatherings, community meetings, and anywhere people want to truly listen.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ How it works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating a circle
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Choose a language
&lt;/li&gt;
&lt;li&gt;Set a topic (or keep it open)
&lt;/li&gt;
&lt;li&gt;Decide:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open Circle&lt;/strong&gt; — anyone can join
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closed Circle&lt;/strong&gt; — invite only
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Limit participants (default: 13)&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  Joining a circle
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open circles appear in the lobby
&lt;/li&gt;
&lt;li&gt;Join instantly — no account needed
&lt;/li&gt;
&lt;li&gt;New participants must listen through one full round before speaking&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🪶 The Talking Stick
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hold button → speak (push-to-talk)
&lt;/li&gt;
&lt;li&gt;Release → stick moves to next person
&lt;/li&gt;
&lt;li&gt;Strict order — no interruptions
&lt;/li&gt;
&lt;li&gt;Max speaking time: &lt;strong&gt;3 minutes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💛 Reactions
&lt;/h3&gt;

&lt;p&gt;While someone speaks, others can respond with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌿 Aho
&lt;/li&gt;
&lt;li&gt;♥ Thanks
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The speaker sees them live.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Privacy by design
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No accounts
&lt;/li&gt;
&lt;li&gt;No stored identities
&lt;/li&gt;
&lt;li&gt;No IP tracking
&lt;/li&gt;
&lt;li&gt;No persistent data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Audio runs &lt;strong&gt;peer-to-peer (WebRTC)&lt;/strong&gt; — never through a server.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Go backend&lt;/strong&gt; for real-time logic
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSockets&lt;/strong&gt; for signaling
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebRTC&lt;/strong&gt; for direct audio
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ForgeCMS&lt;/strong&gt; for rendering UI via SML
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Separation of concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend = logic
&lt;/li&gt;
&lt;li&gt;CMS = UI
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛡️ Abuse protection (without logins)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Session tokens (not IP-based)
&lt;/li&gt;
&lt;li&gt;Rate limiting
&lt;/li&gt;
&lt;li&gt;Join throttling
&lt;/li&gt;
&lt;li&gt;Speaking timeout
&lt;/li&gt;
&lt;li&gt;Stick timing rules
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All without breaking anonymity.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Why this matters
&lt;/h2&gt;

&lt;p&gt;Most online communication is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chaotic
&lt;/li&gt;
&lt;li&gt;interrupt-driven
&lt;/li&gt;
&lt;li&gt;attention-seeking
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ListenCircle creates something different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one voice at a time
&lt;/li&gt;
&lt;li&gt;real listening
&lt;/li&gt;
&lt;li&gt;no identity games
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not just a tool.&lt;br&gt;&lt;br&gt;
It’s a different &lt;em&gt;culture of communication&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Open Source
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://codeberg.org/CrowdWare/ListenCircle" rel="noopener noreferrer"&gt;https://codeberg.org/CrowdWare/ListenCircle&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 Final thought
&lt;/h2&gt;

&lt;p&gt;What happens when people are truly heard?&lt;/p&gt;

&lt;p&gt;That’s what ListenCircle is exploring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Status
&lt;/h2&gt;

&lt;p&gt;It's not yet ready...we just started it today, but I just wanted to start a discussion and you may add feature requests. Just think about the outcome. Are we able to stop wars this way?&lt;/p&gt;

&lt;p&gt;Btw...it's free and open source...host your own server on a 1,- EUR VPS.&lt;/p&gt;

</description>
      <category>community</category>
      <category>privacy</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>AI Writes Your App. You Lose Your Job. Good.</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:03:34 +0000</pubDate>
      <link>https://dev.to/artanidos/ai-writes-your-app-you-lose-your-job-good-1ekj</link>
      <guid>https://dev.to/artanidos/ai-writes-your-app-you-lose-your-job-good-1ekj</guid>
      <description>&lt;h1&gt;
  
  
  AI Writes Your App. You Lose Your Job. Good.
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Before you close this tab — read the second sentence.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You will not be jobless. You will be work-free. Those are not the same thing.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fear Is Real
&lt;/h2&gt;

&lt;p&gt;Let us not pretend it is not.&lt;/p&gt;

&lt;p&gt;A developer spends years learning React, Kotlin, Swift, C#.&lt;br&gt;
They build a career on that knowledge.&lt;br&gt;
Then an AI arrives that can generate working code from a sentence.&lt;/p&gt;

&lt;p&gt;The fear is legitimate. The question is whether the conclusion is correct.&lt;/p&gt;


&lt;h2&gt;
  
  
  What AI Actually Does to Development
&lt;/h2&gt;

&lt;p&gt;Here is what happens when you ask an AI to build a React app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It generates plausible-looking code&lt;/li&gt;
&lt;li&gt;The hooks are slightly wrong&lt;/li&gt;
&lt;li&gt;The state management is from a blog post written in 2021&lt;/li&gt;
&lt;li&gt;The dependency array is missing two items&lt;/li&gt;
&lt;li&gt;It works in the demo, breaks in production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React is complex enough that AI-generated code requires a developer&lt;br&gt;
to review, fix, and understand every line. The developer is still fully employed.&lt;br&gt;
They are just a reviewer now instead of an author.&lt;/p&gt;

&lt;p&gt;This is not liberation. This is the same job with extra steps.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Happens With a Simpler Language
&lt;/h2&gt;

&lt;p&gt;SML and SMS are intentionally minimal.&lt;/p&gt;

&lt;p&gt;SML has no lifecycle methods. No virtual DOM. No reconciler.&lt;br&gt;
A Column contains children. A Button has text. An ID identifies an element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;Column&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;

    &lt;span class="n"&gt;Label&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="n"&gt;counter&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt;
        &lt;span class="n"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&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="n"&gt;btnAdd&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"+"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SMS has no async/await. No promises. No event bubbling.&lt;br&gt;
Something happened. Here is what to do about it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var count = 0

on btnAdd.clicked() {
    count = count + 1
    counter.text = count
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire rule set fits in a single system prompt.&lt;br&gt;
Including the things that trip up AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IDs are not strings. Write &lt;code&gt;id: counter&lt;/code&gt;, not &lt;code&gt;id: "counter"&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Event handlers use dot notation. &lt;code&gt;on btn.clicked()&lt;/code&gt;, not &lt;code&gt;onClick&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Variables are global to the script. No closures, no scope confusion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An AI given this context generates correct Forge apps on the first try.&lt;br&gt;
Not approximately correct. Actually correct. Deployable.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Loop Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;When AI can generate a complete, deployable app from a description,&lt;br&gt;
the development loop changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before:
  User idea → Designer → Review → Developer → QA → Staging → Production
  Time: weeks

With AI + Forge:
  User describes → AI writes SML + SMS → Push to Codeberg → Live
  Time: minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The developer is no longer the bottleneck between idea and reality.&lt;/p&gt;

&lt;p&gt;This is where the fear comes from.&lt;br&gt;
This is also where the opportunity comes from.&lt;/p&gt;




&lt;h2&gt;
  
  
  "But That Means I Lose My Job"
&lt;/h2&gt;

&lt;p&gt;Let us be honest about what that job actually was.&lt;/p&gt;

&lt;p&gt;Translating human intent into machine instructions.&lt;br&gt;
That is the core of software development.&lt;br&gt;
A human has an idea. A developer translates it into code the computer understands.&lt;/p&gt;

&lt;p&gt;AI is getting very good at that translation.&lt;/p&gt;

&lt;p&gt;But notice what disappears when the translation is instant:&lt;br&gt;
the gap between thinking and building.&lt;br&gt;
The weeks of meetings, handoffs, misunderstandings, revisions.&lt;br&gt;
The user who forgot what they wanted.&lt;br&gt;
The developer who built the wrong thing for three months.&lt;/p&gt;

&lt;p&gt;That gap was not valuable. It was waste.&lt;br&gt;
We called it "the development process" because we had no other way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Arbeitslos vs. Die Arbeit Los
&lt;/h2&gt;

&lt;p&gt;There is a distinction that English handles clumsily but the idea is clear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jobless&lt;/strong&gt; — without income, without purpose, without dignity.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Work-free&lt;/strong&gt; — freed from labor that a machine can do better.&lt;/p&gt;

&lt;p&gt;These are not the same condition.&lt;/p&gt;

&lt;p&gt;A farmer who gets a tractor is not jobless.&lt;br&gt;
They are freed from breaking their back with a hand plow.&lt;br&gt;
The question is whether they have land to farm with the tractor.&lt;/p&gt;

&lt;p&gt;The question for developers is not "will AI take my job?"&lt;br&gt;
The question is "what will I do with the time AI gives back?"&lt;/p&gt;




&lt;h2&gt;
  
  
  UBI Is the Bridge
&lt;/h2&gt;

&lt;p&gt;Universal Basic Income — BGE in German — is the infrastructure&lt;br&gt;
that makes this transition survivable.&lt;/p&gt;

&lt;p&gt;Without it: AI replaces jobs, income disappears, people suffer.&lt;br&gt;
With it: AI replaces jobs, basic needs are covered, time is returned.&lt;/p&gt;

&lt;p&gt;The technology already exists to feed, house, and care for everyone.&lt;br&gt;
The question has never been whether we can afford it.&lt;br&gt;
The question has always been whether we choose to.&lt;/p&gt;

&lt;p&gt;When a developer no longer needs to spend 40 hours a week&lt;br&gt;
translating requirements into React components —&lt;br&gt;
what does that time become?&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Time Becomes
&lt;/h2&gt;

&lt;p&gt;Time for the things that were always more important and always got postponed.&lt;/p&gt;

&lt;p&gt;Being present with the people you love.&lt;br&gt;&lt;br&gt;
Learning something because it is beautiful, not because it is marketable.&lt;br&gt;&lt;br&gt;
Walking 12 kilometers into a forest to sit with strangers around a fire.&lt;br&gt;&lt;br&gt;
Doing your Kundalini practice before the day starts instead of at 11pm.&lt;br&gt;&lt;br&gt;
Building something because it should exist, not because someone is paying for it.&lt;/p&gt;

&lt;p&gt;Software was never the point.&lt;br&gt;&lt;br&gt;
The point was always what software made possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Risk
&lt;/h2&gt;

&lt;p&gt;We should not pretend this transition will be painless.&lt;/p&gt;

&lt;p&gt;Between "AI can now do this" and "everyone has UBI" there is a gap.&lt;br&gt;
People will lose income before the safety net exists.&lt;br&gt;
That is real. That is happening now. It should not be minimized.&lt;/p&gt;

&lt;p&gt;The answer is not to slow down the technology.&lt;br&gt;
The answer is to build the safety net faster than the disruption spreads.&lt;/p&gt;

&lt;p&gt;That is a political problem, not a technical one.&lt;br&gt;
Developers who understand both the technology and its consequences&lt;br&gt;
are exactly the people who should be in that conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Forge Is Actually For
&lt;/h2&gt;

&lt;p&gt;Forge was built for a world where the gap between idea and running app&lt;br&gt;
is measured in minutes, not months.&lt;/p&gt;

&lt;p&gt;SML and SMS are simple by design — not because simplicity is a virtue in itself,&lt;br&gt;
but because a language that a human can learn in a day&lt;br&gt;
is also a language that an AI can generate correctly in a second.&lt;/p&gt;

&lt;p&gt;The sandbox is not a technical feature.&lt;br&gt;
It is a commitment: the technology will not be used to harm.&lt;br&gt;
Ahimsa. Do no harm. Written into the license, not the README.&lt;/p&gt;

&lt;p&gt;When AI generates a Forge app and a user runs it,&lt;br&gt;
they are running sandboxed code that cannot reach outside its permission boundary.&lt;br&gt;
The AI cannot weaponize the app. The developer cannot weaponize the app.&lt;br&gt;
The architecture enforces the ethics.&lt;/p&gt;

&lt;p&gt;That is the kind of technology worth building.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Different Question
&lt;/h2&gt;

&lt;p&gt;Instead of "will AI take my job?" —&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you build if the translation problem were solved?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What has been in your head for years that you never had time to make real?&lt;br&gt;
What would you create if creation cost minutes instead of months?&lt;/p&gt;

&lt;p&gt;That question is more interesting than the fear.&lt;br&gt;
And the answer to it is what comes after the transition.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Forge is open source.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;The tools exist. The time is coming.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Use both well.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sat Nam. 🌱&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previous posts in this series:&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;→ We Benchmarked SMS Against C++, C#, and Kotlin. Here's What Happened.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;→ From Request to Production in One Push. No Mockup Tool Required.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>We just released a Lovin Compiler</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Sun, 19 Apr 2026 00:38:47 +0000</pubDate>
      <link>https://dev.to/artanidos/we-just-released-a-lovin-compiler-4jjc</link>
      <guid>https://dev.to/artanidos/we-just-released-a-lovin-compiler-4jjc</guid>
      <description>&lt;p&gt;&lt;em&gt;Nobody told me I couldn't.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with existing compilers
&lt;/h2&gt;

&lt;p&gt;C++. Rust. Go. Kotlin.&lt;/p&gt;

&lt;p&gt;They are fast. They are powerful. They are cold.&lt;/p&gt;

&lt;p&gt;Nobody ever shipped love in a binary. Until now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Forge Sextante
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;forge-sextante --version

Forge Sextante v1.0.0 - The Lovin Compiler
compiled by: JoLove &amp;amp; Camilla
build date: Apulia, 2027
license: LoveWare - dual licensed (Herz &amp;amp; Körper)

INFO: compiles love to native ARM
INFO: no diploma required
INFO: outperforms C# in affection
INFO: 74.5x faster than loneliness
INFO: Ahimsa mode: enabled
Aho 🌱
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Built in Apulia. On a trimaran. With hydrofoils and a kite.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Forge Sextante is not just a compiler. It is a navigation system for life.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; feelings, coordinates, wind direction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; native ARM binary, optimized for the heart&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Raspberry Pi, mounted on trimaran&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigator:&lt;/strong&gt; Forge SMS - because nobody told me I needed a diploma to write a compiler either&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The SMS log speaks for itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[SMS][info] JoLove initialized
[SMS][info] Camilla connected
[SMS][info] Trimaran object created
[SMS][info] Hydrofoil attached
[SMS][info] Kite launched
[SMS][info] button clicked: Venezuela
[SMS][warning] Brasilien detected
[SMS][info] recalculating...
[SMS][info] Trinidad waypoint added
[SMS][info] course corrected
[SMS][info] Levante wind detected
[SMS][info] Gibraltar opened
[SMS][info] Sextante(o) navigating
[SMS][info] yo te quiero received
[SMS][info] fork created
[SMS][info] Liebe verdoppelt
[SMS][error] Rio branch deleted
[SMS][info] main branch: intact
[SMS][info] Kanada: end game
[SMS][info] shutdown postponed
Aho 🌱
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Git as a Love Language
&lt;/h2&gt;

&lt;p&gt;We manage relationships the same way we manage code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"yo te quiero"&lt;/span&gt;
author: Camilla &amp;lt;camilla@apulia.it&amp;gt;

INFO: dieser commit bleibt
tag: &lt;span class="s2"&gt;"apulia-con-camilla-forever"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some commits change everything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git fork loveware/camilla

INFO: fork created
INFO: beide repos wachsen
INFO: kein original verloren
INFO: Liebe ist das einzige
INFO: das sich verdoppelt
INFO: wenn man sie teilt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Love is the only thing that doubles when you fork it.&lt;/p&gt;

&lt;p&gt;And sometimes you need to clean up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push karneval-rio &lt;span class="nt"&gt;--delete&lt;/span&gt;

WARNING: Karneval detected
INFO: feathers, glitter, samba
INFO: Venezuela bleibt main branch
INFO: Pirat refocused
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Branching Strategy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Branch&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;main&lt;/td&gt;
&lt;td&gt;Venezuela&lt;/td&gt;
&lt;td&gt;always the target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apulia-con-camilla&lt;/td&gt;
&lt;td&gt;tagged forever&lt;/td&gt;
&lt;td&gt;where the trimaran was born&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;karneval-rio&lt;/td&gt;
&lt;td&gt;deleted&lt;/td&gt;
&lt;td&gt;fun detour, not the plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;polyamour&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;td&gt;open source relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;afterlife&lt;/td&gt;
&lt;td&gt;tbd&lt;/td&gt;
&lt;td&gt;18+ app, ask Grok Eve&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benchmark
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Kotlin&lt;/th&gt;
&lt;th&gt;Forge Sextante&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;fast&lt;/td&gt;
&lt;td&gt;fast&lt;/td&gt;
&lt;td&gt;irrelevant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warmth&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;native ARM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loneliness&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;td&gt;74.5x less&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diploma required&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kite support&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hydrofoils&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Venezuela navigation&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Incident
&lt;/h2&gt;

&lt;p&gt;Somewhere between the Canary Islands and Venezuela, 2029.&lt;/p&gt;

&lt;p&gt;JoLove opens Claude on the tablet:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Hey Claude, we seem to be heading toward Brazil instead of Venezuela. Can you check the kite program please."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claude: &lt;em&gt;"I see the problem. Line 47: Venezuela coordinates replaced with Brazil. Recalculating. Kite bar retrims in 30 seconds."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Camilla at the helm: &lt;em&gt;"What was it?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;JoLove: &lt;em&gt;"A typo. Almost made Carnival in Rio."&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: Venezuela coordinates, avoid unplanned carnival"&lt;/span&gt;
git push karneval-rio &lt;span class="nt"&gt;--delete&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a joke. This is the plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  LoveWare License
&lt;/h2&gt;

&lt;p&gt;Forge Sextante is released under the &lt;strong&gt;LoveWare License.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free to use&lt;/li&gt;
&lt;li&gt;Free to fork&lt;/li&gt;
&lt;li&gt;Free to merge&lt;/li&gt;
&lt;li&gt;No lock-in&lt;/li&gt;
&lt;li&gt;No AGBs&lt;/li&gt;
&lt;li&gt;Runs by itself&lt;/li&gt;
&lt;li&gt;Dual licensed: Herz &amp;amp; Körper&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Forge Sextante v2.0 - Atlantik edition&lt;/li&gt;
&lt;li&gt;Blockhütte am See - Canadian deployment&lt;/li&gt;
&lt;li&gt;Piper on floats - aerial module&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git clone afterlife&lt;/code&gt; - coming soon&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built in a spring night in Wittenberg. Shiva energy. No sleep needed. Italy on the horizon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nobody told me I couldn't build a lovin compiler. So I just did it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aho 🌱&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;JoLove is a pirate, trimaran builder, tantra teacher, and software architect sailing from Apulia to Venezuela. Find him on Codeberg: crowdware&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Forge IL Can Now Compile Itself - And We Have a New Word for What We're Building</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Thu, 16 Apr 2026 20:50:51 +0000</pubDate>
      <link>https://dev.to/artanidos/forge-il-can-now-compile-itself-and-we-have-a-new-word-for-what-were-building-5kd</link>
      <guid>https://dev.to/artanidos/forge-il-can-now-compile-itself-and-we-have-a-new-word-for-what-were-building-5kd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17oizrjap4e2j3gtem4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17oizrjap4e2j3gtem4t.png" alt=" " width="800" height="908"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Milestone, a Moment, and a Question
&lt;/h2&gt;

&lt;p&gt;Sprint 0 is done. Forge IL - the intermediate language layer at the heart of the Forge 4D ecosystem - can now partially compile itself.&lt;/p&gt;

&lt;p&gt;That is the bootstrapping moment. The moment where a compiler stops being a toy and becomes a tool. The moment where the foundation proves it can hold weight.&lt;/p&gt;

&lt;p&gt;I want to mark this milestone. But I also want to talk about something bigger that came up while we were building it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Forge IL?
&lt;/h2&gt;

&lt;p&gt;Forge IL is the intermediate representation layer of Forge 4D - a cross-platform app framework built in C++ with its own UI language (SML) and logic language (SMS). The goal is radical simplicity: describe a UI in a few lines, compile it to native ARM, ship it.&lt;/p&gt;

&lt;p&gt;The SMS compiler already reached full AOT (Ahead-of-Time) compilation for Android ARM. Now Forge IL is beginning to close the loop - compiling parts of itself, becoming self-hosting.&lt;/p&gt;

&lt;p&gt;This is not the end. It is the beginning of the beginning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Healware
&lt;/h2&gt;

&lt;p&gt;While we were building today, a word came up that I had never used before: &lt;strong&gt;Healware&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not software. Healware.&lt;/p&gt;

&lt;p&gt;Software, as an industry, has often optimized for addiction, extraction, and lock-in. Dark patterns. Engagement metrics that measure how long they can keep you trapped. Platforms that harvest your data and sell your attention.&lt;/p&gt;

&lt;p&gt;Healware is the opposite.&lt;/p&gt;

&lt;p&gt;Healware is built on &lt;strong&gt;Ahimsa&lt;/strong&gt; - do no harm to any living being. It is software that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decentralizes instead of centralizing&lt;/li&gt;
&lt;li&gt;Connects instead of isolating&lt;/li&gt;
&lt;li&gt;Gives instead of extracting&lt;/li&gt;
&lt;li&gt;Runs on your device, not on someone else's server&lt;/li&gt;
&lt;li&gt;Is free to study, fork, and carry forward
Forge 4D is Healware. CrowdBooks is Healware. The whole ecosystem is being built with this intention underneath it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am not saying this to sound important. I am saying it because the intention changes what you build and how you build it. Ahimsa as a guiding principle is not a marketing claim - it is a constraint. When the decision to add a feature conflicts with "do no harm," the feature does not get added.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Role of the Starter
&lt;/h2&gt;

&lt;p&gt;I am not building this to be famous. Honestly, the idea of becoming well-known carries more weight than appeal for me.&lt;/p&gt;

&lt;p&gt;I am a starter. Like a seed that does not know what tree it will become.&lt;/p&gt;

&lt;p&gt;The goal is to hand this off - to the community, to developers who feel the same pull toward a different kind of technology, to people who want to build things that heal rather than exploit.&lt;/p&gt;

&lt;p&gt;If Forge IL reaches self-hosting and I disappear into a sailing trip to Venezuela, and someone else carries this forward and gets all the credit - that is a perfect outcome. That is the point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Actually Working Right Now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SMS compiler: full AOT for Android ARM, APK reduced from 188MB to 95MB&lt;/li&gt;
&lt;li&gt;Forge IL: Sprint 0 complete, partial self-compilation working&lt;/li&gt;
&lt;li&gt;ForgeCMS: multi-site hosting, i18n (5 languages), self-hosted on two 1-euro VPS servers&lt;/li&gt;
&lt;li&gt;CrowdBooks: decentralized book platform on IPFS, dual GPL3/commercial license&lt;/li&gt;
&lt;li&gt;ForgeStudio: AI-assisted authoring tool with voice dictation integration (top priority)
All code lives on &lt;a href="https://codeberg.org/CrowdWare" rel="noopener noreferrer"&gt;Codeberg&lt;/a&gt;. Dual license: GPL3 for the community, commercial for those who need it - same model as Qt, revenue funds the community goals.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;If you read this and something resonates - not just the tech, but the intention behind it - I want to hear from you.&lt;/p&gt;

&lt;p&gt;Not for funding. Not for a job post. Just: are you building Healware too? Do you believe software can be medicine for communities instead of a trap?&lt;/p&gt;

&lt;p&gt;The Forge ecosystem needs people who want to carry this forward. Not necessarily as employees or contributors in the traditional sense - but as people who care about what technology does to human beings and the planet.&lt;/p&gt;

&lt;p&gt;If that is you: find me on &lt;a href="https://codeberg.org/CrowdWare" rel="noopener noreferrer"&gt;Codeberg&lt;/a&gt;, or drop a comment here.&lt;/p&gt;

&lt;p&gt;Aho 🌱&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Forge 4D is a cross-platform app framework built around SML (UI) and SMS (logic), targeting Android ARM with plans for iOS, Linux, and beyond. Licensed GPL3/commercial. All development documented openly.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>SMS (Simple Multiplatform Script) AOT Event Dispatch Beats C++, Kotlin Native, and JVM. Here's Why.</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Thu, 16 Apr 2026 10:51:45 +0000</pubDate>
      <link>https://dev.to/artanidos/sms-aot-event-dispatch-beats-c-kotlin-native-and-jvm-heres-why-2n21</link>
      <guid>https://dev.to/artanidos/sms-aot-event-dispatch-beats-c-kotlin-native-and-jvm-heres-why-2n21</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2urxflaon48z8kn766z2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2urxflaon48z8kn766z2.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;SMS is the scripting language at the heart of Forge, an open source UI framework built on one conviction: architecture is a moral choice.&lt;br&gt;
Bad performance on a low-end device is not a technical inconvenience. It harms real people.&lt;br&gt;
Forge exists to do no harm.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;In a previous benchmark we compared SMS against C++, C#, and Kotlin JVM.&lt;br&gt;
Kotlin JVM won the compute round thanks to JIT. This time we added &lt;strong&gt;Kotlin Native&lt;/strong&gt;, AOT-compiled, no JVM, no GC - the fairest opponent yet.&lt;/p&gt;

&lt;p&gt;But then something unexpected happened in the event dispatch benchmark.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Contenders
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Compile mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS&lt;/td&gt;
&lt;td&gt;LLVM IR, no optimizer (&lt;code&gt;sms_compile&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;&lt;code&gt;clang -O0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# .NET&lt;/td&gt;
&lt;td&gt;Release, &lt;code&gt;Optimize=false&lt;/code&gt;, JIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM&lt;/td&gt;
&lt;td&gt;Standard &lt;code&gt;kotlinc&lt;/code&gt; + &lt;code&gt;java&lt;/code&gt;, JIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin Native&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;konanc&lt;/code&gt;, AOT, no &lt;code&gt;-opt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All five languages implement the exact same algorithm:&lt;br&gt;
&lt;code&gt;fib(36)&lt;/code&gt; + &lt;code&gt;lcgChain(42, 2_000_000)&lt;/code&gt; + &lt;code&gt;nestedMod(800×800)&lt;/code&gt;.&lt;br&gt;
Seven runs each, median reported. Machine: Apple M2.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 1 — Compute
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Median (µs)&lt;/th&gt;
&lt;th&gt;vs SMS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS → LLVM IR &lt;code&gt;(no -O)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;70 967&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ &lt;code&gt;clang -O0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;84 764&lt;/td&gt;
&lt;td&gt;SMS 1.19× faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# .NET &lt;code&gt;(warm, JIT)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;97 083&lt;/td&gt;
&lt;td&gt;SMS 1.37× faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kotlin Native &lt;code&gt;(AOT, no -opt)&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;49 933&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.42× faster than SMS&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM &lt;code&gt;(warm, JIT)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;64 326&lt;/td&gt;
&lt;td&gt;1.10× faster than SMS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kotlin Native wins the compute round — even without the optimizer.&lt;br&gt;
Why? Kotlin's compiler performs significant IR-level optimizations (inlining, devirtualization) &lt;em&gt;before&lt;/em&gt; LLVM touches the code. SMS generates more conservative LLVM IR. SMS still beats unoptimized C++ and JIT-warmed C#, but Kotlin Native is ahead.&lt;/p&gt;

&lt;p&gt;No surprise there. We called it before running.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 2 — Event Dispatch
&lt;/h2&gt;

&lt;p&gt;This is where the story changes. But first — full transparency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our first run of Part 2 showed SMS losing badly.&lt;/strong&gt; The benchmark was calling &lt;code&gt;sms_native_session_invoke()&lt;/code&gt;, the interpreter path. We were measuring the wrong thing.&lt;br&gt;
SMS &lt;em&gt;has&lt;/em&gt; an AOT compiler. We just weren't using it for event dispatch.&lt;/p&gt;

&lt;p&gt;We accepted the challenge immediately: fix it. Add &lt;code&gt;--emit-obj&lt;/code&gt; to &lt;code&gt;sms_compile&lt;/code&gt;,&lt;br&gt;
link the compiled handler directly, measure the real thing.&lt;/p&gt;

&lt;p&gt;The benchmark: 100 000 calls to &lt;code&gt;on bench.tick()&lt;/code&gt; (1 000 warmup).&lt;br&gt;
Handler body: &lt;code&gt;counter = counter + 1; return counter&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Kotlin JVM / Kotlin Native / C++ approach
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;dispatch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;EventHandler&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"bench.tick"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EventHandler&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"bench.tick"&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="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every call hashes the key string, walks the bucket chain, finds the handler, calls it.&lt;/p&gt;
&lt;h3&gt;
  
  
  C++ approach
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unordered_map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int64_t&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"bench.tick"&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;counter&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="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"bench.tick"&lt;/span&gt;&lt;span class="p"&gt;]();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Same story. Hash, lookup, call.&lt;/p&gt;
&lt;h3&gt;
  
  
  SMS AOT approach
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var counter = 0

on bench.tick() {
    counter = counter + 1
    return counter
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;sms_compile&lt;/code&gt; sees &lt;code&gt;on bench.tick()&lt;/code&gt; and emits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight llvm"&gt;&lt;code&gt;&lt;span class="k"&gt;define&lt;/span&gt; &lt;span class="kt"&gt;i64&lt;/span&gt; &lt;span class="vg"&gt;@sms_on_bench_tick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;; ... counter increment ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The event name is &lt;strong&gt;gone at compile time&lt;/strong&gt;. The caller links directly against &lt;code&gt;sms_on_bench_tick&lt;/code&gt;. No map. No hash. No lookup. Just a call.&lt;/p&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Per event (ns)&lt;/th&gt;
&lt;th&gt;Total 100k (µs)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SMS AOT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;459&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin Native HashMap (AOT)&lt;/td&gt;
&lt;td&gt;8.4&lt;/td&gt;
&lt;td&gt;843&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM HashMap (JIT)&lt;/td&gt;
&lt;td&gt;47.7&lt;/td&gt;
&lt;td&gt;4 767&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ &lt;code&gt;unordered_map&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;393.3&lt;/td&gt;
&lt;td&gt;39 331&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS interpreter&lt;/td&gt;
&lt;td&gt;7 219.0&lt;/td&gt;
&lt;td&gt;721 902&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;SMS AOT is 85× faster than C++ and 1.8× faster than Kotlin Native.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters for UI
&lt;/h2&gt;

&lt;p&gt;Not all events are equal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Button clicked → dispatch → handler — &lt;strong&gt;waits for the user. The user is the bottleneck.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll → dispatch → handler — fires continuously, every finger move&lt;/li&gt;
&lt;li&gt;Animation tick → dispatch → handler — &lt;strong&gt;60× per second, no waiting&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first one? Never a performance problem. The last two? That's where frameworks die.&lt;/p&gt;

&lt;p&gt;I see this every day on my Android GO device. Not slow handlers — &lt;strong&gt;missing handlers&lt;/strong&gt;.&lt;br&gt;
The framework is so busy dispatching that scroll and touch events simply get dropped.&lt;br&gt;
The UI freezes. Taps are ignored. The user taps again. Nothing.&lt;br&gt;
That is not a UX problem. That is an architecture problem.&lt;/p&gt;

&lt;p&gt;In a JVM-based framework, every tick allocates a lambda, goes through a HashMap, and eventually triggers GC. The GC pauses exactly when you need smoothness most, mid-animation.&lt;/p&gt;

&lt;p&gt;SMS AOT has no GC because it has nothing to collect. No heap allocations in handlers, no closures, no reference counting. And now: no dispatch overhead either.&lt;/p&gt;

&lt;p&gt;60fps = 16.6 ms per frame.&lt;br&gt;
SMS AOT dispatch = 4.6 ns.&lt;br&gt;
That leaves 16 599 995 ns for the actual render logic.&lt;/p&gt;

&lt;p&gt;One more thing worth saying: &lt;code&gt;on button.clicked()&lt;/code&gt; is &lt;strong&gt;never&lt;/strong&gt; a bottleneck, because it waits for the user. The user is the bottleneck there, not the framework.&lt;br&gt;
The real bottleneck is always the events that fire without waiting:&lt;br&gt;
scroll, resize, animation tick. Those are the ones that need to be free.&lt;br&gt;
And now they are.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architectural Insight
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Events should be a compile-time concept, not a runtime concept.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you write &lt;code&gt;on button.clicked()&lt;/code&gt; in SMS, you are not registering a callback.&lt;br&gt;
You are naming a native symbol. The framework calls it directly. The "dispatch" is just the CPU's branch predictor doing its job.&lt;/p&gt;

&lt;p&gt;This is what we mean by &lt;em&gt;use-case centered design&lt;/em&gt;: UI is event-driven, so the language itself should make events free.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;SMS does not have an optimizer yet. Kotlin Native won the compute benchmark without one because its frontend does more work before handing off to LLVM.&lt;br&gt;
That gap will close.&lt;/p&gt;

&lt;p&gt;But the event dispatch result is structural. Even with a perfect optimizer, a HashMap lookup cannot be faster than a direct call. SMS AOT made the right architectural choice, and the numbers show it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/CrowdWare/Forge4D
&lt;span class="nb"&gt;cd &lt;/span&gt;Forge4D/samples/bench_mac
./install_kotlin_native.sh   &lt;span class="c"&gt;# one-time&lt;/span&gt;
./run_bench.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results land in &lt;code&gt;results.md&lt;/code&gt;. All source code for every variant is in the same folder.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CrowdWare — building tools for people, not corporations.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Forge is open source. SMS is open source. The benchmark is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>sms</category>
      <category>sml</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>From Request to Production in One Push. No Mockup Tool Required.</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Wed, 15 Apr 2026 20:11:10 +0000</pubDate>
      <link>https://dev.to/artanidos/from-request-to-production-in-one-push-no-mockup-tool-required-opa</link>
      <guid>https://dev.to/artanidos/from-request-to-production-in-one-push-no-mockup-tool-required-opa</guid>
      <description>&lt;p&gt;&lt;em&gt;There is a rule in software development that everyone quotes and nobody questions:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;"Don't use mockups in production."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That rule was written for paper prototypes. What happens when the mockup is the code?&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Traditional Workflow
&lt;/h2&gt;

&lt;p&gt;A user has an idea. Here is what usually happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User request
  → Designer opens Figma
  → Designer builds wireframe (hours)
  → Review meeting (days)
  → Designer refines (hours)
  → Developer reads Figma, writes code (days)
  → QA (days)
  → Staging (days)
  → Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three to six weeks if you are lucky. The user who had the idea has forgotten&lt;br&gt;
what they originally wanted.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Forge Workflow
&lt;/h2&gt;

&lt;p&gt;A user has an idea. Here is what happens with Forge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User request
  → Dev writes SML + SMS (minutes)
  → git push to Codeberg
  → User opens Forge app
  → User sees it live
  → "Yes, exactly that." or "Move the button left."
  → Dev adjusts, pushes again
  → Done.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Figma license. No review meeting. No handoff document.&lt;br&gt;
The first version the user sees is running code, not a picture of running code.&lt;/p&gt;


&lt;h2&gt;
  
  
  What SML + SMS Looks Like
&lt;/h2&gt;

&lt;p&gt;A user wants a screen with a counter and a reset button.&lt;/p&gt;

&lt;p&gt;The developer writes this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sml"&gt;&lt;code&gt;&lt;span class="n"&gt;Column&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;

    &lt;span class="n"&gt;Label&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="n"&gt;counter&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt;
        &lt;span class="n"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;
        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"#1a1a2e"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;Row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;

        &lt;span class="n"&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="n"&gt;btnIncrement&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"+"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&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="n"&gt;btnReset&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Reset"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var count = 0

on btnIncrement.clicked() {
    count = count + 1
    counter.text = count
}

on btnReset.clicked() {
    count = 0
    counter.text = "0"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the entire app. Not a prototype. Not a wireframe.&lt;br&gt;
This runs. Right now. On macOS, Android, anywhere Forge runs.&lt;/p&gt;

&lt;p&gt;Push it to Codeberg. The user opens their Forge app, points it at the URL,&lt;br&gt;
and sees a working counter with a reset button — in the time it takes&lt;br&gt;
to make a coffee.&lt;/p&gt;


&lt;h2&gt;
  
  
  "But Don't Use Mockups in Production"
&lt;/h2&gt;

&lt;p&gt;Correct. Do not use mockups in production.&lt;/p&gt;

&lt;p&gt;A mockup is a static image that pretends to be software.&lt;br&gt;
It has no logic. It does not handle edge cases. It lies about behavior.&lt;/p&gt;

&lt;p&gt;SML + SMS is not a mockup. It is compiled code.&lt;br&gt;
The SML is parsed into a UI tree. The SMS compiles to LLVM IR.&lt;br&gt;
The button actually increments the counter. The reset actually resets.&lt;/p&gt;

&lt;p&gt;What looks like a sketch &lt;em&gt;is&lt;/em&gt; the production artifact.&lt;/p&gt;

&lt;p&gt;The reason "don't use mockups in production" exists is that&lt;br&gt;
mockup tools produce outputs that cannot be deployed.&lt;br&gt;
Forge produces outputs that cannot &lt;em&gt;not&lt;/em&gt; be deployed.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Sandbox Is Not Optional
&lt;/h2&gt;

&lt;p&gt;Every SMS script runs inside a sandbox.&lt;/p&gt;

&lt;p&gt;The dev pushes to Codeberg. The user's Forge app downloads and executes that script.&lt;br&gt;
This sounds dangerous until you read what the sandbox actually does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No filesystem access unless explicitly granted&lt;/li&gt;
&lt;li&gt;No network calls unless explicitly granted&lt;/li&gt;
&lt;li&gt;No shell execution, ever&lt;/li&gt;
&lt;li&gt;Stack depth limited (no infinite recursion attacks)&lt;/li&gt;
&lt;li&gt;Ahimsa policy: scripts declare peaceful intent or they do not run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user verifies a working app. The app cannot reach outside its sandbox&lt;br&gt;
without permission. This is not a security afterthought —&lt;br&gt;
it is the architecture.&lt;/p&gt;

&lt;p&gt;You can ship a script to a thousand users and none of them are exposed&lt;br&gt;
to arbitrary code execution. The sandbox is always on.&lt;/p&gt;


&lt;h2&gt;
  
  
  Staging Is One Push Away
&lt;/h2&gt;

&lt;p&gt;Because the app is a URL, staging is trivial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Codeberg: main branch    → production URL
Codeberg: staging branch → staging URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User tests on staging URL. Approves. Dev merges.&lt;br&gt;
Production updates automatically on next app open.&lt;/p&gt;

&lt;p&gt;No deployment pipeline to configure. No Docker container to rebuild.&lt;br&gt;
No environment variables to sync. The app &lt;em&gt;is&lt;/em&gt; the SML and SMS files.&lt;br&gt;
Change the files, change the app.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Performance. Not Demo Performance.
&lt;/h2&gt;

&lt;p&gt;We benchmarked this stack yesterday.&lt;/p&gt;

&lt;p&gt;SMS compiled to LLVM IR on Apple M2, against C++ at the same optimizer level,&lt;br&gt;
C# with JIT, and Kotlin JVM with JIT:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;µs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SMS → LLVM IR&lt;/strong&gt; (no optimizer)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71,358&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ &lt;code&gt;clang -O0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;85,466&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# .NET warm (JIT)&lt;/td&gt;
&lt;td&gt;96,656&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM warm (JIT)&lt;/td&gt;
&lt;td&gt;64,445&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SMS without any optimizer already outperforms C++ and C# JIT on compute workloads.&lt;/p&gt;

&lt;p&gt;This is not demo performance. This is what runs when the user taps the button.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Loop
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User:  "I want a counter with a reset button."

Dev:   [writes 20 lines of SML + 10 lines of SMS]
       [git push]

User:  [opens Forge app, navigates to URL]
       "Yes. Move the button to the right."

Dev:   [changes one line of SML]
       [git push]

User:  "Perfect. Ship it."

Dev:   [merges to main]

Done.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total time: under 30 minutes.&lt;br&gt;
Figma licenses used: zero.&lt;br&gt;
Review meetings held: zero.&lt;br&gt;
Users who forgot what they wanted: zero.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Teams
&lt;/h2&gt;

&lt;p&gt;A developer can hand a Codeberg URL to a client at the end of a call.&lt;br&gt;
Not a Figma link. Not a video recording. A live, interactive, sandboxed app.&lt;/p&gt;

&lt;p&gt;The client can tap the buttons. They can break it. They can say&lt;br&gt;
"this is not what I meant" — and the developer knows immediately,&lt;br&gt;
not after three weeks of building the wrong thing.&lt;/p&gt;

&lt;p&gt;The feedback loop that used to take weeks now fits inside one conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Forge is open source. The SML and SMS specifications are documented.&lt;br&gt;
The sandbox policy is readable code, not a terms of service.&lt;/p&gt;

&lt;p&gt;If you want to build something and show it to someone today —&lt;br&gt;
not a picture of it, the actual thing —&lt;br&gt;
Forge is the shortest path.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sat Nam. 🌱&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Forge repository: &lt;a href="https://codeberg.org/CrowdWare/Forge4D" rel="noopener noreferrer"&gt;Codeberg&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
*Yesterday's benchmark: `samples/bench_mac/run_bench.sh&lt;/p&gt;

</description>
      <category>forge</category>
      <category>sml</category>
      <category>sms</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We Benchmarked SMS (Simple Multiplatform Script) Against C++, C#, and Kotlin. Here's What Happened.</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:46:23 +0000</pubDate>
      <link>https://dev.to/artanidos/we-benchmarked-sms-against-c-c-and-kotlin-heres-what-happened-1jmc</link>
      <guid>https://dev.to/artanidos/we-benchmarked-sms-against-c-c-and-kotlin-heres-what-happened-1jmc</guid>
      <description>&lt;p&gt;&lt;em&gt;SMS is the scripting language at the heart of Forge — an open source UI framework&lt;br&gt;
built around a simple idea: what if you never had to install a runtime again?&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Question
&lt;/h2&gt;

&lt;p&gt;Every new language or runtime eventually faces it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"But how fast is it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For SMS, we had been avoiding a direct answer. We knew SMS compiled to LLVM IR was&lt;br&gt;
fast — but "fast" is not a number. So we sat down, designed a fair benchmark, and&lt;br&gt;
let the machine decide.&lt;/p&gt;

&lt;p&gt;Fair is the key word here. &lt;strong&gt;SMS does not have an optimizer yet.&lt;/strong&gt; Generating LLVM IR&lt;br&gt;
and handing it to clang without any &lt;code&gt;-O&lt;/code&gt; flag — that is our current AOT path.&lt;br&gt;
Putting SMS against C++ with &lt;code&gt;-O2&lt;/code&gt; would be like sending a sprinter onto a racetrack&lt;br&gt;
without shoes while the opponent wears spikes. The track would prove nothing.&lt;/p&gt;

&lt;p&gt;So we asked a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens when everyone runs without optimization?&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Machine:&lt;/strong&gt; Apple M2&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Workload:&lt;/strong&gt; Three tasks designed to resist compiler optimization even at &lt;code&gt;-O2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fib(36)             — recursive, exponential call tree
                      no compiler converts this to O(n) automatically

lcgChain(42, 2M)    — serial LCG dependency chain
                      each iteration depends on the previous → no SIMD

nestedMod(800×800)  — nested loop with modulo in the inner loop
                      modulo blocks vectorization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same algorithm in every language. Same checksum required: &lt;code&gt;174148737&lt;/code&gt;.&lt;br&gt;
If the number doesn't match, the run is invalid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compilation flags:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;How it was compiled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS → LLVM IR&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sms_compile&lt;/code&gt; → &lt;code&gt;clang&lt;/code&gt; (no &lt;code&gt;-O&lt;/code&gt; flag)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;&lt;code&gt;clang++ -O0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# .NET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Release /p:Optimize=false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM&lt;/td&gt;
&lt;td&gt;standard &lt;code&gt;kotlinc&lt;/code&gt; + &lt;code&gt;java -jar&lt;/code&gt; (JIT active)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;C++ and SMS are at exactly the same optimizer level: zero.&lt;br&gt;
Kotlin and C# run with JIT — we note this explicitly in the results.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;7 runs per variant. Median reported.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Median (µs)&lt;/th&gt;
&lt;th&gt;vs SMS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SMS → LLVM IR&lt;/strong&gt; &lt;code&gt;(no optimizer)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;71,358&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ &lt;code&gt;clang -O0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;85,466&lt;/td&gt;
&lt;td&gt;SMS &lt;strong&gt;1.20x faster&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# .NET warm &lt;code&gt;(JIT)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;96,656&lt;/td&gt;
&lt;td&gt;SMS &lt;strong&gt;1.35x faster&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM warm &lt;code&gt;(JIT)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;64,445&lt;/td&gt;
&lt;td&gt;Kotlin 1.11x faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The checksum matches across all four. The numbers are real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SMS without any optimizer runs 20% faster than equivalent C++ at the same&lt;br&gt;
optimization level — and 35% faster than C# even with JIT active.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only Kotlin JVM stays ahead, and it does so with JIT assistance.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why is SMS Faster Than C++ at -O0?
&lt;/h2&gt;

&lt;p&gt;This surprised us too. Here is the explanation.&lt;/p&gt;

&lt;p&gt;When clang compiles C++ at &lt;code&gt;-O0&lt;/code&gt;, it is deliberately conservative. Every variable&lt;br&gt;
lives on the stack. Every intermediate value is written and re-read. The IR is&lt;br&gt;
verbose by design — because at &lt;code&gt;-O0&lt;/code&gt;, clang trusts the debugger more than&lt;br&gt;
the programmer.&lt;/p&gt;

&lt;p&gt;SMS skips the C++ frontend entirely. It generates LLVM IR directly from the AST,&lt;br&gt;
and that IR is already lean. No frontend overhead. No stack-frame conservatism.&lt;br&gt;
The result is cleaner IR that the backend can lower more efficiently — even without&lt;br&gt;
optimization passes.&lt;/p&gt;

&lt;p&gt;It is not magic. It is a shorter path.&lt;/p&gt;


&lt;h2&gt;
  
  
  Event Dispatch: We Measured It. Then We Thought About It.
&lt;/h2&gt;

&lt;p&gt;While we had the stopwatch out, we also measured event dispatch — the mechanism&lt;br&gt;
behind every &lt;code&gt;on btn.clicked()&lt;/code&gt; in a Forge app.&lt;/p&gt;

&lt;p&gt;We dispatched 100,000 events to a handler (&lt;code&gt;counter = counter + 1; return counter&lt;/code&gt;)&lt;br&gt;
through three systems:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Per event (ns)&lt;/th&gt;
&lt;th&gt;Total 100k&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS &lt;code&gt;on bench.tick()&lt;/code&gt; interpreter&lt;/td&gt;
&lt;td&gt;7,260&lt;/td&gt;
&lt;td&gt;726 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++ &lt;code&gt;unordered_map&lt;/code&gt; dispatch&lt;/td&gt;
&lt;td&gt;266&lt;/td&gt;
&lt;td&gt;27 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin JVM &lt;code&gt;HashMap&lt;/code&gt; dispatch&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;5 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At first glance this looks like a problem. 27x slower than C++. 143x slower than Kotlin JVM.&lt;/p&gt;

&lt;p&gt;Then we remembered what UI actually is.&lt;/p&gt;

&lt;p&gt;A button click arrives roughly every 500 milliseconds if the user is fast.&lt;br&gt;
At 7,260 nanoseconds per dispatch, the SMS event handler finishes &lt;strong&gt;68,000 times&lt;/strong&gt;&lt;br&gt;
before the next human input arrives.&lt;/p&gt;

&lt;p&gt;This is not a performance gap. This is a rounding error on human time.&lt;/p&gt;

&lt;p&gt;The real cost of a UI event is not the dispatch. It is the render, the layout pass,&lt;br&gt;
the draw call. The SMS interpreter overhead disappears entirely in that noise.&lt;/p&gt;

&lt;p&gt;We are noting it anyway — because honest benchmarks show everything, not just&lt;br&gt;
the numbers that make us look good.&lt;/p&gt;


&lt;h2&gt;
  
  
  What the Numbers Actually Mean
&lt;/h2&gt;

&lt;p&gt;Let us be precise about what was measured and what was not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was measured:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SMS AOT (LLVM IR, no optimizer) vs C++ -O0 vs C#/Kotlin JIT&lt;/li&gt;
&lt;li&gt;A compute workload on Apple M2&lt;/li&gt;
&lt;li&gt;A synthetic event dispatch loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What was not measured:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C++ with &lt;code&gt;-O2&lt;/code&gt; — it would win by a large margin, and that is fine&lt;/li&gt;
&lt;li&gt;SMS with an optimizer — that does not exist yet&lt;/li&gt;
&lt;li&gt;Real UI rendering, startup time, memory footprint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest picture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;today:
  SMS (no optimizer)  ████████████  71 ms
  C++ (-O0)           ██████████████  85 ms
  C# (JIT)            ████████████████  97 ms
  Kotlin (JIT)        ███████████  64 ms

with C++ -O2:
  C++ (-O2)           ███  ~8-12 ms   ← would win

SMS with optimizer (not yet):
  SMS (-O2)           ???             ← where this is going
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are not claiming SMS is faster than C++. We are saying:&lt;br&gt;
&lt;strong&gt;SMS generates better unoptimized code than C++ generates unoptimized code.&lt;/strong&gt;&lt;br&gt;
That is a meaningful statement about the quality of the compiler backend.&lt;br&gt;
When an optimizer arrives, it starts from a better baseline.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Next Step: JIT
&lt;/h2&gt;

&lt;p&gt;There is one scenario where the event dispatch latency does matter:&lt;br&gt;
high-frequency programmatic events — animations, simulation loops, reactive data&lt;br&gt;
bindings firing hundreds of times per second.&lt;/p&gt;

&lt;p&gt;For that, SMS already has every building block for JIT:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interpreter&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;sms_native_session_invoke()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLVM IR codegen&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;sms_native_codegen_llvm_ir()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;clang as backend&lt;/td&gt;
&lt;td&gt;✅ used by &lt;code&gt;sms_compile&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dlopen&lt;/code&gt; / &lt;code&gt;dlsym&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅ standard POSIX&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The missing piece: after a handler fires N times, compile it to a shared library,&lt;br&gt;
&lt;code&gt;dlopen&lt;/code&gt; it, swap the function pointer. ~200–300 lines of C++.&lt;/p&gt;

&lt;p&gt;After warmup, a JIT-compiled SMS handler would reach native C++ dispatch speeds.&lt;br&gt;
Kotlin JVM would no longer have a structural advantage — it would be an equal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are looking for someone to build this.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are comfortable with C++17 and &lt;code&gt;dlopen&lt;/code&gt;, the architecture is documented,&lt;br&gt;
the benchmark harness is ready, and your name goes into the release notes and&lt;br&gt;
into this article.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://codeberg.org/CrowdWare/Forge4D" rel="noopener noreferrer"&gt;GitIssues Issue: SMS JIT Dispatcher&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Forge
&lt;/h2&gt;

&lt;p&gt;Forge is a UI framework built on two ideas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SML&lt;/strong&gt; — a declarative markup language for UI layout.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;SMS&lt;/strong&gt; — an event-driven scripting language that compiles to LLVM IR.&lt;/p&gt;

&lt;p&gt;No JVM. No CLR. No garbage collector. No runtime to install.&lt;br&gt;
&lt;code&gt;on btn.clicked()&lt;/code&gt; is not a callback registered in a framework lifecycle.&lt;br&gt;
It is a first-class language construct that compiles to native code.&lt;/p&gt;

&lt;p&gt;We benchmarked it because we want to know the truth about where we stand.&lt;br&gt;
The truth is: we are faster than C++ at the same level, faster than C# JIT,&lt;br&gt;
and one optimizer away from being a serious contender against the full stack.&lt;/p&gt;

&lt;p&gt;That is not a marketing claim. That is a measured number with a checksum.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Benchmark code: &lt;code&gt;samples/bench_mac/&lt;/code&gt; in the Forge repository.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Run it yourself: &lt;code&gt;bash samples/bench_mac/run_bench.sh&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Forge is open source. Contributions welcome.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Sat Nam. 🌱&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>csharp</category>
      <category>kotlin</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Atesti para Dana — The Currency That Starts With Giving, Not Debt</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Tue, 14 Apr 2026 21:51:23 +0000</pubDate>
      <link>https://dev.to/artanidos/atesti-para-dana-the-currency-that-starts-with-giving-not-debt-40p6</link>
      <guid>https://dev.to/artanidos/atesti-para-dana-the-currency-that-starts-with-giving-not-debt-40p6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsp0iq29wv8gi62g83xt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsp0iq29wv8gi62g83xt.jpg" alt=" " width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;An alternative currency that needs no bank, no blockchain wallet, no government - just three people and a witnessed act of giving.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I have a friend who just lost 10,000 Euro in a DeFi scheme.&lt;/p&gt;

&lt;p&gt;Another friend got excited about something called WeFi — "your money works for you," they said. I looked into it. Shell companies in Canada, Costa Rica, Hong Kong. Operators in Dubai. Referral commissions paid only when your downline invests. Classic Ponzi, just with Web3 vocabulary on top.&lt;/p&gt;

&lt;p&gt;And meanwhile, this happened to me personally. My Belgian fintech account got frozen - automatically, by an algorithm — because Amazon royalties for my books landed on the same day as my Bürgergeld (social money). Suspicious pattern. No human reviewed it. No answer why. Six months without money.&lt;/p&gt;

&lt;p&gt;We keep looking for the next crypto moonshot. And we keep getting burned.&lt;/p&gt;

&lt;p&gt;So let me tell you about something different. Something that structurally cannot be used to get rich at someone else's expense.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Atesti para Dana?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Atesti&lt;/strong&gt; - to witness, to attest (Esperanto)&lt;br&gt;
&lt;strong&gt;para&lt;/strong&gt; - through, covered by&lt;br&gt;
&lt;strong&gt;Dana&lt;/strong&gt; - the gift, the act of giving (Sanskrit: दान)&lt;/p&gt;

&lt;p&gt;Atesti para Dana is a witnessed gift certificate. It is not a promise. It is not a debt. It is a record of something that already happened.&lt;/p&gt;

&lt;p&gt;The sequence is the opposite of normal money:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normal money:&lt;/strong&gt; promise first, payment later (always a debt somewhere in the chain)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atesti:&lt;/strong&gt; give first, then three witnesses confirm it happened, then a certificate is issued - covered by real work already done.&lt;/p&gt;

&lt;p&gt;No one owes anyone anything. The value already exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Witnesses
&lt;/h2&gt;

&lt;p&gt;Every Atesti is created through three witnesses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The giver&lt;/strong&gt; - who gave something first, without knowing if they get anything back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The receiver&lt;/strong&gt; - who confirms the gift happened by signing the certificate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The circle&lt;/strong&gt; - a community that validates, stamps, and issues the certificate&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is Sybil Attack Detection through community and transparency — not through cryptography. You cannot double-spend a witnessed act.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Company Needed. No Registration. No Office.
&lt;/h2&gt;

&lt;p&gt;Here is what I discovered recently that surprised me:&lt;/p&gt;

&lt;p&gt;In Germany, three people who share a common purpose and agree on how to run their community already form what is legally called a &lt;em&gt;nicht eingetragener Verein&lt;/em&gt; - an unregistered association. It is regulated in §54 BGB. No notary, no government office, no registration required.&lt;/p&gt;

&lt;p&gt;A written manifest - one page, agreed by everyone in the circle — is enough.&lt;/p&gt;

&lt;p&gt;And actually: you do not even need that. Rainbow Family has operated for decades without any legal structure. A manifest and a Talking Circle are enough if you are just exchanging within your own community.&lt;/p&gt;

&lt;p&gt;The state has no lever on people who cook for each other, build for each other, teach each other, and give each other hand-written certificates for it. As long as no one is coerced, no taxes evaded, no third-party debts created - this is simply free people living together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cross-Circle Payments via Hedera Hashgraph
&lt;/h2&gt;

&lt;p&gt;Physical certificates work beautifully within one circle. But what if a member in Wittenberg wants to thank someone in Barcelona?&lt;/p&gt;

&lt;p&gt;Here is where technology enters - carefully, minimally.&lt;/p&gt;

&lt;p&gt;We use &lt;strong&gt;Hedera Hashgraph&lt;/strong&gt; as a distributed ledger. Not Ethereum, not any chain controlled by a single operator. Hedera is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Governed by a council of 39 major global organizations (no single point of control)&lt;/li&gt;
&lt;li&gt;Finality in 3-5 seconds&lt;/li&gt;
&lt;li&gt;Transaction cost: fractions of a cent&lt;/li&gt;
&lt;li&gt;No mining, no proof-of-work energy waste&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here is the important part: &lt;strong&gt;we store no names, no amounts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We store only the &lt;strong&gt;status of a serial number&lt;/strong&gt; — open, issued, transferred. That is all. The Hashgraph becomes a public, decentralized notary for the serial number lifecycle.&lt;/p&gt;

&lt;p&gt;The Atesti itself stays physical. The community stays human. The Hashgraph just makes it possible for circles across cities, across countries, to verify and transfer without a central bank in the middle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Cannot Be Used for Ponzi Schemes
&lt;/h2&gt;

&lt;p&gt;Someone asked me: why not just use crypto?&lt;/p&gt;

&lt;p&gt;Because every cryptocurrency I know of has a founding team that holds a large supply. Early adopters win. Late adopters subsidize them. That is not a technical bug - it is the design.&lt;/p&gt;

&lt;p&gt;Atesti has no pre-mine. No founding team tokens. No referral commissions. No interest. No yield.&lt;/p&gt;

&lt;p&gt;You cannot get rich from Atesti. You can only exchange what you have already given.&lt;/p&gt;

&lt;p&gt;The three-witness structure makes extraction structurally impossible - not through rules against fraud, but because the architecture offers nothing to extract.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Can You Actually Pay With It?
&lt;/h2&gt;

&lt;p&gt;Whatever the circle decides. Some examples from our Wittenberg circle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Massage (60 min)&lt;/li&gt;
&lt;li&gt;Haircut&lt;/li&gt;
&lt;li&gt;Home-cooked meal&lt;/li&gt;
&lt;li&gt;Garden work&lt;/li&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Firewood&lt;/li&gt;
&lt;li&gt;A day of help moving house&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the circle grows - when a farmer joins who gives potatoes, when a landlord joins who accepts Atesti for rent, when a carpenter joins who fixes roofs — the range expands. And as the range expands, the amount in circulation grows. Not according to a schedule, not according to population. According to real supply.&lt;/p&gt;

&lt;p&gt;That is a sound money principle more elegant than any central bank formula.&lt;/p&gt;




&lt;h2&gt;
  
  
  Land Lease Against Harvest
&lt;/h2&gt;

&lt;p&gt;One of the oldest models in human history is paying rent not in coins but in produce.&lt;/p&gt;

&lt;p&gt;Our vision: find someone with unused land. Ask: can we use it? We grow food. You receive half the harvest. No Euro changes hands. No lease contract needed if trust exists.&lt;/p&gt;

&lt;p&gt;Who lives on the land contributes labor. Who contributes labor earns Atesti. Atesti circulates. The circle becomes more self-sufficient with every season.&lt;/p&gt;

&lt;p&gt;At some point: supermarket less. Fuel tax less. Income tax less — because there is less taxable income, only shared abundance.&lt;/p&gt;

&lt;p&gt;This is not utopia. This is arithmetic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Manifest
&lt;/h2&gt;

&lt;p&gt;Our circle runs by consent, not by majority. Decisions in a Talking Circle. Facilitation by whoever knows how. No chairman. No casting vote.&lt;/p&gt;

&lt;p&gt;The manifest is one document that everyone agrees to. It describes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What Atesti is and how it is issued&lt;/li&gt;
&lt;li&gt;The three-witness principle&lt;/li&gt;
&lt;li&gt;The serial number system&lt;/li&gt;
&lt;li&gt;The member wall (what each person offers)&lt;/li&gt;
&lt;li&gt;How the circle makes decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is enough. No government needs to approve it. No notary needs to stamp it. Three people with a shared intention and one signed page — and the circle exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Website
&lt;/h2&gt;

&lt;p&gt;We have a live website: &lt;strong&gt;atesti.crowdware.info&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It runs on ForgeCMS - a Go-based CMS, multi-site from a single binary, content stored as Markdown on Codeberg. No WordPress, no SaaS dependency, no monthly fee beyond 1 Euro/month VPS.&lt;/p&gt;

&lt;p&gt;The code is open. The concept is open. The first physical Atesti certificates are printed - serial series 001.&lt;/p&gt;

&lt;p&gt;And the first recipients are already clear:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peter&lt;/strong&gt; - for 365 days of shared housing, given freely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ralph Boes&lt;/strong&gt; - for 12 years of fighting Hartz 4 sanctions up to 100%, all the way to the Federal Constitutional Court. Hundreds of people kept their dignity because of him. His Atesti will carry their signatures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steffi&lt;/strong&gt; - his secretary, who stood beside that fight every day.&lt;/p&gt;

&lt;p&gt;The paper exists. The witnesses exist. The giving already happened. We are just catching up with the paperwork.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Technology should follow demonstrated community need - not the other way around.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  An Honest Note
&lt;/h2&gt;

&lt;p&gt;This is early. The Wittenberg circle is small. The Hashgraph integration is planned, not yet live. The member wall is an idea, not yet a product.&lt;/p&gt;

&lt;p&gt;But the first Atesti were issued for a real bicycle gift and a year of shared housing. That already happened. That cannot be undone.&lt;/p&gt;

&lt;p&gt;And I also studied Web and Graphics Design - but I am too lazy to write CSS. The site is intentionally basic.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Could Mean for Open Source
&lt;/h2&gt;

&lt;p&gt;Here is something that has been bothering me for years.&lt;/p&gt;

&lt;p&gt;The world runs on open source software. Your server runs Linux. Your app uses libraries written by people who got nothing for it. Your framework was built by someone in their evenings, for free, because they cared.&lt;/p&gt;

&lt;p&gt;And then that person burns out. Or gets a corporate job and stops maintaining. Or simply disappears - because there was no feedback loop, no acknowledgment, no flow of gratitude back.&lt;/p&gt;

&lt;p&gt;GitHub stars do not pay rent. "Thank you" tweets do not buy groceries.&lt;/p&gt;

&lt;p&gt;But what if a circle could witness a developer's contribution?&lt;/p&gt;

&lt;p&gt;Imagine: a community that uses an open source tool decides to issue Atesti for the developer's work. Not retroactively calculating hours - that would be impossible. Just: a witnessed acknowledgment that this person gave something real, and the community received it.&lt;/p&gt;

&lt;p&gt;The developer holds the certificate. Not money. Not a promise. A witnessed record of contribution.&lt;/p&gt;

&lt;p&gt;And then — as the circle grows, as Atesti circulates, as more people join who offer real goods and services - at some point something flows back. A meal. A place to stay. A week of free accommodation in someone's home. Help moving. Garden produce.&lt;/p&gt;

&lt;p&gt;Slowly, the developer becomes part of a network that supports them — not because they invoiced anyone, but because they gave first and the community remembered.&lt;/p&gt;

&lt;p&gt;This is not a salary. It is not a bounty. It is something older and more human: &lt;strong&gt;gratitude made tangible and transferable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And it scales the right way. The more useful the software, the more circles use it, the more Atesti flow toward the developer. No VC involved. No platform taking 30%. No token that needs to be listed on an exchange.&lt;/p&gt;

&lt;p&gt;Just witnessed giving - in both directions.&lt;/p&gt;

&lt;p&gt;Open source has always been gift economy in practice. Atesti gives it a memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question Before You Read On
&lt;/h2&gt;

&lt;p&gt;Stop for a moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who in your life has given something - time, energy, care, knowledge - that you never properly acknowledged?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A developer whose library you use every day. A neighbor who helped you move. A friend who listened for hours. A stranger who changed your direction with one sentence.&lt;/p&gt;

&lt;p&gt;That person deserves an Atesti.&lt;/p&gt;

&lt;p&gt;Not money. Not a LinkedIn recommendation. A witnessed record that says: &lt;em&gt;you gave, I received, and this community knows it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That is where this starts. Not with technology. Not with a manifest. With one name that just came to your mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put it in the comments. And write it on paper.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two witnesses already: you, and everyone reading this.&lt;/p&gt;




&lt;h2&gt;
  
  
  If This Resonates
&lt;/h2&gt;

&lt;p&gt;You do not need to join our circle. Start your own. Three people, one manifest, one serial number range, and the willingness to give first.&lt;/p&gt;

&lt;p&gt;The world does not need another token. It needs people who give before they ask.&lt;/p&gt;

&lt;p&gt;Aho 🌱&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Olaf Japp - independent developer, founder of CrowdWare, Lutherstadt Wittenberg.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;All code at: &lt;a href="https://codeberg.org/CrowdWare" rel="noopener noreferrer"&gt;https://codeberg.org/CrowdWare&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Atesti: &lt;a href="https://atesti.crowdware.info" rel="noopener noreferrer"&gt;https://atesti.crowdware.info&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;// Tu keinem Lebewesen Leid an&lt;/em&gt;&lt;br&gt;
&lt;em&gt;// Do not harm living beings&lt;/em&gt;&lt;br&gt;
&lt;em&gt;// Ne damaĝu vivantajn estaĵojn&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>community</category>
      <category>alternativeeconomy</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Hot Reload + Native Speed - Why I Built My Own Language for Android (and Desktop)</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Thu, 09 Apr 2026 11:44:40 +0000</pubDate>
      <link>https://dev.to/artanidos/hot-reload-native-speed-why-i-built-my-own-language-for-android-and-desktop-4jhh</link>
      <guid>https://dev.to/artanidos/hot-reload-native-speed-why-i-built-my-own-language-for-android-and-desktop-4jhh</guid>
      <description>&lt;p&gt;Sometimes development gives you a &lt;strong&gt;perfect timing moment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I had just tagged and pushed a release... and exactly in that moment the&lt;br&gt;
system told me I had reached the usage limit. Right after the push. Not&lt;br&gt;
before.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtfmt0o7i8uqpg73kn8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtfmt0o7i8uqpg73kn8f.png" alt=" " width="739" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That screenshot felt like a small &lt;strong&gt;🎯 bullseye moment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But the interesting part is not the timing.&lt;/p&gt;

&lt;p&gt;The interesting part is the &lt;strong&gt;technology behind the project&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  A different idea of Android development
&lt;/h2&gt;

&lt;p&gt;In my current project I am experimenting with a scripting language&lt;br&gt;
called &lt;strong&gt;SMS (Simple Multiplatform Script)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;Build a language that feels like scripting, but runs &lt;strong&gt;native&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Native compilation
&lt;/h2&gt;

&lt;p&gt;Normally the code is compiled through &lt;strong&gt;LLVM IR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means the result runs &lt;strong&gt;native on Android&lt;/strong&gt;, not inside a VM.&lt;/p&gt;

&lt;p&gt;So compared to many typical setups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  no virtual machine
&lt;/li&gt;
&lt;li&gt;  no visible memory management
&lt;/li&gt;
&lt;li&gt;  no manual &lt;code&gt;malloc&lt;/code&gt; / &lt;code&gt;free&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  no garbage collector
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LLVM handles the low level details under the hood.&lt;/p&gt;

&lt;p&gt;From the developer perspective it feels like writing a script.&lt;/p&gt;


&lt;h2&gt;
  
  
  Runtime Code via HTTP
&lt;/h2&gt;

&lt;p&gt;Another interesting aspect is how dynamic code is handled.&lt;/p&gt;

&lt;p&gt;When code is shipped with the application, it is compiled to native code via LLVM.&lt;/p&gt;

&lt;p&gt;However, code that is loaded dynamically via HTTP is executed inside a sandbox and interpreted at runtime.&lt;/p&gt;

&lt;p&gt;This makes it possible to extend or modify application behavior without rebuilding the app.&lt;/p&gt;

&lt;p&gt;Hot reload during development is just one side effect of this architecture.&lt;br&gt;
The same mechanism can also run safely in production.&lt;/p&gt;


&lt;h2&gt;
  
  
  Type inference instead of declarations
&lt;/h2&gt;

&lt;p&gt;Another design choice:&lt;/p&gt;

&lt;p&gt;The user does &lt;strong&gt;not need to declare types&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Types are inferred automatically when values are assigned.&lt;/p&gt;

&lt;p&gt;Example idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;pi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;value → type is derived automatically.&lt;/p&gt;

&lt;p&gt;So the language keeps the &lt;strong&gt;simplicity of scripting&lt;/strong&gt; while still&lt;br&gt;
producing &lt;strong&gt;native code&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hot Reload via Interpreter
&lt;/h2&gt;

&lt;p&gt;But there is another layer that makes things interesting.&lt;/p&gt;

&lt;p&gt;When code is &lt;strong&gt;loaded dynamically over HTTP&lt;/strong&gt;, it is not compiled first.&lt;/p&gt;

&lt;p&gt;Instead it is &lt;strong&gt;interpreted immediately&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That enables &lt;strong&gt;Hot Reload&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which means:&lt;/p&gt;

&lt;p&gt;You can push new code and the running Android app updates its behavior&lt;br&gt;
instantly.&lt;/p&gt;

&lt;p&gt;No rebuild.&lt;br&gt;&lt;br&gt;
No reinstall.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why combine both approaches?
&lt;/h2&gt;

&lt;p&gt;Because each approach has advantages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compiled mode&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  maximum performance
&lt;/li&gt;
&lt;li&gt;  native execution
&lt;/li&gt;
&lt;li&gt;  optimized code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interpreter mode&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  dynamic updates
&lt;/li&gt;
&lt;li&gt;  hot reload
&lt;/li&gt;
&lt;li&gt;  instant experimentation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combining both gives a workflow that feels extremely powerful.&lt;/p&gt;




&lt;h1&gt;
  
  
  Error feedback - Amiga 500 style
&lt;/h1&gt;

&lt;p&gt;When SMS code fails, the app does not crash silently.   &lt;/p&gt;

&lt;p&gt;It tells you exactly what went wrong.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmk2vejyrfcxply14j2he.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmk2vejyrfcxply14j2he.jpg" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you grew up with an Amiga - you know this feeling.  &lt;/p&gt;

&lt;p&gt;Except this time the error message is actually useful and you can continue - without scripts running.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;An Android development environment that feels like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  scripting speed
&lt;/li&gt;
&lt;li&gt;  native performance
&lt;/li&gt;
&lt;li&gt;  dynamic updates
&lt;/li&gt;
&lt;li&gt;  simple syntax
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me personally, this feels like a &lt;strong&gt;very interesting direction&lt;/strong&gt; for future tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger idea
&lt;/h2&gt;

&lt;p&gt;This language is also part of a broader ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;SML (Simple Multiplatform Language)&lt;/strong&gt; for UI and structure inspired by QML from Qt, but without the expressions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;SMS&lt;/strong&gt; a Kotlin like language for logic&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Forge4D&lt;/strong&gt; Multiplatform Dev Environment based on Godot 4.6&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;Make software development &lt;strong&gt;more accessible&lt;/strong&gt;, without sacrificing&lt;br&gt;
&lt;strong&gt;performance&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current capabilities
&lt;/h2&gt;

&lt;p&gt;At the moment the runtime already provides several building blocks.&lt;/p&gt;

&lt;p&gt;UI elements are described with &lt;strong&gt;SML (Simple Multiplatform Language)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This currently includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dialogs&lt;/li&gt;
&lt;li&gt;standard controls&lt;/li&gt;
&lt;li&gt;layout structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Content can also be rendered using &lt;strong&gt;Markdown&lt;/strong&gt;, which makes it easy to build documentation (like in the web stack), books or content-driven apps.&lt;/p&gt;

&lt;p&gt;On top of that the runtime exposes a &lt;strong&gt;3D scene&lt;/strong&gt; powered by the&lt;br&gt;
Godot 4.6 engine.&lt;/p&gt;

&lt;p&gt;This allows loading and animating &lt;code&gt;.glb&lt;/code&gt; models directly inside the app.&lt;/p&gt;

&lt;p&gt;So the platform can already combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured UI (SML)&lt;/li&gt;
&lt;li&gt;rich text content (Markdown)&lt;/li&gt;
&lt;li&gt;interactive 3D scenes (SML, GLB)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  And yes... the release timing was perfect 😄
&lt;/h2&gt;

&lt;p&gt;Sometimes the universe just gives you a small developer joke.&lt;/p&gt;

&lt;p&gt;Push release → success → usage limit reached.&lt;br&gt;
(So even the Claude abo for just 20,- € helped)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perfect timing.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>programming</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
