<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Berke Akdemir</title>
    <description>The latest articles on DEV Community by Berke Akdemir (@hanubaki).</description>
    <link>https://dev.to/hanubaki</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4175341%2Fd5b58c09-c96a-4bfd-85d5-ed4a9ca24fc8.png</url>
      <title>DEV Community: Berke Akdemir</title>
      <link>https://dev.to/hanubaki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hanubaki"/>
    <language>en</language>
    <item>
      <title>Why Static System Design Diagrams Lie (And How I Built a 60 FPS Distributed Systems Simulator in the Browser)</title>
      <dc:creator>Berke Akdemir</dc:creator>
      <pubDate>Wed, 28 Oct 2026 05:45:25 +0000</pubDate>
      <link>https://dev.to/hanubaki/why-static-system-design-diagrams-lie-and-how-i-built-a-60-fps-distributed-systems-simulator-in-3h2k</link>
      <guid>https://dev.to/hanubaki/why-static-system-design-diagrams-lie-and-how-i-built-a-60-fps-distributed-systems-simulator-in-3h2k</guid>
      <description>&lt;p&gt;Every architecture review I've ever sat in goes roughly the same way. Someone opens Excalidraw or draw.io, draws a rectangle labeled &lt;code&gt;API&lt;/code&gt;, draws an arrow to &lt;code&gt;Redis&lt;/code&gt;, draws another arrow to &lt;code&gt;Postgres&lt;/code&gt;, and everyone nods and says "looks solid, ship it."&lt;/p&gt;

&lt;p&gt;Then two weeks later traffic spikes 3x, &lt;code&gt;Redis&lt;/code&gt; is chilling at 2ms, &lt;code&gt;Postgres&lt;/code&gt; is at 99% CPU dropping connections, and retries from the API gateway turn a minor slowdown into a full outage.&lt;/p&gt;

&lt;p&gt;The problem with static diagrams is that a 2,500 RPS cache and a 400 RPS database look like the exact same box on a screen. Boxes don't have queues. Lines don't drop packets.&lt;/p&gt;

&lt;p&gt;Over the past few weeks I've been building &lt;strong&gt;&lt;a href="https://graph-flow-virid.vercel.app" rel="noopener noreferrer"&gt;GraphFlow&lt;/a&gt;&lt;/strong&gt; to fix that. It's an open-source system design canvas where the diagram actually runs in your browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw18lgvo0yzqxp5998u91.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw18lgvo0yzqxp5998u91.gif" alt="GraphFlow live simulation" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to skip the text and just poke at it, here is a live model of a Stripe-style webhook &amp;amp; double-entry ledger setup (no login or signup):&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://graph-flow-virid.vercel.app/?template=stripe-webhook-ledger" rel="noopener noreferrer"&gt;Open the live Stripe Ledger simulation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once it opens, try two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Grab the &lt;strong&gt;Load&lt;/strong&gt; slider in the top bar and drag it from &lt;code&gt;1x&lt;/code&gt; to &lt;code&gt;3.5x&lt;/code&gt;. Watch the utilization bar under the Postgres node turn red while &lt;code&gt;p99&lt;/code&gt; latency shoots up.&lt;/li&gt;
&lt;li&gt;Click on any database or worker node and hit &lt;strong&gt;Kill&lt;/strong&gt; (or &lt;strong&gt;+100ms&lt;/strong&gt;) in the little floating bar above it. You'll see red 5xx packets back up until the upstream circuit breaker trips &lt;code&gt;OPEN&lt;/code&gt; to stop the bleeding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's also a &lt;strong&gt;&lt;a href="https://graph-flow-virid.vercel.app/?template=netflix-chaos-streaming" rel="noopener noreferrer"&gt;Netflix edge streaming chaos setup&lt;/a&gt;&lt;/strong&gt; and a &lt;strong&gt;&lt;a href="https://graph-flow-virid.vercel.app/?template=resilient-cqrs-outbox" rel="noopener noreferrer"&gt;CQRS + Kafka Outbox template&lt;/a&gt;&lt;/strong&gt; if you want to play with different topologies.&lt;/p&gt;




&lt;h3&gt;
  
  
  How the queuing math works (without melting the browser)
&lt;/h3&gt;

&lt;p&gt;I didn't want the moving dots to just be eye candy. In GraphFlow, packets only spawn at actual ingress nodes (like a client, mobile app, or webhook source) and travel hop-by-hop. A downstream node doesn't emit a packet until an upstream packet actually reaches it.&lt;/p&gt;

&lt;p&gt;Every node has a base latency, a max RPS capacity, and an error rate. When incoming traffic stays below ~70% of a node's capacity, latency stays flat. Once you cross 75% utilization, queuing backpressure kicks in and tail latency (&lt;code&gt;p95&lt;/code&gt; / &lt;code&gt;p99&lt;/code&gt;) curves upward fast:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;utilization&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arrivalRps&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&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="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;throughputRps&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queuingMultiplier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;utilization&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;utilization&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;2.8&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;utilization&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a node has a circuit breaker enabled and hits 5 consecutive 5xx failures, it trips &lt;code&gt;OPEN&lt;/code&gt; for 6 seconds, drops into &lt;code&gt;HALF-OPEN&lt;/code&gt; to test the waters with a single request, and closes again if the downstream service recovered. You can also dial up packet loss (&lt;code&gt;0%&lt;/code&gt; to &lt;code&gt;50%&lt;/code&gt;) on individual wires to see what happens when the network between two healthy services gets flaky.&lt;/p&gt;




&lt;h3&gt;
  
  
  Avoiding heavy canvas libraries (and the 2.5-Gigapixel mobile bug)
&lt;/h3&gt;

&lt;p&gt;Initially I considered using PixiJS or Konva for the canvas, but I wanted crisp DOM text, normal CSS styling, and a tiny bundle. So the entire canvas is just standard React DOM nodes + native SVG cubic Bezier paths, evaluated via De Casteljau's formula inside a &lt;code&gt;requestAnimationFrame&lt;/code&gt; loop.&lt;/p&gt;

&lt;p&gt;To keep React from choking at 60 FPS, the simulation loop reads from mutable refs (&lt;code&gt;nodesRef&lt;/code&gt; / &lt;code&gt;edgesRef&lt;/code&gt;) and an &lt;code&gt;O(1)&lt;/code&gt; lookup map instead of triggering full canvas re-renders on every tick.&lt;/p&gt;

&lt;p&gt;That worked great on my desktop, until I opened the site on my phone last week and watched mobile Safari drop to about 4 FPS.&lt;/p&gt;

&lt;p&gt;Turns out I had set the SVG canvas to &lt;code&gt;w-[50000px] h-[50000px]&lt;/code&gt; so wires wouldn't clip when panning far out, and I had Tailwind &lt;code&gt;backdrop-blur&lt;/code&gt; on the node cards. On mobile GPUs, a &lt;code&gt;50000 x 50000&lt;/code&gt; element with blur filters forces the browser's tile compositor to allocate a &lt;strong&gt;2.5-gigapixel texture buffer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Fixing it was a fun rabbit hole:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replaced the 50,000px SVG with a viewport-sized &lt;code&gt;w-full h-full overflow-visible&lt;/code&gt; layer (&lt;code&gt;will-change-transform&lt;/code&gt;) and disabled &lt;code&gt;backdrop-blur&lt;/code&gt; on small screens (&lt;code&gt;md:backdrop-blur&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Added adaptive frame pacing on mobile (~33 FPS state commits while keeping &lt;code&gt;dt&lt;/code&gt; packet speed identical) and throttled node queue counter updates to &lt;code&gt;4 Hz&lt;/code&gt; (&lt;code&gt;240ms&lt;/code&gt;) so React isn't diffing node cards 60 times a second.&lt;/li&gt;
&lt;li&gt;Added touch drag-to-connect and auto-framing so big topologies actually fit on a phone screen.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Because drawing boxes by hand is tedious: Infra Import &amp;amp; Export
&lt;/h3&gt;

&lt;p&gt;Nobody wants to manually drag 15 boxes onto a canvas during an incident review or before writing an RFC.&lt;/p&gt;

&lt;p&gt;If you click &lt;strong&gt;AI / Import -&amp;gt; Import Infra&lt;/strong&gt; in the top bar, you can paste an existing config file and it will reverse-engineer a 4-tier layout automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/strong&gt; (reads your services, images like &lt;code&gt;postgres&lt;/code&gt;/&lt;code&gt;redis&lt;/code&gt;/&lt;code&gt;kafka&lt;/code&gt;, and wires up &lt;code&gt;depends_on&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;main.tf&lt;/code&gt;&lt;/strong&gt; (parses Terraform AWS resources like ALB, ECS, RDS, ElastiCache, SQS, S3, Lambda)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/strong&gt; (looks at dependencies like &lt;code&gt;pg&lt;/code&gt;, &lt;code&gt;ioredis&lt;/code&gt;, &lt;code&gt;kafkajs&lt;/code&gt;, &lt;code&gt;stripe&lt;/code&gt;, &lt;code&gt;@aws-sdk/client-s3&lt;/code&gt; and builds your service graph)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAPI 3.0 specs&lt;/strong&gt; or &lt;strong&gt;CSV tables&lt;/strong&gt; (for mapping multi-department ERP flows)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a &lt;strong&gt;Live ERP/API&lt;/strong&gt; mode in the top bar where you can feed live JSON telemetry into the canvas instead of synthetic traffic.&lt;/p&gt;

&lt;p&gt;Once you find your bottleneck—or use the &lt;strong&gt;Pin Baseline&lt;/strong&gt; and &lt;strong&gt;Auto-Harden&lt;/strong&gt; buttons in the right panel to add missing circuit breakers and scale up replicas—you can export the result straight into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub PR / Notion Mermaid diagrams&lt;/strong&gt; (&lt;code&gt;flowchart LR&lt;/code&gt; + &lt;code&gt;sequenceDiagram&lt;/code&gt; + an SLA &amp;amp; cloud cost summary table)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS / GCP / Azure monthly FinOps estimates&lt;/strong&gt; (so you can show your manager what adding Redis + 2 extra Fargate tasks actually costs vs. how much p99 latency it saves)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform (&lt;code&gt;main.tf&lt;/code&gt;)&lt;/strong&gt;, &lt;strong&gt;Kubernetes (&lt;code&gt;k8s-manifests.yaml&lt;/code&gt; with HPA)&lt;/strong&gt;, or a runnable &lt;strong&gt;Grafana &lt;code&gt;k6&lt;/code&gt; load test script&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Give it a spin
&lt;/h3&gt;

&lt;p&gt;The core simulator is MIT licensed and open source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://graph-flow-virid.vercel.app" rel="noopener noreferrer"&gt;https://graph-flow-virid.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/Hanubaki/GraphFlow" rel="noopener noreferrer"&gt;https://github.com/Hanubaki/GraphFlow&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work on backend systems or SRE, I'd genuinely love your feedback on the queuing model. Does the latency curve feel realistic when you push past 80% utilization, or are there specific failure modes (like DB connection pool starvation or retry storms) you'd want to simulate next?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building GraphFlow: An Interactive Distributed Systems Simulator in Pure SVG</title>
      <dc:creator>Berke Akdemir</dc:creator>
      <pubDate>Sat, 10 Oct 2026 13:42:38 +0000</pubDate>
      <link>https://dev.to/hanubaki/building-graphflow-an-interactive-distributed-systems-simulator-in-pure-svg-47b5</link>
      <guid>https://dev.to/hanubaki/building-graphflow-an-interactive-distributed-systems-simulator-in-pure-svg-47b5</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;Today I'm excited to open-source &lt;strong&gt;GraphFlow&lt;/strong&gt;, an interactive browser-based distributed systems modeler and chaos simulator.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Live Simulator:&lt;/strong&gt; &lt;a href="https://graph-flow-virid.vercel.app" rel="noopener noreferrer"&gt;graph-flow-virid.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Hanubaki/GraphFlow" rel="noopener noreferrer"&gt;github.com/Hanubaki/GraphFlow&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Problem: Architecture Diagrams Are Inert
&lt;/h3&gt;

&lt;p&gt;Whenever we design distributed microservices, we reach for tools like draw.io, Miro, Lucidchart, or Excalidraw. &lt;/p&gt;

&lt;p&gt;While they look great in documentation, &lt;strong&gt;static boxes and arrows can't tell you how your system actually behaves&lt;/strong&gt;. They don't reveal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when a downstream worker starts choking?&lt;/li&gt;
&lt;li&gt;How packet latency compounds across synchronous gRPC calls?&lt;/li&gt;
&lt;li&gt;Whether an upstream circuit breaker will trip and isolate failures before crashing your entire API Gateway.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a tool where &lt;strong&gt;the diagram actually runs&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Makes GraphFlow Different?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv1abcipx5kev4fk4motg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv1abcipx5kev4fk4motg.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GraphFlow is not just a diagramming canvas; it's a living, client-side simulation engine:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Native SVG Vector Calculus (60 FPS)
&lt;/h4&gt;

&lt;p&gt;Request packets travel along cubic Bézier curves evaluated on every single frame with the &lt;strong&gt;De Casteljau algorithm&lt;/strong&gt;. There are no heavy canvas dependencies or bulky WebGL runtimes — the entire bundle is lightweight (&amp;lt; 75 KB compressed).&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Live Chaos &amp;amp; DDoS Surge Testing
&lt;/h4&gt;

&lt;p&gt;With a single click on &lt;strong&gt;"Inject Surge"&lt;/strong&gt;, you can simulate real-world load spikes (e.g. jumping from 700 to 2,450+ RPS), tune node error rates, and observe cascading HTTP 500 error packets propagating into Dead Letter Queues (DLQ) in real time.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Infrastructure as Code (IaC) &amp;amp; Spec Export
&lt;/h4&gt;

&lt;p&gt;Your architecture is never locked into the browser. With one click, export directly to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terraform (IaC)&lt;/strong&gt; scaffolding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; network definitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub-flavored Mermaid Markdown&lt;/strong&gt; documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Zero-Cost Instant State Sharing
&lt;/h4&gt;

&lt;p&gt;The entire system topology, node states, and simulation parameters compress directly into a shareable URL hash. You can send a link to your colleagues on Slack, and they will load your exact interactive simulation with zero database friction.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Local-First &amp;amp; Offline Ready
&lt;/h4&gt;

&lt;p&gt;Runs 100% in your browser. Even without an AI API key or cloud database, built-in neural rules and local storage keep everything completely functional offline.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; React + TypeScript + Vite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS (Engineered "Control Room" dark archetype, WCAG AA compliant)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math &amp;amp; Animation:&lt;/strong&gt; Native SVG + &lt;code&gt;requestAnimationFrame&lt;/code&gt; cubic Bézier calculus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State &amp;amp; Testing:&lt;/strong&gt; Zustand, Vitest (TDD regression test suite)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT Open Source&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  I'd Love Your Feedback!
&lt;/h3&gt;

&lt;p&gt;GraphFlow is 100% free and open-source. What distributed patterns or failure modes would you like to see modeled next?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://graph-flow-virid.vercel.app" rel="noopener noreferrer"&gt;graph-flow-virid.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;Star the project on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Hanubaki/GraphFlow" rel="noopener noreferrer"&gt;github.com/Hanubaki/GraphFlow&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading, and happy designing!&lt;/p&gt;

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