<?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: Kazuki Fujiwara</title>
    <description>The latest articles on DEV Community by Kazuki Fujiwara (@kazukifujiwara).</description>
    <link>https://dev.to/kazukifujiwara</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%2F4016276%2Fa8fb195f-8d5b-4adc-bbaa-220098e8999d.png</url>
      <title>DEV Community: Kazuki Fujiwara</title>
      <link>https://dev.to/kazukifujiwara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kazukifujiwara"/>
    <language>en</language>
    <item>
      <title>TopoDraft: Network Topology as Code — draw your network topology diagram with your AI agent</title>
      <dc:creator>Kazuki Fujiwara</dc:creator>
      <pubDate>Sun, 05 Jul 2026 15:21:22 +0000</pubDate>
      <link>https://dev.to/kazukifujiwara/topodraft-network-topology-as-code-draw-your-network-topology-diagram-with-your-ai-agent-2abm</link>
      <guid>https://dev.to/kazukifujiwara/topodraft-network-topology-as-code-draw-your-network-topology-diagram-with-your-ai-agent-2abm</guid>
      <description>&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%2Fl6zhvlu56m3pfhhov762.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%2Fl6zhvlu56m3pfhhov762.png" alt="TopoDraft's physical view: a two-site network across Tokyo-HQ and Osaka-DC, with two routers and a switch at each site connected over two carrier circuits, CID-0001 and CID-0002." width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Network diagrams rot
&lt;/h2&gt;

&lt;p&gt;Every network team has the same artifact: a network topology diagram in Visio,&lt;br&gt;
PowerPoint, or a drawing tool — last updated three reorgs ago. Diagrams are&lt;br&gt;
binary blobs. You can't &lt;code&gt;git diff&lt;/code&gt; them, you can't review them in a PR, and no&lt;br&gt;
automation can maintain them, so nobody does.&lt;/p&gt;

&lt;p&gt;Code gets reviewed. Configs get reviewed. The diagram — arguably the most&lt;br&gt;
load-bearing document in the room — doesn't.&lt;/p&gt;

&lt;p&gt;I built a VSCode extension to change that: &lt;strong&gt;TopoDraft — Network Topology as&lt;br&gt;
Code&lt;/strong&gt;. The idea is simple: your network topology diagram &lt;em&gt;is&lt;/em&gt; a plain text&lt;br&gt;
file, you edit it on a canvas, and your AI agent edits the very same file —&lt;br&gt;
live, right next to you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=kazukifujiwara.topodraft" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=kazukifujiwara.topodraft&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub (Apache-2.0): &lt;a href="https://github.com/kazukifujiwara/network-topo-draft" rel="noopener noreferrer"&gt;https://github.com/kazukifujiwara/network-topo-draft&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;Open a &lt;code&gt;*.topo.json&lt;/code&gt; file and you get a canvas editor with two views:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Physical view&lt;/strong&gt; — devices, cables, carrier circuits, and site frames.
That's the cover image above: a two-site network across Tokyo-HQ and Osaka-DC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logical view&lt;/strong&gt; — VRF compartments, L3 adjacencies, and multi-access
segments with HSRP/VRRP virtual IPs.&lt;/li&gt;
&lt;/ul&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%2Fyffcxm9thsbwy105tl6b.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%2Fyffcxm9thsbwy105tl6b.png" alt="TopoDraft's logical view: VRF-1 compartments on each router, eBGP over both carrier circuits, and VRRP-backed LAN gateways, with a device inspector panel showing interface details for rt-tokyo-01." width="799" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Logical view: VRFs, eBGP over each carrier circuit, and VRRP-backed LAN gateways.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Drag to place a node, drag a port to connect, double-click to rename&lt;br&gt;
(references follow automatically), and undo is just VSCode's regular &lt;code&gt;Ctrl+Z&lt;/code&gt; —&lt;br&gt;
because every canvas action is really a plain text edit on the document&lt;br&gt;
underneath.&lt;/p&gt;

&lt;p&gt;That file is deliberately boring JSON, and the serializer is deterministic:&lt;br&gt;
same content, same bytes. That one property is what makes a diagram reviewable&lt;br&gt;
— a change to your WAN shows up as a three-line diff in a PR, not "binary files&lt;br&gt;
differ."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt-tokyo-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"router"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo-HQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"interfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gi0/0/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ip_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.255.0.1/30"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"circuits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo-HQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt-tokyo-01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Osaka-DC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"device"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rt-osaka-01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"cid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CID-0001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"leased line"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The part I actually care about: your AI agent as a co-author
&lt;/h2&gt;

&lt;p&gt;The goal was never "AI draws the diagram instead of you." It's an agent working&lt;br&gt;
&lt;em&gt;next to you&lt;/em&gt;, in the same file:&lt;/p&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%2Fnstefv59fi3ff0yfvpxu.gif" 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%2Fnstefv59fi3ff0yfvpxu.gif" alt="Time-lapse: an AI agent writes the topology JSON while TopoDraft's canvas draws the two-site network step by step, starting from an empty canvas." width="720" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You ask; the agent writes the JSON; the open canvas draws every step. (Time-lapse.)&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A toolbar button writes the complete file-format contract — rules, JSON
Schema, and a worked example — into your workspace. It defaults to
&lt;code&gt;AGENTS.md&lt;/code&gt;, the file most coding agents read automatically, and &lt;em&gt;Save as…&lt;/em&gt;
lets you drop it under whatever name your agent expects (&lt;code&gt;CLAUDE.md&lt;/code&gt;,
&lt;code&gt;GEMINI.md&lt;/code&gt;, …). Either way your agent learns the format without you
explaining it, and rerunning is safe — an existing file is updated in place,
not overwritten.&lt;/li&gt;
&lt;li&gt;You ask your agent for something like "a two-site redundant WAN with VRRP
gateways."&lt;/li&gt;
&lt;li&gt;The agent writes &lt;code&gt;*.topo.json&lt;/code&gt;; the open canvas renders each edit live.&lt;/li&gt;
&lt;li&gt;You drag a few nodes to taste. Your edits are text edits too, so the agent
can keep working after you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agents make mistakes, so the canvas is defensive by design: while an agent is&lt;br&gt;
mid-edit and the JSON is momentarily broken, the canvas dims and waits — it&lt;br&gt;
never crashes, and it never writes back over the agent's work. (There's also&lt;br&gt;
validation with precise diagnostics and a headless CLI for CI — but that's a&lt;br&gt;
topic for its own post.)&lt;/p&gt;

&lt;h2&gt;
  
  
  If you run NetBox
&lt;/h2&gt;

&lt;p&gt;Field names follow NetBox where a counterpart exists (&lt;code&gt;device_type&lt;/code&gt;, &lt;code&gt;site&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;tenant&lt;/code&gt;, &lt;code&gt;cid&lt;/code&gt;, FHRP &lt;code&gt;group_id&lt;/code&gt;, …), so a &lt;code&gt;.topo.json&lt;/code&gt; can be a reviewable&lt;br&gt;
&lt;em&gt;view&lt;/em&gt; of one slice of your CMDB rather than yet another source of truth to keep&lt;br&gt;
in sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;No telemetry, no remote code, and the format is an open, published JSON Schema —&lt;br&gt;
files embed &lt;code&gt;$schema&lt;/code&gt;, so other tools and agents can validate and edit&lt;br&gt;
&lt;code&gt;*.topo.json&lt;/code&gt; too.&lt;/p&gt;

&lt;p&gt;Search "&lt;strong&gt;TopoDraft&lt;/strong&gt;" in VSCode extensions, or grab it here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://marketplace.visualstudio.com/items?itemName=kazukifujiwara.topodraft" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=kazukifujiwara.topodraft&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or try it with &lt;strong&gt;zero local install&lt;/strong&gt;: open &lt;a href="https://vscode.dev" rel="noopener noreferrer"&gt;vscode.dev&lt;/a&gt;, install TopoDraft from the Extensions view, and run &lt;strong&gt;TopoDraft: Open Example Topology&lt;/strong&gt; from the Command Palette — a live canvas in your browser in under a minute. It works on &lt;a href="https://github.dev" rel="noopener noreferrer"&gt;github.dev&lt;/a&gt; too (press &lt;code&gt;.&lt;/code&gt; in any GitHub repo).&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;+New&lt;/strong&gt; menu ships templates (two-site WAN, HSRP segment, routed LAG pair)&lt;br&gt;
— opening one is the fastest way to get a feel for it.&lt;/p&gt;

&lt;p&gt;It's built solo and moving fast — since this post it's gained web support (vscode.dev / github.dev) and a Get Started walkthrough (v0.3.0). I'd genuinely love feedback: bug reports and feature requests go to &lt;a href="https://github.com/kazukifujiwara/network-topo-draft/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;, and if it's useful to you, a Marketplace review or a GitHub star helps more than you'd think.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>vscode</category>
      <category>ai</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
