<?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>Forem: Thomas Hansen</title>
    <description>The latest articles on Forem by Thomas Hansen (@polterguy).</description>
    <link>https://forem.com/polterguy</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%2F829923%2F04782b3f-244f-42af-a2bb-cd3277828def.png</url>
      <title>Forem: Thomas Hansen</title>
      <link>https://forem.com/polterguy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/polterguy"/>
    <language>en</language>
    <item>
      <title>A practical guide to headless browser automation in Hyperlambda</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Thu, 19 Mar 2026 10:56:14 +0000</pubDate>
      <link>https://forem.com/polterguy/a-practical-guide-to-headless-browser-automation-in-hyperlambda-182g</link>
      <guid>https://forem.com/polterguy/a-practical-guide-to-headless-browser-automation-in-hyperlambda-182g</guid>
      <description>&lt;p&gt;A lot of browser automation tooling feels like it was designed for its own ecosystem first and for your application second.&lt;/p&gt;

&lt;p&gt;You end up learning a separate mental model, a separate lifecycle, and usually some kind of invisible context that makes simple things harder to reason about than they should be.&lt;/p&gt;

&lt;p&gt;I did not want that.&lt;/p&gt;

&lt;p&gt;When I added headless browser support to Hyperlambda, I wanted it to feel like the rest of the language. I wanted a small set of explicit operations that I could combine in predictable ways. Connect to a browser. Navigate somewhere. Wait for the page to become usable. Click, type, inspect, screenshot, close.&lt;/p&gt;

&lt;p&gt;That is basically it.&lt;/p&gt;

&lt;p&gt;This article is a practical walkthrough of how I use the headless browser slots in Hyperlambda.&lt;/p&gt;

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

&lt;p&gt;The model is intentionally simple.&lt;/p&gt;

&lt;p&gt;You start by opening a browser session. That returns a &lt;code&gt;session_id&lt;/code&gt;. Then you pass that &lt;code&gt;session_id&lt;/code&gt; into every other browser-related slot.&lt;/p&gt;

&lt;p&gt;I like this because there is no hidden browser object, no ambient scope, and no guessing about where state lives.&lt;/p&gt;

&lt;p&gt;The flow is visible.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect&lt;/li&gt;
&lt;li&gt;Navigate&lt;/li&gt;
&lt;li&gt;Wait&lt;/li&gt;
&lt;li&gt;Interact&lt;/li&gt;
&lt;li&gt;Read state&lt;/li&gt;
&lt;li&gt;Save a screenshot if needed&lt;/li&gt;
&lt;li&gt;Close&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the smallest possible example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.session_id
set-value:x:@.session_id
   puppeteer.connect

puppeteer.goto:x:@.session_id
   url:"https://ainiro.io"

puppeteer.title:x:@.session_id

puppeteer.close:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you understand that pattern, everything else builds on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I start a browser session
&lt;/h2&gt;

&lt;p&gt;The first slot I use is &lt;code&gt;puppeteer.connect&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Minimal version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.session_id
set-value:x:@.session_id
   puppeteer.connect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That launches Chromium and returns a session identifier.&lt;/p&gt;

&lt;p&gt;If I need more control, I can add configuration such as headless mode, executable path, launch timeout, extra Chromium flags, or lifetime settings.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.session_id
set-value:x:@.session_id
   puppeteer.connect
      headless:true
      timeout:30000
      args
         .:--no-sandbox
         .:--disable-dev-shm-usage
      timeout-minutes:30
      max-lifetime-minutes:120
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most of the time, I do not need anything beyond the default call. But it is useful to know I can tune launch behavior when I need to.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I navigate to a page
&lt;/h2&gt;

&lt;p&gt;Once I have a &lt;code&gt;session_id&lt;/code&gt;, I can send the browser somewhere with &lt;code&gt;puppeteer.goto&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;puppeteer.goto:x:@.session_id
   url:"https://ainiro.io"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is enough for simple flows.&lt;/p&gt;

&lt;p&gt;If I want more deterministic behavior, I add timeout and a wait strategy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.goto:x:@.session_id
   url:"https://ainiro.io"
   timeout:30000
   wait-until:networkidle2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;wait-until&lt;/code&gt; argument matters more than people think.&lt;/p&gt;

&lt;p&gt;Some pages are usable as soon as the DOM exists.&lt;br&gt;
Some keep loading assets after initial render.&lt;br&gt;
Some populate important UI elements after async JavaScript completes.&lt;/p&gt;

&lt;p&gt;That is why I usually treat &lt;code&gt;goto&lt;/code&gt; as navigation, not as proof that the page is ready for the next action.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I wait for the page to become usable
&lt;/h2&gt;

&lt;p&gt;In practice, I rarely rely on navigation alone.&lt;/p&gt;

&lt;p&gt;If I know I need a specific element before continuing, I wait for that element explicitly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.wait-for-selector:x:@.session_id
   selector:"#name"
   visible:true
   timeout:10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes the automation more stable because I am waiting for the thing I actually care about.&lt;/p&gt;

&lt;p&gt;If I expect the page URL itself to change after some action, I can wait for that too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.wait-for-url:x:@.session_id
   url:"https://ainiro.io/contact-us"
   timeout:10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think this is one of the biggest differences between browser automation that mostly works and browser automation that keeps breaking in annoying ways.&lt;/p&gt;

&lt;p&gt;Do not wait for abstract readiness if your next step depends on something concrete.&lt;/p&gt;

&lt;p&gt;Wait for the concrete thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I click buttons and links
&lt;/h2&gt;

&lt;p&gt;For clicks, I use &lt;code&gt;puppeteer.click&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;puppeteer.click:x:@.session_id
   selector:"#submit_contact_form_button"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I need to adjust how the click happens, I can add options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.click:x:@.session_id
   selector:"#submit_contact_form_button"
   click-count:2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is intentionally straightforward.&lt;/p&gt;

&lt;p&gt;Find the selector. Click the selector. Move on.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of browser automation API I prefer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I type and fill form fields
&lt;/h2&gt;

&lt;p&gt;There are two useful variants here.&lt;/p&gt;

&lt;p&gt;If I want to type text into a field without clearing it first, I use &lt;code&gt;puppeteer.type&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;puppeteer.type:x:@.session_id
   selector:"#name"
   text:"Thomas Hansen"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I want to replace whatever is already there, I use &lt;code&gt;puppeteer.fill&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;puppeteer.fill:x:@.session_id
   selector:"#email"
   text:"thomas@gaiasoul.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I want a more human-looking typing pace, I can add delay.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.type:x:@.session_id
   selector:"#info"
   text:"Hello from Hyperlambda"
   delay:25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That covers most form automation I need.&lt;/p&gt;

&lt;p&gt;And if I need keyboard-level interaction rather than button clicks, I can use &lt;code&gt;puppeteer.press&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;puppeteer.press:x:@.session_id
   selector:"#submit_contact_form_button"
   key:Enter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I work with selects
&lt;/h2&gt;

&lt;p&gt;Dropdowns use &lt;code&gt;puppeteer.select&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;puppeteer.select:x:@.session_id
   selector:"#plan"
   values
      .:basic
      .:pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is especially useful when automating admin panels, onboarding forms, or internal tools where select controls are common.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I inspect the page
&lt;/h2&gt;

&lt;p&gt;Not every browser session is about clicking through forms.&lt;/p&gt;

&lt;p&gt;Sometimes I just want to inspect what the browser sees after the page has fully rendered.&lt;/p&gt;

&lt;p&gt;For that, I typically use these slots:&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the title
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.title:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read the current URL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.url:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read the rendered HTML
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.content:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last one is particularly useful because it gives me the page as the browser sees it after JavaScript execution, not just the original raw server response.&lt;/p&gt;

&lt;p&gt;If I need something even more targeted, I can evaluate JavaScript directly in the page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.evaluate:x:@.session_id
   expression:"document.title"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.evaluate:x:@.session_id
   expression:"typeof window.mcaptcha"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives me a quick way to inspect runtime state without building a bigger extraction flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I save screenshots
&lt;/h2&gt;

&lt;p&gt;Screenshots are useful for debugging, documentation, and simple verification.&lt;/p&gt;

&lt;p&gt;Here is the basic PNG example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.screenshot:x:@.session_id
   filename:"/etc/tmp/example.png"
   full-page:true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is a JPEG version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.screenshot:x:@.session_id
   filename:"/etc/tmp/example.jpg"
   type:jpeg
   quality:85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of those features I end up using more than I expect.&lt;/p&gt;

&lt;p&gt;If something fails in an automated flow, a screenshot often gives me the answer much faster than logs alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I close the session
&lt;/h2&gt;

&lt;p&gt;When I am done, I close the browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;puppeteer.close:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I know that sounds obvious, but I still think it matters to treat connect and close as part of the actual program design.&lt;/p&gt;

&lt;p&gt;Open the resource.&lt;br&gt;
Use the resource.&lt;br&gt;
Close the resource.&lt;/p&gt;

&lt;p&gt;That keeps the flow readable and avoids unnecessary browser sessions hanging around.&lt;/p&gt;
&lt;h2&gt;
  
  
  A full example
&lt;/h2&gt;

&lt;p&gt;Here is a simple end-to-end example.&lt;/p&gt;

&lt;p&gt;It opens Chromium, goes to a page, waits for network activity to calm down, reads title and URL, takes a screenshot, and closes the session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.session_id
set-value:x:@.session_id
   puppeteer.connect

puppeteer.goto:x:@.session_id
   url:"https://ainiro.io"
   timeout:30000
   wait-until:networkidle2

puppeteer.title:x:@.session_id
puppeteer.url:x:@.session_id

puppeteer.screenshot:x:@.session_id
   filename:"/etc/tmp/ainiro-homepage.png"
   full-page:true

puppeteer.close:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is a form-oriented example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.session_id
set-value:x:@.session_id
   puppeteer.connect

puppeteer.goto:x:@.session_id
   url:"https://ainiro.io/contact-us"
   timeout:30000
   wait-until:networkidle2

puppeteer.wait-for-selector:x:@.session_id
   selector:"#name"
   visible:true
   timeout:10000

puppeteer.fill:x:@.session_id
   selector:"#name"
   text:"Thomas Hansen"

puppeteer.fill:x:@.session_id
   selector:"#email"
   text:"thomas@gaiasoul.com"

puppeteer.type:x:@.session_id
   selector:"#info"
   text:"Hello from Hyperlambda"

puppeteer.click:x:@.session_id
   selector:"#submit_contact_form_button"

puppeteer.close:x:@.session_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I think makes this approach nice
&lt;/h2&gt;

&lt;p&gt;What I like about these slots is not that they are flashy.&lt;/p&gt;

&lt;p&gt;It is that they are predictable.&lt;/p&gt;

&lt;p&gt;They do not try to invent a second programming model inside Hyperlambda.&lt;br&gt;
They do not hide the browser lifecycle behind clever abstractions.&lt;br&gt;
They do not require me to guess where state comes from.&lt;/p&gt;

&lt;p&gt;Everything important is explicit.&lt;/p&gt;

&lt;p&gt;You can read the flow from top to bottom and understand exactly what the browser is doing.&lt;/p&gt;

&lt;p&gt;That is a huge advantage when the automation grows from a toy example into something that actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;I think browser automation should feel boring in the best possible way.&lt;/p&gt;

&lt;p&gt;You should be able to connect, navigate, wait, interact, inspect, screenshot, and close without learning a separate philosophy just to click a button on a web page.&lt;/p&gt;

&lt;p&gt;That is why I like the headless browser slots in Hyperlambda.&lt;/p&gt;

&lt;p&gt;They give me enough power to automate real workflows, but they stay small and direct enough that the code remains readable.&lt;/p&gt;

&lt;p&gt;And for me, that is usually the difference between a browser automation API I try once and a browser automation API I actually keep using.&lt;/p&gt;

&lt;p&gt;If you want to get started with Hyperlambda you can &lt;a href="https://hyperlambda.dev" rel="noopener noreferrer"&gt;clone Magic Cloud and Hyperlambda here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hyperlambda</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Natural Language based DSL AST Compilers</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Fri, 13 Mar 2026 16:03:56 +0000</pubDate>
      <link>https://forem.com/polterguy/natural-language-based-dsl-ast-compilers-3fl4</link>
      <guid>https://forem.com/polterguy/natural-language-based-dsl-ast-compilers-3fl4</guid>
      <description>&lt;p&gt;I've tried this 5 times, with 3 different LLMs, and the exercise is as follows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I go to a publicly available AI chatbot, such as ChatGPT for instance&lt;/li&gt;
&lt;li&gt;I explain it what training material I have, what process I'm following, and other details about how I fine tune&lt;/li&gt;
&lt;li&gt;I explain Hyperlambda's syntax, by pointing it at articles and code parts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And every single time it comes back and tells me the following ...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You're beyond code-generation, what you're building is an AST compiler, based upon AI, that's almost &lt;em&gt;"deterministic"&lt;/em&gt; in nature&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same answer every single time. Interestingly, I don't disagree. To understand why that's such a big thing, let's go through the semantics of how I am working, and with what.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hyperlambda, the DSL
&lt;/h2&gt;

&lt;p&gt;The DSL is called &lt;a href="https://ainiro.io/hyperlambda" rel="noopener noreferrer"&gt;Hyperlambda&lt;/a&gt;, and it's got some pretty unique traits. For one, it's &lt;em&gt;"homoiconic"&lt;/em&gt;. That's just a fancy word for saying its execution structure is the exact same as the code format, which is true.&lt;/p&gt;

&lt;p&gt;To understand why that's such a bloody big deal, you must realise that this implies there is no AST layer in Hyperlambda. Hyperlambda &lt;em&gt;is&lt;/em&gt; the AST layer. Hence technically, we're simply removing several layers of complexity from traditional programming language, since Hyperlambda is simply the ability to &lt;a href="https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/march/patterns-active-events-one-design-pattern-instead-of-a-dozen" rel="noopener noreferrer"&gt;raise events&lt;/a&gt;, combined with the ability to recursively traverse tree structures, passing in dynamically created recursive tree structures to said events.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One simple design pattern! Resulting in an entirely new axiom for software development as a profession ...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since this structure is recursive in nature, this implies among other things that every complex piece of Hyperlambda, can be broken down by pruning its parent node, and the end result is &lt;em&gt;valid Hyperlambda&lt;/em&gt;! For instance, imagine the following code ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if
   eq:x:@.arguments/*/name
      .:Thomas
   .lambda
      log.info:Thomas was here!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above is easily understood by most I presume, but it's basically the following in natural language; &lt;em&gt;"If the name argument equals 'Thomas', log the value 'Thomas was here!'"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;However, the place where it gets &lt;em&gt;"weird"&lt;/em&gt;, is that I can take any parts of the above structure, and simply &lt;em&gt;"chop it up"&lt;/em&gt; into multiple smaller snippets, and they would all be considered value Hyperlambda. Below is an example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eq:x:@.arguments/*/name
   .:Thomas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I can even modify it, and add stuff such as the following to it ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eq:x:@.arguments/*/name
   .:Thomas
return:x:-
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which basically implies; &lt;em&gt;"Compare name argument to 'Thomas' and return true if they're the same, otherwise false."&lt;/em&gt; And I can continue &lt;em&gt;"chopping up"&lt;/em&gt; Hyperlambda snippets using the above technique, over and over again.&lt;/p&gt;

&lt;p&gt;Ignoring the fact of that this has a dramatic effect on my personal ability to produce 100% correct training snippets, partially by even automating the process - LLMs happens to be &lt;em&gt;"a bajillion"&lt;/em&gt; times better at understanding recursive structures such as the above, where everything is a function - Touch OOP! FP wins!&lt;/p&gt;

&lt;p&gt;Sorry, I don't mean to be touchy here, but it's a known fact! LLMs can deal with functional programming languages a bajillion times better than OOP ...&lt;/p&gt;

&lt;p&gt;And Hyperlambda is, you guessed it, &lt;strong&gt;FP&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Hence Hyperlambda &lt;em&gt;is&lt;/em&gt; an AST layer, or an &lt;em&gt;"Abstract Syntax Tree"&lt;/em&gt; - Which also might explain my difficulties explaining it to other members of the homo sapiens branch. However, more importantly, LLMs are &lt;em&gt;"a bajillion"&lt;/em&gt; times better at understanding recursive AST layers, such as Hyperlambda, than - &lt;em&gt;"traditional code"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Basically, the recursive nature of functional programming, combined with the recursive nature of Hyperlambda, due to its simple &lt;em&gt;"node structure"&lt;/em&gt;, which is basically just a graph object - Results in a &lt;em&gt;"double whammy"&lt;/em&gt; from a fine tuning perspective and LLM perspective.&lt;/p&gt;

&lt;p&gt;Every single time I explain my language to an LLM, they consistently comes back and refers to it as &lt;em&gt;"the 100% correct way to build an AI-based 'compiler platform'"&lt;/em&gt; - Also a lot due to its security mechanisms may I add ...&lt;/p&gt;

&lt;h3&gt;
  
  
  Declarative
&lt;/h3&gt;

&lt;p&gt;Hyperlambda is &lt;em&gt;declarative&lt;/em&gt;, in addition to being homoiconic and functional. This reduces token count when dealing with LLMs by a factor of between 95% and 80%. 95% compared to C++ and 80% compared to Python. In addition, there's typically only a handful of correct ways to achieve something in a declarative language. With an imperative language like Python, there's a billion different ways to solve the same problem.&lt;/p&gt;

&lt;p&gt;This implies you'll need millions of example of Python code to teach the same you only need 50,000 to teach in a declarative language. Simply because the &lt;em&gt;"knowledge graph"&lt;/em&gt; is smaller, and hence the connections are reduced by &lt;strong&gt;a lot&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;I've got 59,300 Hyperlambda training files, in a ridiculously strict training regime, of superb quality. According to ChatGPT that makes my LLM roughly on pair currently with SOTA models such as Claude Code or OpenAI's Codex.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Basically, 59,300 Hyperlambda examples is equivalent to 10 million Python examples!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because it's not about sheer size of training material, it's about percentage covered of possible structures. In Python there are easily 20 million different structures, just combining two different concepts. In Hyperlambda that number is reduced down to maybe 100,000.&lt;/p&gt;

&lt;p&gt;And assuming you ask it to actually do something it knows how to do, and you don't give it bananas prompts - I can pretty much guarantee you that it's easily on pair with both Claude Code and Codex!&lt;/p&gt;

&lt;h2&gt;
  
  
  Meta programming
&lt;/h2&gt;

&lt;p&gt;The funny thing was, I started out with an extreme rush towards meta programming about 13 years ago - Realising it was something unique. To have a working meta programming language, you need to be both declarative in nature, homoiconic, and functional. Meta programming rests on these 3 pillars.&lt;/p&gt;

&lt;p&gt;Today I don't care about its meta programming capabilities much more, since my LLM is getting so bloody good at generating code, I barely think about it. Hence the 3 bi products I barely cared about in the first place, became its most interesting traits in the long run - And my reasons for originally building it the way I did, is almost completely uninteresting at this point in time ...&lt;/p&gt;

&lt;p&gt;Anyways, thx for reading - Both of you ... ;)&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Create your Own Private DIY Silicon Valley</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sun, 01 Mar 2026 11:11:30 +0000</pubDate>
      <link>https://forem.com/polterguy/create-your-own-private-diy-silicon-valley-18e6</link>
      <guid>https://forem.com/polterguy/create-your-own-private-diy-silicon-valley-18e6</guid>
      <description>&lt;p&gt;It's not exactly a secret that Facebook, Google, Reddit, and others are censoring you and spying on you I presume. Personally, I've got an entire army at Reddit so passionately hating me, they've subscribed to my YouTube videos for 6 years, with the sole purpose of down voting my videos. And of course, anything I post over there, is censored in &lt;strong&gt;seconds&lt;/strong&gt; ...&lt;/p&gt;

&lt;p&gt;I got so tired of this, I figured somebody just have to solve it. Since the nature of the web is that who ever owns the box, gets to decide what gets published - I &lt;strong&gt;created my own box&lt;/strong&gt;!&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%2F9wqoigasxy2g5rn7moiv.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%2F9wqoigasxy2g5rn7moiv.png" alt="My web server" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above MacMini is running &lt;em&gt;out of my living room&lt;/em&gt;. You can visit it at &lt;a href="https://home.ainiro.io" rel="noopener noreferrer"&gt;home.ainiro.io&lt;/a&gt;. I have even created a dummy little app (30 minutes job) that I deployed on to it. You can find my app below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://home.ainiro.io/analytics-crm" rel="noopener noreferrer"&gt;Dumb CRM system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  HOWTO
&lt;/h2&gt;

&lt;p&gt;The process is dead simple.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get a MacMini&lt;/li&gt;
&lt;li&gt;Install Docker on it&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;docker compose up&lt;/code&gt; in the same folder you've got the file below saved as &lt;em&gt;"docker-compose.yaml"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Paste the docker compose file below into ChatGPT and tell it to expose both sites using Cloudflare tunnels&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The docker compose file can be found here ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;servergardens/magic-backend:latest&lt;/span&gt;
    &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;linux/amd64&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;magic_backend&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4444:4444"&lt;/span&gt;

    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_etc:/magic/files/etc&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_data:/magic/files/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_config:/magic/files/config&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_modules:/magic/files/modules&lt;/span&gt;

  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;servergardens/magic-frontend:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;magic_frontend&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;

    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5555:80"&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_etc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All in all, the process took me 30 minutes, after which I had a fully functioning (and &lt;strong&gt;secure&lt;/strong&gt;) web server, serving my own apps, out of my own living room. Get the source to Magic below, or read more about it on my website.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic's code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ainiro.io" rel="noopener noreferrer"&gt;My website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>discuss</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Setup Magic Cloud on your own Development Machine</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Tue, 17 Feb 2026 06:55:25 +0000</pubDate>
      <link>https://forem.com/polterguy/setup-magic-cloud-on-your-own-development-machine-22il</link>
      <guid>https://forem.com/polterguy/setup-magic-cloud-on-your-own-development-machine-22il</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; is an open source full stack &lt;em&gt;"vibe coding platform"&lt;/em&gt;. What I mean by that, is that you can create full stack apps using AI without coding. Below is an example of what you can create.&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%2Fvrcmb16o2z6z91stvxjy.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%2Fvrcmb16o2z6z91stvxjy.png" alt="Example AI generated full stack app" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above is a simple CRM system that was created in about 10 minutes. The system, created my database, my API, and my frontend. 100% without coding. In addition, it added Google SSO, and secured my app 100% automatically. You can watch a video below of how to setup Magic.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/k6eSKxc6oM8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Magic's Unique Value Proposition
&lt;/h2&gt;

&lt;p&gt;There exists &lt;em&gt;"a bajillion"&lt;/em&gt; similar platforms out there. However, most of these are focused on &lt;em&gt;"citizen"&lt;/em&gt;. Personally, I love the idea of arming citizen, but for me it's much more interesting solving &lt;strong&gt;real problems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hence, I created a vibe coding platform for &lt;em&gt;professionals&lt;/em&gt; instead. What I mean by that is that Magic Cloud is a vibe coding platform specifically created for the SMB and Enterprise market, and not &lt;em&gt;"citizen"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It's got security built-in as the standard, coming out of the box. It's got zero lockins, allowing you to host it anywhere you wish. It's easily deployed into Kubernetes, allowing you to &lt;em&gt;"scale it to the moon"&lt;/em&gt; if required. And it (of course), features everything you'd need from a modern AI automation platform; Such as for instance ...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Git integrations.&lt;/li&gt;
&lt;li&gt;Terminal integrations.&lt;/li&gt;
&lt;li&gt;100+ functions, for everything from saving files, to creating databases, and to searching your files.&lt;/li&gt;
&lt;li&gt;Connect it to PostgreSQL, MySQL, SQL Server, and any database you might have from before.&lt;/li&gt;
&lt;li&gt;Run your backend on anything, not only Supabase&lt;/li&gt;
&lt;li&gt;Run your frontend from anything, including inside your LAN&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And of course, it helps having a platform that's literally so blistering fast and optimal, you could probably deploy it on a Raspberry PI if required ...&lt;/p&gt;

&lt;p&gt;If you want to read more about Magic, you can find my website below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ainiro.io" rel="noopener noreferrer"&gt;AINIRO Magic Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>lowcode</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Why I Built Magic Cloud for Real Enterprise Teams (Not Demo Land)</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sun, 15 Feb 2026 18:27:46 +0000</pubDate>
      <link>https://forem.com/polterguy/why-i-built-magic-cloud-for-real-enterprise-teams-not-demo-land-62a</link>
      <guid>https://forem.com/polterguy/why-i-built-magic-cloud-for-real-enterprise-teams-not-demo-land-62a</guid>
      <description>&lt;p&gt;There’s a recurring pattern I’ve seen for years in enterprise software: We keep piling tools on top of tools, hoping the stack will somehow solve the bottleneck.&lt;/p&gt;

&lt;p&gt;But the bottleneck isn’t the stack. It’s &lt;strong&gt;the loop&lt;/strong&gt;: idea, backlog, spec, implementation, deployment, maintenance. I built &lt;strong&gt;Magic Cloud&lt;/strong&gt; to collapse that loop into something radically simpler — without sacrificing control, security, or performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem isn’t developers — it’s the system around them
&lt;/h2&gt;

&lt;p&gt;I’ve led and supported teams with real constraints: security reviews, compliance, internal policies, and delivery deadlines that don’t move.&lt;/p&gt;

&lt;p&gt;In those environments, most “AI dev tools” feel like &lt;strong&gt;good demos&lt;/strong&gt; but &lt;strong&gt;bad foundations&lt;/strong&gt;. They generate code, sure — but the surrounding system is fragile:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Too many external dependencies
&lt;/li&gt;
&lt;li&gt;Too many leaky integrations
&lt;/li&gt;
&lt;li&gt;Too little security built into the core
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s where Magic Cloud is different. It was built from the inside out for &lt;strong&gt;enterprise reality&lt;/strong&gt;, not just a product launch demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Magic Cloud actually changes
&lt;/h2&gt;

&lt;p&gt;Magic Cloud combines two layers that usually live apart:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt; — the runtime for your app
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development&lt;/strong&gt; — the AI-driven creation process
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By fusing these, you can generate full-stack apps and AI agents using natural language &lt;strong&gt;and&lt;/strong&gt; deploy them with an enterprise-grade security model built in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No disconnected toolchains.&lt;/li&gt;
&lt;li&gt;No vendor lock-in.&lt;/li&gt;
&lt;li&gt;No magic “connectors” that break at the worst time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A different security philosophy
&lt;/h2&gt;

&lt;p&gt;Most platforms hope security can be &lt;em&gt;added later&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
I designed Magic Cloud to treat security as the default, not an optional upgrade. Here are a few core principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RBAC at the foundation&lt;/strong&gt; — not as an afterthought&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool usage constrained by authenticated user permissions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No MCP protocol&lt;/strong&gt; — Magic uses a custom tool bridge designed to be safer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hidden data access&lt;/strong&gt; — sensitive info leaves only if you explicitly allow it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This isn’t a theoretical posture. It’s practical. It matters.&lt;/p&gt;
&lt;h2&gt;
  
  
  Performance and control, not just AI novelty
&lt;/h2&gt;

&lt;p&gt;I love fast iterations, but I also care about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Performance under real load&lt;/li&gt;
&lt;li&gt;Long-term maintainability&lt;/li&gt;
&lt;li&gt;Stack visibility when things break&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Magic Cloud is built on modern &lt;strong&gt;C#/.NET Core&lt;/strong&gt; for performance and stability. It’s &lt;strong&gt;open source&lt;/strong&gt;, self-hostable, and designed for &lt;strong&gt;long-term operational control&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  I built it for teams like mine
&lt;/h2&gt;

&lt;p&gt;This wasn’t built for hype. It was built because I kept watching teams get buried under their own process. Magic Cloud isn’t a “toy.” It’s a system for teams who want &lt;strong&gt;real leverage&lt;/strong&gt;, without losing their security posture or their autonomy.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/k6eSKxc6oM8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Read the original article &lt;a href="https://ainiro.io/blog/magic-cloud-the-enterprise-vibe-coding-platform" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>lowcode</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Magic Cloud has Git Support</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Thu, 12 Feb 2026 18:45:09 +0000</pubDate>
      <link>https://forem.com/polterguy/magic-cloud-has-git-support-4d22</link>
      <guid>https://forem.com/polterguy/magic-cloud-has-git-support-4d22</guid>
      <description>&lt;p&gt;&lt;a href="https://ainiro.io" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; is our flagship product. Being a fairly outspoken guy related to Git, most have believed you can't use Git in Magic.&lt;/p&gt;

&lt;p&gt;That's not true. I personally use Git on both Hyperlambda projects, and Magic itself (obviously!) - However, I guess I'm to take some blame here myself, if I'm to be objective about it. I have been known to have one or two controversial opinions ... 😂&lt;/p&gt;

&lt;p&gt;Anyways, as of today, Magic has 100% perfectly implemented Git support. In fact, there are as of today 10 new slots related to Git and GitHub, and these are as follows;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[git.clone-repo]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[git.create-repo]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[git.delete-repo]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[git.commit]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[git.push]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[git.checkout]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[git.remote.add]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[github.repo.create]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[github.repo.delete]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[github.repo.list]&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Git AI Agent
&lt;/h2&gt;

&lt;p&gt;Not only did we implement Git support, but as a bonus we added it to our AI agent - Allowing you to create branches, push, commit, etc, directly from the integrated AI agent. Below is a video of me demonstrating it.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/nLm2zRBexFc"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;So starting from today, not only can you use Git directly from &lt;a href="https://ainiro.io/hyperlambda" rel="noopener noreferrer"&gt;Hyperlambda&lt;/a&gt; - But you can frikkin' vibe code with it ... 😊&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Open Source Vibe Coding tool for Citizen</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Tue, 10 Feb 2026 15:38:22 +0000</pubDate>
      <link>https://forem.com/polterguy/open-source-vibe-coding-tool-for-citizen-27ap</link>
      <guid>https://forem.com/polterguy/open-source-vibe-coding-tool-for-citizen-27ap</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; is an open source framework, you can run on your own development machine. Kind of like Lovable, only better! With zero lock-in of course! You can basically host it where ever you wish!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/k6eSKxc6oM8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The only thing that's proprietary, requiring a key, is access to the Hyperlambda Generator, which is my own LLM that's capable of generating Hyperlambda code automatically.&lt;/p&gt;

&lt;p&gt;That makes it arguably &lt;em&gt;the sole&lt;/em&gt; solution on earth in this space, that's &lt;em&gt;"enterprise ready"&lt;/em&gt;, as in secure, cares about privacy, while at the same time making it possible to generate entire CRM systems, full stack apps, databases, APIs, and everything required for the typical Enterprise customer!&lt;/p&gt;

&lt;p&gt;You can connect it to SQL Server, PostgreSQL, MySQL, or SQLite, in addition to that it can be integrated into everything else you've got from before, through APIs (that you vibe code), or &lt;em&gt;"whatever"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Anyways, that was it! All I had to say!! 😊&lt;/p&gt;

</description>
      <category>nocode</category>
      <category>ai</category>
      <category>productivity</category>
      <category>database</category>
    </item>
    <item>
      <title>Getting Started with Open Source Vibe Coding</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sat, 07 Feb 2026 13:38:54 +0000</pubDate>
      <link>https://forem.com/polterguy/getting-started-with-open-source-vibe-coding-6f5</link>
      <guid>https://forem.com/polterguy/getting-started-with-open-source-vibe-coding-6f5</guid>
      <description>&lt;p&gt;&lt;a href="https://ainiro.io" rel="noopener noreferrer"&gt;Magic Cloud&lt;/a&gt; is 100% open source. In addition, people keeps on telling me it's &lt;em&gt;"better"&lt;/em&gt; than Lovable and Bolt42. I wouldn't know since I barely use these tools, but I know what it &lt;em&gt;can&lt;/em&gt; do, and what it can do, easily saves me for 90% of my time!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/k6eSKxc6oM8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In the above video I demonstrate the entire process of getting started with Magic. Below are its Docker Compose file if you want to reproduce what I did.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;servergardens/magic-backend:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;magic_backend&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4444:4444"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_etc:/magic/files/etc&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_data:/magic/files/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_config:/magic/files/config&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;magic_files_modules:/magic/files/modules&lt;/span&gt;
  &lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;servergardens/magic-frontend:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;magic_frontend&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5555:80"&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_etc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;magic_files_modules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the above as &lt;em&gt;"docker-compose.yaml"&lt;/em&gt; somewhere, run &lt;code&gt;docker compose up&lt;/code&gt;, and you're vibe coding on &lt;em&gt;your own development machine, using nothing but open source software&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The last AI agent on Earth
&lt;/h2&gt;

&lt;p&gt;In a way, Magic Cloud becomes &lt;em&gt;"the last AI agent you'll ever need"&lt;/em&gt;. This is because of its Hyperlambda programming language, that allows for dynamically generate tools on demand, and immediately use these tools to perform some task.&lt;/p&gt;

&lt;p&gt;No deployments, no compilations, no &lt;em&gt;"setting up sandbox environment"&lt;/em&gt; wait screens - Still, the thing is 100% secure by default!&lt;/p&gt;

&lt;h2&gt;
  
  
  What can you create?
&lt;/h2&gt;

&lt;p&gt;The above just creates a simple TODO app, but at least in theory, you can create anything you can create with Lovable and Bolt42, except everything is open source of course!&lt;/p&gt;

&lt;p&gt;I've used it to create complex CRM systems with RLS and business logic. I've used it to create task management systems, with Kanban boards, and RBAC. I've used it to create rich back office apps, with integrated SSO and OIDC. And everything &lt;em&gt;"just works."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bugs
&lt;/h2&gt;

&lt;p&gt;Vibe coding is still a new phenomenon, and the process generates bugs every now and then - So you &lt;strong&gt;must&lt;/strong&gt; sanity check the code output before trusting it.&lt;/p&gt;

&lt;p&gt;Just a friendly warning ...&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;You can find the repo &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>lowcode</category>
      <category>nocode</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Vibe code full-stack apps using AI (and keep it open source)</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Thu, 05 Feb 2026 12:54:52 +0000</pubDate>
      <link>https://forem.com/polterguy/vibe-code-full-stack-apps-using-ai-and-keep-it-open-source-3gmo</link>
      <guid>https://forem.com/polterguy/vibe-code-full-stack-apps-using-ai-and-keep-it-open-source-3gmo</guid>
      <description>&lt;p&gt;If you build software with tools like Lovable or Bolt44, you’re usually making a trade-off: &lt;strong&gt;speed and convenience&lt;/strong&gt; in exchange for &lt;strong&gt;privacy, security, and control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For hobby projects, that might be fine. For real businesses and enterprise use, it usually isn’t. That’s exactly why I built &lt;strong&gt;Magic Cloud&lt;/strong&gt;. Magic Cloud is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hostable&lt;/strong&gt; (Docker makes it easy to deploy anywhere)&lt;/li&gt;
&lt;li&gt;Built around a purpose-made &lt;strong&gt;DSL&lt;/strong&gt; instead of raw chat-generated code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than asking a general-purpose LLM to spit out Python or C#, I designed a system where the model generates code in a language that was &lt;strong&gt;explicitly built to be generated by AI&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hyperlambda and why security actually works
&lt;/h2&gt;

&lt;p&gt;The DSL at the core of Magic Cloud is called &lt;strong&gt;Hyperlambda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hyperlambda wasn’t designed for humans first — it was designed for &lt;strong&gt;machines&lt;/strong&gt;. That single design decision changes everything.&lt;/p&gt;

&lt;p&gt;Most criticism of vibe coding eventually boils down to one word:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hyperlambda makes insecure code &lt;em&gt;hard to express&lt;/em&gt; by design.&lt;/p&gt;

&lt;p&gt;Some of the security properties baked into the runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code executes inside a &lt;strong&gt;sandboxed virtual file system&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No access to files outside the sandbox&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role-based access control (RBAC)&lt;/strong&gt; for users &lt;em&gt;and&lt;/em&gt; agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Function-level whitelisting&lt;/strong&gt; so only explicitly allowed operations can run&lt;/li&gt;
&lt;li&gt;Secure defaults for things like password storage (per-record salts + slow hashing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of trying to “audit AI output after the fact”, the system itself prevents entire classes of vulnerabilities from ever being generated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Token count matters more than people realize
&lt;/h2&gt;

&lt;p&gt;Token usage isn’t just about API cost.&lt;/p&gt;

&lt;p&gt;Lower token usage also means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less cognitive load on the model&lt;/li&gt;
&lt;li&gt;more consistent output&lt;/li&gt;
&lt;li&gt;fewer hallucinations&lt;/li&gt;
&lt;li&gt;the ability to generate &lt;strong&gt;larger and more complex applications&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hyperlambda is extremely compact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~&lt;strong&gt;10%&lt;/strong&gt; of the tokens required by C#&lt;/li&gt;
&lt;li&gt;~&lt;strong&gt;20%&lt;/strong&gt; of the tokens required by Python&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, that means an agent can build &lt;strong&gt;5–10× more complex systems&lt;/strong&gt; before hitting practical context limits.&lt;/p&gt;

&lt;p&gt;Hyperlambda also happens to be very AI-friendly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;homoiconic / AST-like structure&lt;/li&gt;
&lt;li&gt;declarative style (closer to SQL than OOP)&lt;/li&gt;
&lt;li&gt;no classes or inheritance — just functions and files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This dramatically simplifies generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance (and why most DSLs fail)
&lt;/h2&gt;

&lt;p&gt;Most DSLs fall into one of three traps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Too narrow to be useful&lt;/li&gt;
&lt;li&gt;Too slow to be practical&lt;/li&gt;
&lt;li&gt;Just glorified configuration formats (XML/JSON hell)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hyperlambda avoids all three. In benchmarks, it’s roughly &lt;strong&gt;20× faster than Python on average&lt;/strong&gt;. When you combine that with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sandboxed execution&lt;/li&gt;
&lt;li&gt;low token usage&lt;/li&gt;
&lt;li&gt;zero compile step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You end up with a system that’s not only secure, but &lt;em&gt;fast enough&lt;/em&gt; to run AI-driven logic in real production workloads. Based on those measurements, Magic Cloud ends up roughly &lt;strong&gt;two orders of magnitude more efficient than typical LangChain-style stacks&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real win: convenience without compromise
&lt;/h2&gt;

&lt;p&gt;Security and performance matter — but the biggest advantage is still &lt;strong&gt;convenience&lt;/strong&gt;. Magic Cloud can generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;API&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;frontend&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And when generation is done, the app is &lt;strong&gt;already live&lt;/strong&gt;. There’s no separate “dev environment” versus “deployment environment”. No build pipelines to babysit. No fragile glue code between tools. You iterate directly against the same runtime that serves production traffic. That tight feedback loop makes a huge difference when you’re steering an LLM interactively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source and self-hosted by default
&lt;/h2&gt;

&lt;p&gt;With most closed vibe-coding platforms, you eventually hit the same wall:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unclear data handling&lt;/li&gt;
&lt;li&gt;restrictive terms&lt;/li&gt;
&lt;li&gt;no real control&lt;/li&gt;
&lt;li&gt;“please don’t paste sensitive data” disclaimers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Magic Cloud runs &lt;strong&gt;entirely on your infrastructure&lt;/strong&gt; if you want it to. Private server. Air-gapped network. Internal business systems. Because it’s open source and extensible, it works just as well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRMs&lt;/li&gt;
&lt;li&gt;internal admin tools&lt;/li&gt;
&lt;li&gt;project management systems&lt;/li&gt;
&lt;li&gt;back-office software&lt;/li&gt;
&lt;li&gt;custom business workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I demo it with a CRM
&lt;/h2&gt;

&lt;p&gt;One of my demos shows Magic Cloud building a CRM system with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;companies&lt;/li&gt;
&lt;li&gt;contacts&lt;/li&gt;
&lt;li&gt;leads&lt;/li&gt;
&lt;li&gt;notes&lt;/li&gt;
&lt;li&gt;activities&lt;/li&gt;
&lt;li&gt;email sending&lt;/li&gt;
&lt;li&gt;JWT authentication&lt;/li&gt;
&lt;li&gt;RBAC security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CRMs are the perfect vibe-coding target.&lt;/p&gt;

&lt;p&gt;Off-the-shelf CRMs try to serve &lt;em&gt;everyone&lt;/em&gt;, which usually means they fit &lt;strong&gt;no one&lt;/strong&gt; particularly well. Your actual business workflows are always a little different. A custom CRM doesn’t need 10,000 features — it needs the &lt;strong&gt;right&lt;/strong&gt; ones. And only you really know what those are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;If you want to vibe code full-stack applications &lt;em&gt;without&lt;/em&gt; sacrificing security or ownership, the ingredients matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A DSL designed for &lt;strong&gt;AI generation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Sandboxing, RBAC, and constrained execution&lt;/li&gt;
&lt;li&gt;A single loop where build, test, and deploy are effectively the same thing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the problem Magic Cloud is built to solve. If you want the original article, you can find it below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ainiro.io/blog/vibe-code-full-stack-apps-using-ai-and-open-source" rel="noopener noreferrer"&gt;Vibe coding full stack apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>I just MURDERED Software Development, and I'm not sorry!</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Sun, 01 Feb 2026 10:55:48 +0000</pubDate>
      <link>https://forem.com/polterguy/i-just-murdered-software-development-and-im-not-sorry-2k3i</link>
      <guid>https://forem.com/polterguy/i-just-murdered-software-development-and-im-not-sorry-2k3i</guid>
      <description>&lt;p&gt;For 20+, I've felt that dev heads was &lt;em&gt;"the new priesthood"&lt;/em&gt;, with their design patterns, acronyms, and theories about abstractions and IoC, holding on to their knowledge as if it was Christian Dogma from &lt;em&gt;"The Witch Hammer"&lt;/em&gt;! And for 20+ years, I've done what I can to eliminate these people's &lt;em&gt;"power grabs"&lt;/em&gt; on others.&lt;/p&gt;

&lt;p&gt;Today, I'm putting the finishing touches on Magic Cloud, with the intentions being to publicly humiliate 45 million software developers, making them realise that they were wrong all the time, by releasing an AI agent that arguably builds &lt;em&gt;better software than 99% of all dev heads&lt;/em&gt;!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Zero unit testing, no Git or versioning, just good ol' &lt;em&gt;"saving AI generated code straight to production"&lt;/em&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Do you believe I'm joking? Well, watch this video to understand that I am 100% perfectly serious!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/z5np09h8_bM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The "code"
&lt;/h2&gt;

&lt;p&gt;Basically, I told it to ...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create me a CRM system to manage tasks for my outsourcing company&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;10 minutes later, the finished result, including RBAC, bcrypt-hashed passwords at rest, and a security model that would make the NSA blush.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Hyperlambda, a Web Query Language</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Fri, 05 Dec 2025 08:38:04 +0000</pubDate>
      <link>https://forem.com/polterguy/hyperlambda-a-web-query-language-1c74</link>
      <guid>https://forem.com/polterguy/hyperlambda-a-web-query-language-1c74</guid>
      <description>&lt;p&gt;We've just launched a new addition to Magic, which is our &lt;a href="https://ainiro.io/natural-language-api" rel="noopener noreferrer"&gt;Natural Language API&lt;/a&gt;. The thing is built upon Hyperlambda, so it's &lt;em&gt;"a bajillion"&lt;/em&gt; times faster than anything similar built in Python, and a code-gen request probably costs less than 1 cent. In fact, the average request executes in 1 to 4 seconds, allowing you to literally create API methods &lt;em&gt;"on the fly"&lt;/em&gt;, which again allows you to treat the web as a &lt;em&gt;"queryable database"&lt;/em&gt;. Examples of things you can ask it are ...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Scrape ainiro.io and return the first 5 hyperlinks you find"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Return all links from the sitemap at ainiro.io NOT containing /blog/"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Invoke Chuck Norris API and return some random joke"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Invoke Chuck Norris API and return some random joke"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To understand, consider the following request; &lt;em&gt;"Scrape ainiro.io and return the first 5 external Hyperlinks you find"&lt;/em&gt; - Which results in the following JSON being returned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"https://seattleballooning.com"&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://github.com/polterguy/magic"&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://docs.ainiro.io/"&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://www.2xplain.nl/"&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://app.fintell.ai"&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;h2&gt;
  
  
  Instant API
&lt;/h2&gt;

&lt;p&gt;Due to its speed, you can literally depend upon it dynamically generating your code on the fly, by semantically scraping web pages for information. In the following video I'm walking you through parts of its implementation.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/eUSZz4LVtVw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;The way it works, is as follows.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A natural language request comes to the server&lt;/li&gt;
&lt;li&gt;Magic checks its database to see if it's previously succeeded in generating code for the request&lt;/li&gt;
&lt;li&gt;If it finds cached code, it executes the code and returns the result of the execution&lt;/li&gt;
&lt;li&gt;If it does &lt;em&gt;not&lt;/em&gt; find a cached result, it generates the code, stores it in its cache, executes it, and return its response&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means that on the first invocation it takes between 1 to 4 seconds to generate the specified code. Consecutive requests executes in 150ms, implying it's faster than Python. In fact, it's got roughly 10 better performance and throughput than Python according to tests we've conducted previously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;If you want to play with this, you can &lt;a href="https://github.com/polterguy/magic" rel="noopener noreferrer"&gt;clone Magic&lt;/a&gt;, install the &lt;em&gt;"natural-language-api"&lt;/em&gt; plugin, and test it from Hyper IDE. If this is too much hassle, you can also &lt;a href="https://ainiro.io/buy" rel="noopener noreferrer"&gt;purchase a cloudlet&lt;/a&gt; from us.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hyperlambda is 17 times faster than Python with Flask</title>
      <dc:creator>Thomas Hansen</dc:creator>
      <pubDate>Mon, 24 Nov 2025 07:35:19 +0000</pubDate>
      <link>https://forem.com/polterguy/hyperlambda-is-17-times-faster-than-python-with-flask-1jfk</link>
      <guid>https://forem.com/polterguy/hyperlambda-is-17-times-faster-than-python-with-flask-1jfk</guid>
      <description>&lt;p&gt;I just measured the performance of Python with Flask, and compared it towards Magic with &lt;a href="https://ainiro.io/hyperlambda" rel="noopener noreferrer"&gt;Hyperlambda&lt;/a&gt;, and the results should shock you. Hyperlambda and Magic is on average 17 times faster than Flask. I did the same test where I measure &lt;a href="https://ainiro.io/blog/hyperlambda-is-20-times-faster-than-fast-api-and-python" rel="noopener noreferrer"&gt;Fast API versus Hyperlambda&lt;/a&gt;, except of course I used Flask instead of Fast API, and the results was as follows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flask executed between 2,324 and 3,616 HTTP requests, an average of 4,778&lt;/li&gt;
&lt;li&gt;Hyperlambda executed between 78,000 and 83,361 requests, an average of 80,680&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test creates 50 async tasks or threads, and basically just hammers a CRUD read endpoint that's returning Artist items from my chinook database. The database was copied and pasted from the Hyperlambda solution, so it's the exact same database. The machine is the same, a MacBook Pro M3, and you can find the code below if you wish to reproduce what I did.&lt;/p&gt;

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

&lt;p&gt;To test you can use the code from my &lt;a href="https://ainiro.io/blog/hyperlambda-is-20-times-faster-than-fast-api-and-python" rel="noopener noreferrer"&gt;Fast API article&lt;/a&gt;, but instead of creating a Fast API endpoint you use the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Helper function to query SQLite
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_all_artists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Chinook.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row_factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Row&lt;/span&gt;   &lt;span class="c1"&gt;# Enables dict-like rows
&lt;/span&gt;    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT ArtistId, Name FROM Artist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;dict&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/artists&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;artists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get_all_artists&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5001&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above is a standard solution returning database items using Flask. In case you don't want to check out my previous blog, you can find the &lt;em&gt;"stress testing"&lt;/em&gt; code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:5001/artists&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="c1"&gt;#URL = "http://127.0.0.1:5000/magic/modules/chinook/artist"
&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stop_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;stop_time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;  &lt;span class="c1"&gt;# seconds
&lt;/span&gt;    &lt;span class="n"&gt;concurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;  &lt;span class="c1"&gt;# number of parallel workers
&lt;/span&gt;
    &lt;span class="n"&gt;counters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;stop_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nf"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stop_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Requests sent: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Successful:     &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed:         &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;counters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fail&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Req/sec:        &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To test the Hyperlambda endpoint, change the &lt;code&gt;URL&lt;/code&gt; variable you're using, run the test 3 times towards each endpoint, and calculate the average of each run. This should give you a representative average value for each example. To generate the Hyperlambda code, I simply used the &lt;a href="https://ainiro.io/crud-generator" rel="noopener noreferrer"&gt;CRUD generator&lt;/a&gt; to wrap my chinook database. Remember to turn &lt;strong&gt;off&lt;/strong&gt; authorisation requirements before generating your CRUD endpoints to get the equivalent code, and make sure you either pass in &lt;code&gt;limit=1&lt;/code&gt; as a query paremeter to the endpoint, or edit the endpoint manually to return &lt;em&gt;all records&lt;/em&gt;. Otherwise the Hyperlambda code will only return 25 items.&lt;/p&gt;

&lt;p&gt;Interestingly, Flask seems to be able to accept more throughput than Fast API, but it of course becomes equivalent to &lt;em&gt;"nothing"&lt;/em&gt; compared to the amount of throughput Hyperlambda can deal with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;A Volkswagen Beetle can probably do 120KM per hour. Multiplying that number by 17, and you get 2,040KM per hour. That's about the same as the maximum speed of a modern fighter jet. Implying ...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hyperlambda versus Python and Flask, is like trying to race a fighter jet with a Volkswagen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As in, yes, the performance difference between Flask and Hyperlambda is the same as the performance difference between a 20 year old Volkswagen and a modern fighter jet!&lt;/p&gt;

</description>
      <category>python</category>
      <category>productivity</category>
      <category>performance</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
