<?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>Running Classic ASP Without IIS: The Modern Cross-Platform Alternative</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Mon, 25 May 2026 13:05:25 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/running-classic-asp-without-iis-the-modern-cross-platform-alternative-5d59</link>
      <guid>https://dev.to/lucas_guimaraes/running-classic-asp-without-iis-the-modern-cross-platform-alternative-5d59</guid>
      <description>&lt;p&gt;For decades, Internet Information Services (IIS) has been the undisputed home for Classic ASP applications. However, the landscape of web hosting is changing rapidly. With Microsoft officially announcing the deprecation of VBScript, many developers and system administrators are left wondering about the future of their legacy codebases. Migrating massive, business-critical Classic ASP applications to a new language is often too expensive and time-consuming.&lt;/p&gt;

&lt;p&gt;Historically, when developers looked for an alternative to IIS, they turned to solutions like &lt;strong&gt;Sun ONE ASP&lt;/strong&gt; (formerly ChiliSoft), &lt;strong&gt;Abyss Web Server&lt;/strong&gt;, or the lightweight &lt;strong&gt;Baby Web Server&lt;/strong&gt;. Today, these options are either long abandoned, proprietary, or lack the modern architecture required for contemporary cloud deployments.&lt;/p&gt;

&lt;p&gt;If you are searching for a viable, actively maintained alternative to IIS to keep your Classic ASP applications running securely and efficiently, the solution is &lt;strong&gt;AxonASP&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AxonASP?
&lt;/h2&gt;

&lt;p&gt;AxonASP is an open-source server environment built from the ground up to host Classic ASP applications on virtually any operating system. It completely removes the dependency on Windows Server and IIS, providing a bridge between legacy VBScript codebases and modern deployment infrastructure.&lt;/p&gt;

&lt;p&gt;Instead of being a commercial product trying to lock you in, AxonASP is a community-driven project aimed at bringing Classic ASP into the modern era.&lt;/p&gt;

&lt;h2&gt;
  
  
  A True Cross-Platform Architecture
&lt;/h2&gt;

&lt;p&gt;Because AxonASP is written in &lt;strong&gt;Go (Golang)&lt;/strong&gt;, it boasts true cross-platform compatibility. You are no longer tied to Windows environments. You can run your Classic ASP applications natively on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux&lt;/strong&gt; (Ubuntu, Debian, Alpine, CentOS, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ARM Architectures&lt;/strong&gt; (Making it compatible with Raspberry Pi, Apple Silicon, and efficient cloud processors like AWS Graviton)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can deploy AxonASP as a lightweight standalone executable application or run it as a &lt;strong&gt;Docker container&lt;/strong&gt;. This containerization support is critical for teams wanting to integrate legacy ASP applications into modern CI/CD pipelines and Kubernetes clusters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance: Low Footprint, High Speed
&lt;/h2&gt;

&lt;p&gt;One of the biggest drawbacks of traditional IIS or older alternatives like Abyss Web Server was their resource consumption.&lt;/p&gt;

&lt;p&gt;AxonASP leverages Go's highly efficient concurrency model and memory management. The result is a server with an incredibly low CPU and memory footprint. It can handle high-traffic workloads while consuming a fraction of the resources required by a full Windows Server installation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Caching for VBScript
&lt;/h3&gt;

&lt;p&gt;A common pain point in Classic ASP development was the performance hit associated with dynamic code execution. AxonASP tackles this by introducing a highly optimized, advanced caching system.&lt;/p&gt;

&lt;p&gt;Under the hood, the engine intelligently caches parsed scripts and compiled states. This optimization means that traditionally expensive VBScript operations—specifically the &lt;code&gt;Eval&lt;/code&gt; and &lt;code&gt;Execute&lt;/code&gt; commands—run significantly faster than they did on legacy engines. AxonASP doesn't just run Classic ASP; it optimizes the execution of the code to meet modern speed expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose AxonASP Over Legacy Alternatives?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Future-Proofing Against VBScript Deprecation:&lt;/strong&gt; As Microsoft phases out native VBScript support in future Windows builds, AxonASP provides a self-contained runtime environment that ensures your code continues to work indefinitely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source and Actively Maintained:&lt;/strong&gt; Unlike Sun ONE ASP or Baby Web Server, AxonASP is open-source. It is actively developed, meaning bugs are patched, modern web standards are supported, and the community can audit the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Deployment:&lt;/strong&gt; By supporting Docker and Linux, you can finally move your ASP applications off expensive Windows Server licenses and onto cost-effective, scalable cloud Linux instances.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Finding a viable alternative to IIS for Classic ASP doesn't mean you have to rely on outdated, unsupported software like Sun ONE or Abyss. AxonASP proves that legacy code can thrive in modern environments. By combining the flexibility of GoLang, support for Docker and ARM, and advanced caching optimizations, AxonASP is ensuring that Classic ASP remains a fast, reliable, and deployable technology for years to come.&lt;/p&gt;

</description>
      <category>iis</category>
      <category>asp</category>
      <category>go</category>
      <category>cloud</category>
    </item>
    <item>
      <title>VBScript Still Lives: How a Custom Go VM Brought Classic ASP to Linux and Mac</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Mon, 25 May 2026 01:45:40 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/vbscript-still-lives-how-a-custom-go-vm-brought-classic-asp-to-linux-and-mac-3861</link>
      <guid>https://dev.to/lucas_guimaraes/vbscript-still-lives-how-a-custom-go-vm-brought-classic-asp-to-linux-and-mac-3861</guid>
      <description>&lt;p&gt;When Microsoft officially announced the deprecation of VBScript, it signaled the end of an era. For decades, thousands of critical Line-of-Business (LoB) applications, internal ERPs, and legacy systems built on Classic ASP have been quietly powering corporate intranets, entirely tethered to Windows Server and IIS.&lt;/p&gt;

&lt;p&gt;The conventional wisdom dictates that legacy platforms should be rewritten in modern stacks. But rewriting decades of perfectly functional business logic is expensive, risky, and often unnecessary. Instead of letting VBScript die, ** AxonASP ** took a radically different engineering approach: rewriting the entire execution engine from scratch in Go to bring Classic ASP to Linux, macOS, and Docker.&lt;/p&gt;

&lt;p&gt;Here is a technical deep dive into how a language from the 90s was re-engineered for the modern cloud computing era.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dropping the AST: The Shift to a Single-Pass Compiler
&lt;/h2&gt;

&lt;p&gt;The original Microsoft VBScript interpreter relied heavily on older parsing technologies that suffered from repetitive string parsing and high memory allocation overhead under concurrent loads. To achieve modern performance, the AxonASP architecture completely discarded the traditional Abstract Syntax Tree (AST) approach for VBScript execution.&lt;/p&gt;

&lt;p&gt;Instead, the runtime features a custom single-pass compiler. As the engine reads the legacy VBScript/VB6-style code, it emits bytecode directly to a highly optimized, stack-based Virtual Machine known as AxonVM. By aggressively avoiding reflection and minimizing dynamic heap allocations in Go, the VBScript execution achieves a virtually zero-allocation overhead.&lt;/p&gt;

&lt;p&gt;To handle concurrency, the engine implements an "IIS-style VM pooling" mechanism that maps directly to Go's native goroutines. This means the server can handle high request concurrency with a drastically reduced memory footprint, often outperforming the original Windows Server ASP engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dual-Language Engine: Synchronous Server-Side JavaScript
&lt;/h2&gt;

&lt;p&gt;While preserving VBScript was the primary goal, a modern runtime needs to speak the language of today's web. The engine implements an AST-based JavaScript runtime (derived from Goja) strictly compliant with ECMAScript 6+.&lt;/p&gt;

&lt;p&gt;Because it operates as a dual-language engine, developers can actually mix modern JS (using &lt;code&gt;Array.map&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt;, and strict mode) with legacy VBScript in the exact same application environment.&lt;/p&gt;

&lt;p&gt;More importantly, the latest architectural updates introduced Node.js compatibility, including support for CommonJS &lt;code&gt;require&lt;/code&gt; and ECMAScript Modules (&lt;code&gt;.mjs&lt;/code&gt; files). This brings an interesting paradigm shift: &lt;strong&gt;Synchronous Server-Side JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike Node.js, which forces an asynchronous, event-driven loop and continuous &lt;code&gt;async/await&lt;/code&gt; chaining for I/O operations, AxonASP runs each request in its own preemptive goroutine. Developers can write traditional top-to-bottom synchronous JavaScript to fetch database records without blocking the entire web server, drastically lowering the cognitive friction for simple APIs and database-heavy admin panels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern Tooling: CLI, WASM, and AI Integration
&lt;/h2&gt;

&lt;p&gt;Taking ASP out of IIS unlocked completely new deployment and execution models that were previously impossible for VBScript:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CLI and TUI Execution:&lt;/strong&gt; The runtime ships with a Text User Interface (TUI) and a Command-Line Interface, allowing VBScript and ASP code to be executed directly from a Linux terminal. This makes it possible to use legacy ASP logic for background cron jobs and system administration scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Computing via WebAssembly (WASM):&lt;/strong&gt; In an experimental push, the engine can be compiled to WebAssembly. This allows legacy server-side ASP and VBScript to run directly inside the user's web browser, opening doors for offline-capable web applications just like Blazor, but using AxonLive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in MCP Server:&lt;/strong&gt; Acknowledging the shift toward AI-assisted development, the runtime embeds a Model Context Protocol (MCP) server. AI agents (like those in VS Code) can connect directly to the runtime to understand the system's native libraries, and autonomously refactor or write new ASP code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Software doesn't have to die just because a corporation stops supporting it. Released under the open-source MPL-2.0 license, this project proves that with the right architectural foundations (and the immense power of Go), even a language as maligned as VBScript can be modernized to run cleanly on modern Linux containers.&lt;/p&gt;

&lt;p&gt;VBScript might be officially deprecated by Microsoft, but thanks to open-source engineering, it is very much alive.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>asp</category>
      <category>linux</category>
      <category>go</category>
    </item>
    <item>
      <title>What Happens When You Teach Old Scripting Languages New Runtime Tricks?</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Mon, 25 May 2026 01:45:24 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/what-happens-when-you-teach-old-scripting-languages-new-runtime-tricks-4hmj</link>
      <guid>https://dev.to/lucas_guimaraes/what-happens-when-you-teach-old-scripting-languages-new-runtime-tricks-4hmj</guid>
      <description>&lt;p&gt;For a long time, Classic ASP, VBScript, VB6-style behavior, and server-side JavaScript were treated as technologies locked to a specific era and operating system. Our team started from a different question: what if these languages were not obsolete, just trapped by historical runtime dependencies? With AI-assisted development, we began rebuilding compatibility from the ground up so the same legacy logic can run consistently on Linux, Windows, and macOS without rewriting entire systems.&lt;/p&gt;

&lt;p&gt;AxonASP is built around a custom execution engine in Go, with a stack-based virtual machine for VBScript/Classic ASP semantics and an internal JavaScript engine with full EcmaScript 6 compliant path for JScript compatibility. Instead of depending on external interpreters, we parse, compile, and execute code with explicit control over opcodes, coercion rules, error mapping, and ASP object behavior. This gives us room to preserve the quirks that matter in real production applications, including case-insensitive lookups, historical type conversions, and the runtime expectations found in old ASP codebases.&lt;/p&gt;

&lt;p&gt;AI has been especially useful in accelerating difficult compatibility work: comparing edge-case behavior, generating focused test scenarios, and helping us inspect regressions quickly across multiple language features. That does not replace engineering judgment, but it shortens the distance between “we found a mismatch” and “we shipped a precise fix.” The practical result is a platform where legacy applications can be studied, maintained, and modernized incrementally rather than discarded because of infrastructure constraints.&lt;/p&gt;

&lt;p&gt;If this interests you, take a look at AxonASP on GitHub: &lt;a href="https://github.com/guimaraeslucas/axonasp" rel="noopener noreferrer"&gt;https://github.com/guimaraeslucas/axonasp&lt;/a&gt;. The project is open to people who care about runtime design, language compatibility, and long-term software preservation, and we would love thoughtful feedback from developers working with old ASP/VBScript/VB6-era systems today.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
      <category>cloud</category>
    </item>
    <item>
      <title>SSR with JavaScript: Escaping Node.js Clunkiness with AxonASP</title>
      <dc:creator>Lucas Guimarães</dc:creator>
      <pubDate>Sun, 24 May 2026 22:55:11 +0000</pubDate>
      <link>https://dev.to/lucas_guimaraes/ssr-with-javascript-escaping-nodejs-clunkiness-with-axonasp-2ojc</link>
      <guid>https://dev.to/lucas_guimaraes/ssr-with-javascript-escaping-nodejs-clunkiness-with-axonasp-2ojc</guid>
      <description>&lt;p&gt;Server-Side Rendering (SSR) is back in vogue, but let’s be honest: building dynamic, server-rendered HTML pages purely in JavaScript can often feel incredibly clunky.&lt;/p&gt;

&lt;p&gt;If you are using Node.js, you usually have to choose between two extremes. You either adopt a massive, heavy-handed meta-framework, or you wrestle with templating engines (like EJS or Pug) that feel disconnected from your actual logic. Mixing HTML and JavaScript in a standard Node.js environment is awkward. It requires routing gymnastics, string concatenations, and a mental overhead that simply shouldn't be necessary for generating a webpage.&lt;/p&gt;

&lt;p&gt;There is a better, much cleaner way to handle this interaction, and it takes inspiration from the classic web but runs on a seriously modern engine: AxonASP.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Elegance of True Inline Server Logic
&lt;/h2&gt;

&lt;p&gt;AxonASP re-introduces the elegance of the classic ASP routing and templating model, but supercharges it for the modern JavaScript ecosystem. Instead of setting up complex controllers just to pass a JSON object to a view engine, AxonASP lets you fluidly mix your HTML and your JavaScript logic in the same file, rendered seamlessly by the same engine.&lt;/p&gt;

&lt;p&gt;Here is what it looks like to generate dynamic content without the Node.js boilerplate:&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Dynamic User Roster&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;System Users&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-list"&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;// Look ma, modern JavaScript!&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;fetchUsers&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="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&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="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;role:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nc"&gt;Admin&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nc"&gt;Active&lt;/span&gt;&lt;span class="err"&gt;'&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="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;role:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nc"&gt;Developer&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nc"&gt;Active&lt;/span&gt;&lt;span class="err"&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="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fetchUsers&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
        &lt;span class="nt"&gt;%&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;User ID: &lt;span class="nt"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;%&amp;gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Role: &lt;span class="nt"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="nt"&gt;%&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Status: &lt;span class="nt"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt; &lt;span class="nt"&gt;%&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;%&lt;/span&gt; 
            &lt;span class="o"&gt;});&lt;/span&gt; 
        &lt;span class="nt"&gt;%&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The syntax is immediately readable. The HTML remains front and center, while the JavaScript steps in exactly where it is needed to drive the dynamic data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separation of Concerns: APIs and HTML Under One Roof
&lt;/h2&gt;

&lt;p&gt;AxonASP isn't just a templating engine; it's a robust execution environment. It allows you to serve your beautifully rendered HTML pages right alongside your JSON-based REST APIs.&lt;/p&gt;

&lt;p&gt;You can write pure JavaScript endpoints for your frontend applications to consume, and standard HTML/JS pages for your web views. Everything is kept logically separated in your project structure, but fundamentally rendered and executed by the exact same underlying mechanism. No need to spin up separate microservices or configure reverse proxies just to serve an API and a webpage from the same domain.&lt;/p&gt;

&lt;p&gt;Separation of Concerns: APIs and HTML Under One Roof&lt;br&gt;
AxonASP isn't just a templating engine; it's a robust execution environment. It allows you to serve your beautifully rendered HTML pages right alongside your JSON-based REST APIs.&lt;/p&gt;

&lt;p&gt;You can write pure JavaScript endpoints for your frontend applications to consume, and standard HTML/JS pages for your web views. Everything is kept logically separated in your project structure, but fundamentally rendered and executed by the exact same underlying mechanism. No need to spin up separate microservices or configure reverse proxies just to serve an API and a webpage from the same domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern JS, Node Modules, and the Power of the VM Pool
&lt;/h2&gt;

&lt;p&gt;If you think a classic-style syntax means outdated JavaScript, think again. AxonASP fully supports ECMAScript 6 (ES6) and newer versions. You get all the modern syntactic sugar—destructuring, arrow functions, spread operators—right inside your server-rendered pages. Furthermore, for specific use cases, you can even leverage Node.js modules directly within your AxonASP environment.&lt;/p&gt;

&lt;p&gt;But where AxonASP truly leaves standard Node.js in the dust is its execution architecture.&lt;/p&gt;

&lt;p&gt;Node.js is notoriously built on a single-threaded Event Loop. This means to achieve concurrency, you are forced to write asynchronous, non-blocking code (async/await everywhere). If you execute a heavy synchronous task, you block the entire server for all users.&lt;/p&gt;

&lt;p&gt;AxonASP solves this by utilizing a pool of Virtual Machines. When a request comes in, it is assigned to an available VM in the pool. This architectural choice is a game-changer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;True Concurrency: You do not need to rely on complex asynchronous code tied to a single thread to serve multiple users.&lt;/li&gt;
&lt;li&gt;Simpler Code: You can write fast, synchronous, procedural JavaScript logic without worrying about blocking the main thread, because your script execution is isolated within its own VM.&lt;/li&gt;
&lt;li&gt;High Performance: Built for high-performance server-side execution, the engine scales beautifully under load, spinning up and assigning VMs as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Node.js revolutionized backend JavaScript, but it made rendering standard HTML pages unnecessarily complex. AxonASP brings back the joy and speed of rapid web development. By combining the straightforward nature of classic inline logic with modern ES6+ support, Node module compatibility, and a powerful VM pool architecture, it provides a superior developer experience for dynamic web generation.&lt;/p&gt;

&lt;p&gt;Stop fighting with your templating engines. Give AxonASP a try and see how seamless server-side JavaScript can actually be.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <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>
