<?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: youichi uda</title>
    <description>The latest articles on DEV Community by youichi uda (@y1uda).</description>
    <link>https://dev.to/y1uda</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%2F3744835%2F116879f0-640d-480e-aea1-4a8a60f56ad9.png</url>
      <title>DEV Community: youichi uda</title>
      <link>https://dev.to/y1uda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/y1uda"/>
    <language>en</language>
    <item>
      <title>I Built a Godot MCP Server Because Existing Ones Couldn't Let AI Test My Game</title>
      <dc:creator>youichi uda</dc:creator>
      <pubDate>Tue, 24 Feb 2026 14:25:29 +0000</pubDate>
      <link>https://dev.to/y1uda/i-built-a-godot-mcp-server-because-existing-ones-couldnt-let-ai-test-my-game-47dl</link>
      <guid>https://dev.to/y1uda/i-built-a-godot-mcp-server-because-existing-ones-couldnt-let-ai-test-my-game-47dl</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I make games in Godot. I use AI (Claude Code) to write code daily. But the workflow always had the same bottleneck:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI writes code → I run the game → I check if it works → I report back → AI fixes → I run again...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That "I run and check" part adds up. Especially when you're tweaking UI, testing edge cases, or iterating on a mechanic. I wanted to hand off the entire build-test-fix cycle to AI.&lt;/p&gt;

&lt;p&gt;I tried existing Godot MCP servers. The free ones (godot-mcp, etc.) have ~13 tools focused on file operations. They can't even &lt;strong&gt;launch the game&lt;/strong&gt;, let alone play it or take screenshots. The paid alternative (GDAI MCP, $19) has ~30 tools but still no input simulation or runtime analysis.&lt;/p&gt;

&lt;p&gt;None of them could do what I needed: &lt;strong&gt;AI builds the game, runs it, tests it, and fixes what's broken — without me touching anything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://godot-mcp.abyo.net" rel="noopener noreferrer"&gt;Godot MCP Pro&lt;/a&gt;. 84 tools, 14 categories. Input simulation, runtime analysis, screenshots — everything needed for AI to autonomously test a running game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: One Prompt → Complete Reversi + AI Playtest
&lt;/h2&gt;

&lt;p&gt;To show what this looks like in practice, here's a demo. Empty Godot project, one prompt, AI does the rest.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/D-jqmczINnQ"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h3&gt;
  
  
  The Prompt (summary)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a complete Reversi game in this Godot project.
Single scene, single script, all rendering via _draw().

Requirements: 8x8 board, pieces, highlights, flip animation,
standard rules, score display, restart button...

After building, set as main scene and play it.
Then playtest: play 4 moves, screenshot after each,
fix anything that's wrong.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is the last part — "playtest it yourself, fix anything that's wrong." That single instruction turns AI from a code generator into a QA tester.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Happened
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Build Phase (~2 min)
&lt;/h4&gt;

&lt;p&gt;AI autonomously chains tool calls to build the game:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create_script("main.gd")    → Full game logic in one file
create_scene("main.tscn")   → Scene with Node2D root
attach_script                → Wire script to root
add_node × 4                → Score, Turn, Message labels + Restart button
save_scene → set_project_setting → reload_project → play_scene
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The editor updates in real-time. Nodes appear in the scene tree, the game window opens with a fully rendered Reversi board.&lt;/p&gt;

&lt;h4&gt;
  
  
  Playtest Phase (~2 min)
&lt;/h4&gt;

&lt;p&gt;This is why I built the tool. AI takes a screenshot, inspects the board, clicks a cell, takes another screenshot to verify:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moves 1-2&lt;/strong&gt;: Successful. AI confirms piece placement, flipping, score updates after each move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Move 3&lt;/strong&gt;: AI clicks B2 → Takes screenshot → &lt;em&gt;"B2 was not a valid move. Score didn't change."&lt;/em&gt; → Reads the yellow highlights on the board to find valid cells → &lt;strong&gt;Self-corrects to C4&lt;/strong&gt; → Success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Move 4&lt;/strong&gt;: AI clicks E2 → Same thing — detects failure from screenshot → &lt;strong&gt;Self-corrects to E3&lt;/strong&gt; → Success.&lt;/p&gt;

&lt;p&gt;The AI made mistakes, but it &lt;strong&gt;caught them from the screenshots&lt;/strong&gt; and fixed them without any human input. This is the workflow I wanted: tell AI to test, and it figures out the rest.&lt;/p&gt;

&lt;h4&gt;
  
  
  Report
&lt;/h4&gt;

&lt;p&gt;After testing, AI outputs a full checklist:&lt;/p&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;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8×8 board rendering&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Piece drawing with outlines&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Valid move highlights&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last-move indicator&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8-direction flip logic&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flip animation&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score and turn display&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-pass handling&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart button&lt;/td&gt;
&lt;td&gt;OK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Assistant ←--MCP/stdio--→ Node.js Server ←--WebSocket--→ Godot Editor Plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP (Model Context Protocol) is an open protocol by Anthropic that gives AI access to "tools." Godot MCP Pro implements this protocol with 84 tools across 14 categories.&lt;/p&gt;

&lt;p&gt;The four tool categories that make autonomous testing possible:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;play_scene&lt;/code&gt; / &lt;code&gt;stop_scene&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;AI can launch and stop the game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;simulate_mouse_click&lt;/code&gt; / &lt;code&gt;simulate_key&lt;/code&gt; / &lt;code&gt;simulate_sequence&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;AI can send input to the running game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_game_screenshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI can see the running game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;get_game_scene_tree&lt;/code&gt; / &lt;code&gt;get_game_node_properties&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;AI can read runtime state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Without these, AI can write code but can't verify it works. With them, AI closes the loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Not Just Edit Files?
&lt;/h3&gt;

&lt;p&gt;File editing gives you code generation. It doesn't give you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game launch/stop control&lt;/li&gt;
&lt;li&gt;Input simulation (keyboard, mouse, action sequences)&lt;/li&gt;
&lt;li&gt;Screenshot capture from running game&lt;/li&gt;
&lt;li&gt;Runtime state inspection (live scene tree, node properties)&lt;/li&gt;
&lt;li&gt;Ctrl+Z undo (all MCP mutations go through Godot's UndoRedoManager)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The build → test → fix cycle needs &lt;strong&gt;bidirectional communication&lt;/strong&gt; with the editor. That's the whole point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Tool List (84 tools / 14 categories)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Filesystem, settings, UID conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scene&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Create, open, delete, instance, play/stop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Add, delete, rename, properties, signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Script&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;List, read, create, edit, attach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Screenshots, errors, GDScript execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input Simulation&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Keyboard, mouse, actions, sequences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Analysis&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Live scene tree, properties, monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Animation&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Create, tracks, keyframes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TileMap&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Cell ops, fill, info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Theme &amp;amp; UI&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Colors, constants, fonts, styleboxes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shader&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Create, edit, parameters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch Ops&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Search, bulk changes, dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profiling&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Performance monitors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Presets, build commands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Input simulation, runtime analysis, signal management, animation, tilemap, shader, and profiling tools are exclusive to Godot MCP Pro — no other Godot MCP server has them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Actually Use It Day-to-Day
&lt;/h2&gt;

&lt;p&gt;The Reversi demo is a showcase. In practice, the most useful things are more mundane:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI setup&lt;/strong&gt;: "Set this Label's font to 24, anchor to center-top" — AI changes it directly in the editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal wiring&lt;/strong&gt;: "Connect this button's pressed signal" — done without opening the Node dock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototyping&lt;/strong&gt;: "Make the player dash when pressing Shift" — AI writes the code, launches the game, tests it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug investigation&lt;/strong&gt;: "Run the game, do X, then read the player's position and velocity" — AI reports back with actual runtime values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It lets me focus on game design and final decisions while AI handles the editor busywork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; Godot 4.x (4.3+), Node.js 18+, MCP-compatible AI client (Claude Code, Claude Desktop, Cursor, Cline, etc.)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get it from &lt;a href="https://godot-mcp.abyo.net" rel="noopener noreferrer"&gt;godot-mcp.abyo.net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;addons/godot_mcp/&lt;/code&gt; into your Godot project&lt;/li&gt;
&lt;li&gt;Enable the plugin in Project Settings → Plugins&lt;/li&gt;
&lt;li&gt;Add to your AI client's MCP config:
&lt;/li&gt;
&lt;/ol&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;"mcpServers"&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;"godot-mcp-pro"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"path/to/mcp/server/build/index.js"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Godot MCP Pro&lt;/strong&gt; — 84 tools, 14 categories, $5 one-time, lifetime updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://godot-mcp.abyo.net" rel="noopener noreferrer"&gt;godot-mcp.abyo.net&lt;/a&gt;&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I checked the WordPress sites I built years ago. Here's what I found.</title>
      <dc:creator>youichi uda</dc:creator>
      <pubDate>Sun, 08 Feb 2026 08:06:20 +0000</pubDate>
      <link>https://dev.to/y1uda/i-checked-the-wordpress-sites-i-built-years-ago-heres-what-i-found-m9k</link>
      <guid>https://dev.to/y1uda/i-checked-the-wordpress-sites-i-built-years-ago-heres-what-i-found-m9k</guid>
      <description>&lt;h2&gt;
  
  
  "Oh, that site still works"
&lt;/h2&gt;

&lt;p&gt;If you've ever built WordPress sites for clients, you know the feeling. You think about a site you delivered three years ago and wonder: &lt;em&gt;are they keeping it updated?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You check. WordPress 5.x. Plugins untouched since delivery. PHP 8.1 — which reached end of security support in December 2025. No security headers configured at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works. But "working" is not the same as "safe."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article is about the uncomfortable reality of what happens to WordPress sites after we hand them over.&lt;/p&gt;

&lt;h2&gt;
  
  
  WordPress Is a Monoculture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The numbers
&lt;/h3&gt;

&lt;p&gt;WordPress dominates the CMS market globally, holding about &lt;strong&gt;61.7%&lt;/strong&gt; of market share among CMS-powered sites. But in some markets, the concentration is extreme.&lt;/p&gt;

&lt;p&gt;In Japan, WordPress holds &lt;strong&gt;82.9%&lt;/strong&gt; of the CMS market. "Small business website" and "WordPress site" are essentially synonyms. And while Japan is an extreme case, the pattern holds across most markets — WordPress is the default choice for agencies and freelancers everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why monocultures are dangerous
&lt;/h3&gt;

&lt;p&gt;In agriculture, monoculture — growing a single crop across vast areas — creates systemic risk. One disease can wipe out an entire harvest.&lt;/p&gt;

&lt;p&gt;The CMS market has the same problem. When WordPress is this dominant, &lt;strong&gt;a single exploit can target millions of sites simultaneously&lt;/strong&gt;. Find a vulnerability in Plugin A, and every site running that plugin is exposed. It's an attacker's dream: maximum impact, minimum effort.&lt;/p&gt;

&lt;p&gt;And those vulnerabilities? They're discovered every single day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vulnerabilities Don't Trickle — They Pour
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The scale
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;June 2025:&lt;/strong&gt; 337 new vulnerabilities reported (298 plugins, 39 themes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One week in January 2026 (Jan 12–18):&lt;/strong&gt; 180 vulnerabilities disclosed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;96% of vulnerabilities&lt;/strong&gt; come from plugins&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's roughly &lt;strong&gt;25 new vulnerabilities per day.&lt;/strong&gt; No individual developer or small team can keep up with this manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  The scary part: no authentication required
&lt;/h3&gt;

&lt;p&gt;About half of the vulnerabilities reported in late 2025 were exploitable &lt;strong&gt;without authentication&lt;/strong&gt;. No login needed. No special permissions. Just hit a URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /wp-json/vulnerable-plugin/v1/sensitive-data HTTP/1.1
Host: target-site.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all it takes to leak data in some real-world vulnerabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Maintenance Gap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What happens after delivery
&lt;/h3&gt;

&lt;p&gt;Here's a lifecycle I've seen play out dozens of times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Year 0: Agency builds WordPress site with 10 plugins.
        Client declines maintenance contract — "too expensive."

Year 1: Agency says "please keep it updated."
        Client says "sure" (they don't).

Year 2: Maintenance contract ends. Relationship fades.

Year 3: Nobody remembers the wp-login password.
        The site becomes untouchable — "don't break it."

Year 4: PHP 8.1 reaches EOL. Hosting provider sends warnings. Ignored.

Year 5: Three plugins are abandoned by their developers.
        Known vulnerabilities, zero patches.

Year 6: ← We are here. The site loads fine.
          It's a vulnerability goldmine.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;According to Japan's IPA (Information-technology Promotion Agency) &lt;a href="https://www.ipa.go.jp/pressrelease/2024/press20250214.html" rel="noopener noreferrer"&gt;2024 SME Cybersecurity Survey&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Most common cause of unauthorized access&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unpatched vulnerabilities (48%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average incident cost&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$5,000 (¥730,000)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average recovery time&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.8 days&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incidents impacting business partners&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~70%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These numbers are from Japanese SMEs, but the pattern is universal. Small businesses everywhere run outdated WordPress installations and lack the resources to maintain them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this really someone else's problem?
&lt;/h3&gt;

&lt;p&gt;Hard truth: the client chose not to pay for maintenance. But &lt;em&gt;we&lt;/em&gt; designed the site. Did we build it to be as low-maintenance as possible? Did we adequately communicate what happens without updates?&lt;/p&gt;

&lt;p&gt;Realistically, not every client will sign a maintenance contract. But if we could at least &lt;strong&gt;make the current state visible&lt;/strong&gt;, it would open the conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking a WordPress Site's Health From the Outside
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What you can do from the terminal
&lt;/h3&gt;

&lt;p&gt;As a developer, you can gather basic security intel with a few commands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detect WordPress version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From meta tags&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oP&lt;/span&gt; &lt;span class="s1"&gt;'content="WordPress \K[0-9.]+'&lt;/span&gt;

&lt;span class="c"&gt;# From RSS feed&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://example.com/feed/ | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oP&lt;/span&gt; &lt;span class="s1"&gt;'\?v=\K[0-9.]+'&lt;/span&gt;

&lt;span class="c"&gt;# Check if readme.html is exposed&lt;/span&gt;
curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://example.com/readme.html | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check security headers:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://example.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'(strict-transport-security|content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try this on a small business site. Chances are &lt;strong&gt;nothing comes back&lt;/strong&gt; — meaning zero security headers are configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check email authentication:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# SPF&lt;/span&gt;
dig +short TXT example.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf

&lt;span class="c"&gt;# DMARC&lt;/span&gt;
dig +short TXT _dmarc.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A DMARC policy of &lt;code&gt;p=none&lt;/code&gt; means phishing emails spoofing the domain aren't being blocked.&lt;/p&gt;

&lt;h3&gt;
  
  
  But will you do this regularly?
&lt;/h3&gt;

&lt;p&gt;Running these commands once is easy. But realistically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to check 10+ client domains periodically&lt;/li&gt;
&lt;li&gt;You need to cross-reference plugin versions against new CVEs&lt;/li&gt;
&lt;li&gt;You want to be notified when something changes&lt;/li&gt;
&lt;li&gt;You need client-facing reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Terminal commands don't scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nyambush — Passive ASM for the Rest of Us
&lt;/h2&gt;

&lt;p&gt;This is why I built &lt;strong&gt;&lt;a href="https://nyambush.app/en" rel="noopener noreferrer"&gt;Nyambush&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nyambush is an &lt;strong&gt;ASM (Attack Surface Management)&lt;/strong&gt; SaaS. Enter a domain, get an instant security assessment of its external attack surface.&lt;/p&gt;

&lt;p&gt;ASM tools are typically enterprise software costing $30,000+/year. Nyambush starts at &lt;strong&gt;free&lt;/strong&gt; — no account required.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it checks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What you learn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subdomain enumeration, dangling CNAMEs (subdomain takeover risk), WHOIS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Email Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SPF/DKIM/DMARC configuration, spoofing risk assessment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP Headers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security header coverage, HTTPS configuration issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WordPress&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Core version, detected plugins/themes, known CVEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Patrol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Headless browser crawling + Claude Vision AI for defacement &amp;amp; anomaly detection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  AI Patrol — Catching Defacements That Humans Miss
&lt;/h3&gt;

&lt;p&gt;Many compromised sites look perfectly normal to a casual visitor. The defacement might be subtle — injected spam links, hidden redirects, or a modified footer that only search engines see.&lt;/p&gt;

&lt;p&gt;AI Patrol solves this with a two-layer approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Layer 1: Technical checks (automated during crawl)
├── HTTP status codes (5xx/4xx detection)
├── JavaScript errors
├── Console errors
├── Broken images
├── Mixed content (HTTPS → HTTP)
└── Broken links (subresource 404/5xx)

Layer 2: AI visual analysis (Claude Vision API)
├── Defacement detection (injected text, hacker signatures)
├── Debug info leaks (stack traces, SQL queries, internal paths)
├── Phishing redirects
├── Layout breakage (overlapping elements, overflow)
├── Character encoding issues
├── Suspicious ads/popups
└── SEO spam (hidden text, keyword stuffing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Visual diff detection:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Playwright captures full-page screenshots and compares them pixel-by-pixel against the previous crawl using pixelmatch. When the change rate exceeds 5%, Claude Vision AI analyzes &lt;em&gt;what&lt;/em&gt; changed — distinguishing legitimate content updates from unauthorized modifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passive scanning only
&lt;/h3&gt;

&lt;p&gt;Nyambush performs &lt;strong&gt;passive scanning exclusively&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS queries&lt;/li&gt;
&lt;li&gt;Standard HTTP/HTTPS requests (identical to normal browser visits)&lt;/li&gt;
&lt;li&gt;Certificate Transparency log lookups&lt;/li&gt;
&lt;li&gt;Public vulnerability database correlation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No port scanning. No exploit attempts. No PoC execution. This means you can safely scan &lt;strong&gt;any&lt;/strong&gt; domain — your own sites, client sites, or prospective clients — without legal concerns.&lt;/p&gt;

&lt;h3&gt;
  
  
  How agencies and freelancers use it
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Health check past clients&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enter a former client's domain. See its current security posture. If issues are found, you have concrete data to re-engage: &lt;em&gt;"Your site is running WordPress 5.8 with X known vulnerabilities. Want to discuss a fix?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Numbers change conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Scope new projects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For redesign or migration projects, scan the existing site first. &lt;em&gt;"Here's the current security risk profile"&lt;/em&gt; makes a compelling case for modernization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Automated post-delivery monitoring with AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set up AI Patrol and Nyambush continuously monitors delivered sites. When defacement, layout breakage, or JavaScript failures are detected, you get screenshots and specific findings. Present before/after screenshots with diff images to clients as evidence of your maintenance value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Quality assurance at delivery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scan your own work before handoff. Prove that security headers and email authentication are properly configured. &lt;em&gt;"Security-conscious development"&lt;/em&gt; becomes a documented differentiator.&lt;/p&gt;

&lt;h3&gt;
  
  
  WordPress plugin for deeper insight
&lt;/h3&gt;

&lt;p&gt;External scanning can't see everything. Install the &lt;strong&gt;Nyambush WordPress plugin&lt;/strong&gt; to report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete plugin inventory (including deactivated plugins)&lt;/li&gt;
&lt;li&gt;Exact PHP version&lt;/li&gt;
&lt;li&gt;wp-config.php security settings (debug mode, SSL enforcement)&lt;/li&gt;
&lt;li&gt;Login security configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those "deactivated but not deleted" plugins with known vulnerabilities? Now you can find them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Business&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$13&lt;/td&gt;
&lt;td&gt;$65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domains&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scan frequency&lt;/td&gt;
&lt;td&gt;Monthly&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;Daily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Patrol&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;5 pages (Haiku 4.5)&lt;/td&gt;
&lt;td&gt;50 pages (Sonnet 4.5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patrol scope&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Tech checks + AI analysis + visual diff&lt;/td&gt;
&lt;td&gt;Same (higher accuracy model)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notifications&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Slack + LINE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Report&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Free works for personal checks. Pro fits agencies managing multiple client sites. Business adds daily AI patrol for automated defacement and incident detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond "Build and Forget"
&lt;/h2&gt;

&lt;p&gt;WordPress vulnerability disclosure has reached a scale that no individual can track manually. But "stop using WordPress" isn't realistic — it powers the majority of the web, and that's not changing anytime soon.&lt;/p&gt;

&lt;p&gt;What we &lt;em&gt;can&lt;/em&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make the invisible visible&lt;/strong&gt; — know the current state of sites we've built&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communicate risk with data&lt;/strong&gt; — show clients specific numbers, not vague warnings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate monitoring&lt;/strong&gt; — catch changes before they become incidents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let AI watch what humans can't&lt;/strong&gt; — visual monitoring at a scale no team can match&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it: &lt;a href="https://nyambush.app/en" rel="noopener noreferrer"&gt;nyambush.app&lt;/a&gt;. Enter a domain. One minute, zero signup, and you'll see what's really going on.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ipa.go.jp/pressrelease/2024/press20250214.html" rel="noopener noreferrer"&gt;IPA "2024 SME Cybersecurity Survey"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.meti.go.jp/press/2024/02/20250219001/20250219001.html" rel="noopener noreferrer"&gt;METI "70% of SME Cyber Incidents Impact Business Partners"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wordfence.com/blog/2026/01/wordfence-intelligence-weekly-wordpress-vulnerability-report-january-12-2026-to-january-18-2026/" rel="noopener noreferrer"&gt;Wordfence Weekly Vulnerability Report (Jan 12–18, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kusanagi.tokyo/releases/22573/" rel="noopener noreferrer"&gt;WordPress Vulnerability Roundup (KUSANAGI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kinsta.com/wordpress-market-share/" rel="noopener noreferrer"&gt;WordPress Market Share Statistics (Kinsta)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.appleple.com/blog/cms/japanese-cms-share202507.html" rel="noopener noreferrer"&gt;Japanese CMS Market Share 2025 (Appleple)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wordpress</category>
      <category>security</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built an open-source SBOM dashboard to track vulnerabilities across all my projects</title>
      <dc:creator>youichi uda</dc:creator>
      <pubDate>Sun, 01 Feb 2026 06:38:26 +0000</pubDate>
      <link>https://dev.to/y1uda/i-built-an-open-source-sbom-dashboard-to-track-vulnerabilities-across-all-my-projects-5c1j</link>
      <guid>https://dev.to/y1uda/i-built-an-open-source-sbom-dashboard-to-track-vulnerabilities-across-all-my-projects-5c1j</guid>
      <description>&lt;p&gt;I got tired of generating SBOMs and then having nowhere useful to put them. So I built &lt;a href="https://github.com/youichi-uda/sbomhub" rel="noopener noreferrer"&gt;SBOMHub&lt;/a&gt; - an open-source dashboard for managing SBOMs and tracking vulnerabilities across multiple projects.&lt;/p&gt;

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

&lt;p&gt;Tools like Syft, Trivy, and cdxgen make generating SBOMs easy. But then what?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where do you store SBOMs for 20+ projects?&lt;/li&gt;
&lt;li&gt;When a new CVE drops (like Log4j), can you quickly find which projects are affected?&lt;/li&gt;
&lt;li&gt;How do you prioritize which vulnerabilities to fix first?&lt;/li&gt;
&lt;li&gt;How do you prove to auditors that you're tracking vulnerabilities?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I needed a central place to answer these questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SBOMHub Does
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F78q01m260p4nihp0phui.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.amazonaws.com%2Fuploads%2Farticles%2F78q01m260p4nihp0phui.png" alt="SBOMHub Dashboard" width="800" height="749"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Import SBOMs&lt;/strong&gt; from any generator (CycloneDX/SPDX JSON)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track vulnerabilities&lt;/strong&gt; with NVD matching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-project CVE search&lt;/strong&gt; - "Show me every project using lodash &amp;lt; 4.17.21"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EPSS scoring&lt;/strong&gt; - Prioritize by actual exploit probability, not just CVSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VEX support&lt;/strong&gt; - Mark false positives with justification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI for CI/CD&lt;/strong&gt; - Fail builds on critical vulnerabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/youichi-uda/sbomhub/main/docker-compose.yml &lt;span class="nt"&gt;-o&lt;/span&gt; docker-compose.yml
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# Open http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. PostgreSQL and Redis are included.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLI Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/youichi-uda/sbomhub-cli/cmd/sbomhub@latest

&lt;span class="c"&gt;# Scan and upload (auto-detects Syft/Trivy/cdxgen)&lt;/span&gt;
sbomhub scan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; my-app

&lt;span class="c"&gt;# Fail CI on critical vulnerabilities&lt;/span&gt;
sbomhub scan &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--project&lt;/span&gt; my-app &lt;span class="nt"&gt;--fail-on&lt;/span&gt; critical
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GitHub Actions Integration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SBOM Check&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sbom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl -fsSL https://sbomhub.app/install.sh | sh&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Scan and Upload&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sbomhub scan . --project ${{ github.repository }} --fail-on critical&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;SBOMHUB_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SBOMHUB_API_KEY }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Go 1.22+ (Echo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Next.js 16 + React 19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;shadcn/ui + Tailwind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;PostgreSQL 15+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache&lt;/td&gt;
&lt;td&gt;Redis 7+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Not Dependency-Track?
&lt;/h2&gt;

&lt;p&gt;Fair question. Dependency-Track is more mature and battle-tested.&lt;/p&gt;

&lt;p&gt;I built SBOMHub because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DT dropped SPDX support in v4&lt;/li&gt;
&lt;li&gt;I needed a CLI for CI/CD integration&lt;/li&gt;
&lt;li&gt;I wanted cross-project CVE search&lt;/li&gt;
&lt;li&gt;I needed SBOM diff between versions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If DT works for you, stick with it. SBOMHub is for people who need these specific features.&lt;/p&gt;

&lt;h2&gt;
  
  
  SaaS Option
&lt;/h2&gt;

&lt;p&gt;Don't want to self-host? Try the cloud version: &lt;strong&gt;&lt;a href="https://sbomhub.app" rel="noopener noreferrer"&gt;https://sbomhub.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Projects&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;~$17/mo&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;~$55/mo&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Self-hosted is completely free (AGPL-3.0).&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;[ ] LDAP/OIDC authentication&lt;/li&gt;
&lt;li&gt;[ ] More vulnerability sources&lt;/li&gt;
&lt;li&gt;[ ] AI-powered priority suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/youichi-uda/sbomhub" rel="noopener noreferrer"&gt;https://github.com/youichi-uda/sbomhub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt;: &lt;a href="https://github.com/youichi-uda/sbomhub-cli" rel="noopener noreferrer"&gt;https://github.com/youichi-uda/sbomhub-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS&lt;/strong&gt;: &lt;a href="https://sbomhub.app" rel="noopener noreferrer"&gt;https://sbomhub.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Would love feedback! What features would make this useful for your workflow?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>security</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
