<?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: Lucas Guimarães</title>
    <description>The latest articles on DEV Community by Lucas Guimarães (@lucas_guimaraes).</description>
    <link>https://dev.to/lucas_guimaraes</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%2F3875449%2Fd45f3256-5a0b-43bd-8de8-68a3c1872029.jpg</url>
      <title>DEV Community: Lucas Guimarães</title>
      <link>https://dev.to/lucas_guimaraes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucas_guimaraes"/>
    <language>en</language>
    <item>
      <title>Why I'm Writing Server-Side synchronous JavaScript (And Why It Beats Node.js for APIs)</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Thu, 30 Apr 2026 01:26:57 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/why-im-writing-server-side-es5-in-2026-and-why-it-beats-nodejs-for-apis-4iba</link>
      <guid>https://dev.to/lucas_guimaraes/why-im-writing-server-side-es5-in-2026-and-why-it-beats-nodejs-for-apis-4iba</guid>
      <description>&lt;p&gt;If you tell a developer today that you are writing server-side JavaScript, they will immediately assume you are setting up Node.js, Deno, or Bun. They will picture &lt;code&gt;package.json&lt;/code&gt; files, a massive &lt;code&gt;node_modules&lt;/code&gt; folder, and a build pipeline just to get a simple API running.&lt;/p&gt;

&lt;p&gt;What if I told you I am deploying highly concurrent, database-driven JavaScript APIs on Linux without a single &lt;code&gt;npm install&lt;/code&gt;? &lt;/p&gt;

&lt;p&gt;I am doing this using &lt;strong&gt;AxonASP&lt;/strong&gt;, a runtime built in GoLang that executes Classic ASP. But instead of sticking exclusively to VBScript, I am utilizing its built-in JavaScript engine. &lt;/p&gt;

&lt;p&gt;Before you dismiss this as retro-computing nostalgia, let's look at the architectural advantages of choosing this stack over a traditional Node.js environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Batteries Included" Philosophy vs. Dependency Hell
&lt;/h3&gt;

&lt;p&gt;The biggest friction point in the Node.js ecosystem is the reliance on third-party packages for fundamental operations. Need to connect to a database? Download a driver. Need to process an image? Download a heavy wrapper around a C library. Need to send an email? That's another dependency.&lt;/p&gt;

&lt;p&gt;AxonASP takes the opposite approach. It is distributed as a single, compiled Go binary[cite: 8]. Instead of relying on a fragmented package ecosystem, it injects zero-allocation native Go libraries directly into the runtime. &lt;/p&gt;

&lt;p&gt;When writing JavaScript in AxonASP, you have immediate access to enterprise-grade tools natively:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;G3DB:&lt;/strong&gt; High-performance database connectivity with built-in connection pooling for SQLite, MySQL, PostgreSQL, MS SQL Server, Oracle, and MS Access.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;G3IMAGE:&lt;/strong&gt; Process, draw, manipulate, and convert images on the fly.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;G3CRYPTO &amp;amp; G3MAIL:&lt;/strong&gt; Generate hashes, encrypt data, and send SMTP emails with attachments out of the box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get the power of compiled Go libraries exposed directly to your JavaScript code, with virtually zero overhead. &lt;/p&gt;

&lt;h3&gt;
  
  
  ES5 vs. ES6+: The Synchronous Advantage
&lt;/h3&gt;

&lt;p&gt;AxonASP features an AST-based JScript engine derived from Goja. It is mostly compliant with ECMAScript 5, supporting strict mode, &lt;code&gt;JSON&lt;/code&gt;, and array methods like &lt;code&gt;map&lt;/code&gt; and &lt;code&gt;filter&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;I know what you are thinking: &lt;em&gt;ES5? No async/await? No arrow functions?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;In a Node.js environment, &lt;code&gt;async/await&lt;/code&gt; is strictly necessary because Node runs on a single-threaded event loop. If you block the thread with a synchronous database query, the entire server freezes. This forces you to write asynchronous code for everything.&lt;/p&gt;

&lt;p&gt;AxonASP, however, relies on native Go concurrency for handling multiple requests. Every HTTP request is handled in its own isolated goroutine. This means you can write straightforward, synchronous, top-down JavaScript without worrying about blocking the server. &lt;/p&gt;

&lt;p&gt;You query the database, you get the result on the next line, and you send it to the client. No callbacks, no promises, no mental gymnastics. Just clean, linear procedural code that is incredibly easy to debug and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Power of Native ASP Objects
&lt;/h3&gt;

&lt;p&gt;When you build an API in Express.js or Fastify, you spend time configuring routing, middleware, and request parsers. &lt;/p&gt;

&lt;p&gt;In AxonASP, the file system &lt;em&gt;is&lt;/em&gt; the router. You drop an &lt;code&gt;api.asp&lt;/code&gt; file into your directory, and it's instantly live. More importantly, you have instant access to the robust, battle-tested standard ASP objects. &lt;/p&gt;

&lt;p&gt;Reading headers, parsing query strings, and handling form data is done natively through the &lt;code&gt;Request&lt;/code&gt; object. Outputting data is handled by the &lt;code&gt;Response&lt;/code&gt; object. It is a frictionless layer between the HTTP protocol and your business logic. Furthermore, you can even mix JavaScript and VBScript seamlessly in the same application if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment and Footprint
&lt;/h3&gt;

&lt;p&gt;Deploying Node.js apps usually involves managing process managers like PM2, copying over thousands of files, and dealing with memory bloat. &lt;/p&gt;

&lt;p&gt;AxonASP requires minimal resource consumption and boasts a server startup time measured in milliseconds. You can run it natively on Windows, Linux, or macOS, and it is entirely Docker-friendly. You can expose it via its built-in HTTP proxy mode or integrate it directly into Nginx or Apache using FastCGI. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion: Pragmatism Over Hype
&lt;/h3&gt;

&lt;p&gt;Is Node.js or Bun faster at pure mathematical compute? Probably. Do they have newer language syntax? Yes. &lt;/p&gt;

&lt;p&gt;But when it comes to shipping a business application or a micro-API quickly, stability and simplicity win. AxonASP allows us to write standard JavaScript, connect to a robust GoLang-backed database pool, and deploy a single binary to a lightweight Linux server. &lt;/p&gt;

&lt;p&gt;It is not about chasing the latest framework; it is about building stable, fast, and easily maintainable systems. Sometimes, the best way forward is looking at what already worked, stripping away the bloat, and supercharging it with modern system architecture.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>backend</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Server-Side JavaScript in ASP? Building APIs on Linux with AxonASP</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Wed, 29 Apr 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/server-side-javascript-in-asp-building-apis-on-linux-with-axonasp-5c4o</link>
      <guid>https://dev.to/lucas_guimaraes/server-side-javascript-in-asp-building-apis-on-linux-with-axonasp-5c4o</guid>
      <description>&lt;p&gt;When we talk about Classic ASP, the first thing that comes to mind is usually VBScript. It’s a great, straightforward language, but let's be honest: in the modern web ecosystem, everything talks JSON. And generating JSON manually by concatenating strings in VBScript is a nightmare no developer should have to endure today.&lt;/p&gt;

&lt;p&gt;But here is a forgotten fact: Classic ASP on Windows always supported JScript.&lt;/p&gt;

&lt;p&gt;With AxonASP (&lt;a href="https://github.com/guimaraeslucas/axonasp" rel="noopener noreferrer"&gt;https://github.com/guimaraeslucas/axonasp&lt;/a&gt;), a GoLang-based server that runs Classic ASP natively on Linux, macOS, and Windows — this capability isn't just preserved; it becomes a powerful tool. AxonASP implements an ECMAScript 5.0 (ES5) engine, allowing you to write server-side JavaScript seamlessly integrated with your ASP pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Best of Both Worlds&lt;/strong&gt;&lt;br&gt;
By using JavaScript as your primary language in an ASP page, you can naturally mix HTML content with server-rendered JS. More importantly, it completely eliminates the friction of building APIs. You get the native syntax of JavaScript (including built-in JSON.stringify and JSON.parse) combined with the robust, battle-tested standard ASP objects like Response, Request, and Server.&lt;/p&gt;

&lt;p&gt;Add to this ecosystem libraries like G3DB, which makes connecting to and querying multiple databases simultaneously a breeze, and you suddenly have a highly capable, extremely lightweight backend stack running directly on a Linux server or inside a Docker container.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Example: A Micro-API Endpoint&lt;/strong&gt;&lt;br&gt;
To show you how this looks in practice, let's build a simple, secure API endpoint.&lt;/p&gt;

&lt;p&gt;Imagine you need to serve data to a modern Vue.js or React frontend. Instead of setting up a heavy framework, you can drop this .asp file into your AxonASP www folder. It reads a query parameter, queries a database using G3DB, formats the result as JSON, and serves it with the correct HTTP headers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsp"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="nc"&gt;Language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"JavaScript"&lt;/span&gt; &lt;span class="nt"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;%&lt;/span&gt;
&lt;span class="c1"&gt;// 1. Setup modern HTTP headers for our API&lt;/span&gt;
&lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ContentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Charset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AddHeader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Access-Control-Allow-Origin"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Define our data retrieval logic&lt;/span&gt;
&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getRecordData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recordId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Instantiate the library with the primary ProgID.&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CreateObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"G3DB"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Opens using configuration/env values.&lt;/span&gt;
    &lt;span class="c1"&gt;// Returns True on successful open from config/env; False otherwise.&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;isConnected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OpenFromEnv&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mysql"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;isConnected&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Returns the current error string.&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Database connection failed: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GetError&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; 
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Use parameterized queries to ensure security against SQL Injection&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"SELECT id, status, created_at, assigned_user FROM workflow_queue WHERE id = ?"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Executes a query and returns a forward-only result set.&lt;/span&gt;
    &lt;span class="c1"&gt;// Placeholder rewriting converts ? markers to the active driver format when needed.&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Query&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recordId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Check if the result set is valid (G3DB returns Empty on failure).&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EOF&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Map the Recordset directly into a native JavaScript Object&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nl"&gt;id:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                &lt;span class="nl"&gt;createdAt:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"created_at"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                &lt;span class="nl"&gt;assignedTo:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"assigned_user"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;};&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Always clean up the Recordset&lt;/span&gt;
        &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Capture execution failures using the read-only LastError property.&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Query execution failed: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LastError&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Closes the current database pool managed by the G3DB object.&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; 

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Process the incoming request&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Extract the ID from the URL (e.g., api.asp?id=1042)&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;reqId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;QueryString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqId&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s"&gt;"undefined"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;reqId&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"400 Bad Request"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringify&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; 
            &lt;span class="nl"&gt;success:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
            &lt;span class="nl"&gt;error:&lt;/span&gt; &lt;span class="s"&gt;"Missing required parameter: id."&lt;/span&gt; 
        &lt;span class="o"&gt;}));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getRecordData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reqId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Success: output standard JSON using native ES5 stringify&lt;/span&gt;
            &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringify&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; 
                &lt;span class="nl"&gt;success:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
                &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; 
            &lt;span class="o"&gt;}));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"404 Not Found"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringify&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; 
                &lt;span class="nl"&gt;success:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
                &lt;span class="nl"&gt;error:&lt;/span&gt; &lt;span class="s"&gt;"Record not found in the database."&lt;/span&gt; 
            &lt;span class="o"&gt;}));&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Global error handler&lt;/span&gt;
    &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"500 Internal Server Error"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringify&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; 
        &lt;span class="nl"&gt;success:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
        &lt;span class="nl"&gt;error:&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt; 
    &lt;span class="o"&gt;}));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
Look at the code above. It is valid JavaScript, it runs incredibly fast, and it does exactly what it needs to do without layers of middleware or complex routing configurations.&lt;/p&gt;

&lt;p&gt;Because AxonASP is built on GoLang, this entire environment is completely decoupled from Windows Server. You can write your legacy or new ASP systems using the syntax you already know, leverage standard ASP objects, query your databases with G3DB, and deploy it all on a minimal Linux distribution.&lt;/p&gt;

&lt;p&gt;If you are maintaining Classic ASP applications, migrating them doesn't have to mean rewriting them from scratch in another language. You can modernize the infrastructure, switch to JavaScript where it makes sense (like API endpoints), and keep your systems running smoothly for the next decade.&lt;/p&gt;

</description>
      <category>asp</category>
      <category>api</category>
      <category>backend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Running Classic ASP on Linux in 2026</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Wed, 29 Apr 2026 00:25:52 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/running-classic-asp-on-linux-in-2026-595p</link>
      <guid>https://dev.to/lucas_guimaraes/running-classic-asp-on-linux-in-2026-595p</guid>
      <description>&lt;p&gt;Yes, it is 2026, and Classic ASP is still very much alive.&lt;/p&gt;

&lt;p&gt;While many consider it a relic of the past, the reality is that many companies still rely on it for internal systems, legacy enterprise tools, and even public-facing pages. For a long time, the biggest drawback was the platform lock-in: if you wanted to run ASP, you were tied to Windows and IIS.&lt;/p&gt;

&lt;p&gt;But things have changed. VBScript is a remarkably straightforward language that deserves to be preserved, and for those who prefer it, modern implementations even allow you to mix in JavaScript.&lt;/p&gt;

&lt;p&gt;I’ve been working on a solution to bring this stack into the modern era of infrastructure. It’s called AxonASP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why AxonASP?&lt;/strong&gt;&lt;br&gt;
Written in GoLang, AxonASP is a cross-platform server that allows you to run Classic ASP on Linux, macOS, and Windows. This means you can finally containerize your legacy applications using Docker or deploy them on ultra-lightweight Linux instances.&lt;/p&gt;

&lt;p&gt;How lightweight? A simple AWS T2.nano virtual machine with just 512 MB of RAM is more than enough to serve your website. You can maintain your legacy systems (or build new ones) directly from a Linux environment with minimal overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation Guide&lt;/strong&gt;&lt;br&gt;
You can find the project and the latest releases on GitHub: github.com/guimaraeslucas/axonasp.&lt;/p&gt;

&lt;p&gt;To get started on Linux, you can download the package specific to your distribution using wget. Replace the extension according to your needs (.rpm, .deb, or .apk):&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;# For Alpine (APK)&lt;/span&gt;
wget https://github.com/guimaraeslucas/axonasp/releases/download/v1.2.2/axonasp_1.2.2_x86_64.apk

&lt;span class="c"&gt;# For Debian/Ubuntu (DEB)&lt;/span&gt;
wget https://github.com/guimaraeslucas/axonasp/releases/download/v1.2.2/axonasp_1.2.2_x86_64.deb

&lt;span class="c"&gt;# For RHEL/Fedora/Amazon Linux (RPM)&lt;/span&gt;
wget https://github.com/guimaraeslucas/axonasp/releases/download/v1.2.2/axonasp_1.2.2_x86_64.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since Amazon Linux is the standard for AWS environments, here is how you install it using dnf:&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="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; ./axonasp_1.2.2_x86_64.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Running the Server&lt;/strong&gt;&lt;br&gt;
After installation, the server files are located in /opt/axonasp. To do a quick test, navigate to the directory and run the HTTP binary:&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="nb"&gt;cd&lt;/span&gt; /opt/axonasp
./axonasp-http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, the server will look for your files in the opt/axonasp/www/ folder. You can tweak the behavior, ports, and logic by editing the configuration file at &lt;em&gt;config/axonasp.toml&lt;/em&gt;. Your site will be live at &lt;em&gt;localhost:8801&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production Deployment (Nginx Reverse Proxy)&lt;/strong&gt;&lt;br&gt;
To expose your application to the public web with proper security and SSL, you should use a reverse proxy like Nginx. Here is example configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;upstream&lt;/span&gt; &lt;span class="s"&gt;axonasp_backend&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;server&lt;/span&gt; &lt;span class="nf"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8801&lt;/span&gt; &lt;span class="s"&gt;max_fails=3&lt;/span&gt; &lt;span class="s"&gt;fail_timeout=30s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;myapp.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;myapp.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/ssl/certs/myapp.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/ssl/private/myapp.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt; &lt;span class="s"&gt;TLSv1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://axonasp_backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_request_buffering&lt;/span&gt; &lt;span class="no"&gt;off&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;p&gt;&lt;strong&gt;Running as a Daemon&lt;/strong&gt;&lt;br&gt;
In a production Linux environment, you don't want to run the binary manually. AxonASP comes with a helper to handle the systemd installation automatically:&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="nb"&gt;sudo&lt;/span&gt; ./axonasp-service &lt;span class="nb"&gt;install
sudo&lt;/span&gt; ./axonasp-service start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will register AxonASP as a service, ensuring it starts automatically on boot.&lt;/p&gt;

&lt;p&gt;Classic ASP doesn't have to be stuck in 1998. With the right tools, it's a viable, lightweight, and incredibly fast option for 2026.&lt;/p&gt;

</description>
      <category>asp</category>
      <category>linux</category>
      <category>aws</category>
      <category>go</category>
    </item>
    <item>
      <title>We brought Classic ASP to Linux: Check out the AxonASP video and our new live manual!</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Sun, 19 Apr 2026 22:00:31 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/we-brought-classic-asp-to-linux-check-out-the-axonasp-video-and-our-new-live-manual-4mmh</link>
      <guid>https://dev.to/lucas_guimaraes/we-brought-classic-asp-to-linux-check-out-the-axonasp-video-and-our-new-live-manual-4mmh</guid>
      <description>&lt;p&gt;Hey DEV community! 👋&lt;/p&gt;

&lt;p&gt;Recently, I shared how I completely rewrote the Classic ASP engine from scratch in Go to save legacy applications from Microsoft's VBScript deprecation. Today, I'm super excited to share a short video presentation I just put together showing AxonASP 2.0 in action!&lt;/p&gt;

&lt;p&gt;You can watch the full breakdown of how we achieved zero-AST execution, extreme speeds, and cross-platform compatibility right here:&lt;br&gt;
👉 (Insert your YouTube Video Link here)&lt;/p&gt;

&lt;p&gt;📖 More than just docs: A complete learning hub&lt;br&gt;
One of the biggest challenges with older technology is that the old forums, tutorials, and documentation are slowly disappearing from the web. To fix this, we didn't just build an engine; we built a comprehensive, modern manual.&lt;/p&gt;

&lt;p&gt;Whether you are a veteran migrating a legacy enterprise app or a modern developer wondering what ASP even is, the manual has you covered. It features:&lt;/p&gt;

&lt;p&gt;The Basics: A complete, friendly refresher on fundamental Classic ASP concepts.&lt;/p&gt;

&lt;p&gt;The Modern Extensions: Detailed, copy-pasteable examples on how to use our new native Go objects directly inside your VBScript. You'll learn how to parse APIs with G3JSON, fetch external resources with G3HTTP, and even render Markdown to HTML instantly using G3MD.&lt;/p&gt;

&lt;p&gt;Containerization: Step-by-step guides on using our Docker containers so you can containerize your 20-year-old apps in seconds.&lt;/p&gt;

&lt;p&gt;Real-time CLI: Instructions on how to use our interactive command-line interface. You can actually write, test, and learn ASP snippets in real-time, right from your terminal!&lt;/p&gt;

&lt;p&gt;🤯 Eating our own dog food&lt;br&gt;
Here is my favorite part: The manual itself is a Classic ASP application. If you visit the link below, you aren't just reading static files. That entire documentation site is currently running live in production, powered natively by the AxonASP engine, sitting securely behind an Nginx reverse proxy on a Linux server. It's fast, stable, and proves exactly what this architecture is capable of handling in the real world.&lt;/p&gt;

&lt;p&gt;🔗 Explore it yourself&lt;br&gt;
I'd love for you to watch the video, poke around the docs, and try it out. Let me know what you think of the architecture in the comments!&lt;/p&gt;

&lt;p&gt;Read the live manual (running on AxonASP + Linux + Nginx): &lt;a href="https://g3pix.com.br/axonasp/manual/default.asp" rel="noopener noreferrer"&gt;https://g3pix.com.br/axonasp/manual/default.asp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the source code and drop a star: &lt;a href="https://github.com/guimaraeslucas/axonasp" rel="noopener noreferrer"&gt;https://github.com/guimaraeslucas/axonasp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>cloud</category>
      <category>web</category>
      <category>asp</category>
    </item>
    <item>
      <title>A 30-year-old language optimized for future: Building a Zero-AST Virtual Machine in Go that can run ASP</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Tue, 14 Apr 2026 13:10:00 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/a-30-year-old-language-optimized-for-future-building-a-zero-ast-virtual-machine-in-go-that-can-run-bjg</link>
      <guid>https://dev.to/lucas_guimaraes/a-30-year-old-language-optimized-for-future-building-a-zero-ast-virtual-machine-in-go-that-can-run-bjg</guid>
      <description>&lt;p&gt;Hey DEV community! 👋 I'm back again.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you think Classic ASP is dead, let me tell you: it is now more alive than ever.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Recently, I completed a total refactoring of the codebase for version 2.0 of AxonASP, my open-source Go engine for VBScript and Classic ASP. The goal wasn't just to keep legacy code breathing; I wanted to push the boundaries of what this 90s language could actually achieve on modern hardware.&lt;/p&gt;

&lt;p&gt;I want to share some of the deep engineering optimizations we implemented under the hood to make this happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚡ Zero AST, Pure Bytecode&lt;/strong&gt;&lt;br&gt;
In this rewrite, I made a huge architectural leap: threw out the Abstract Syntax Tree (AST).&lt;/p&gt;

&lt;p&gt;Instead, the new single-pass compiler emits bytecode directly to a stack-based Virtual Machine. By eliminating the AST, AxonASP executes scripts with virtually zero-allocation overhead. The memory footprint drops drastically, and execution is fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔄 IIS-Style VM Pooling &amp;amp; Advanced Caching&lt;/strong&gt;&lt;br&gt;
To handle high concurrency, I implemented an advanced VM pool modeled perfectly after the original IIS architecture, but backed by Go's native goroutines. Also I combined this with aggressive script caching, and even implemented compilation caching for dynamic execution (eval, execute, and executeglobal). The result is that request processing times are  faster compared to traditional ASP&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Making ASP a Joy to Write Again&lt;/strong&gt;&lt;br&gt;
Pure speed is great, but developer experience matters just as much. We didn't stop at just supporting the legacy standard library. We injected over 60 custom Axon functions directly into the runtime. You now have access to advanced array manipulation, native JSON handling, and cryptographic tools right out of the box. It actually makes writing ASP a joy again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Test-Driven ASP (Yes, really)&lt;/strong&gt;&lt;br&gt;
Say goodbye to broken scripts and regressions. I wanted to bring modern development practices to the language, so we built the new axonasp-testsuite executable. It allows you to write and run automated test suites natively, directly against your .asp files! TDD in Classic ASP is finally a reality.&lt;/p&gt;

&lt;p&gt;If you are curious about how all of this works, or if you have a legacy application you want to rescue, we’ve put together a complete, comprehensive manual right inside the repository to help you get started.&lt;/p&gt;

&lt;p&gt;Classic ASP might be a piece of retro-computing history, but with these optimizations, it's ready for the modern web. I'd love to hear what you guys think of.&lt;/p&gt;

&lt;p&gt;👉 Check out the repo and the source code here: &lt;a href="https://github.com/guimaraeslucas/axonasp" rel="noopener noreferrer"&gt;https://github.com/guimaraeslucas/axonasp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>go</category>
      <category>asp</category>
      <category>virtualmachine</category>
    </item>
    <item>
      <title>Microsoft killed VBScript, so I built a custom Go VM to bring Classic ASP into 2026</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:55:19 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/microsoft-killed-vbscript-so-i-built-a-custom-go-vm-to-bring-classic-asp-into-2026-375c</link>
      <guid>https://dev.to/lucas_guimaraes/microsoft-killed-vbscript-so-i-built-a-custom-go-vm-to-bring-classic-asp-into-2026-375c</guid>
      <description>&lt;p&gt;Hey DEV community! 👋&lt;/p&gt;

&lt;p&gt;I don't have a formal IT degree—my day job is actually as a Doctor —but I am a self-taught Go developer with a massive passion for 90s retro-computing and legacy software preservation.&lt;/p&gt;

&lt;p&gt;Recently, with Microsoft officially pulling the plug on VBScript and Classic ASP having been neglected for years, I realized a lot of legacy code was going to be left in the dark. Instead of letting it die, I decided to do something a little crazy: I completely rewrote the engine from scratch in Go.&lt;/p&gt;

&lt;p&gt;Let me introduce you to AxonASP 2.0.&lt;/p&gt;

&lt;p&gt;It’s an open-source project designed not just to keep legacy code alive, but to allow Classic ASP to actually evolve into the modern web era.&lt;/p&gt;

&lt;p&gt;⚡ The Go Architecture: Why it's so fast&lt;br&gt;
Writing an interpreter in Go has been an incredible engineering journey. I wanted to achieve extreme performance, so I threw out the traditional Abstract Syntax Tree (AST) approach.&lt;/p&gt;

&lt;p&gt;Under the hood, AxonASP features a single-pass compiler that emits bytecode directly to a highly optimized, register-based Virtual Machine (AxonVM). By aggressively avoiding reflection and minimizing heap allocations in Go, the script execution overhead is practically zero. It’s insanely fast and memory-optimized, mimicking an IIS-style VM pool using Go's native concurrency (goroutines).&lt;/p&gt;

&lt;p&gt;🛠️ Bringing ASP to the Modern Age&lt;br&gt;
I didn't just want a 1:1 clone; I wanted to build the tools that ASP developers wished they had 20 years ago. Here is what the runtime currently includes:&lt;/p&gt;

&lt;p&gt;Native AI Integration: It has a built-in MCP (Model Context Protocol) server. You can hook your AI agents/LLMs directly into the runtime to autonomously write and refactor ASP code based on your local environment.&lt;/p&gt;

&lt;p&gt;A Real CLI &amp;amp; TUI: You can finally execute ASP and VBScript directly from your terminal! It features a Text User Interface, making it perfect for running cron jobs or system admin scripts.&lt;/p&gt;

&lt;p&gt;Modern Workflows: AxonASP comes with a native test suite (axonasp-testsuite) so you can write automated assertions for your old ASP scripts.&lt;/p&gt;

&lt;p&gt;Truly Cross-Platform: It runs natively on Windows, Linux, and macOS across most architectures. You are no longer chained to Windows Server.&lt;/p&gt;

&lt;p&gt;Flexible Serving: It ships with both a FastCGI daemon (perfect for Nginx/Apache) and a built-in HTTP server.&lt;/p&gt;

&lt;p&gt;📦 Try it out!&lt;br&gt;
I would absolutely love to get feedback from this community. What do you think of the architecture? What modern features would you add to a language from the 90s?&lt;/p&gt;

&lt;p&gt;You can check out the source code, the complete documentation, and architectural examples (yes, MVC in Classic ASP!) right here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/guimaraeslucas/axonasp" rel="noopener noreferrer"&gt;https://github.com/guimaraeslucas/axonasp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ah! You can also import and convert Access databases in Windows, and create prompts for IA Agents to code the ASP pages you want.&lt;/p&gt;

&lt;p&gt;Note: If you just want to take it for a spin, the repo includes a simple Windows installer and a fully configured Docker setup so you can run it in seconds.&lt;/p&gt;

&lt;p&gt;Let me know what you think in the comments!  💻🩺&lt;/p&gt;

</description>
      <category>go</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
