<?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: Saras Growth Space</title>
    <description>The latest articles on Forem by Saras Growth Space (@saras_growth_space).</description>
    <link>https://forem.com/saras_growth_space</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%2F3805711%2F9d71d829-9e4b-42ad-919e-ef864f55f79d.png</url>
      <title>Forem: Saras Growth Space</title>
      <link>https://forem.com/saras_growth_space</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/saras_growth_space"/>
    <language>en</language>
    <item>
      <title>Your AI Isn’t Dumb. It Just Doesn’t Think Twice.</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Sat, 18 Apr 2026 14:33:53 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/your-ai-isnt-dumb-it-just-doesnt-think-twice-1nh4</link>
      <guid>https://forem.com/saras_growth_space/your-ai-isnt-dumb-it-just-doesnt-think-twice-1nh4</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/openclaw-2026-04-16"&gt;OpenClaw Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Most AI systems don’t fail because they lack intelligence.&lt;/p&gt;

&lt;p&gt;They fail because they answer too quickly.&lt;/p&gt;

&lt;p&gt;We’ve optimized for speed—but not for thinking.&lt;/p&gt;

&lt;p&gt;So I built a minimal AI agent that does one simple thing differently:&lt;/p&gt;

&lt;p&gt;👉 It doesn’t trust its first answer.&lt;/p&gt;

&lt;p&gt;Instead, it runs a small loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generate
&lt;/li&gt;
&lt;li&gt;critique
&lt;/li&gt;
&lt;li&gt;improve
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No complex setup. No multi-agent orchestration.&lt;br&gt;&lt;br&gt;
Just a tiny shift from “one-shot response” to “thinking loop”.&lt;/p&gt;


&lt;h2&gt;
  
  
  How I Used OpenClaw
&lt;/h2&gt;

&lt;p&gt;I used OpenClaw to structure a simple 3-step workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate&lt;/strong&gt; → quick first response
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critique&lt;/strong&gt; → what’s missing? what’s weak?
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve&lt;/strong&gt; → rewrite using that feedback
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the full loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input → Generate → Critique → Improve → Output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of trying to force better answers through prompts,&lt;br&gt;&lt;br&gt;
I used OpenClaw to design a better &lt;em&gt;process&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔁 The Thinking Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Input]
↓
[Generate]
↓
[Critique]
↓
[Improve]
↓
[Output]
↺ (feedback loop)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here’s what this looks like in practice:&lt;/p&gt;

&lt;h3&gt;
  
  
  Input
&lt;/h3&gt;

&lt;p&gt;Why do people procrastinate?&lt;/p&gt;




&lt;h3&gt;
  
  
  First Answer
&lt;/h3&gt;

&lt;p&gt;People procrastinate due to lack of motivation, fear of failure, or poor time management.&lt;/p&gt;




&lt;h3&gt;
  
  
  Self-Critique
&lt;/h3&gt;

&lt;p&gt;This is correct but generic. It lists reasons without explaining the underlying behavior. It also lacks a relatable example.&lt;/p&gt;




&lt;h3&gt;
  
  
  Improved Answer
&lt;/h3&gt;

&lt;p&gt;People procrastinate not because they’re lazy, but because they’re avoiding discomfort.&lt;/p&gt;

&lt;p&gt;Starting something difficult creates uncertainty or fear of doing it badly. Instead of facing that, the brain shifts toward easier, short-term rewards.&lt;/p&gt;

&lt;p&gt;So procrastination isn’t really a time problem—it’s an emotional one.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Changed?
&lt;/h3&gt;

&lt;p&gt;Same model. Same input.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First answer → surface-level
&lt;/li&gt;
&lt;li&gt;Second answer → actually useful
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is one extra step: reflection.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;I went into this thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;better prompts = better outputs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I came out thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;better loops = better systems&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The biggest shift for me was this:&lt;/p&gt;

&lt;p&gt;Most AI setups today are built like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ask once
&lt;/li&gt;
&lt;li&gt;answer once
&lt;/li&gt;
&lt;li&gt;done
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But real thinking doesn’t work like that.&lt;/p&gt;

&lt;p&gt;It loops.&lt;br&gt;&lt;br&gt;
It questions itself.&lt;br&gt;&lt;br&gt;
It improves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;Before making your AI system more complex:&lt;/p&gt;

&lt;p&gt;👉 Make it think twice.&lt;/p&gt;




&lt;h2&gt;
  
  
  ClawCon Michigan
&lt;/h2&gt;

&lt;p&gt;I did not attend ClawCon Michigan, but I really appreciate the community and ideas around OpenClaw that inspired this challenge.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>openclawchallenge</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What If Your Daily Habits Had a Carbon Score? I Built EcoTrack AI 🌱</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Sat, 18 Apr 2026 08:51:56 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/what-if-your-daily-habits-had-a-carbon-score-i-built-ecotrack-ai-3dk2</link>
      <guid>https://forem.com/saras_growth_space/what-if-your-daily-habits-had-a-carbon-score-i-built-ecotrack-ai-3dk2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Most people understand climate change — but very few can &lt;em&gt;see&lt;/em&gt; their personal impact in a meaningful way.&lt;/p&gt;

&lt;p&gt;EcoTrack AI is a frontend-only React application that turns everyday lifestyle choices into a measurable carbon footprint and feedback system.&lt;/p&gt;

&lt;p&gt;Users enter three simple inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transport&lt;/li&gt;
&lt;li&gt;food habits&lt;/li&gt;
&lt;li&gt;daily energy usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system then computes a deterministic carbon score using real-world emission factors, compares it against global benchmarks, and generates rule-based sustainability recommendations.&lt;/p&gt;

&lt;p&gt;But the core idea is not calculation.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;behavior visibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;EcoTrack AI is designed as a &lt;strong&gt;behavioral feedback system&lt;/strong&gt;, where small daily actions become visible, comparable, and improvable over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/d11IIhdVSbc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lifestyle input selection&lt;/li&gt;
&lt;li&gt;simulated analysis flow&lt;/li&gt;
&lt;li&gt;carbon score generation&lt;/li&gt;
&lt;li&gt;comparison with global averages&lt;/li&gt;
&lt;li&gt;personalized suggestions&lt;/li&gt;
&lt;li&gt;weekly trend visualization&lt;/li&gt;
&lt;li&gt;collective impact projection&lt;/li&gt;
&lt;li&gt;feedback loop for behavior adjustment&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;EcoTrack AI was intentionally designed as a &lt;strong&gt;frontend-first behavioral simulation system&lt;/strong&gt;, not a backend-driven AI product.&lt;/p&gt;

&lt;p&gt;The goal was to build something explainable, transparent, and focused on user behavior feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Design Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Deterministic Carbon Engine&lt;/strong&gt;&lt;br&gt;
All emissions are calculated using predefined real-world factors for transport, food, and energy usage. This ensures full transparency and reproducibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Rule-Based Recommendation System&lt;/strong&gt;&lt;br&gt;
Suggestions are generated using explicit conditional logic tied directly to user inputs. No machine learning or external APIs are used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Simulated Intelligence Layer (UX Choice)&lt;/strong&gt;&lt;br&gt;
A short loading sequence simulates “AI analysis”. This is not real AI — it is a deliberate UX decision to make the system feel responsive and intentional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Behavior-Driven Architecture&lt;/strong&gt;&lt;br&gt;
Every component is designed around one idea:&lt;br&gt;
👉 “How does this change user behavior after seeing their result?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Personalized Visualization System&lt;/strong&gt;&lt;br&gt;
Weekly trend data is generated based on user input, making insights feel contextual rather than static.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;p&gt;Built using React (Vite) with a modular component structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralized state management in &lt;code&gt;App.jsx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Isolated carbon logic in &lt;code&gt;carbonLogic.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Component-driven UI for each stage of user journey&lt;/li&gt;
&lt;li&gt;Recharts for visualization&lt;/li&gt;
&lt;li&gt;Pure CSS design system with semantic color tokens&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  AI Usage Transparency
&lt;/h2&gt;

&lt;p&gt;EcoTrack AI does not use real AI models.&lt;/p&gt;

&lt;p&gt;All “AI-powered insights” are simulated using deterministic rule-based logic.&lt;/p&gt;

&lt;p&gt;However, the architecture is intentionally designed to support future integration with LLM-based systems such as Google Gemini for contextual recommendations.&lt;/p&gt;

&lt;p&gt;Development was accelerated using AI tools for component scaffolding and UI iteration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All carbon calculations are based on defined emission factors&lt;/li&gt;
&lt;li&gt;No backend, APIs, or external services are used&lt;/li&gt;
&lt;li&gt;System is fully explainable and runs entirely in the browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EcoTrack AI is not a prediction tool.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;feedback system for behavior change&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Its purpose is simple:&lt;/p&gt;

&lt;p&gt;Make impact visible → make decisions conscious → enable small, consistent change.&lt;/p&gt;

&lt;p&gt;Because awareness alone doesn’t change behavior — feedback does.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>gamification</category>
    </item>
    <item>
      <title>AI Increased My Workload — Not My Salary</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Thu, 16 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/ai-increased-my-workload-not-my-salary-fog</link>
      <guid>https://forem.com/saras_growth_space/ai-increased-my-workload-not-my-salary-fog</guid>
      <description>&lt;p&gt;AI was supposed to make our lives easier.&lt;br&gt;&lt;br&gt;
So why does it feel like we are working more than ever?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Quiet Shift
&lt;/h2&gt;

&lt;p&gt;AI tools didn’t reduce work.&lt;br&gt;&lt;br&gt;
They &lt;strong&gt;changed expectations&lt;/strong&gt;.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;“This task takes 2–3 days.”&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;“With AI, you can finish it today, right?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same role.&lt;br&gt;&lt;br&gt;
Same pay.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;More output expected.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Changed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🚀 Faster Coding ≠ Less Work
&lt;/h3&gt;

&lt;p&gt;Yes, AI helps write code faster.&lt;/p&gt;

&lt;p&gt;But now you also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review AI output
&lt;/li&gt;
&lt;li&gt;Fix hidden bugs
&lt;/li&gt;
&lt;li&gt;Validate logic
&lt;/li&gt;
&lt;li&gt;Handle edge cases
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 We’re writing less, but &lt;strong&gt;thinking more&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  📈 More Responsibility, No Upgrade
&lt;/h3&gt;

&lt;p&gt;Today we are expected to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ship faster
&lt;/li&gt;
&lt;li&gt;Know more stacks
&lt;/li&gt;
&lt;li&gt;Act as reviewer + architect
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI didn’t replace roles.&lt;br&gt;&lt;br&gt;
It &lt;strong&gt;stacked them onto one person.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💸 The Salary Gap
&lt;/h3&gt;

&lt;p&gt;Some companies quietly assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI makes you more productive, so we can pay the same (or less).”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But productivity gains ≠ reduced effort.&lt;/p&gt;

&lt;p&gt;They mean:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;higher expectations per person.&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;AI isn’t the issue.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Expectation inflation is.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deadlines shrink
&lt;/li&gt;
&lt;li&gt;Workload grows
&lt;/li&gt;
&lt;li&gt;Effort becomes invisible
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Doing more is just “normal.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Should We Do
&lt;/h2&gt;

&lt;p&gt;Keep it simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push back on unrealistic timelines
&lt;/li&gt;
&lt;li&gt;Highlight validation work (AI isn’t always right)
&lt;/li&gt;
&lt;li&gt;Focus on quality, not just speed
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your value isn’t how fast you generate code.&lt;/p&gt;

&lt;p&gt;It’s how well you &lt;strong&gt;think, decide, and build correctly.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;AI made us faster.&lt;/p&gt;

&lt;p&gt;It shouldn’t make us cheaper or more overworked.&lt;/p&gt;

&lt;p&gt;If productivity goes up, something else should too:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pay, time, or balance.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Teapot Cloud: Enterprise Software That Refuses to Work (HTTP 418)</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Sun, 12 Apr 2026 14:04:11 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/teapot-cloud-enterprise-software-that-refuses-to-work-http-418-3o5d</link>
      <guid>https://forem.com/saras_growth_space/teapot-cloud-enterprise-software-that-refuses-to-work-http-418-3o5d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🫖 Teapot Cloud — Scalable Failure as a Service
&lt;/h2&gt;

&lt;p&gt;In a world of highly reliable, production-grade systems… I built a platform that looks enterprise-ready — but is fundamentally incapable of doing its job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teapot Cloud&lt;/strong&gt; is a SaaS-style beverage infrastructure platform with dashboards, logs, analytics, and pricing tiers.&lt;/p&gt;

&lt;p&gt;There’s just one core feature:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It refuses to brew coffee. Every. Single. Time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it does so with complete confidence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;HTTP 418 — I'm a teapot&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Why 418 Matters
&lt;/h3&gt;

&lt;p&gt;HTTP 418 — &lt;em&gt;"I'm a teapot"&lt;/em&gt; — is one of the most iconic inside jokes in internet history, introduced as part of the Hyper Text Coffee Pot Control Protocol.&lt;/p&gt;

&lt;p&gt;It was never meant to be useful.&lt;/p&gt;

&lt;p&gt;And that’s exactly why Teapot Cloud exists.&lt;/p&gt;

&lt;p&gt;This system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rejects invalid beverage requests (coffee ☕❌)&lt;/li&gt;
&lt;li&gt;Enforces protocol purity&lt;/li&gt;
&lt;li&gt;Treats failure as a &lt;strong&gt;feature&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a bug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is compliance.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;🎥 Video Walkthrough: &lt;em&gt;&lt;a href="https://youtu.be/YH84QHUCjo0" rel="noopener noreferrer"&gt;https://youtu.be/YH84QHUCjo0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This demo shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attempting to brew coffee&lt;/li&gt;
&lt;li&gt;Staged “enterprise” loading sequences&lt;/li&gt;
&lt;li&gt;Immediate HTTP 418 rejection&lt;/li&gt;
&lt;li&gt;Live dashboard metrics reacting in real time&lt;/li&gt;
&lt;li&gt;Logs capturing critical brewing violations&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  How I Built It
&lt;/h3&gt;

&lt;p&gt;Teapot Cloud is built to feel like a real SaaS product — even though it solves absolutely nothing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tech Stack
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React 18&lt;/strong&gt; (functional components + hooks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; (utility-first styling with custom effects)&lt;/li&gt;
&lt;li&gt;Custom animations using &lt;code&gt;setTimeout&lt;/code&gt; and &lt;code&gt;setInterval&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fully simulated backend behavior (no real API)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Core Systems
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Brewing Interface&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input-based beverage request system (defaults to coffee)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multi-stage loading messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Initializing brew protocol…”&lt;/li&gt;
&lt;li&gt;“Consulting tea leaves…”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Always returns HTTP 418 with randomized responses like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Short and stout — request denied”&lt;/li&gt;
&lt;li&gt;“Handle detected. Coffee not permitted”&lt;/li&gt;
&lt;li&gt;“Protocol violation: beverage mismatch”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer Mode&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toggle to reveal raw JSON responses&lt;/li&gt;
&lt;li&gt;Structured 418 error payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Live metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coffee Attempts Blocked ☕🚫&lt;/li&gt;
&lt;li&gt;Tea Success Rate (suspiciously high)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Dynamic “System Mood”&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Real-time animated charts powered by nonsense data&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Logs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminal-style streaming logs&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sample entries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[CRITICAL] Coffee brewing attempt detected&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[WARN] User expectations exceed system capability&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[DEBUG] Tea leaves are judging input&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free / Pro / Enterprise tiers&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Feature highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Faster 418 errors”&lt;/li&gt;
&lt;li&gt;“Priority denial queue”&lt;/li&gt;
&lt;li&gt;“Dedicated disappointment manager”&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;All plans return HTTP 418. This is intentional.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Prize Category
&lt;/h3&gt;

&lt;h3&gt;
  
  
  🫖 Best Ode to Larry Masinter
&lt;/h3&gt;

&lt;p&gt;This project is a direct tribute to Larry Masinter and the spirit of HTTP 418.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every request results in a &lt;strong&gt;418 response&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The system is designed around honoring that constraint&lt;/li&gt;
&lt;li&gt;Even premium users cannot bypass it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teapot Cloud doesn’t fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It refuses — correctly.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Teapot Cloud explores a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What if software looked perfect… but was fundamentally designed not to work?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s a celebration of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over-engineered interfaces&lt;/li&gt;
&lt;li&gt;Beautiful dashboards&lt;/li&gt;
&lt;li&gt;And completely useless outcomes&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;System Status:&lt;/strong&gt; Operational ✅&lt;br&gt;
&lt;strong&gt;Coffee Success Rate:&lt;/strong&gt; 0% ❌&lt;br&gt;
&lt;strong&gt;Standards Compliance:&lt;/strong&gt; 100% 🫖&lt;/p&gt;




&lt;p&gt;Thanks for checking it out.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Is WFO/Hybrid Work Really Helping Us?</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Thu, 09 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/is-wfohybrid-work-really-helping-us-4d13</link>
      <guid>https://forem.com/saras_growth_space/is-wfohybrid-work-really-helping-us-4d13</guid>
      <description>&lt;p&gt;We were told hybrid and work-from-office (WFO) models would improve collaboration, productivity, and work-life balance. But for many of us, the reality feels very different.&lt;/p&gt;

&lt;p&gt;Daily commuting alone takes away hours from our lives. Time that could have gone into rest, learning, or simply being present with ourselves or loved ones. Instead, it’s spent in traffic, crowded transport, and constant fatigue before the workday even begins.&lt;/p&gt;

&lt;p&gt;For those living away from their families, the emotional gap is hard to ignore. Video calls can’t replace real presence. Missing out on everyday moments slowly builds a sense of isolation that’s easy to overlook but difficult to deal with.&lt;/p&gt;

&lt;p&gt;Then comes the practical side of living alone. Managing everything—cooking, cleaning, errands—adds another layer of responsibility. The workday doesn’t end after logging off; it just shifts into personal tasks. Over time, this creates a cycle where there’s barely any space left to recharge.&lt;/p&gt;

&lt;p&gt;And beyond logistics, there’s a quieter but deeper impact — emotional and mental strain.&lt;/p&gt;

&lt;p&gt;Living away from family, handling everything alone, and constantly switching between personal responsibilities and work creates a kind of invisible exhaustion.&lt;/p&gt;

&lt;p&gt;When your day starts with a long commute and ends with unfinished household work, there’s little time left to recover. This doesn’t just affect personal well-being — it impacts focus, creativity, and the quality of work itself.&lt;/p&gt;

&lt;p&gt;Ironically, what’s meant to improve productivity can sometimes do the opposite. Less energy, more stress, and fragmented attention rarely lead to better outcomes.&lt;/p&gt;

&lt;p&gt;There’s also the financial reality. Rent, transport, food, and daily expenses keep increasing, but salaries often don’t reflect these added costs. In many cases, working from the office becomes significantly more expensive than working remotely.&lt;/p&gt;

&lt;p&gt;So it raises a real question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are we actually gaining more than we’re losing with WFO/hybrid models?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Maybe the conversation shouldn’t just be about where we work, but how work can better support real lives, real constraints, and real well-being.&lt;/p&gt;

&lt;p&gt;Curious to hear your experience — has WFO/hybrid improved things for you, or made it harder?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>mentalhealth</category>
      <category>watercooler</category>
      <category>workplace</category>
    </item>
    <item>
      <title>Stop “Vibe Coding” — Start Understanding the Problem First</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Thu, 02 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/stop-vibe-coding-start-understanding-the-problem-first-6m9</link>
      <guid>https://forem.com/saras_growth_space/stop-vibe-coding-start-understanding-the-problem-first-6m9</guid>
      <description>&lt;p&gt;One of the most underrated mistakes in development isn’t about syntax, frameworks, or tools.&lt;/p&gt;

&lt;p&gt;It’s jumping into coding &lt;strong&gt;without truly understanding what you’re trying to build.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You open your editor, get an idea, start wiring things together… and it &lt;em&gt;feels&lt;/em&gt; like progress.&lt;/p&gt;

&lt;p&gt;But most of the time, it’s just motion — not direction.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚫 What happens when you skip understanding?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. You solve the wrong problem
&lt;/h3&gt;

&lt;p&gt;You build something that &lt;em&gt;works&lt;/em&gt; — but doesn’t actually meet the real need.&lt;/p&gt;

&lt;p&gt;Because you never clarified the use case in the first place.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. You waste time rewriting
&lt;/h3&gt;

&lt;p&gt;At first, things move fast.&lt;/p&gt;

&lt;p&gt;Then comes the realization:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait… this isn’t what I actually needed.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now you refactor. Rebuild. Sometimes restart completely.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Every decision feels random
&lt;/h3&gt;

&lt;p&gt;When the “why” is missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tech stack choices become guesses&lt;/li&gt;
&lt;li&gt;Architecture has no direction&lt;/li&gt;
&lt;li&gt;Even small decisions feel uncertain&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Your project turns messy
&lt;/h3&gt;

&lt;p&gt;Instead of a clear flow, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;disconnected features&lt;/li&gt;
&lt;li&gt;inconsistent logic&lt;/li&gt;
&lt;li&gt;patches over patches&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Effort ≠ Progress
&lt;/h3&gt;

&lt;p&gt;You’re spending hours coding… but not getting closer to a meaningful outcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What to do instead
&lt;/h2&gt;

&lt;p&gt;Before writing code, pause and define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What problem am I solving?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who is this for?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What exactly should this do?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What does success look like?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What constraints exist?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need a full document.&lt;/p&gt;

&lt;p&gt;Even &lt;strong&gt;10–15 minutes of clarity&lt;/strong&gt; can save hours (or days) later.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The real mindset shift
&lt;/h2&gt;

&lt;p&gt;Coding is not just about building things.&lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;understanding what should be built — and why.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“Vibe coding” feels fast at the start, but clarity is what actually gets you to the finish line.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 Final thought
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Slow down before you start — so you don’t get stuck halfway.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>coding</category>
    </item>
    <item>
      <title>The Infinite Loop of Change in Tech</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Thu, 26 Mar 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/the-infinite-loop-of-change-in-tech-1nf9</link>
      <guid>https://forem.com/saras_growth_space/the-infinite-loop-of-change-in-tech-1nf9</guid>
      <description>&lt;p&gt;You finally decide.&lt;/p&gt;

&lt;p&gt;“This is the stack. This is the approach. This is &lt;em&gt;it&lt;/em&gt;.”&lt;/p&gt;

&lt;p&gt;You open your editor, start building, things begin to click… and then—&lt;/p&gt;

&lt;p&gt;A new update drops.&lt;br&gt;
A library deprecates something.&lt;br&gt;
A better pattern shows up.&lt;br&gt;
Someone on your team suggests a “cleaner” way.&lt;/p&gt;

&lt;p&gt;So you pause. Rethink. Refactor.&lt;/p&gt;

&lt;p&gt;Then repeat.&lt;/p&gt;

&lt;p&gt;Welcome to one of the most underrated realities of working in tech:&lt;br&gt;
&lt;strong&gt;nothing stays still long enough for you to feel completely done.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;At first, it feels frustrating.&lt;/p&gt;

&lt;p&gt;You question your decisions.&lt;br&gt;
You feel like you’re constantly going back instead of forward.&lt;br&gt;
You wonder if you’re just overcomplicating things.&lt;/p&gt;

&lt;p&gt;But over time, something shifts.&lt;/p&gt;

&lt;p&gt;You realize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The loop isn’t a bug — it’s the system.&lt;/li&gt;
&lt;li&gt;Stability isn’t the goal — adaptability is.&lt;/li&gt;
&lt;li&gt;“Perfect decisions” don’t exist — only &lt;em&gt;current best choices&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The real skill isn’t just coding.&lt;/p&gt;

&lt;p&gt;It’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deciding &lt;em&gt;when to move forward despite uncertainty&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Knowing &lt;em&gt;what not to refactor&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Accepting that &lt;em&gt;change will always outpace your plans&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;So now, instead of fighting the loop, I try to work with it:&lt;/p&gt;

&lt;p&gt;Build → Learn → Adjust → Ship → Repeat&lt;/p&gt;

&lt;p&gt;Not endlessly polishing.&lt;br&gt;
Not endlessly restarting.&lt;br&gt;
Just iterating with intent.&lt;/p&gt;




&lt;p&gt;Tech doesn’t reward those who get it right the first time.&lt;/p&gt;

&lt;p&gt;It rewards those who can &lt;strong&gt;keep going when things change.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And they always do.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Production Challenges with SSE</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Sat, 21 Mar 2026 15:05:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/production-challenges-with-sse-3k7g</link>
      <guid>https://forem.com/saras_growth_space/production-challenges-with-sse-3k7g</guid>
      <description>&lt;p&gt;After building a working SSE demo, the next step is &lt;strong&gt;making it production-ready&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Real-world SSE systems face challenges that simple demos don’t cover. Let’s break them down.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Automatic Reconnection
&lt;/h2&gt;

&lt;p&gt;Browsers using &lt;strong&gt;EventSource&lt;/strong&gt; automatically reconnect if the connection drops.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By default, the &lt;strong&gt;retry delay is 3 seconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You can customize it from the server:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;retry: 5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Units are in &lt;strong&gt;milliseconds&lt;/strong&gt; (so &lt;code&gt;5000&lt;/code&gt; → 5 seconds).&lt;/li&gt;
&lt;li&gt;Include this at the start of your SSE stream:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;retry: 5000

data: Welcome!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2️⃣ Heartbeats / Keep-Alives
&lt;/h2&gt;

&lt;p&gt;Some proxies or load balancers close idle HTTP connections.&lt;/p&gt;

&lt;p&gt;To prevent this, send &lt;strong&gt;regular heartbeat messages&lt;/strong&gt; even if there’s no real event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_generator&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: Event &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# send an event every 10 seconds to keep connection alive
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Heartbeats &lt;strong&gt;avoid silent disconnects&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Can be a blank message:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data: \n\n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ Handling Last-Event-ID
&lt;/h2&gt;

&lt;p&gt;SSE supports &lt;strong&gt;resuming after a reconnect&lt;/strong&gt; using the &lt;code&gt;Last-Event-ID&lt;/code&gt; header.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The client automatically sends:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Last-Event-ID: 101
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Server can &lt;strong&gt;resume from the last message&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Useful if messages are critical (e.g., order updates, notifications).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4️⃣ Proxy &amp;amp; Load Balancer Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SSE uses a &lt;strong&gt;long-lived HTTP connection&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Some reverse proxies (like Nginx) may &lt;strong&gt;timeout idle connections&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Increase proxy timeout&lt;/li&gt;
&lt;li&gt;Use heartbeats to keep the connection alive&lt;/li&gt;
&lt;li&gt;Consider sticky sessions if using multiple servers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5️⃣ Scaling SSE for Many Clients
&lt;/h2&gt;

&lt;p&gt;SSE is &lt;strong&gt;one-way&lt;/strong&gt;, but each client keeps a connection open → memory usage grows linearly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Options for scaling:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use async frameworks&lt;/strong&gt; (FastAPI + Uvicorn) → lightweight connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish/Subscribe system&lt;/strong&gt; (Redis, Kafka) → one event source feeds many clients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load balancers&lt;/strong&gt; → distribute connections across multiple SSE servers&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6️⃣ When to Consider WebSockets Instead
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SSE = server → client&lt;/li&gt;
&lt;li&gt;WebSockets = two-way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your system needs &lt;strong&gt;real-time bidirectional communication&lt;/strong&gt; (like chat), consider &lt;strong&gt;WebSockets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Otherwise, SSE is simpler and easier to scale for &lt;strong&gt;notifications, dashboards, stock tickers, activity feeds&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Summary — Production Best Practices
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Challenge&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connection drops&lt;/td&gt;
&lt;td&gt;Automatic reconnection via EventSource + retry header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle timeouts&lt;/td&gt;
&lt;td&gt;Heartbeats / keep-alive messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missed events&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;id&lt;/code&gt; + &lt;code&gt;Last-Event-ID&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxies/load balancers&lt;/td&gt;
&lt;td&gt;Increase timeout, sticky sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Many clients&lt;/td&gt;
&lt;td&gt;Async frameworks, pub/sub system, load balancers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Next Steps
&lt;/h2&gt;

&lt;p&gt;With this article, you now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Working SSE demo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production-ready strategies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Knowledge to &lt;strong&gt;answer interviews confidently&lt;/strong&gt; about SSE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, you can &lt;strong&gt;combine SSE with FastAPI, Redis, or other backends&lt;/strong&gt; to build scalable, real-world systems.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>sse</category>
      <category>software</category>
    </item>
    <item>
      <title>Build SSE in Python (FastAPI)</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Sat, 21 Mar 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/build-sse-in-python-fastapi-4g6c</link>
      <guid>https://forem.com/saras_growth_space/build-sse-in-python-fastapi-4g6c</guid>
      <description>&lt;p&gt;We’re building a &lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt; demo using &lt;strong&gt;FastAPI&lt;/strong&gt;.&lt;br&gt;
This example streams messages to a browser &lt;strong&gt;immediately and reliably&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣ Dependencies
&lt;/h2&gt;

&lt;p&gt;Install the required packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional (for HTML rendering if needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;jinja2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2️⃣ Python Code (SSE + HTML)
&lt;/h2&gt;

&lt;p&gt;Save this as &lt;code&gt;main.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.responses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StreamingResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTMLResponse&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

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

&lt;span class="c1"&gt;# SSE generator
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;event_generator&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="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: Message &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Each message ends with two newlines
&lt;/span&gt;        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# simulate delay
&lt;/span&gt;
&lt;span class="c1"&gt;# SSE endpoint
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;StreamingResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;event_generator&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;media_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text/event-stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Serve HTML page for testing
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;HTMLResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html&amp;gt;
      &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;SSE Test&amp;lt;/h1&amp;gt;
        &amp;lt;ul id=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;gt;&amp;lt;/ul&amp;gt;
        &amp;lt;script&amp;gt;
          const source = new EventSource(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;);
          const messages = document.getElementById(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;);

          source.onmessage = function(event) {
            const li = document.createElement(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;li&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;);
            li.textContent = event.data;
            messages.appendChild(li);
          };
        &amp;lt;/script&amp;gt;
      &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;StreamingResponse&lt;/code&gt; → streams events continuously&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data: ...\n\n&lt;/code&gt; → required format for SSE&lt;/li&gt;
&lt;li&gt;HTML served directly from FastAPI for &lt;strong&gt;easy testing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Browser automatically reconnects if connection drops&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3️⃣ How to Run
&lt;/h2&gt;

&lt;p&gt;Open terminal in the folder with &lt;code&gt;main.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt; → Python file name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;app&lt;/code&gt; → FastAPI instance&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--reload&lt;/code&gt; → auto-reloads on code change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then open in your browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:8000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;strong&gt;messages appear one by one every second&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Each SSE message &lt;strong&gt;must end with &lt;code&gt;\n\n&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Delay in the generator (&lt;code&gt;time.sleep()&lt;/code&gt;) simulates real-time updates&lt;/li&gt;
&lt;li&gt;Browser handles reconnection automatically&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Next Steps
&lt;/h2&gt;

&lt;p&gt;Next, we’ll cover &lt;strong&gt;production challenges with SSE&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heartbeats to keep connections alive&lt;/li&gt;
&lt;li&gt;Automatic reconnection tips&lt;/li&gt;
&lt;li&gt;Proxy &amp;amp; load balancer considerations&lt;/li&gt;
&lt;li&gt;Scaling SSE for many clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are critical for building &lt;strong&gt;real-world SSE systems&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>sse</category>
      <category>python</category>
    </item>
    <item>
      <title>When should you use SSE vs Polling vs WebSockets?</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Sat, 21 Mar 2026 04:35:11 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/when-should-you-use-sse-vs-polling-vs-websockets-7fa</link>
      <guid>https://forem.com/saras_growth_space/when-should-you-use-sse-vs-polling-vs-websockets-7fa</guid>
      <description>&lt;p&gt;When building real-time applications, developers usually consider three approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polling&lt;/li&gt;
&lt;li&gt;Server-Sent Events (SSE)&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, they may seem similar.&lt;/p&gt;

&lt;p&gt;But choosing the wrong one can lead to &lt;strong&gt;performance issues, complexity, or scalability problems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break them down clearly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 1. Polling — The Simplest Approach
&lt;/h2&gt;

&lt;p&gt;Polling means the client repeatedly asks the server for updates.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → “Any update?”
Server → “No”

Client → “Any update?”
Server → “No”

Client → “Any update?”
Server → “Yes”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Very easy to implement&lt;/li&gt;
&lt;li&gt;Works everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Wastes bandwidth (many useless requests)&lt;/li&gt;
&lt;li&gt;High server load&lt;/li&gt;
&lt;li&gt;Delayed updates&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ 2. Server-Sent Events (SSE)
&lt;/h2&gt;

&lt;p&gt;With SSE, the client opens a single connection and waits for updates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → open connection
Server → send updates when ready
Server → send updates when ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SSE uses standard HTTP and the browser API: &lt;strong&gt;EventSource&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Efficient (no repeated requests)&lt;/li&gt;
&lt;li&gt;Simple to implement&lt;/li&gt;
&lt;li&gt;Built-in reconnection&lt;/li&gt;
&lt;li&gt;Works over HTTP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One-way communication (server → client only)&lt;/li&gt;
&lt;li&gt;Not suitable for interactive apps (like chat)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 3. WebSockets — Full Duplex Communication
&lt;/h2&gt;

&lt;p&gt;WebSockets allow continuous &lt;strong&gt;two-way communication&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client ⇄ Server ⇄ Client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They use a special protocol: &lt;strong&gt;WebSocket&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time two-way communication&lt;/li&gt;
&lt;li&gt;Low latency&lt;/li&gt;
&lt;li&gt;Great for interactive apps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;More complex to implement&lt;/li&gt;
&lt;li&gt;Requires connection upgrade&lt;/li&gt;
&lt;li&gt;Harder to scale and debug&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Differences
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Polling&lt;/th&gt;
&lt;th&gt;SSE&lt;/th&gt;
&lt;th&gt;WebSockets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connection&lt;/td&gt;
&lt;td&gt;Many requests&lt;/td&gt;
&lt;td&gt;One long connection&lt;/td&gt;
&lt;td&gt;Persistent upgraded connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direction&lt;/td&gt;
&lt;td&gt;Request/response&lt;/td&gt;
&lt;td&gt;Server → Client&lt;/td&gt;
&lt;td&gt;Two-way&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Efficiency&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium/High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🎯 When Should You Use Each?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Polling when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need something quick and simple&lt;/li&gt;
&lt;li&gt;Real-time is not critical&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Use SSE when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Updates are mostly &lt;strong&gt;server → client&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You want a simple real-time solution&lt;/li&gt;
&lt;li&gt;You need built-in reconnection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Live dashboards&lt;/li&gt;
&lt;li&gt;Stock updates&lt;/li&gt;
&lt;li&gt;Activity feeds&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Use WebSockets when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;two-way communication&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat applications&lt;/li&gt;
&lt;li&gt;Multiplayer games&lt;/li&gt;
&lt;li&gt;Collaborative editing tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Common Mistake
&lt;/h2&gt;

&lt;p&gt;A very common mistake is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Using WebSockets for everything.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In many cases, SSE is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simpler&lt;/li&gt;
&lt;li&gt;easier to debug&lt;/li&gt;
&lt;li&gt;easier to scale&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Interview Insight
&lt;/h2&gt;

&lt;p&gt;If an interviewer asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“When would you choose SSE over WebSockets?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A strong answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When communication is mostly server-to-client and I want a simpler, HTTP-based streaming solution with built-in reconnection.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 What’s Next
&lt;/h2&gt;

&lt;p&gt;Now that you understand when to use SSE, let’s get practical.&lt;/p&gt;

&lt;p&gt;In the next article, we’ll build a real SSE server using Python with &lt;strong&gt;FastAPI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You’ll go from concept → working implementation.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>sse</category>
      <category>software</category>
    </item>
    <item>
      <title>How Server-Sent Events (SSE) Work Internally</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Fri, 20 Mar 2026 15:02:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/how-server-sent-events-sse-work-internally-4mb7</link>
      <guid>https://forem.com/saras_growth_space/how-server-sent-events-sse-work-internally-4mb7</guid>
      <description>&lt;p&gt;In the previous article, we understood &lt;em&gt;why&lt;/em&gt; Server-Sent Events (SSE) exist.&lt;/p&gt;

&lt;p&gt;Now let’s go deeper:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;How does SSE actually work under the hood?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 1 — It Starts with a Normal HTTP Request
&lt;/h2&gt;

&lt;p&gt;From the browser’s perspective, SSE begins like any other request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /events
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the server responds differently.&lt;/p&gt;




&lt;h2&gt;
  
  
  📡 Step 2 — Special Response Header
&lt;/h2&gt;

&lt;p&gt;The server sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: text/event-stream
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This header tells the browser:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This response is not going to end. Keep listening.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔁 Step 3 — The Connection Stays Open
&lt;/h2&gt;

&lt;p&gt;Unlike normal APIs:&lt;/p&gt;

&lt;p&gt;Client → request → response → close&lt;/p&gt;

&lt;p&gt;SSE does this:&lt;/p&gt;

&lt;p&gt;Client → request&lt;br&gt;
Server → response (never ends)&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of it like opening a tap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → open connection
Server → stream data continuously
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of sending a bucket of water, the server sends a &lt;strong&gt;flow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 4 — Event Format
&lt;/h2&gt;

&lt;p&gt;SSE sends data in a very specific format.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;data: Order received

data: Cooking started

data: Out for delivery

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Important Rules:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Each message starts with &lt;code&gt;data:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Each event ends with a &lt;strong&gt;blank line&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Without the blank line, the browser keeps waiting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Multiple Lines in One Event
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;data: hello
data: world

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes a single message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hello
world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏷️ Advanced Event Format
&lt;/h2&gt;

&lt;p&gt;SSE supports more fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;id: 101
event: order_update
data: cooking started

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fields Explained:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data&lt;/code&gt; → actual message&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;event&lt;/code&gt; → custom event type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; → event identifier (used for reconnection)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 Browser Support
&lt;/h2&gt;

&lt;p&gt;Browsers provide a built-in API:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;EventSource&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/events&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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;h2&gt;
  
  
  🎯 Custom Event Handling
&lt;/h2&gt;

&lt;p&gt;If the server sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;event: order
data: shipped

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can listen like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;order&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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;h2&gt;
  
  
  🔄 Automatic Reconnection
&lt;/h2&gt;

&lt;p&gt;One of the most powerful features of SSE:&lt;/p&gt;

&lt;p&gt;👉 The browser automatically reconnects if the connection drops.&lt;/p&gt;

&lt;p&gt;Even better, it sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Last-Event-ID: 101
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the server can resume from where it left off.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why SSE Is Simple
&lt;/h2&gt;

&lt;p&gt;SSE works because it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses standard HTTP&lt;/li&gt;
&lt;li&gt;Requires no protocol upgrade&lt;/li&gt;
&lt;li&gt;Has built-in browser support&lt;/li&gt;
&lt;li&gt;Handles reconnection automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared to &lt;strong&gt;WebSocket&lt;/strong&gt;, it is much simpler to implement.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Common Mistake
&lt;/h2&gt;

&lt;p&gt;A very common bug:&lt;/p&gt;

&lt;p&gt;Forgetting the blank line at the end of an event.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;data: hello
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will &lt;strong&gt;not work properly&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;data: hello

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 What’s Next
&lt;/h2&gt;

&lt;p&gt;In the next article, we’ll answer a very important question:&lt;/p&gt;

&lt;p&gt;👉 When should you use SSE vs Polling vs WebSockets?&lt;/p&gt;

&lt;p&gt;This is one of the most common interview questions — and also a critical design decision in real systems.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>sse</category>
      <category>software</category>
    </item>
    <item>
      <title>Why Server-Sent Events (SSE) Exist</title>
      <dc:creator>Saras Growth Space</dc:creator>
      <pubDate>Fri, 20 Mar 2026 15:00:00 +0000</pubDate>
      <link>https://forem.com/saras_growth_space/why-server-sent-events-sse-exist-2mh9</link>
      <guid>https://forem.com/saras_growth_space/why-server-sent-events-sse-exist-2mh9</guid>
      <description>&lt;p&gt;When developers need real-time updates, the first instinct is usually simple:&lt;/p&gt;

&lt;p&gt;“Let’s just ask the server every few seconds.”&lt;/p&gt;

&lt;p&gt;This approach is called &lt;strong&gt;polling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first, it works fine.&lt;/p&gt;

&lt;p&gt;But as your application grows, problems start appearing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too many unnecessary requests&lt;/li&gt;
&lt;li&gt;Increased server load&lt;/li&gt;
&lt;li&gt;Delayed updates&lt;/li&gt;
&lt;li&gt;Wasted bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly, something that looked simple becomes inefficient.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚨 The Problem with Polling
&lt;/h2&gt;

&lt;p&gt;Let’s say you're building a food delivery tracker.&lt;/p&gt;

&lt;p&gt;Your frontend keeps asking:&lt;/p&gt;

&lt;p&gt;Client → “Any update?”&lt;br&gt;
Server → “No”&lt;/p&gt;

&lt;p&gt;Client → “Any update?”&lt;br&gt;
Server → “No”&lt;/p&gt;

&lt;p&gt;Client → “Any update?”&lt;br&gt;
Server → “Order is out for delivery”&lt;/p&gt;

&lt;p&gt;This continues every few seconds.&lt;/p&gt;

&lt;p&gt;Even when there is &lt;strong&gt;no update&lt;/strong&gt;, the request still happens.&lt;/p&gt;

&lt;p&gt;Now imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10,000 users&lt;/li&gt;
&lt;li&gt;Each sending requests every 5 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s &lt;strong&gt;120,000 requests per minute&lt;/strong&gt; — most of them useless.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 What We Actually Want
&lt;/h2&gt;

&lt;p&gt;Instead of repeatedly asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Any update?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We want the browser to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Tell me when there is an update.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This flips the model completely.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Enter Server-Sent Events (SSE)
&lt;/h2&gt;

&lt;p&gt;Server-Sent Events (SSE) allow the server to &lt;strong&gt;push updates to the client&lt;/strong&gt; over a single, long-lived HTTP connection.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;Client → request → response → close&lt;/p&gt;

&lt;p&gt;We get:&lt;/p&gt;

&lt;p&gt;Client → open connection&lt;br&gt;
Server → send updates whenever they happen&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Mental Model
&lt;/h2&gt;

&lt;p&gt;Think of SSE like a &lt;strong&gt;live news ticker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you tune in, updates keep flowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order received&lt;/li&gt;
&lt;li&gt;Cooking started&lt;/li&gt;
&lt;li&gt;Out for delivery&lt;/li&gt;
&lt;li&gt;Delivered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No refreshing. No repeated requests.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ How Is This Different from Normal HTTP?
&lt;/h2&gt;

&lt;p&gt;In a typical API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client sends a request&lt;/li&gt;
&lt;li&gt;The server sends a response&lt;/li&gt;
&lt;li&gt;The connection closes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With SSE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The client sends a request&lt;/li&gt;
&lt;li&gt;The server &lt;strong&gt;keeps the connection open&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The server sends data &lt;strong&gt;continuously over time&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Where SSE Fits
&lt;/h2&gt;

&lt;p&gt;SSE is perfect when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates come &lt;strong&gt;from server → client&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You don’t need the client to send continuous messages back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;li&gt;Live sports scores&lt;/li&gt;
&lt;li&gt;Stock price updates&lt;/li&gt;
&lt;li&gt;Activity feeds&lt;/li&gt;
&lt;li&gt;AI streaming responses&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Constraint
&lt;/h2&gt;

&lt;p&gt;SSE is &lt;strong&gt;one-way communication&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Server → Client ✅&lt;br&gt;
Client → Server ❌ (not continuous)&lt;/p&gt;

&lt;p&gt;If your system requires two-way communication (like chat), you would use &lt;strong&gt;WebSocket&lt;/strong&gt; instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What’s Next
&lt;/h2&gt;

&lt;p&gt;In the next article, we’ll break down:&lt;/p&gt;

&lt;p&gt;👉 How SSE actually works at the protocol level&lt;br&gt;
👉 How the browser receives and processes events&lt;/p&gt;

&lt;p&gt;This is where things get interesting.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>sse</category>
      <category>software</category>
    </item>
  </channel>
</rss>
