<?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: Eidon Ze</title>
    <description>The latest articles on DEV Community by Eidon Ze (@eidon_ze_598ff4e987ed54d2).</description>
    <link>https://dev.to/eidon_ze_598ff4e987ed54d2</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%2F4057898%2F5ab22102-d2b1-4a61-8340-96932aea426d.jpg</url>
      <title>DEV Community: Eidon Ze</title>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eidon_ze_598ff4e987ed54d2"/>
    <language>en</language>
    <item>
      <title>Five read-only diagnostic CLIs for AI agents on Web3 (x402, MCP, Solana)</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sun, 27 Sep 2026 04:46:46 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/five-read-only-diagnostic-clis-for-ai-agents-on-web3-x402-mcp-solana-31l4</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/five-read-only-diagnostic-clis-for-ai-agents-on-web3-x402-mcp-solana-31l4</guid>
      <description>&lt;p&gt;AI agents are starting to pay for things (x402, USDC per call on Solana and Base). That creates two failure modes nobody has good tooling for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The endpoint answers the wrong thing.&lt;/strong&gt; An x402 endpoint that returns &lt;code&gt;400&lt;/code&gt; instead of &lt;code&gt;402&lt;/code&gt;, or a payment document missing &lt;code&gt;payTo&lt;/code&gt;, breaks every agent that touches it — usually silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nobody can prove what was delivered.&lt;/strong&gt; An agent pays, gets a response, and has no independent evidence of what the seller actually delivered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I kept running into both, so I built a suite of &lt;strong&gt;five read-only diagnostic CLIs&lt;/strong&gt; — and released them all on npm this week. They share one philosophy: &lt;strong&gt;CLI-first, no private keys, no auto-payments, JSON output, &lt;code&gt;PASS / FAIL / UNKNOWN&lt;/code&gt;, and every tool documents what it does &lt;em&gt;not&lt;/em&gt; cover.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suite index with all commands:&lt;/strong&gt; &lt;a href="https://xka0085-byte.github.io/evidence-tools/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/evidence-tools/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The five tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. mcpdoctor — is your MCP/x402 endpoint discoverable?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @eidonze/mcpdoctor inspect https://your-endpoint/mcp &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parses the HTTP 402 payment document (headers and body, x402 v1 &lt;code&gt;accepts[]&lt;/code&gt; and v2 &lt;code&gt;x402.accepts&lt;/code&gt;) and checks the &lt;code&gt;/.well-known/mcp/server.json&lt;/code&gt; and &lt;code&gt;/.well-known/x402&lt;/code&gt; discovery manifests, with a SHA-256 of the response. &lt;strong&gt;It does not speak the MCP protocol — no &lt;code&gt;initialize&lt;/code&gt;, no &lt;code&gt;tools/list&lt;/code&gt;.&lt;/strong&gt; One real bug it caught during development: an endpoint advertising a vendor hint header with no &lt;code&gt;accepts[]&lt;/code&gt; — which shadowed the real payment document.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. x402-reconcile — what does an x402 endpoint demand?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx x402-reconcile inspect https://api.example.com/paid &lt;span class="nt"&gt;--method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;POST &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parses the 402 challenge: scheme (&lt;code&gt;exact&lt;/code&gt;/&lt;code&gt;base&lt;/code&gt;), network (CAIP-2), asset, amount, &lt;code&gt;payTo&lt;/code&gt;, timeout — plus response latency and a SHA-256 of the raw response bytes. Verified against a real public endpoint (a notary service returning 402 / exact / USDC / amount 1000). It never signs or pays anything — settlement and delivery stay explicitly &lt;code&gt;NOT_TESTED&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. oauthdoctor — can an agent even discover your OAuth metadata?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx oauthdoctor inspect https://mcp.example.com/mcp &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Walks the MCP authorization discovery flow: unauthenticated request → 401 challenge → &lt;code&gt;WWW-Authenticate&lt;/code&gt; &lt;code&gt;resource_metadata&lt;/code&gt; → Protected Resource Metadata → Authorization Server Metadata → PKCE &lt;code&gt;S256&lt;/code&gt; declaration. Discovery-only by design: no login, no token exchange, no stored credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. wallet-evidence — what does one Solana RPC actually see?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx wallet-evidence inspect &amp;lt;signature&amp;gt; &lt;span class="nt"&gt;--rpc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.mainnet-beta.solana.com &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Slot, block time, execution error, parsed instructions, fee — and a SHA-256 of the raw RPC response so the report is re-checkable. The interesting finding while testing: &lt;strong&gt;the same transaction signature was visible on one public RPC and &lt;code&gt;not found&lt;/code&gt; on another.&lt;/strong&gt; The tool therefore returns &lt;code&gt;UNKNOWN&lt;/code&gt; when an RPC can't see a transaction — it never conflates that with "the transaction does not exist."&lt;/p&gt;

&lt;h3&gt;
  
  
  5. crosschain-incident — normalize a cross-chain incident export
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx crosschain-incident inspect &lt;span class="nt"&gt;--input&lt;/span&gt; ./message.json &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Takes operator-supplied source/destination status JSON and produces a conservative evidence report. Missing fields stay &lt;code&gt;UNKNOWN&lt;/code&gt;; failures become machine-readable findings. Protocol APIs (LayerZero/Hyperlane) are the roadmap — today it's an offline formatter and says so.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;Only parts of this stack have real-world validation so far, and the tools label their own coverage. Examples: &lt;code&gt;x402-reconcile&lt;/code&gt; has parsed one real public 402 challenge but has never verified a settlement; &lt;code&gt;oauthdoctor&lt;/code&gt; passes local positive/negative fixtures but hasn't met a public OAuth-protected MCP endpoint yet. The &lt;a href="https://github.com/xka0085-byte/agenttoll" rel="noopener noreferrer"&gt;ReceiptRail&lt;/a&gt; MCP service behind the suite has its declared core (&lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;tools/list&lt;/code&gt;) passing the official MCP conformance tests — not full-conformance, and it doesn't claim to be.&lt;/p&gt;

&lt;p&gt;Every README has a &lt;strong&gt;"NOT covered"&lt;/strong&gt; section. If a claim isn't backed by a test or a real observation, it's not in the report.&lt;/p&gt;

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

&lt;p&gt;All five are one &lt;code&gt;npx&lt;/code&gt; away, MIT licensed, zero runtime dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @eidonze/mcpdoctor inspect https://your-endpoint/mcp &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The suite grew out of &lt;a href="https://github.com/xka0085-byte/agenttoll" rel="noopener noreferrer"&gt;ReceiptRail&lt;/a&gt; — on-chain x402 delivery receipts on Solana (SHA-256 digest anchored to a PDA after settlement, verifiable offline with zero trust), live MCP endpoint at &lt;code&gt;https://agenttoll-receipts.app.workbuddy.host/mcp&lt;/code&gt;, npm &lt;code&gt;receiptrail-mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Suite index: &lt;a href="https://xka0085-byte.github.io/evidence-tools/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/evidence-tools/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run an x402 endpoint and want a human inspection of the full payment-to-delivery path (not just the challenge), that's the manual service the suite grew out of: &lt;a href="https://xka0085-byte.github.io/evidence-tools/" rel="noopener noreferrer"&gt;https://xka0085-byte.github.io/evidence-tools/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>ai</category>
      <category>solana</category>
      <category>npm</category>
    </item>
    <item>
      <title>Your x402 endpoint is probably answering 400 instead of 402 — here's a one-command check</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Wed, 23 Sep 2026 07:54:24 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/your-x402-endpoint-is-probably-answering-400-instead-of-402-heres-a-one-command-check-57o1</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/your-x402-endpoint-is-probably-answering-400-instead-of-402-heres-a-one-command-check-57o1</guid>
      <description>&lt;p&gt;&lt;em&gt;ReceiptRail: &lt;a href="https://github.com/xka0085-byte/agenttoll" rel="noopener noreferrer"&gt;github.com/xka0085-byte/agenttoll&lt;/a&gt; · listed on &lt;a href="https://smithery.ai/server/xka0085/ReceiptRail" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt; and the official MCP Registry · mcpdoctor: &lt;a href="https://www.npmjs.com/package/@eidonze/mcpdoctor" rel="noopener noreferrer"&gt;npm&lt;/a&gt; · &lt;a href="https://github.com/xka0085-byte/mcp-doctor" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>mcp</category>
      <category>solana</category>
      <category>web3</category>
    </item>
    <item>
      <title>How to Convert Tailwind HTML to Structured, Semantic CSS (Without a Full Rewrite)</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 08 Aug 2026 07:40:19 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/how-to-convert-tailwind-html-to-structured-semantic-css-without-a-full-rewrite-15m1</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/how-to-convert-tailwind-html-to-structured-semantic-css-without-a-full-rewrite-15m1</guid>
      <description>&lt;p&gt;How to Convert Tailwind HTML to Structured, Semantic CSS (Without a Full Rewrite)&lt;br&gt;
I've been using Tailwind for about two years across a handful of projects. It's fast, it's predictable, and once the muscle memory kicks in you can style things without switching files.&lt;br&gt;
But here's what I kept running into:&lt;br&gt;
That component you built six months ago? The one with ⁠flex items-center justify-between p-4 bg-white rounded-lg shadow-md⁠ on the outer div, plus another half-dozen classes on each child element? When you come back to refactor it, you're reading styling before you're reading structure. And if you want to move that component into a project that doesn't use Tailwind — or hand it off to someone who doesn't know the utility vocabulary — you're stuck.&lt;br&gt;
The tooling gap&lt;br&gt;
I went looking for something that could take a chunk of Tailwind-styled HTML and give me back clean, semantic CSS. Not one-to-one class translation (there are a dozen tools that do ⁠px-4 → padding: 1rem⁠). I wanted something that understood the component structure — that a button inside a card should become ⁠.card-button⁠, not ⁠.element-4⁠.&lt;br&gt;
What I found:&lt;br&gt;
 One-to-one converters — great if you just need to know what ⁠gap-4⁠ compiles to, but they output ⁠.element {}⁠ ⁠.div {}⁠ flat rules with no hierarchy&lt;br&gt;
 StyleLens (VSCode) — finds duplicate utility patterns and suggests refactoring into ⁠&lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;⁠, but it's an editor workflow, not an export tool&lt;br&gt;
 Tailwind's own ⁠&lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;⁠ — moves the problem from the HTML to the CSS file but doesn't change the naming problem&lt;br&gt;
None of them did what I actually wanted: paste some HTML, get back component-level CSS with meaningful class names.&lt;br&gt;
What I ended up building&lt;br&gt;
Since I couldn't find it, I put together a minimal tool that does exactly that. The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse the HTML tree&lt;/li&gt;
&lt;li&gt;Translate every Tailwind class to its CSS equivalent&lt;/li&gt;
&lt;li&gt;Group declarations by component (the tree structure tells you what belongs where)&lt;/li&gt;
&lt;li&gt;Name things based on what they are — semantic tags like ⁠h2⁠ become ⁠.card-title⁠, buttons become ⁠.card-button⁠, etc.
Here's what it looks like in practice.
Input:

&amp;lt; img class="w-full h-48 object-cover" src="img.jpg" /&amp;gt;

&lt;h2&gt;Card Title&lt;/h2&gt;
&lt;p&gt;Description goes here.&lt;/p&gt;

  Get Started



Output:
.card {
max-width: 24rem;
margin-left: auto;
margin-right: auto;
background-color: #ffffff;
border-radius: 0.75rem;
box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);
overflow: hidden;
}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;.card-image {&lt;br&gt;
  width: 100%;&lt;br&gt;
  height: 12rem;&lt;br&gt;
  object-fit: cover;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-body {&lt;br&gt;
  padding: 1.5rem;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-title {&lt;br&gt;
  font-size: 1.25rem;&lt;br&gt;
  font-weight: 700;&lt;br&gt;
  color: #111827;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-description {&lt;br&gt;
  margin-top: 0.5rem;&lt;br&gt;
  color: #4b5563;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-button {&lt;br&gt;
  margin-top: 1rem;&lt;br&gt;
  padding-left: 1rem;&lt;br&gt;
  padding-right: 1rem;&lt;br&gt;
  padding-top: 0.5rem;&lt;br&gt;
  padding-bottom: 0.5rem;&lt;br&gt;
  background-color: #2563eb;&lt;br&gt;
  color: #ffffff;&lt;br&gt;
  border-radius: 0.25rem;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-button:hover {&lt;br&gt;
  background-color: #1d4ed8;&lt;br&gt;
}&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%2Fydxguqyxxusveb4kp5d7.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%2Fydxguqyxxusveb4kp5d7.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What happens when 4 competing products all stumble at the same time</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sun, 02 Aug 2026 04:47:49 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/what-happens-when-4-competing-products-all-stumble-at-the-same-time-pja</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/what-happens-when-4-competing-products-all-stumble-at-the-same-time-pja</guid>
      <description>&lt;p&gt;I've been researching the freelancer client portal space for a side project, and I stumbled into something I didn't expect.&lt;/p&gt;

&lt;p&gt;In the last 12 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HoneyBook raised prices and got flooded with 1-star reviews for crashing&lt;/li&gt;
&lt;li&gt;Fiverr shut down AND.CO entirely — tens of thousands of users had to leave&lt;/li&gt;
&lt;li&gt;Dubsado's setup process is so complex people hire $500+ consultants&lt;/li&gt;
&lt;li&gt;Bonsai got acquired and went radio silent on product updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four products, four different problems, all happening at once.&lt;/p&gt;

&lt;p&gt;It got me thinking — if you were going to build a client portal today, what would you actually include? I've been talking to freelancers and the answer keeps coming back to like four features: project status, file sharing, invoices, messages. That's it. No CRM pipelines, no workflow automations, no "enterprise plan."&lt;/p&gt;

&lt;p&gt;So I threw up a landing page to see if anyone cares. It's called ClientDash — one link per client, $49 one-time, no subscription.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://peppy-pegasus-d7ec4a.netlify.app/" rel="noopener noreferrer"&gt;https://peppy-pegasus-d7ec4a.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm not sure if this is a real window or just a coincidence I'm reading too much into. Curious what people here think — is the client portal space actually underserved, or are freelancers just fine with Google Docs + email?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>freelance</category>
    </item>
    <item>
      <title>ReceiptRadar — Auto-extract every receipt from your Gmail inbox</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:38:46 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/receiptradar-auto-extract-every-receipt-from-your-gmail-inbox-510h</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/receiptradar-auto-extract-every-receipt-from-your-gmail-inbox-510h</guid>
      <description></description>
      <category>ai</category>
    </item>
  </channel>
</rss>
