<?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: Farshad Khazaei Fard</title>
    <description>The latest articles on DEV Community by Farshad Khazaei Fard (@nelthaarion).</description>
    <link>https://dev.to/nelthaarion</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4004674%2F04444837-7886-4cdf-bfef-b3265746ac1c.png</url>
      <title>DEV Community: Farshad Khazaei Fard</title>
      <link>https://dev.to/nelthaarion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nelthaarion"/>
    <language>en</language>
    <item>
      <title>We Don't Need Another Go ORM. We Need a Better One.</title>
      <dc:creator>Farshad Khazaei Fard</dc:creator>
      <pubDate>Mon, 13 Jul 2026 09:49:39 +0000</pubDate>
      <link>https://dev.to/nelthaarion/we-dont-need-another-go-orm-we-need-a-better-one-jd1</link>
      <guid>https://dev.to/nelthaarion/we-dont-need-another-go-orm-we-need-a-better-one-jd1</guid>
      <description>&lt;p&gt;The Go ecosystem already has excellent ORMs.&lt;/p&gt;

&lt;p&gt;So why build another one?&lt;/p&gt;

&lt;p&gt;Because most of them force developers to choose between two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Performance&lt;/li&gt;
&lt;li&gt;😊 Developer Experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You rarely get both.&lt;/p&gt;

&lt;p&gt;That question led to &lt;strong&gt;BreezeORM&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;As applications grow, database access becomes one of the biggest bottlenecks.&lt;/p&gt;

&lt;p&gt;Developers often end up writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raw SQL for speed&lt;/li&gt;
&lt;li&gt;ORMs for productivity&lt;/li&gt;
&lt;li&gt;A mix of both... and lots of maintenance headaches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither approach feels ideal.&lt;/p&gt;

&lt;p&gt;Raw SQL gives complete control—but quickly becomes difficult to maintain.&lt;/p&gt;

&lt;p&gt;Traditional ORMs make development easier—but sometimes hide expensive queries, allocate unnecessary objects, or generate SQL you didn't intend.&lt;/p&gt;

&lt;p&gt;There should be a middle ground.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BreezeORM Tries to Solve
&lt;/h2&gt;

&lt;p&gt;Instead of treating SQL as something to hide, BreezeORM embraces it.&lt;/p&gt;

&lt;p&gt;Its design focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Low-overhead query execution&lt;/li&gt;
&lt;li&gt;🧠 Predictable SQL generation&lt;/li&gt;
&lt;li&gt;🔍 Type-safe query building&lt;/li&gt;
&lt;li&gt;🧩 Clean repository integration&lt;/li&gt;
&lt;li&gt;🚀 Prepared statement support&lt;/li&gt;
&lt;li&gt;📦 Lightweight architecture with minimal abstractions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to be the most feature-rich ORM.&lt;/p&gt;

&lt;p&gt;The goal is to stay out of your way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for Real Applications
&lt;/h2&gt;

&lt;p&gt;Whether you're building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs&lt;/li&gt;
&lt;li&gt;SaaS platforms&lt;/li&gt;
&lt;li&gt;Trading systems&lt;/li&gt;
&lt;li&gt;Analytics pipelines&lt;/li&gt;
&lt;li&gt;Multiplayer game backends&lt;/li&gt;
&lt;li&gt;AI services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your database layer shouldn't become the slowest part of your application.&lt;/p&gt;

&lt;p&gt;BreezeORM is designed with production workloads in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Isn't Everything...
&lt;/h2&gt;

&lt;p&gt;...but it matters.&lt;/p&gt;

&lt;p&gt;Performance without maintainability becomes technical debt.&lt;/p&gt;

&lt;p&gt;Maintainability without performance becomes a scaling problem.&lt;/p&gt;

&lt;p&gt;BreezeORM aims for both.&lt;/p&gt;

&lt;p&gt;Fast enough for demanding systems.&lt;/p&gt;

&lt;p&gt;Simple enough to enjoy using every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go Should Feel Like Go
&lt;/h2&gt;

&lt;p&gt;One of Go's greatest strengths is clarity.&lt;/p&gt;

&lt;p&gt;Small interfaces.&lt;/p&gt;

&lt;p&gt;Explicit behavior.&lt;/p&gt;

&lt;p&gt;Readable code.&lt;/p&gt;

&lt;p&gt;BreezeORM follows the same philosophy.&lt;/p&gt;

&lt;p&gt;No hidden magic.&lt;/p&gt;

&lt;p&gt;No surprising behavior.&lt;/p&gt;

&lt;p&gt;Just predictable, efficient data access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;Because infrastructure improves when developers challenge assumptions.&lt;/p&gt;

&lt;p&gt;Every benchmark.&lt;/p&gt;

&lt;p&gt;Every issue.&lt;/p&gt;

&lt;p&gt;Every pull request.&lt;/p&gt;

&lt;p&gt;Every discussion.&lt;/p&gt;

&lt;p&gt;Makes the project stronger.&lt;/p&gt;

&lt;p&gt;If you've ever wished your ORM felt a little more "Go"...&lt;/p&gt;

&lt;p&gt;You might enjoy BreezeORM.&lt;/p&gt;

&lt;p&gt;⭐ GitHub:&lt;br&gt;
&lt;a href="https://github.com/nelthaarion/breezeorm" rel="noopener noreferrer"&gt;https://github.com/nelthaarion/breezeorm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 Documentation:&lt;br&gt;
&lt;a href="https://nelthaarion.github.io/breezeorm" rel="noopener noreferrer"&gt;https://nelthaarion.github.io/breezeorm&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  golang #go #database #orm #opensource #backend #performance #postgres #mysql
&lt;/h1&gt;

</description>
      <category>sql</category>
      <category>go</category>
      <category>orm</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Breeze Framework: Rethinking What a Modern Go Framework Can Be ⚡</title>
      <dc:creator>Farshad Khazaei Fard</dc:creator>
      <pubDate>Mon, 13 Jul 2026 09:46:09 +0000</pubDate>
      <link>https://dev.to/nelthaarion/breeze-framework-rethinking-what-a-modern-go-framework-can-be-4hgh</link>
      <guid>https://dev.to/nelthaarion/breeze-framework-rethinking-what-a-modern-go-framework-can-be-4hgh</guid>
      <description>&lt;p&gt;The web has &lt;strong&gt;changed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Applications are no longer simple HTTP servers.&lt;br&gt;
Today we build real-time dashboards, AI-powered services, multiplayer systems, APIs, microservices, and applications that need to handle thousands of connections with minimal overhead.&lt;/p&gt;

&lt;p&gt;But our frameworks are still mostly designed for yesterday's problems.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What if a *&lt;em&gt;Go *&lt;/em&gt; framework was built from the ground up for modern workloads?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Breeze&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;high-performance&lt;/strong&gt; Go framework designed around one idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Performance should not come at the cost of developer experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why &lt;strong&gt;&lt;em&gt;Breeze&lt;/em&gt;&lt;/strong&gt;?
&lt;/h2&gt;

&lt;p&gt;Go already gives us incredible performance.&lt;/p&gt;

&lt;p&gt;But the framework layer often becomes the bottleneck.&lt;/p&gt;

&lt;p&gt;Too much abstraction.&lt;br&gt;
Too many allocations.&lt;br&gt;
Too much hidden complexity.&lt;/p&gt;

&lt;p&gt;Breeze takes a different approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ High-performance networking powered by gnet&lt;/li&gt;
&lt;li&gt;🔥 Real-time WebSocket architecture built in&lt;/li&gt;
&lt;li&gt;🧩 Modular middleware system&lt;/li&gt;
&lt;li&gt;📚 Automatic Swagger/OpenAPI generation&lt;/li&gt;
&lt;li&gt;🎨 Built-in SPA template engine&lt;/li&gt;
&lt;li&gt;🚀 Optimized worker pool architecture&lt;/li&gt;
&lt;li&gt;🗄️ BreezeORM for efficient database operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything you need to build production-grade applications — without assembling dozens of unrelated tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future Is Real-Time
&lt;/h2&gt;

&lt;p&gt;Modern applications are moving toward instant experiences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live collaboration&lt;/li&gt;
&lt;li&gt;Trading platforms&lt;/li&gt;
&lt;li&gt;AI assistants&lt;/li&gt;
&lt;li&gt;Gaming backends&lt;/li&gt;
&lt;li&gt;Monitoring systems&lt;/li&gt;
&lt;li&gt;Real-time analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Breeze is designed for this world.&lt;/p&gt;

&lt;p&gt;Instead of adding real-time capabilities later, Breeze treats them as a first-class citizen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Less Glue Code. More Building.
&lt;/h2&gt;

&lt;p&gt;A common problem in backend development:&lt;/p&gt;

&lt;p&gt;You start with a simple API...&lt;/p&gt;

&lt;p&gt;Then suddenly you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;li&gt;Background workers&lt;/li&gt;
&lt;li&gt;Database optimization&lt;/li&gt;
&lt;li&gt;Frontend integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your stack becomes a collection of disconnected pieces.&lt;/p&gt;

&lt;p&gt;Breeze tries to bring these pieces together into one coherent ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built With Go Philosophy
&lt;/h2&gt;

&lt;p&gt;Go was created around simplicity, performance, and reliability.&lt;/p&gt;

&lt;p&gt;Breeze follows the same principles:&lt;/p&gt;

&lt;p&gt;Simple APIs.&lt;br&gt;
Predictable behavior.&lt;br&gt;
Low overhead.&lt;br&gt;
Production-focused design.&lt;/p&gt;

&lt;p&gt;No magic.&lt;br&gt;
No unnecessary complexity.&lt;/p&gt;

&lt;p&gt;Just a fast foundation for building the next generation of applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  A New Breeze Is Coming 🌪️
&lt;/h2&gt;

&lt;p&gt;Frameworks should not only help us write code faster.&lt;/p&gt;

&lt;p&gt;They should help us think bigger.&lt;/p&gt;

&lt;p&gt;Breeze is an experiment in what a modern Go framework can become.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Make building fast, scalable, real-time applications feel effortless.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try Breeze. Build something fast.&lt;/p&gt;

&lt;p&gt;⭐ GitHub:&lt;br&gt;
&lt;a href="https://github.com/nelthaarion/breeze" rel="noopener noreferrer"&gt;https://github.com/nelthaarion/breeze&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  golang #go #opensource #webdevelopment #backend #performance #framework
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>I Put an Entire DevOps Stack Inside My Go Framework (And It's Glorious)</title>
      <dc:creator>Farshad Khazaei Fard</dc:creator>
      <pubDate>Thu, 09 Jul 2026 07:24:45 +0000</pubDate>
      <link>https://dev.to/nelthaarion/i-put-an-entire-devops-stack-inside-my-go-framework-and-its-glorious-l96</link>
      <guid>https://dev.to/nelthaarion/i-put-an-entire-devops-stack-inside-my-go-framework-and-its-glorious-l96</guid>
      <description>&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging Go APIs shouldn't require 5 terminal tabs, a Grafana instance, and a prayer.
&lt;/h2&gt;

&lt;p&gt;**&lt;/p&gt;




&lt;p&gt;Let me describe a familiar scenario. You're building an API. A request fails. To figure out why, you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check your server logs in Terminal 1.&lt;/li&gt;
&lt;li&gt;Open your database GUI to see if the data was written.&lt;/li&gt;
&lt;li&gt;Check your Redis client to see if the cache was invalidated.&lt;/li&gt;
&lt;li&gt;Open Swagger to verify the payload shape.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pprof&lt;/code&gt; to see if memory spiked.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s five different tools, five different context switches, and about ten minutes lost for a bug that takes thirty seconds to fix. &lt;/p&gt;

&lt;p&gt;When I was building &lt;strong&gt;Breeze&lt;/strong&gt; (the gnet-powered Go framework I wrote about recently), I decided to solve this. I didn't want to build a separate monitoring tool—I wanted the framework to &lt;em&gt;know&lt;/em&gt; what it was doing.&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;Breeze Dashboard&lt;/strong&gt;: a real-time, single-pane-of-glass observability tool built directly into your Go server.&lt;/p&gt;

&lt;h2&gt;
  
  
  🖥️ What Is the Breeze Dashboard?
&lt;/h2&gt;

&lt;p&gt;It’s a live web UI that attaches to your Breeze application. It gives you full visibility into your traffic, your database, your routes, and your Go runtime—without writing a single line of monitoring code.&lt;/p&gt;

&lt;p&gt;Oh, and it comes with built-in authentication so you don't accidentally expose your server internals to the internet.&lt;/p&gt;

&lt;p&gt;Here is what you get the second you turn it on:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 🕵️‍♂️ The Developer Timeline (My Favorite Feature)
&lt;/h3&gt;

&lt;p&gt;This is the killer app of the dashboard. Instead of correlating timestamps across logs and databases, the Developer Timeline gives you a linear, chronological view of a request's lifecycle. &lt;/p&gt;

&lt;p&gt;You can watch a single HTTP request trigger a specific ORM query, hit the cache, and spawn a background queue job—all in one unified timeline. It turns "guessing" into "seeing."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 📡 Live Requests Stream
&lt;/h3&gt;

&lt;p&gt;A real-time, updating feed of every request hitting your server. You see the Method, Path, Status Code, and Latency the millisecond it happens. No grepping logs. No waiting for aggregators. Just instant, raw visibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 🗄️ Database Browser &amp;amp; ORM Query Monitor
&lt;/h3&gt;

&lt;p&gt;You don't need pgAdmin or DBeaver for local dev anymore. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database Browser:&lt;/strong&gt; Inspect your tables, indexes, and data directly in the dashboard UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ORM Query Monitor:&lt;/strong&gt; See the exact SQL queries your application is generating in real-time, how long they take, and which route triggered them. It makes N+1 query problems painfully obvious.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 🗺️ Routes Explorer &amp;amp; API Explorer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routes Explorer:&lt;/strong&gt; A visual map of every route registered in your router—methods, paths, and attached middleware chains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Explorer:&lt;/strong&gt; Since Breeze has native OpenAPI 3.1 support, the dashboard integrates a full API testing UI. You can ping your endpoints directly from the browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. 🧠 Real-Time Health &amp;amp; Runtime
&lt;/h3&gt;

&lt;p&gt;Deep dive into the Go runtime without &lt;code&gt;pprof&lt;/code&gt; web UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active Goroutines&lt;/li&gt;
&lt;li&gt;Memory Allocation / GC Pauses&lt;/li&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;Event loop stats (since it runs on gnet)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. 📦 Cache &amp;amp; Queue Monitoring
&lt;/h3&gt;

&lt;p&gt;If your app uses caching or background workers, the dashboard gives you a live look into their state. See what keys are hot, what queues are backing up, and clear caches with a click.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. 📜 Live Logs
&lt;/h3&gt;

&lt;p&gt;A clean, filterable log stream right in your browser. Collapses stack traces by default, expands on click. &lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 How It Works
&lt;/h2&gt;

&lt;p&gt;Because Breeze controls the entire request lifecycle—from the gnet event loop to the router, to the template engine—it can capture telemetry that external APMs (like DataDog or New Relic) have to work incredibly hard to instrument.&lt;/p&gt;

&lt;p&gt;You don't need to add tracing IDs manually. You don't need to wrap your database driver. The framework &lt;em&gt;is&lt;/em&gt; the instrument.&lt;/p&gt;

&lt;p&gt;Setting it up is conceptually as simple as pointing it at your app and adding an auth check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Conceptual setup (requires Breeze latest)&lt;/span&gt;
&lt;span class="c"&gt;// Enable the dashboard with a secure password&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnableDashboard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DashboardConfig&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;"/admin/dashboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Password&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"your-secure-password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;// Never hardcode in prod!&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to &lt;code&gt;localhost:3000/admin/dashboard&lt;/code&gt;, log in, and you're instantly looking at the heartbeat of your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Why Does This Matter?
&lt;/h2&gt;

&lt;p&gt;The "Full-Stack Go" movement is growing. People are tired of spinning up a React frontend, a Postgres instance, a Redis cache, and three separate monitoring tools just to build a simple CRUD app. &lt;/p&gt;

&lt;p&gt;Frameworks like Laravel (PHP) and Django (Python) have had robust local tooling for years. Go developers have historically had to build their own DevOps pies from scratch. &lt;/p&gt;

&lt;p&gt;The Breeze Dashboard bridges that gap. It gives you the raw, C-level performance of &lt;code&gt;gnet&lt;/code&gt;, combined with the developer experience of a modern, batteries-included framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ A Quick Word on Security
&lt;/h2&gt;

&lt;p&gt;Because the dashboard has access to your database, logs, and runtime, it is locked down by default. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is disabled unless explicitly enabled.&lt;/li&gt;
&lt;li&gt;It requires authentication.&lt;/li&gt;
&lt;li&gt;In production, you should ideally bind it to an internal port or put it behind an auth proxy. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;If you're already using Breeze, update to the latest version and check the docs to enable the Dashboard. If you haven't tried Breeze yet, this is a great reason to take it for a spin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Docs &amp;amp; Setup Guide:&lt;/strong&gt; &lt;a href="https://nelthaarion.github.io/breeze" rel="noopener noreferrer"&gt;nelthaarion.github.io/breeze&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;⭐ GitHub:&lt;/strong&gt; &lt;a href="https://github.com/nelthaarion/breeze" rel="noopener noreferrer"&gt;github.com/nelthaarion/breeze&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What's your current local development debugging setup? Are you team &lt;code&gt;docker-compose&lt;/code&gt; with 5 containers, or team &lt;code&gt;print&lt;/code&gt; statements? Let me know in the comments! 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: #go #golang #devops #observability #dashboard #breeze #webdev&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>devops</category>
      <category>breeze</category>
    </item>
    <item>
      <title>🚀 Announcing Breeze: The Go HTTP Framework That Redefines Raw Speed</title>
      <dc:creator>Farshad Khazaei Fard</dc:creator>
      <pubDate>Thu, 09 Jul 2026 07:10:02 +0000</pubDate>
      <link>https://dev.to/nelthaarion/announcing-breeze-the-go-http-framework-that-redefines-raw-speed-58i6</link>
      <guid>https://dev.to/nelthaarion/announcing-breeze-the-go-http-framework-that-redefines-raw-speed-58i6</guid>
      <description>&lt;p&gt;&lt;strong&gt;630k req/s. Zero allocations. Built-in SPA engine. This is Breeze.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Let me skip the humble intro. I built a Go HTTP framework that benchmarks &lt;strong&gt;3× faster than Fiber&lt;/strong&gt; on the same hardware, same payload. It's called &lt;strong&gt;Breeze&lt;/strong&gt;, it's built on top of &lt;code&gt;gnet&lt;/code&gt;'s event loop, and it ships with features that most frameworks make you bolt on yourself.&lt;/p&gt;

&lt;p&gt;Here's why I think it's worth your attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 The Numbers Don't Lie
&lt;/h2&gt;

&lt;p&gt;Simple JSON endpoint. Same machine. Same payload.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Requests/sec&lt;/th&gt;
&lt;th&gt;vs Breeze&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Breeze&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~630k&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.0×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;goFiber&lt;/td&gt;
&lt;td&gt;~210k&lt;/td&gt;
&lt;td&gt;0.33×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Echo&lt;/td&gt;
&lt;td&gt;~140k&lt;/td&gt;
&lt;td&gt;0.22×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gin&lt;/td&gt;
&lt;td&gt;~120k&lt;/td&gt;
&lt;td&gt;0.19×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;net/http&lt;/td&gt;
&lt;td&gt;~85k&lt;/td&gt;
&lt;td&gt;0.13×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;These are approximate numbers from my environment — run the benchmarks yourself for authoritative results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔍 How Is This Even Possible?
&lt;/h2&gt;

&lt;p&gt;Breeze isn't another &lt;code&gt;net/http&lt;/code&gt; wrapper. It's built on &lt;code&gt;gnet&lt;/code&gt;, a non-blocking event-driven networking engine that makes direct &lt;code&gt;epoll&lt;/code&gt;/&lt;code&gt;kqueue&lt;/code&gt; syscalls. On top of that, I obsessed over every allocation in the hot path:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack-allocated router.&lt;/strong&gt; Path segment matching uses a fixed &lt;code&gt;[16]string&lt;/code&gt; array on the stack — no heap allocations. Parameter indexes are pre-computed at route registration, not at match time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-copy parsing.&lt;/strong&gt; Raw bytes are converted to strings using &lt;code&gt;unsafe.String&lt;/code&gt; — no copying. Header keys are lowercased in-place instead of creating new strings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart worker pool.&lt;/strong&gt; A fixed goroutine pool with a 16× buffered channel absorbs request bursts. When the queue is full, it spawns a goroutine &lt;em&gt;instead of blocking the event loop&lt;/em&gt;. That's the critical difference — the event loop never stalls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response serialization without &lt;code&gt;fmt.Sprintf&lt;/code&gt;.&lt;/strong&gt; Status codes are mapped via array index. Buffers are pre-sized. Every nanosecond counts when you're serving 600k+ requests per second.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Show Me the Code
&lt;/h2&gt;

&lt;p&gt;A complete working server in under 20 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"runtime"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/nelthaarion/breeze"&lt;/span&gt;
    &lt;span class="n"&gt;middleware&lt;/span&gt; &lt;span class="s"&gt;"github.com/nelthaarion/breeze/middlewares"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecoveryMiddleware&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoggingMiddleware&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/users/:id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="n"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewWorkerPool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NumCPU&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;  &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// port, multiCore&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. One event loop per CPU core, RoundRobin load balancing, TCP_NODELAY enabled by default. No tuning required.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔌 Native WebSocket — No Goroutine Per Connection
&lt;/h2&gt;

&lt;p&gt;This is the one that makes people do a double-take.&lt;/p&gt;

&lt;p&gt;Most Go frameworks spawn a goroutine for every WebSocket connection. Breeze doesn't — the WebSocket handler runs &lt;em&gt;inside the gnet event loop&lt;/em&gt;. Zero extra goroutines. Zero per-connection memory overhead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;hub&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/ws"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WSHandlerFunc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Connect&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WSConn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"welcome"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WSConn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opcode&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BroadcastText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WSConn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="kt"&gt;uint16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;hub&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BroadcastText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a user left"&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;The built-in &lt;code&gt;WSHub&lt;/code&gt; handles broadcast, room management, and graceful disconnects. RFC 6455 compliant, auto-reconnect on the client side with exponential backoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎨 The Template Engine That Thinks It's an SPA
&lt;/h2&gt;

&lt;p&gt;This is the feature I'm most excited about. Breeze ships a full server-side template engine that &lt;em&gt;automatically&lt;/em&gt; turns your multi-page app into a single-page app. No React. No Vue. No build step.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. You write normal server-rendered views with layouts and components:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- views/layout.html --&amp;gt;&lt;/span&gt;
{{define "layout"}}
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    {{component "nav" .}}
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"breeze-app"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        {{template "content" .}}
    &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;
{{end}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- views/home.html --&amp;gt;&lt;/span&gt;
{{define "content"}}
&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello, {{.Data.Name}}!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
{{component "card" (map "title" "Welcome" "body" "Try clicking a link")}}
{{end}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. You register routes the simple way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewTemplateEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TemplateConfig&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ViewsDir&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="s"&gt;"views"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ComponentsDir&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"components"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;LayoutFile&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;"views/layout.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"home"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"World"&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;3. The magic happens automatically.&lt;/strong&gt; On every full-page render, Breeze injects a JavaScript runtime before &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;. When a user clicks an internal link, the runtime intercepts it, fetches &lt;em&gt;only the content block&lt;/em&gt; (via &lt;code&gt;X-Breeze-Partial: true&lt;/code&gt; header), and swaps &lt;code&gt;#breeze-app&lt;/code&gt; innerHTML. No full page reload. &lt;code&gt;pushState&lt;/code&gt; handles the URL. &lt;code&gt;popstate&lt;/code&gt; handles back/forward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your multi-page app just became a SPA. You didn't write a single line of JavaScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But wait — there's more. The template engine also gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reactive data store&lt;/strong&gt; — page data is embedded as JSON, accessible via &lt;code&gt;breeze.data()&lt;/code&gt;, watchable via &lt;code&gt;breeze.watch()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-side re-rendering&lt;/strong&gt; — &lt;code&gt;breeze.render('card', newData, '#target')&lt;/code&gt; re-renders a component without hitting the server (it uses an embedded Go-template subset interpreter)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragment routes&lt;/strong&gt; — &lt;code&gt;router.Fragment('/fragments/stats', engine, "stats", dataFn)&lt;/code&gt; serves bare HTML fragments for polling or partial updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPA form handling&lt;/strong&gt; — POST forms are intercepted and submitted via &lt;code&gt;fetch()&lt;/code&gt;, response HTML is swapped in. Progressive enhancement means forms still work without JS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polling built in&lt;/strong&gt; — &lt;code&gt;breeze.poll('/fragments/stats', '#stats-box', 2000)&lt;/code&gt; auto-refreshes a fragment every 2 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev mode hot reload&lt;/strong&gt; — set &lt;code&gt;DevMode: true&lt;/code&gt; and template changes are reflected instantly without restarting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛡️ 9 Middleware, Zero External Dependencies
&lt;/h2&gt;

&lt;p&gt;Everything you need for production, shipped with the framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// JWT with access + refresh tokens, role-based auth, custom claims validator&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JWTAuthMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JWTOptions&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AccessSecret&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;"secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;RefreshSecret&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"refresh-secret"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;RequiredRoles&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;

&lt;span class="c"&gt;// CORS with automatic OPTIONS preflight&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CORSOptions&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AllowOrigins&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"https://myapp.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AllowMethods&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"GET,POST,PUT,DELETE,OPTIONS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;

&lt;span class="c"&gt;// Per-route rate limiting&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;breeze&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loginHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRateLimiter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RateLimiterOptions&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Requests&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Per&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Minute&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;span class="c"&gt;// Auto Brotli → Gzip → Deflate compression&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompressionMiddleware&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c"&gt;// Security headers (CSP, HSTS, X-Frame-Options, etc.)&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultSecurityMiddleware&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c"&gt;// Swagger docs from Go struct annotations&lt;/span&gt;
&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SwaggerMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SwaggerOptions&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"My API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"1.0.0"&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;Also included: &lt;strong&gt;Logger&lt;/strong&gt;, &lt;strong&gt;Panic Recovery&lt;/strong&gt;, and &lt;strong&gt;ETag Cache&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🆚 How It Compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Breeze&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Fiber&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Gin&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Echo&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;gnet event loop&lt;/td&gt;
&lt;td&gt;fasthttp&lt;/td&gt;
&lt;td&gt;net/http&lt;/td&gt;
&lt;td&gt;net/http&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hot path allocs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~0&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebSocket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native, zero-goroutine&lt;/td&gt;
&lt;td&gt;fasthttp-based&lt;/td&gt;
&lt;td&gt;gorilla/websocket&lt;/td&gt;
&lt;td&gt;gorilla/websocket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Template + SPA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Separate&lt;/td&gt;
&lt;td&gt;Separate&lt;/td&gt;
&lt;td&gt;Separate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Swagger/OpenAPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;Third-party&lt;/td&gt;
&lt;td&gt;Third-party&lt;/td&gt;
&lt;td&gt;Third-party&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Middleware&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9 built-in&lt;/td&gt;
&lt;td&gt;Growing&lt;/td&gt;
&lt;td&gt;Largest ecosystem&lt;/td&gt;
&lt;td&gt;Good built-in set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;net/http compat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest take:&lt;/strong&gt; If you need deep net/http ecosystem compatibility, Gin or Echo are still the safe choices. But if you're starting fresh and want maximum performance with modern features baked in — Breeze is worth a serious look.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📦 Install and Run
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/nelthaarion/breeze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Go 1.24.3+. Pulls in &lt;code&gt;gnet v2&lt;/code&gt;, &lt;code&gt;go-json&lt;/code&gt;, &lt;code&gt;brotli&lt;/code&gt;, and &lt;code&gt;golang-jwt/jwt&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Dashboard&lt;/strong&gt; — live route explorer, request monitor, ORM query monitor (already in progress)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC support&lt;/strong&gt; — leveraging gnet for high-performance gRPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More middleware&lt;/strong&gt; — OAuth2, OpenTelemetry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template engine enhancements&lt;/strong&gt; — hot-reload improvements, more built-in functions&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📖 Docs: &lt;a href="https://nelthaarion.github.io/breeze" rel="noopener noreferrer"&gt;nelthaarion.github.io/breeze&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⭐ GitHub: &lt;a href="https://github.com/nelthaarion/breeze" rel="noopener noreferrer"&gt;github.com/nelthaarion/breeze&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built Breeze because I was tired of choosing between speed and features. If that resonates with you, try it out and let me know what you think. I'm active on GitHub issues and open to contributions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's your current Go framework of choice, and what would make you switch? Let's talk in the comments.&lt;/strong&gt; 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: #go #golang #webframework #performance #breeze #open_source&lt;/em&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>go</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I wanted a Go networking engine that gets out of the way, so I built one (Breeze).</title>
      <dc:creator>Farshad Khazaei Fard</dc:creator>
      <pubDate>Sat, 27 Jun 2026 00:49:42 +0000</pubDate>
      <link>https://dev.to/nelthaarion/i-wanted-a-go-networking-engine-that-gets-out-of-the-way-so-i-built-one-breeze-3jc</link>
      <guid>https://dev.to/nelthaarion/i-wanted-a-go-networking-engine-that-gets-out-of-the-way-so-i-built-one-breeze-3jc</guid>
      <description>&lt;p&gt;Over the past few months, I've been working on Breeze, a networking engine built on top of gnet.&lt;/p&gt;

&lt;p&gt;The goal wasn't to create "another web framework."&lt;/p&gt;

&lt;p&gt;The goal was to explore how far an event-loop architecture can go for modern Go services.&lt;/p&gt;

&lt;p&gt;Some design decisions I made:&lt;/p&gt;

&lt;p&gt;⚡ Event-loop driven architecture&lt;br&gt;
🌐 Native HTTP and WebSocket support&lt;br&gt;
🚀 WebSocket fast-path (avoids the HTTP router after the upgrade)&lt;br&gt;
🧵 Worker pool to keep the event loop responsive&lt;br&gt;
📦 Low-allocation request handling&lt;br&gt;
📚 Built-in Swagger support&lt;br&gt;
🔌 Built-in WebSocket Hub for real-time applications&lt;/p&gt;

&lt;p&gt;One design choice I'm particularly interested in discussing is that HTTP and WebSocket aren't treated the same.&lt;/p&gt;

&lt;p&gt;Every incoming connection is classified inside the event loop. HTTP requests follow the router, while upgraded WebSocket connections are dispatched directly to the WebSocket engine. It keeps the hot path small and avoids unnecessary work once the protocol is established.&lt;/p&gt;

&lt;p&gt;The project is still evolving, and I'm deliberately questioning every architectural decision before calling it "production ready."&lt;/p&gt;

&lt;p&gt;I'd genuinely appreciate feedback from developers who have experience with:&lt;/p&gt;

&lt;p&gt;High-concurrency Go servers&lt;br&gt;
gnet or event-loop architectures&lt;br&gt;
Large-scale WebSocket systems&lt;br&gt;
Low-latency backend services&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/nelthaarion/breeze" rel="noopener noreferrer"&gt;https://github.com/nelthaarion/breeze&lt;/a&gt;&lt;br&gt;
Documentation: &lt;br&gt;
&lt;a href="https://nelthaarion.github.io/breeze" rel="noopener noreferrer"&gt;https://nelthaarion.github.io/breeze&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm especially interested in hearing what you would change. Architecture discussions are often more valuable than benchmark numbers.&lt;/p&gt;

&lt;p&gt;Happy to answer any questions or dive into implementation details. 🚀&lt;/p&gt;

</description>
      <category>go</category>
      <category>networking</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
