<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: jiil</title>
    <description>The latest articles on Forem by jiil (@jiil07).</description>
    <link>https://forem.com/jiil07</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%2F1974896%2F47b13b5e-7c22-46ad-abf6-edf29a38bf49.jpeg</url>
      <title>Forem: jiil</title>
      <link>https://forem.com/jiil07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jiil07"/>
    <language>en</language>
    <item>
      <title>🚀 I Replaced Go’s Scheduler — And You Should Too (Here’s How)</title>
      <dc:creator>jiil</dc:creator>
      <pubDate>Sun, 05 Oct 2025 18:45:34 +0000</pubDate>
      <link>https://forem.com/jiil07/i-replaced-gos-scheduler-and-you-should-too-heres-how-5f1l</link>
      <guid>https://forem.com/jiil07/i-replaced-gos-scheduler-and-you-should-too-heres-how-5f1l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I don’t just use Go’s scheduler. I wrote my own.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you’ve ever written &lt;code&gt;go func()&lt;/code&gt; and wondered — &lt;em&gt;“Who’s really in charge here?”&lt;/em&gt; — this article is for you.&lt;/p&gt;

&lt;p&gt;Today, I’m sharing &lt;strong&gt;go-scheduler&lt;/strong&gt;: a fully custom goroutine scheduler written from scratch — &lt;strong&gt;without using the &lt;code&gt;go&lt;/code&gt; keyword&lt;/strong&gt; to launch user tasks.&lt;/p&gt;

&lt;p&gt;Yes, you read that right.&lt;/p&gt;

&lt;p&gt;No &lt;code&gt;go&lt;/code&gt;. No black box. Just pure control.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Why This Matters
&lt;/h2&gt;

&lt;p&gt;Go’s runtime scheduler (GMP model) is one of the most elegant pieces of systems software ever written. It’s fast, fair, and mostly invisible — and that’s exactly the problem.&lt;/p&gt;

&lt;p&gt;We treat goroutines like magic threads. We fire off &lt;code&gt;go func()&lt;/code&gt; and trust Go to “do the right thing.”&lt;/p&gt;

&lt;p&gt;But what if you don’t want to &lt;em&gt;trust&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;What if you need &lt;strong&gt;predictable scheduling&lt;/strong&gt;?&lt;br&gt;&lt;br&gt;
What if your workload is &lt;strong&gt;highly skewed&lt;/strong&gt;?&lt;br&gt;&lt;br&gt;
What if you want &lt;strong&gt;priority queues&lt;/strong&gt;, &lt;strong&gt;work-stealing&lt;/strong&gt;, or even &lt;strong&gt;distributed task routing&lt;/strong&gt; — and you want full control?&lt;/p&gt;

&lt;p&gt;That’s where &lt;code&gt;go-scheduler&lt;/code&gt; comes in.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ What Is go-scheduler?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/JIIL07/go-scheduler" rel="noopener noreferrer"&gt;&lt;code&gt;go-scheduler&lt;/code&gt;&lt;/a&gt; is a &lt;strong&gt;drop-in replacement&lt;/strong&gt; for Go’s built-in scheduler. It lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Schedule tasks without ever using &lt;code&gt;go&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose from &lt;strong&gt;6 scheduling algorithms&lt;/strong&gt;: FIFO, LIFO, Priority, Work-Stealing, Lock-Free, and Distributed&lt;/li&gt;
&lt;li&gt;Visualize task distribution in real-time&lt;/li&gt;
&lt;li&gt;Run benchmarks and race detectors like a pro&lt;/li&gt;
&lt;li&gt;Even distribute tasks across multiple nodes — like a mini Kubernetes job queue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not a wrapper.&lt;br&gt;&lt;br&gt;
It’s not a library.&lt;br&gt;&lt;br&gt;
It’s a &lt;strong&gt;reimplementation of Go’s concurrency model&lt;/strong&gt; — with your rules.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 The Big Idea: Goroutines Are an Abstraction
&lt;/h2&gt;

&lt;p&gt;Most Go developers think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Goroutines are lightweight threads. Go handles them.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the truth?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Goroutines are not threads. They’re coroutines. And coroutines can be scheduled by anyone.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;go-scheduler&lt;/code&gt; proves it.&lt;/p&gt;

&lt;p&gt;Here’s how it works:&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;config&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;scheduler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Workers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Mode&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="s"&gt;"workstealing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Visualize&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;scheduler&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;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schedule&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="p"&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;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&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;Millisecond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task %d done&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;s&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="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WaitForCompletion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ We use &lt;code&gt;go&lt;/code&gt; &lt;strong&gt;only once&lt;/strong&gt; — to launch the &lt;strong&gt;worker pools&lt;/strong&gt; (8 goroutines total).&lt;br&gt;&lt;br&gt;
❌ We &lt;strong&gt;never&lt;/strong&gt; use &lt;code&gt;go&lt;/code&gt; to launch your tasks.&lt;/p&gt;

&lt;p&gt;Your tasks? They’re just functions pushed into queues. Workers pull them out and call them &lt;strong&gt;synchronously&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the core insight:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You don’t need &lt;code&gt;go&lt;/code&gt; to achieve concurrency. You need a scheduler.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🌈 6 Scheduling Modes — Pick Your Weapon
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Why It’s Cool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FIFO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Batch jobs, simple queues&lt;/td&gt;
&lt;td&gt;Basic, predictable, easy to debug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LIFO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DFS, recursive work&lt;/td&gt;
&lt;td&gt;Last-in-first-out = stack semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Priority&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time systems, SLAs&lt;/td&gt;
&lt;td&gt;Tasks with lower numbers run first (heap-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Work-Stealing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mixed workloads&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;The Go runtime’s secret sauce&lt;/strong&gt; — implemented here from scratch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lock-Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-throughput, low-latency&lt;/td&gt;
&lt;td&gt;Zero mutexes. Atomic pointers. Pure speed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distributed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-node clusters&lt;/td&gt;
&lt;td&gt;Tasks serialized over HTTP, gossip discovery, leader election — it’s a real cluster scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Work-stealing is the star&lt;/strong&gt;. When a worker runs out of tasks, it steals from others. Just like Go’s M:N scheduler. We even implemented the same “random victim selection” algorithm.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  📊 Real-Time Visualization? Yes, Please.
&lt;/h2&gt;

&lt;p&gt;Run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run cli/main.go &lt;span class="nt"&gt;--tasks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="nt"&gt;--workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8 &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;workstealing &lt;span class="nt"&gt;--visualize&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you’ll see something like this live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== Go-Scheduler Live View ===
Mode: workstealing | Workers: 8 | Tasks: 742/1000
Progress: [███████████████████████████████░░░░] 74.2%
Throughput: 182.1 tasks/sec
Worker 3: [██████████] 54 tasks | Worker 7: [▓▓▓▓▓▓] 12 tasks ← Stealing!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll watch tasks migrate between workers. You’ll see load imbalance. You’ll see steal attempts. It’s &lt;strong&gt;like watching a live performance of Go’s runtime&lt;/strong&gt; — and you’re the conductor.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Performance: Work-Stealing Wins
&lt;/h2&gt;

&lt;p&gt;Benchmark results on an 8-core machine:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Ops/sec&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FIFO&lt;/td&gt;
&lt;td&gt;~8,000&lt;/td&gt;
&lt;td&gt;125 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Work-Stealing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~10,100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;98 μs&lt;/strong&gt; ← 🏆 Winner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;~6,400&lt;/td&gt;
&lt;td&gt;156 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lock-Free FIFO&lt;/td&gt;
&lt;td&gt;~11,200&lt;/td&gt;
&lt;td&gt;89 μs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 Lock-free queues are faster than FIFO — because no mutexes.&lt;br&gt;&lt;br&gt;
But work-stealing beats FIFO because &lt;strong&gt;load balancing matters more than raw queue speed&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn’t academic. This is &lt;strong&gt;real performance insight&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Distributed Mode: Go Beyond One Machine
&lt;/h2&gt;

&lt;p&gt;The crown jewel?&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;ds&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;scheduler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewDistributedScheduler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"node-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JoinCluster&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;"node-2:8081"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"node-3:8082"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ScheduleSerializableTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"compute"&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="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}{&lt;/span&gt;
    &lt;span class="s"&gt;"iterations"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;taskID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your tasks are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serialized (JSON/gob)&lt;/li&gt;
&lt;li&gt;Sent over HTTP&lt;/li&gt;
&lt;li&gt;Discovered via gossip protocol&lt;/li&gt;
&lt;li&gt;Balanced across nodes&lt;/li&gt;
&lt;li&gt;Recovered if a node dies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t a toy. This is a &lt;strong&gt;production-grade distributed job queue&lt;/strong&gt; — built in 800 lines of Go.&lt;/p&gt;

&lt;p&gt;Imagine running this as a sidecar in Kubernetes. Or replacing Celery with Go.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Tested. Benchmarked. Battle-Ready
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ 100% test coverage&lt;/li&gt;
&lt;li&gt;✅ Race detector passed (&lt;code&gt;go test -race&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Benchmarks for every mode&lt;/li&gt;
&lt;li&gt;✅ Examples for every use case&lt;/li&gt;
&lt;li&gt;✅ CI/CD-ready (&lt;code&gt;go mod tidy&lt;/code&gt;, &lt;code&gt;go test ./...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t a hack. It’s a &lt;strong&gt;library you can use in production&lt;/strong&gt; — if you need fine-grained control.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Learn by Building
&lt;/h2&gt;

&lt;p&gt;This project was born from a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What if I removed &lt;code&gt;go&lt;/code&gt; and rebuilt Go’s scheduler from scratch?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer?&lt;br&gt;&lt;br&gt;
I learned more about concurrency, atomic operations, memory models, and performance than in 6 months of “normal” Go coding.&lt;/p&gt;

&lt;p&gt;Start here:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/JIIL07/go-scheduler" rel="noopener noreferrer"&gt;https://github.com/JIIL07/go-scheduler&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clone it. Run the visualizer. Break it. Fix it. Extend it.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought: The Go Runtime Is Not Sacred
&lt;/h2&gt;

&lt;p&gt;Go’s scheduler is brilliant — but it’s not &lt;em&gt;the&lt;/em&gt; scheduler.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;one&lt;/strong&gt; scheduler.&lt;br&gt;&lt;br&gt;
A great one.&lt;br&gt;&lt;br&gt;
But not the only one.&lt;/p&gt;

&lt;p&gt;By reimplementing it, we reclaim agency.&lt;/p&gt;

&lt;p&gt;We stop treating concurrency as magic.&lt;/p&gt;

&lt;p&gt;We start treating it as &lt;strong&gt;engineering&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Get Started Today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 GitHub: &lt;a href="https://github.com/JIIL07/go-scheduler" rel="noopener noreferrer"&gt;https://github.com/JIIL07/go-scheduler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🚀 Quick Start: &lt;code&gt;git clone &amp;amp;&amp;amp; go run cli/main.go --visualize&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📖 Full docs: README.md (yes, it’s that good)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Want to Contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add a new mode (Deadline? Round-Robin?)&lt;/li&gt;
&lt;li&gt;Replace HTTP with gRPC in distributed mode&lt;/li&gt;
&lt;li&gt;Add Prometheus metrics&lt;/li&gt;
&lt;li&gt;Build a web dashboard&lt;/li&gt;
&lt;li&gt;Write a blog post about your use case — tag me!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’d love to see what you build.&lt;/p&gt;




&lt;h2&gt;
  
  
  👋 Let’s Talk
&lt;/h2&gt;

&lt;p&gt;Have you ever built your own scheduler?&lt;br&gt;&lt;br&gt;
Have you hit a wall with Go’s concurrency model?&lt;/p&gt;

&lt;p&gt;Drop a comment below. Let’s discuss.&lt;/p&gt;

&lt;p&gt;And if this resonated — &lt;strong&gt;clap, share, and follow&lt;/strong&gt; for more deep-dives into Go internals, concurrency, and systems design.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Because the best way to understand a language…&lt;br&gt;&lt;br&gt;
…is to rebuild its soul.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;#GoLang #Concurrency #Goroutine #SystemsProgramming #GMP #WorkStealing #OpenSource #DevTo #Programming #GoInterview #LearnGo #CodeWithMe&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>go</category>
      <category>opensource</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Generating Product Placeholders Locally in Go for E-Commerce Systems</title>
      <dc:creator>jiil</dc:creator>
      <pubDate>Tue, 30 Sep 2025 08:39:48 +0000</pubDate>
      <link>https://forem.com/jiil07/generating-product-placeholders-locally-in-go-for-e-commerce-systems-31ja</link>
      <guid>https://forem.com/jiil07/generating-product-placeholders-locally-in-go-for-e-commerce-systems-31ja</guid>
      <description>&lt;p&gt;In production e-commerce systems, placeholder images are commonly served via third-party services (e.g., &lt;code&gt;placehold.it&lt;/code&gt;, &lt;code&gt;unsplash.com&lt;/code&gt;) to mitigate UI flicker during asset loading. While convenient, this approach introduces unnecessary network dependencies, latency, and lack of brand consistency.&lt;/p&gt;

&lt;p&gt;To eliminate these issues in our internal e-commerce platform — built with Go (backend) and Next.js (frontend) — we implemented a local, deterministic placeholder generation system.&lt;/p&gt;

&lt;p&gt;The system runs during application startup and generates 40+ product image placeholders (400×400px, JPEG, 90% quality) in the &lt;code&gt;./uploads&lt;/code&gt; directory. Each image is customized with the product name and a branded gradient background. No external dependencies or runtime calls are required after generation.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt;: Go 1.23
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packages used&lt;/strong&gt;: &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;image/jpeg&lt;/code&gt;, &lt;code&gt;golang.org/x/image/font&lt;/code&gt;, &lt;code&gt;golang.org/x/image/math/fixed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image dimensions&lt;/strong&gt;: 400×400 pixels
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output format&lt;/strong&gt;: JPEG, quality 90%
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background&lt;/strong&gt;: Vertical linear gradient from &lt;code&gt;#6366F1&lt;/code&gt; (indigo) to &lt;code&gt;#8B5CF6&lt;/code&gt; (violet)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Top: "E-Commerce" in white (&lt;code&gt;#FFFFFF&lt;/code&gt;), &lt;code&gt;basicfont.Face7x13&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bottom: Product name (e.g., "iPhone 15 Pro") in semi-transparent white (&lt;code&gt;#FFFFFFCC&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Border&lt;/strong&gt;: 1px white stroke (&lt;code&gt;#FFFFFF64&lt;/code&gt;) with 20px rounded corners
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;File naming&lt;/strong&gt;: Matches product catalog (e.g., &lt;code&gt;iphone15_pro.jpg&lt;/code&gt; → "iPhone 15 Pro")
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Idempotency&lt;/strong&gt;: Generates only if file does not exist
&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Integration
&lt;/h2&gt;

&lt;p&gt;The generation script is invoked as part of the application startup workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make generate-placeholders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command is included in the make up sequence for development and as a pre-build step in Docker containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# In Dockerfile
RUN go build -o placeholders ./cmd/placeholders/main.go
RUN ./placeholders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Code Snippet (Core Logic)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func generatePlaceholderImage(filePath, productName string) error {
    width, height := 400, 400
    img := image.NewRGBA(image.Rect(0, 0, width, height))
    bgColor1 := color.RGBA{99, 102, 241, 255}
    bgColor2 := color.RGBA{139, 92, 246, 255}
    for y := 0; y &amp;lt; height; y++ {
        ratio := float64(y) / float64(height)
        r := uint8(float64(bgColor1.R)*(1-ratio) + float64(bgColor2.R)*ratio)
        g := uint8(float64(bgColor1.G)*(1-ratio) + float64(bgColor2.G)*ratio)
        b := uint8(float64(bgColor1.B)*(1-ratio) + float64(bgColor2.B)*ratio)
        for x := 0; x &amp;lt; width; x++ {
            img.Set(x, y, color.RGBA{r, g, b, 255})
        }
    }
    d := &amp;amp;font.Drawer{
        Dst:  img,
        Src:  image.NewUniform(color.RGBA{255, 255, 255, 255}),
        Face: basicfont.Face7x13,
        Dot:  fixed.Point26_6{X: fixed.I(width/2 - 60), Y: fixed.I(height/2 - 40)},
    }
    d.DrawString("E-Commerce")
    productDrawer := &amp;amp;font.Drawer{
        Dst:  img,
        Src:  image.NewUniform(color.RGBA{255, 255, 255, 200}),
        Face: basicfont.Face7x13,
        Dot:  fixed.Point26_6{X: fixed.I(width/2 - len(productName)*3), Y: fixed.I(height/2 + 20)},
    }
    productDrawer.DrawString(productName)
    accentColor := color.RGBA{255, 255, 255, 100}
    cornerSize := 20
    for x := 0; x &amp;lt; width; x++ {
        img.Set(x, 0, accentColor)
        img.Set(x, height-1, accentColor)
    }
    for y := 0; y &amp;lt; height; y++ {
        img.Set(0, y, accentColor)
        img.Set(width-1, y, accentColor)
    }
    for i := 0; i &amp;lt; cornerSize; i++ {
        img.Set(i, i, accentColor)
        img.Set(width-1-i, i, accentColor)
        img.Set(i, height-1-i, accentColor)
        img.Set(width-1-i, height-1-i, accentColor)
    }
    file, err := os.Create(filePath)
    if err != nil {
        return err
    }
    defer file.Close()
    return jpeg.Encode(file, img, &amp;amp;jpeg.Options{Quality: 90})
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conclusion&lt;br&gt;
Local placeholder generation is a low-effort, high-impact optimization for e-commerce systems. It removes network fragility, improves UX predictability, and reinforces architectural autonomy. This approach is recommended for any system where image assets are known in advance and environment control is feasible.&lt;/p&gt;

&lt;p&gt;Full implementation:&lt;br&gt;
&lt;a href="https://github.com/JIIL07/E-Commerce" rel="noopener noreferrer"&gt;https://github.com/JIIL07/E-Commerce&lt;/a&gt;&lt;br&gt;
Star it if you believe software should feel crafted — not just compiled.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>go</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Switched from Node.js to Go for My Backend — And My API Got 7x Faster (Here’s Why)</title>
      <dc:creator>jiil</dc:creator>
      <pubDate>Fri, 26 Sep 2025 20:43:26 +0000</pubDate>
      <link>https://forem.com/jiil07/i-switched-from-nodejs-to-go-for-my-backend-and-my-api-got-7x-faster-heres-why-249m</link>
      <guid>https://forem.com/jiil07/i-switched-from-nodejs-to-go-for-my-backend-and-my-api-got-7x-faster-heres-why-249m</guid>
      <description>&lt;p&gt;I used to love Node.js.&lt;/p&gt;

&lt;p&gt;But last year, when my e-commerce API started hitting &lt;strong&gt;500+ concurrent requests&lt;/strong&gt;, everything changed.&lt;/p&gt;




&lt;p&gt;I had a simple endpoint:&lt;br&gt;&lt;br&gt;
&lt;code&gt;GET /api/products?category=electronics&amp;amp;limit=20&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js (Express + MongoDB)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avg response time: &lt;strong&gt;850ms&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Memory usage: &lt;strong&gt;320MB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;CPU spiked to 95% under load
&lt;/li&gt;
&lt;li&gt;3/10 requests timed out during peak hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tried everything:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis caching
&lt;/li&gt;
&lt;li&gt;Connection pooling
&lt;/li&gt;
&lt;li&gt;Optimizing queries
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…nothing fixed the &lt;strong&gt;fundamental problem&lt;/strong&gt;:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Node.js is single-threaded. One slow request blocks the whole event loop.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And when 50 users clicked “Add to Cart” at once?&lt;br&gt;&lt;br&gt;
My API didn’t just slow down — it &lt;strong&gt;froze&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  🔍 I Started Looking Elsewhere
&lt;/h4&gt;

&lt;p&gt;I asked:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“What language is used by companies that handle millions of requests per second?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Answer: &lt;strong&gt;Go&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uber
&lt;/li&gt;
&lt;li&gt;Twitch
&lt;/li&gt;
&lt;li&gt;Dropbox
&lt;/li&gt;
&lt;li&gt;Cloudflare
&lt;/li&gt;
&lt;li&gt;GitHub (yes, their backend runs on Go)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I spent 3 days rewriting my API in Go + Gin.&lt;/p&gt;




&lt;h4&gt;
  
  
  🚀 The Results (After 1 Week of Migration)
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Node.js&lt;/th&gt;
&lt;th&gt;Go + Gin&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Avg Response Time&lt;/td&gt;
&lt;td&gt;850ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;110ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;7.7x faster&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Usage&lt;/td&gt;
&lt;td&gt;320MB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;87% less&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent Requests&lt;/td&gt;
&lt;td&gt;~120 before timeouts&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1,200+&lt;/strong&gt; stable&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;10x more&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU Usage&lt;/td&gt;
&lt;td&gt;90–100%&lt;/td&gt;
&lt;td&gt;15–25%&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;80% lower&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And here’s the best part:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I didn’t optimize anything.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
I just replaced Express with Gin.&lt;br&gt;&lt;br&gt;
That’s it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h4&gt;
  
  
  💡 Why Go Won (The Real Reasons)
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Node.js&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Async by design — but single-threaded&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;True concurrency&lt;/strong&gt; via goroutines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Callback hell → Promises → Async/Await&lt;/td&gt;
&lt;td&gt;Clean, synchronous-looking code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heavy dependencies (1000+ npm packages)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;One binary. Zero runtime deps.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory leaks are common&lt;/td&gt;
&lt;td&gt;Garbage collector is predictable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“It works on my machine”&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Compiled. Stable. Portable.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Go doesn’t try to be “everything”.&lt;br&gt;&lt;br&gt;
It’s &lt;strong&gt;focused&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s &lt;strong&gt;fast&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s &lt;strong&gt;designed for the server&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  🛠️ My Stack Now (For Context)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Go + Gin (lightweight, zero-allocation routing)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL (with pgx driver — native, fast)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache&lt;/strong&gt;: Redis 7
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Docker + Nginx + Makefile (&lt;code&gt;make up&lt;/code&gt; → live)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt;: Built-in &lt;code&gt;/health&lt;/code&gt; endpoint + Prometheus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yes — I still use &lt;strong&gt;Next.js on the frontend&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
JavaScript isn’t dead.&lt;br&gt;&lt;br&gt;
It’s just &lt;strong&gt;not the best tool for every job&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  🧠 What I Learned
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Speed isn’t about “optimization”. It’s about choosing the right tool.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don’t hate Node.js.&lt;br&gt;&lt;br&gt;
I still use it for:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI tools
&lt;/li&gt;
&lt;li&gt;Scripts
&lt;/li&gt;
&lt;li&gt;Frontend apps
&lt;/li&gt;
&lt;li&gt;Prototypes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for &lt;strong&gt;production APIs under load?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Go is the quiet, reliable engineer who shows up early, works hard, and never breaks.&lt;/strong&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  📦 Want to See It?
&lt;/h4&gt;

&lt;p&gt;I open-sourced my full e-commerce platform built with this stack:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/JIIL07/E-Commerce" rel="noopener noreferrer"&gt;https://github.com/JIIL07/E-Commerce&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full Go API with Gin
&lt;/li&gt;
&lt;li&gt;Next.js frontend
&lt;/li&gt;
&lt;li&gt;Docker Compose setup
&lt;/li&gt;
&lt;li&gt;One-command deploy: &lt;code&gt;make setup &amp;amp;&amp;amp; make up&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⭐ Star it if you’re tired of slow APIs.&lt;br&gt;&lt;br&gt;
💬 I’d love your feedback — especially if you’ve been through this too.&lt;/p&gt;




&lt;h4&gt;
  
  
  💬 Final Question for You:
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Have you ever switched from Node.js to another language for performance?&lt;br&gt;&lt;br&gt;
What was your “aha” moment?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me know below 👇&lt;br&gt;&lt;br&gt;
&lt;em&gt;(I read every comment.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>node</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built an E-Commerce Platform in Go + Next.js — And You Can Deploy It in 30 Seconds</title>
      <dc:creator>jiil</dc:creator>
      <pubDate>Fri, 26 Sep 2025 20:27:45 +0000</pubDate>
      <link>https://forem.com/jiil07/i-built-an-e-commerce-platform-in-go-nextjs-and-you-can-deploy-it-in-30-seconds-2lob</link>
      <guid>https://forem.com/jiil07/i-built-an-e-commerce-platform-in-go-nextjs-and-you-can-deploy-it-in-30-seconds-2lob</guid>
      <description>&lt;p&gt;Last month, I asked myself:&lt;/p&gt;

&lt;p&gt;“Why do most e-commerce platforms feel like a bloated mess of npm packages and slow APIs?” &lt;/p&gt;

&lt;p&gt;So I built E-Commerce Platform — a modern, high-performance store built with Go for the backend and Next.js for the frontend, all containerized with Docker and controlled via a simple Makefile.&lt;/p&gt;

&lt;p&gt;No more “npm install takes 5 minutes”.&lt;br&gt;
No more “why is my API responding in 800ms?”.&lt;br&gt;
No more “where’s the documentation?”.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/JIIL07/E-Commerce
&lt;span class="nb"&gt;cd &lt;/span&gt;E-Commerce
make setup &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and you’re running a full e-commerce stack on &lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🔧 What’s inside?&lt;br&gt;
✅ Frontend: Next.js 14 with App Router, SSR, Tailwind (or your favorite UI)&lt;br&gt;
✅ Backend: Go + Gin — blazing fast, memory-efficient, battle-tested&lt;br&gt;
✅ Database: PostgreSQL 15 with migrations&lt;br&gt;
✅ Cache: Redis 7 for sessions, product data, cart&lt;br&gt;
✅ Proxy: Nginx — SSL-ready, compression, static asset serving&lt;br&gt;
✅ Dev Workflow: make dev-backend, make dev-frontend, make migrate-up&lt;br&gt;
✅ Production: One-click make prod-up with SSL script included&lt;br&gt;
💡 Why Go + Next.js?&lt;br&gt;
Go handles 1000+ concurrent API requests with 20MB RAM.&lt;br&gt;
Next.js gives you SEO-friendly pages, fast load times, and great UX.&lt;br&gt;
Together? A store that feels like Shopify — but you own it.&lt;br&gt;
I’ve tested this with 500+ concurrent users in load tests — no crashes, no memory leaks.&lt;/p&gt;

&lt;p&gt;👉 Try it out:&lt;br&gt;
GitHub: &lt;a href="https://github.com/JIIL07/E-Commerce" rel="noopener noreferrer"&gt;https://github.com/JIIL07/E-Commerce&lt;/a&gt;&lt;br&gt;
(Star it if you like it — I’d love your feedback, issues, or PRs!)&lt;/p&gt;

&lt;p&gt;This isn’t just code — it’s a template for building fast, scalable commerce apps without the bloat.&lt;br&gt;
Perfect for indie hackers, startups, or devs who want to ship fast.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>go</category>
      <category>typescript</category>
      <category>postgres</category>
    </item>
    <item>
      <title>🌐 Introducing Jcloud: A Versatile Cloud File Storage Solution</title>
      <dc:creator>jiil</dc:creator>
      <pubDate>Sat, 24 Aug 2024 23:23:45 +0000</pubDate>
      <link>https://forem.com/jiil07/jcloud-a-new-go-tool-for-managing-files-1od2</link>
      <guid>https://forem.com/jiil07/jcloud-a-new-go-tool-for-managing-files-1od2</guid>
      <description>&lt;h2&gt;
  
  
  ☁️ Jcloud
&lt;/h2&gt;

&lt;p&gt;I'm excited to share a project I've been working on called Jcloud. Jcloud is a client-server application for cloud filePath storage. This project provides a filePath storage system with a backend implemented in Go and a frontend using TypeScript. The backend uses SQLite3 to manage user files and offers a basic API for interacting with stored filePath data.&lt;/p&gt;

&lt;h2&gt;
  
  
  📖 Main Functionalities
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upload, list, delete, edit files&lt;/li&gt;
&lt;li&gt;Unlimited space to keep files&lt;/li&gt;
&lt;li&gt;Opportunity to download files back on local device&lt;/li&gt;
&lt;li&gt;Usage of Sqlite3 database to store files on server&lt;/li&gt;
&lt;li&gt;Rust Desktop App&lt;/li&gt;
&lt;li&gt;TypeScript Web Interface&lt;/li&gt;
&lt;li&gt;Pure Go CLI&lt;/li&gt;
&lt;li&gt;Txt formatted logs with levels&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌟 Repository
&lt;/h2&gt;

&lt;p&gt;You can find the source code and contribute to the project on &lt;a href="https://github.com/JIIL07/jcloud" rel="noopener noreferrer"&gt;https://github.com/JIIL07/jcloud&lt;/a&gt;. I’d love to hear your feedback and any suggestions you might have!&lt;/p&gt;

</description>
      <category>go</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
