<?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>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>
    <item>
      <title>From IONOS Rage-Quit to Self-Hosted Freedom: How a 120 Euro Bill Improved ForgeCMS</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Wed, 08 Apr 2026 22:02:37 +0000</pubDate>
      <link>https://dev.to/artanidos/from-ionos-rage-quit-to-self-hosted-freedom-how-a-120-euro-bill-improved-forgecms-4kb8</link>
      <guid>https://dev.to/artanidos/from-ionos-rage-quit-to-self-hosted-freedom-how-a-120-euro-bill-improved-forgecms-4kb8</guid>
      <description>&lt;h2&gt;
  
  
  The bill that started it all
&lt;/h2&gt;

&lt;p&gt;IONOS sent me a 120 Euro invoice. Two domains at 42 Euro each - way more than I originally paid for them. Plus some positions I was sure I had cancelled months ago. I paid what I could. They locked every server on my account. No warning. No partial restore. Everything gone overnight.&lt;/p&gt;

&lt;p&gt;I cancelled all contracts the next day. They pulled the servers immediately - even though the contracts had months left to run. No grace period. Clean cut.&lt;/p&gt;

&lt;p&gt;The support offered me a backup for 70,- EUR...&lt;br&gt;&lt;br&gt;
FU was my answer ;-)&lt;/p&gt;

&lt;p&gt;When a provider holds your infrastructure hostage over a billing dispute, you don't negotiate. You migrate.&lt;/p&gt;


&lt;h2&gt;
  
  
  Green field
&lt;/h2&gt;

&lt;p&gt;I had been planning to self-host on my own 1 Euro VPS using ForgeCMS anyway. The plan was just... not today. IONOS made the decision for me.&lt;/p&gt;

&lt;p&gt;This forced exactly the feature I had been postponing: &lt;strong&gt;multi-site hosting from a single ForgeCMS binary&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;
&lt;h3&gt;
  
  
  One Go binary, multiple domains
&lt;/h3&gt;

&lt;p&gt;ForgeCMS is a single Go executable. It receives incoming HTTP requests and routes them to the correct site based on the domain. No virtual machines, no containers, no orchestration layer.&lt;/p&gt;

&lt;p&gt;Currently hosting two sites from one process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;crowdware.info&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;atesti.crowdware.info&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caddy sits in front as the TLS reverse proxy. That is the entire stack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser -&amp;gt; Caddy (TLS) -&amp;gt; ForgeCMS binary -&amp;gt; Codeberg (page content)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One of the VPS instances also runs our own Postfix mail server. No Google, no Microsoft, no third-party email provider. Full stack independence for 2 Euro per month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content lives in Git, not in a database
&lt;/h3&gt;

&lt;p&gt;All page content - written in SML and Markdown - lives in a Codeberg repository. ForgeCMS fetches files from the repo at request time and caches them locally. No build step, no static site generation, no database.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;app.sml&lt;/code&gt; config for each domain looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hocon"&gt;&lt;code&gt;&lt;span class="nl"&gt;App&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s2"&gt;"Atesti para Dana"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://atesti.crowdware.info"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;Site&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"codeberg.org"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"CrowdWare"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"sites"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"atesti"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;Languages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;supported&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"de en es ca eo"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;Menu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Home"&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nl"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Impressum"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/impressum"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;Routing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;Route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nl"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.sml"&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;Route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/impressum"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"impressum.sml"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;Route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/404"&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nl"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"404.sml"&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each domain gets its own folder under &lt;code&gt;config/&lt;/code&gt; in the repo. ForgeCMS reads all of them on startup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Staging via a second 1 Euro VPS
&lt;/h3&gt;

&lt;p&gt;The staging workflow is dead simple: a second 1 Euro server running the identical setup. Deploy the new version there, test it, then flip the DNS A record. ForgeCMS and Caddy do not need to know anything about staging - it is purely a DNS switch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Deploy to staging&lt;/span&gt;
./deploy.sh 5.6.7.8

&lt;span class="c"&gt;# Verify via /etc/hosts override locally:&lt;/span&gt;
&lt;span class="c"&gt;# 5.6.7.8  atesti.crowdware.info&lt;/span&gt;

&lt;span class="c"&gt;# Go live: update DNS A record to 5.6.7.8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The deploy script is fully idempotent - run it again and it installs Caddy, uploads the binary, syncs configs, and starts the systemd service. First deploy or tenth deploy, same command.&lt;/p&gt;

&lt;h3&gt;
  
  
  New UI components
&lt;/h3&gt;

&lt;p&gt;While we were in there, we added Bootstrap-based components that had been on the list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Image sliders for visual content sections&lt;/li&gt;
&lt;li&gt;Project cards for listing work and initiatives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are driven from Markdown content in the repo - no hardcoded HTML in the binary.&lt;/p&gt;

&lt;h3&gt;
  
  
  i18n built in
&lt;/h3&gt;

&lt;p&gt;The atesti site serves five languages: German (default), English, Spanish, Catalan, Esperanto. ForgeCMS tries the language-specific file first and falls back to the default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;atesti/
  index.sml        - default (de)
  main.md
  en/
    main.md
  es/
    main.md
  ca/
    main.md
  eo/
    main.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The architecture in one line
&lt;/h2&gt;

&lt;p&gt;All content is Markdown and SML in a Codeberg repo. One Go binary serves everything. Caddy handles TLS. Total infrastructure cost: &lt;strong&gt;2 Euro per month&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What comes next: load balancer for 1 Euro more
&lt;/h2&gt;

&lt;p&gt;The IP-swap staging approach works but a load balancer in front would make zero-downtime deploys cleaner and faster.&lt;/p&gt;

&lt;p&gt;The plan: the second VPS currently runs Postfix for mail tied to the our domains. That Postfix server becomes the load balancer. Total infrastructure cost at that point: 3 Euro per month.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference implementation
&lt;/h2&gt;

&lt;p&gt;The full repository structure - configs, deploy script, content layout, and README - is public:&lt;/p&gt;

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

&lt;p&gt;If you want to run your own ForgeCMS installation, that repo is the reference. The deploy script handles everything from a bare VPS to a running multi-site setup in one command.&lt;/p&gt;

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




&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://crowdware.info" rel="noopener noreferrer"&gt;CrowdWare&lt;/a&gt; open source ecosystem. Built with Go.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. - The two 1 Euro VPS servers running all of this? Also IONOS. Setup fee for the second one was 10 Euro, then 1 Euro per month. The old hosting contract was 11 Euro per month alone. ROI: month one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>cms</category>
      <category>opensource</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>The Benchmark Was a Lie (In Our Favor)</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Wed, 08 Apr 2026 03:43:03 +0000</pubDate>
      <link>https://dev.to/artanidos/the-benchmark-was-a-lie-in-our-favor-2g74</link>
      <guid>https://dev.to/artanidos/the-benchmark-was-a-lie-in-our-favor-2g74</guid>
      <description>&lt;p&gt;&lt;em&gt;Follow-up to: "A Language Was Born Today: SMS Went Native"&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Nobody told me that I cannot build a compiler without a diploma. So I just did it.&lt;/p&gt;

&lt;p&gt;And then Claude asked the right question:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Did you compile everything?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No. We didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Language. Two Modes. Zero Rewrites.
&lt;/h2&gt;

&lt;p&gt;This is the part that still makes me smile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clicked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;same code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;interpreter or compiler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;you decide at deploy time&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That code does not know if it is being compiled or interpreted. You decide at deploy time. No rewrites. No porting. No type declarations. No ceremony.&lt;/p&gt;

&lt;p&gt;The language does not care. That is the point.&lt;/p&gt;

&lt;p&gt;Most languages force a choice early: scripting or compiled. Dynamic or static. Fast or flexible. SMS says: why choose?&lt;/p&gt;

&lt;p&gt;No type declarations. The compiler infers the type from the first assignment. Write like a human thinks. The compiler does the rest.&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;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olaf"&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;age&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;h2&gt;
  
  
  What We Missed
&lt;/h2&gt;

&lt;p&gt;When SMS hit 1.26x faster than C# on March 24, these parts were still running through the interpreter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All event handlers&lt;/li&gt;
&lt;li&gt;All library calls (OS, AI, and others)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Half the compiler wasn't even running. And we were still faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Event Syntax Nobody Asked For (But Everyone Needed)
&lt;/h2&gt;

&lt;p&gt;Here is how you connect UI to behavior in Forge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight qml"&gt;&lt;code&gt;&lt;span class="kt"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;myButton&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;// SML - declare the thing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;myButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clicked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// SMS - react to it&lt;/span&gt;
    &lt;span class="nf"&gt;doSomething&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;The ID from SML becomes the event target in SMS. No binding layer. No ViewModel. No &lt;code&gt;findViewById()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Compare that to the Kotlin way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- XML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Button&lt;/span&gt; &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/myButton"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;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 kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Kotlin&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;myButton&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&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;myButton&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;myButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setOnClickListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two languages, one thought. That is the design.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dispatcher Is Dead
&lt;/h2&gt;

&lt;p&gt;You know this code. You have written this code. You hate this code:&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="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;itemId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;R&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;menu_file&lt;/span&gt;    &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;openFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nc"&gt;R&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;menu_edit&lt;/span&gt;    &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;openEdit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nc"&gt;R&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;menu_help&lt;/span&gt;    &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;openHelp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;// ... 117 more lines of this&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In SMS:&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="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;menuFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clicked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;openFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;menuEdit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clicked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;openEdit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;menuHelp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clicked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;openHelp&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;120 menu items. Zero switch statements. Zero when-blocks. Zero dispatchers.&lt;/p&gt;

&lt;p&gt;Every event lives exactly where it belongs. Open the file in 6 months and you still know what happens. That is not clever engineering. That is FSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FSS: Fucking Stupid Simple to read. Simple to write. Simple to maintain.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We did not aim for KISS. We ended up with FSS.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "Fully AOT" Means Now
&lt;/h2&gt;

&lt;p&gt;After fixing what we missed, the compiler now covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event handlers (&lt;code&gt;on widget.event()&lt;/code&gt;) - compiled&lt;/li&gt;
&lt;li&gt;Library calls (OS, AI, and others) - compiled&lt;/li&gt;
&lt;li&gt;User logic - compiled&lt;/li&gt;
&lt;li&gt;Remote scripts loaded via HTTP - interpreter fallback, by design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is not a weakness. It is architecture.&lt;/p&gt;

&lt;p&gt;Trusted code gets compiled. Untrusted remote content stays sandboxed in the interpreter. One app, both modes, running together.&lt;/p&gt;

&lt;p&gt;Think Lua in game engines. Think browser JIT with sandboxed iframes. The hybrid model is a feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  So What Is the Real Number?
&lt;/h2&gt;

&lt;p&gt;We do not know yet.&lt;/p&gt;

&lt;p&gt;The full AOT benchmark - with events and libraries compiled - is next. What we know: &lt;strong&gt;1.26x faster than C# was the floor, not the ceiling.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first test had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C# GC pressure: never triggered in the test window&lt;/li&gt;
&lt;li&gt;JVM warmup: excluded from measurement&lt;/li&gt;
&lt;li&gt;SMS event handlers: still interpreted&lt;/li&gt;
&lt;li&gt;SMS library calls: still interpreted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real gap is larger. We will publish numbers when we have them. Same protocol as before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 warmups
20 measured runs
median + p95
no cherry-picking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we are not too shy to race against C++. Because we don't have malloc or free. No manual memory management muddying the numbers. Just the language doing its job.&lt;/p&gt;




&lt;h2&gt;
  
  
  Android: It's Already Running
&lt;/h2&gt;

&lt;p&gt;The AOT path targets Android ARM. And it is not "coming soon" - it is running now.&lt;/p&gt;

&lt;p&gt;Same compiler. Same simplicity. Same FSS philosophy. Native on Android.&lt;/p&gt;

&lt;p&gt;Benchmark numbers are next. Stay tuned.&lt;/p&gt;




&lt;h2&gt;
  
  
  While We Were At It
&lt;/h2&gt;

&lt;p&gt;APK size: 188 MB down to 95 MB. We dropped 32-bit support. Half the weight, same power.&lt;/p&gt;

&lt;p&gt;And one more thing.&lt;/p&gt;

&lt;p&gt;There is a comment in the compiler now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Do no harm to any living being.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We used to enforce it as syntax. Naive. The app warned us. We listened.&lt;/p&gt;

&lt;p&gt;Now it is different. We don't force it. We don't warn about it. But if you put it in your code - the compiler knows. And it rewards you. Quietly.&lt;/p&gt;

&lt;p&gt;Good intention reveals itself. We just listen for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  But Why Android? Why Any of This?
&lt;/h2&gt;

&lt;p&gt;I look at my phone and I know.&lt;/p&gt;

&lt;p&gt;They see which games I play. Which books I read. What I type on the keyboard. Every app, every tap, every moment - theoretically visible to someone I never invited.&lt;/p&gt;

&lt;p&gt;And every few months: &lt;em&gt;"Please update."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No thanks. I am not inviting a new devil onto my device. The old one is already scanning everything.&lt;/p&gt;

&lt;p&gt;My phone gets slower with every update. Touch events stop working because something is running in the background. Ads from GetApps. Bloat I cannot remove. A platform I do not control.&lt;/p&gt;

&lt;p&gt;That is the pain. That is why this matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less code. More security. No surveillance tax.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ForgeOS is the answer we are building towards. Mobile first. Free hardware. Open from the ground up. No Google. No App Store gatekeeping. No proprietary runtime watching everything you do.&lt;/p&gt;

&lt;p&gt;The compiler is the foundation. FSS all the way down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Workshop: Wittenberg, LEUCOREA
&lt;/h2&gt;

&lt;p&gt;On Saturday we are running a workshop at LEUCOREA (Collegienstrasse 62, Lutherstadt Wittenberg) on sustainable software development in the age of AI.&lt;/p&gt;

&lt;p&gt;One of the topics on the table: should Forge go mobile first?&lt;/p&gt;

&lt;p&gt;The circle decides. That is how we work.&lt;/p&gt;

&lt;p&gt;If you are a student, a developer, or just someone who is tired of handing your phone to corporations - you are welcome.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Glaube mir kein Wort. Probier es selber aus."&lt;/em&gt;&lt;br&gt;
Don't believe a word I say. Try it yourself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;SMS and SML are part of the Forge ecosystem - a native UI framework built in C++ with its own compiler, its own language, and a stubborn belief that code should read like a sentence.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;42 years after Amiga BASIC. Still going. 🤘&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>android</category>
      <category>opensource</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Lutherstadt Wittenberg is Reforming Again – This Time It's Software</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Mon, 06 Apr 2026 14:17:31 +0000</pubDate>
      <link>https://dev.to/artanidos/lutherstadt-wittenberg-is-reforming-again-this-time-its-software-104h</link>
      <guid>https://dev.to/artanidos/lutherstadt-wittenberg-is-reforming-again-this-time-its-software-104h</guid>
      <description>&lt;p&gt;&lt;em&gt;An invitation to those who think differently.&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;"Most software today is not built for you. It's built for someone who wants something from you."&lt;br&gt;
"We build differently."&lt;/p&gt;




&lt;h2&gt;
  
  
  The Eddy Current Principle
&lt;/h2&gt;

&lt;p&gt;Kayakers know: behind every rock in the river, an eddy forms.&lt;br&gt;
A quiet pocket where the water curves back upstream, calm inside the chaos.&lt;br&gt;
Those who know this don't avoid obstacles, they use them to rest, regroup, and move forward.&lt;br&gt;
We build software the same way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Obstacles We Use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gradle&lt;/strong&gt; pulls in hundreds of libraries, nobody knows what they all do.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;WordPress&lt;/strong&gt; installs updates with Google Analytics quietly bundled in.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Windows&lt;/strong&gt; is always watching.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;App Stores&lt;/strong&gt; take 30%, for nothing.&lt;/p&gt;

&lt;p&gt;These aren't problems to route around.&lt;br&gt;&lt;br&gt;
They're rocks. And behind every rock is an eddy.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;An operating system that can be trusted.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No package manager&lt;/strong&gt; apps delivered via HTTP, running natively, cached locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No corporation&lt;/strong&gt; - fully Open Source, anyone can host it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hidden dependencies&lt;/strong&gt; - AI-assisted code reviews as a trust layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No middleman taking a cut&lt;/strong&gt; - Bitcoin Lightning micropayments flow directly to developers - &lt;strong&gt;Stack:&lt;/strong&gt; SML/SMS for UI, Go for services, Linux kernel as foundation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone who compiles themselves pays nothing.&lt;br&gt;&lt;br&gt;
Those who use the distribution let Satoshis flow, including backwards, to everyone who ever contributed.&lt;br&gt;&lt;br&gt;
Even Linus Torvalds gets a share for the kernel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who We're Looking For
&lt;/h2&gt;

&lt;p&gt;Not finished developers.&lt;br&gt;&lt;br&gt;
People who are curious.&lt;br&gt;&lt;br&gt;
Who prefer understanding over consuming.&lt;br&gt;&lt;br&gt;
Who find an idea more important than a CV.&lt;/p&gt;

&lt;p&gt;All disciplines welcome:&lt;br&gt;&lt;br&gt;
C++, Go, Design, Philosophy, Journalism, Law, whatever you bring.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works – Three Circles
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Local – Wittenberg Saturdays&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Full day, €80 per person. Room costs covered from just 2 participants.&lt;br&gt;&lt;br&gt;
Hands-on, in person, real coffee.&lt;br&gt;
I show you my way of doing things efficiently using AI - and Ahimsa, Gandhi's principle of do no harm, as the ethical foundation beneath every line of code we write.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regional – Day Trip&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Berlin and Leipzig are 1–2 hours by train.&lt;br&gt;&lt;br&gt;
Come for the Saturday, go home the same evening.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global – X Spaces / Online&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Free or small ticket via X.&lt;br&gt;&lt;br&gt;
Africa, Russia, Americas, Asia – wherever you are.&lt;br&gt;&lt;br&gt;
The global circle feeds the local one.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Begins
&lt;/h2&gt;

&lt;p&gt;We don't wait for perfect conditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two people signing up is enough – the circle begins.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the first circle we decide together: Where do we meet? When? What do we build first?&lt;br&gt;&lt;br&gt;
From there the circle grows to seven. The project name gets chosen. First steps get defined.&lt;/p&gt;

&lt;p&gt;The circle can grow to thirteen – larger spaces available in Wittenberg as needed.&lt;br&gt;&lt;br&gt;
Those who stay longer become mentors, running their own circles.&lt;/p&gt;

&lt;p&gt;No big deal – it's about passing on tools.&lt;br&gt;&lt;br&gt;
Once it was Google and Stack Overflow. Today it's AI.&lt;br&gt;&lt;br&gt;
The principle stays the same: &lt;strong&gt;learn to find solutions, not memorize them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Coding in the background is helpful – but no longer mandatory.&lt;br&gt;&lt;br&gt;
The AI handles the code. We handle the thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Wittenberg?
&lt;/h2&gt;

&lt;p&gt;In 1517, Martin Luther changed the frame here.&lt;br&gt;&lt;br&gt;
He didn't fight the system – he changed the frame.&lt;/p&gt;

&lt;p&gt;That's second-order thinking.&lt;br&gt;&lt;br&gt;
That's what we do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recognition
&lt;/h2&gt;

&lt;p&gt;Every contribution gets an &lt;strong&gt;Atesti para Dana&lt;/strong&gt; –&lt;br&gt;&lt;br&gt;
a physical certificate of participation, signed by witnesses.&lt;br&gt;&lt;br&gt;
Not money. Memory. Frameable, collectible, tradeable like art.&lt;/p&gt;

&lt;p&gt;In twenty years, an Atesti saying &lt;em&gt;"I helped build this OS"&lt;/em&gt;&lt;br&gt;&lt;br&gt;
might be worth more than you think.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Interested? Get in touch.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;CrowdWare - Lutherstadt Wittenberg, Germany&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Codeberg: &lt;a href="https://codeberg.org/crowdware" rel="noopener noreferrer"&gt;codeberg.org/crowdware&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>architecture</category>
      <category>opensource</category>
      <category>privacy</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>I Built a Tool That Translates Meaning — Not Words</title>
      <dc:creator>Art</dc:creator>
      <pubDate>Fri, 03 Apr 2026 12:58:39 +0000</pubDate>
      <link>https://dev.to/artanidos/i-built-a-tool-that-translates-meaning-not-words-255j</link>
      <guid>https://dev.to/artanidos/i-built-a-tool-that-translates-meaning-not-words-255j</guid>
      <description>&lt;p&gt;&lt;em&gt;A call for testers, native speakers, and developers who want to help preserve languages before they disappear.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  It Started With an Ice Cream
&lt;/h2&gt;

&lt;p&gt;I walked barefoot through Denmark in short trousers, bought an ice cream cone, and wrote about it.&lt;/p&gt;

&lt;p&gt;Then I ran it through SOUL.&lt;/p&gt;

&lt;p&gt;A few seconds later I had the same story in Spanish, Portuguese, Catalan and Low German. &lt;em&gt;Plattdeutsch.&lt;/em&gt; A language I barely speak anymore. Words I hadn't heard in decades. But when I read them aloud, they came back. The sound unlocked something.&lt;/p&gt;

&lt;p&gt;That's when I knew this was working.&lt;/p&gt;




&lt;h2&gt;
  
  
  What SOUL Actually Does
&lt;/h2&gt;

&lt;p&gt;Most translation tools work at the word level.&lt;br&gt;&lt;br&gt;
Word in → word out.&lt;/p&gt;

&lt;p&gt;SOUL works at the concept level.&lt;/p&gt;

&lt;p&gt;Before any translation happens, SOUL builds a dictionary of &lt;strong&gt;meanings&lt;/strong&gt;, not words. Each concept gets its own entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Concept {
  id: "longing-de"
  note: "Sehnsucht — transcendent longing. No English equivalent."
  dynamic: piano
  tempo: largo
  de: "Sehnsucht"
  es: "añoranza"
  ca: "enyorança"
  en: "Sehnsucht"
  nds: "Sehnsucht"
  pt: "saudade"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice: English keeps &lt;em&gt;Sehnsucht&lt;/em&gt;, because there is no English word.&lt;br&gt;&lt;br&gt;
SOUL doesn't flatten the gap. It marks it.&lt;br&gt;&lt;br&gt;
A reader knows they're touching something their language cannot fully hold.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Pipeline, Grok Does the Heavy Lifting Once
&lt;/h2&gt;

&lt;p&gt;Here's what happens under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You write Markdown (your language)
  → soul encode
    → Grok API (automatic, one call)
      → extracts concepts, not just words
      → fills the dictionary per language
        → soul render -l es  → Spanish
        → soul render -l ca  → Catalan
        → soul render -l nds → Low German
        → soul render -l pt  → Portuguese
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Grok runs once per concept.&lt;br&gt;&lt;br&gt;
After that, no AI needed. Ever.&lt;br&gt;&lt;br&gt;
Pure deterministic rendering. Offline. Forever.&lt;/p&gt;

&lt;p&gt;One dictionary entry, curated once by a native speaker —&lt;br&gt;&lt;br&gt;
and every future book that uses that concept gets it right automatically.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The system grows without the system growing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Why This Matters Beyond Tech
&lt;/h2&gt;

&lt;p&gt;Have you ever thought about &lt;em&gt;obrigado&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;In Portuguese it means "thank you."&lt;br&gt;&lt;br&gt;
It also literally means: &lt;em&gt;I am obligated.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every time a child says thank you in Portuguese —&lt;br&gt;&lt;br&gt;
they practice owing something.&lt;br&gt;&lt;br&gt;
Nobody planned this. It's just what was handed down.&lt;/p&gt;

&lt;p&gt;In German, &lt;em&gt;Verantwortung&lt;/em&gt; means moral accountability,&lt;br&gt;&lt;br&gt;
you chose this, you must answer for it.&lt;br&gt;&lt;br&gt;
In English, &lt;em&gt;responsibility&lt;/em&gt; can mean the same thing,&lt;br&gt;&lt;br&gt;
or just a job description. Nobody's fault. Just assigned.&lt;/p&gt;

&lt;p&gt;One word where German has two.&lt;br&gt;&lt;br&gt;
A whole dimension of moral weight quietly lost in translation.&lt;/p&gt;

&lt;p&gt;These aren't curiosities.&lt;br&gt;&lt;br&gt;
They're the invisible architecture of how we think.&lt;/p&gt;

&lt;p&gt;SOUL preserves the architecture.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Cannot Be Burned
&lt;/h2&gt;

&lt;p&gt;Franco banned Catalan. Books were burned.&lt;/p&gt;

&lt;p&gt;Wilhelm Reich's work was burned, in the United States, in the 1950s.&lt;br&gt;&lt;br&gt;
Professor Bernd Senf spent decades carefully reconstructing what was lost.&lt;/p&gt;

&lt;p&gt;When the soul of a book lives in SOUL format on IPFS,&lt;br&gt;&lt;br&gt;
you can delete an incarnation.&lt;br&gt;&lt;br&gt;
You cannot delete the meaning.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;.soul&lt;/code&gt; file is plain 7-bit ASCII.&lt;br&gt;&lt;br&gt;
Readable since 1963.&lt;br&gt;&lt;br&gt;
It carries its own specification, a time capsule.&lt;/p&gt;

&lt;p&gt;In 50 years, someone opens this repo.&lt;br&gt;&lt;br&gt;
No CrowdWare. No cloud. No permission needed.&lt;br&gt;&lt;br&gt;
They read the spec. They reconstruct every language version.&lt;br&gt;&lt;br&gt;
The meaning survived.&lt;/p&gt;

&lt;p&gt;Low German is fading.&lt;br&gt;&lt;br&gt;
42 languages in Guatemala are endangered.&lt;br&gt;&lt;br&gt;
Catalan remembers what suppression feels like.  &lt;/p&gt;

&lt;p&gt;SOUL gives every language a reason to exist and a way to survive.&lt;/p&gt;


&lt;h2&gt;
  
  
  CrowdBooks — Anyone Can Publish
&lt;/h2&gt;

&lt;p&gt;SOUL connects directly to CrowdBooks, a decentralized book platform on IPFS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You speak → Whisper → Text → SOUL → IPFS
Reader opens → SOUL from IPFS → their language → Bookreader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anyone can write a book.&lt;br&gt;&lt;br&gt;
Anyone can encode it into SOUL.&lt;br&gt;&lt;br&gt;
Anyone can add a language, just add a translation table.&lt;br&gt;&lt;br&gt;
The Bookreader needs no update.&lt;/p&gt;

&lt;p&gt;Publish in German today.&lt;br&gt;&lt;br&gt;
Add Spanish next month when a native speaker curates the dictionary.&lt;br&gt;&lt;br&gt;
Add Hebrew when someone who reads it tells us the concepts are right.&lt;/p&gt;

&lt;p&gt;Every language that gets a dictionary becomes a language this book can speak.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Looking For
&lt;/h2&gt;

&lt;p&gt;This is the call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testers&lt;/strong&gt; — clone the repo, run the example texts, tell me where the translation feels wrong. The ice cream story is there. The Danish barefoot walk. Read it in your language and tell me what's missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native speakers&lt;/strong&gt;, especially Low German, Catalan, Mam, Kaqchikel, Portuguese. Every concept in the dictionary was placed by software. It needs human eyes. Your eyes. One correction from a native speaker is worth more than a thousand AI iterations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linguists&lt;/strong&gt;, the concept model is young and surely wrong in ways I cannot see. Words like &lt;em&gt;hygge&lt;/em&gt;, &lt;em&gt;saudade&lt;/em&gt;, &lt;em&gt;Weltanschauung&lt;/em&gt;, &lt;em&gt;ubuntu&lt;/em&gt;, concepts that carry entire worldviews, need careful handling. Tell me what I'm missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers&lt;/strong&gt; — Go, SML, IPFS. Small stack. Clean. Documented. Clone it, build it, break it. PRs welcome on Codeberg.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;I'm not doing this for money.&lt;br&gt;&lt;br&gt;
I'm doing it because I can and because it needs doing.&lt;/p&gt;

&lt;p&gt;Somewhere between Socrates asking questions in Athens,&lt;br&gt;&lt;br&gt;
Gandhi refusing to participate in a system that needed everyone's compliance,&lt;br&gt;&lt;br&gt;
and an elder in Guatemala speaking Mam to a child, there is a thread.&lt;/p&gt;

&lt;p&gt;The thread is this:&lt;br&gt;&lt;br&gt;
&lt;em&gt;meaning matters more than the vessel it travels in.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;SOUL is just a vessel.&lt;br&gt;&lt;br&gt;
A very careful one.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://codeberg.org/CrowdWare/soul-go
&lt;span class="nb"&gt;cd &lt;/span&gt;soul-go
&lt;span class="c"&gt;# see README for setup&lt;/span&gt;
soul encode &lt;span class="nt"&gt;-l&lt;/span&gt; de example/eiswaffel.md
soul render &lt;span class="nt"&gt;-l&lt;/span&gt; es example/eiswaffel.soul
soul render &lt;span class="nt"&gt;-l&lt;/span&gt; nds example/eiswaffel.soul
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the Low German version aloud.&lt;br&gt;&lt;br&gt;
See what comes back.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://codeberg.org/CrowdWare/soul-go" rel="noopener noreferrer"&gt;codeberg.org/CrowdWare/soul-go&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CrowdBooks:&lt;/strong&gt; &lt;a href="https://crowdbooks.crowdware.info" rel="noopener noreferrer"&gt;crowdbooks.crowdware.info&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; GPL-3.0-or-later&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;CrowdWare — Lutherstadt Wittenberg — 2026&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Cause no harm to any living being.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nlp</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
