<?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: Sandeep Kumar</title>
    <description>The latest articles on DEV Community by Sandeep Kumar (@qisanxi).</description>
    <link>https://dev.to/qisanxi</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%2F4101220%2F88f4de15-01f6-4cbb-9ab2-2405d2caf892.jpg</url>
      <title>DEV Community: Sandeep Kumar</title>
      <link>https://dev.to/qisanxi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qisanxi"/>
    <language>en</language>
    <item>
      <title>Stopping LLM Hallucinations in Reverse Engineering: Meet Reverify</title>
      <dc:creator>Sandeep Kumar</dc:creator>
      <pubDate>Fri, 04 Sep 2026 03:28:30 +0000</pubDate>
      <link>https://dev.to/qisanxi/stopping-llm-hallucinations-in-reverse-engineering-meet-reverify-37ne</link>
      <guid>https://dev.to/qisanxi/stopping-llm-hallucinations-in-reverse-engineering-meet-reverify-37ne</guid>
      <description>&lt;p&gt;Large Language Models (LLMs) are changing how we write, debug, and understand code. But when you throw an LLM at compiled binaries, things get messy quickly. &lt;/p&gt;

&lt;p&gt;If you’ve ever tried to use an AI agent to analyze malware, reverse-engineer a proprietary protocol, or solve a CTF challenge, you have likely run into the &lt;strong&gt;hallucination barrier&lt;/strong&gt;. An agent will confidently assert that a specific function starts at &lt;code&gt;0x401120&lt;/code&gt;, uses an RC4 decryption routine, and reads a struct with a 16-byte offset. You open the binary in Ghidra or IDA Pro, check the address, and realize... none of that exists. The LLM simply hallucinated a plausible-looking structure because it fit the probabilistic pattern of its training data.&lt;/p&gt;

&lt;p&gt;Binary analysis is an unforgiving domain. A single incorrect byte, mismatched register, or offset shift of 4 bytes breaks everything. In reverse engineering, close enough is not good enough.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Reverify&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Reverify is an advanced, deterministic verification loop designed to ground AI reverse-engineering agents in actual binary bytes. It acts as an automated judge that forces LLMs to prove their hypotheses using binary parsing, disassembly, pattern matching, and CPU emulation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Why LLMs Fail at Binary Analysis
&lt;/h2&gt;

&lt;p&gt;LLMs are probabilistic engines designed to predict the next token. They are excellent at understanding semantic patterns but struggle with exact physical structures and arithmetic calculations. When analyzing a binary, an AI agent faces several distinct challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spatial and Structural Hallucinations:&lt;/strong&gt; AI agents routinely guess struct offsets, assembly layouts, and function boundaries based on naming conventions or contextual clues rather than physical reality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution Blindness:&lt;/strong&gt; Static analysis alone is rarely enough. An LLM cannot execute a code path in its head to verify if a decryption loop actually produces a specific key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Ground-Truth Feedback:&lt;/strong&gt; When an agent acts autonomously, it lacks a tight feedback loop. If it makes an incorrect assumption early in its chain of thought, every subsequent conclusion is compromised.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To make autonomous reverse-engineering agents viable, we must transition them from a "guess-and-check" methodology to a &lt;strong&gt;formal hypothesis-and-verification&lt;/strong&gt; loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Reverify?
&lt;/h2&gt;

&lt;p&gt;Reverify bridges the gap between probabilistic LLMs and deterministic execution engines. It provides a structured verification layer that tests LLM assertions against reality.&lt;/p&gt;

&lt;p&gt;Instead of allowing an AI agent to simply state: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The function at &lt;code&gt;0x1000&lt;/code&gt; is a custom XOR decryption routine."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reverify forces the agent to interact with a verification framework that asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Prove it. Provide the disassembly, trace the register states, emulate the execution using Unicorn, and show that the output bytes at target memory locations match your claim."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Reverify leverages a powerhouse stack of binary analysis and dynamic instrumentation tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LIEF:&lt;/strong&gt; For structural parsing of executable formats (ELF, PE, Mach-O).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capstone Engine:&lt;/strong&gt; For multi-architecture instruction disassembly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unicorn Engine:&lt;/strong&gt; For lightweight CPU emulation, allowing register and memory tracing without running the full binary on the host system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frida:&lt;/strong&gt; For dynamic instrumentation and hooking during live process execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Context Protocol (MCP):&lt;/strong&gt; To expose these validation tools natively to LLM agents (like Claude or GPT-based agents) as structured tools.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Under the Hood: Key Components
&lt;/h2&gt;

&lt;p&gt;Let's dive into some of the core components of the Reverify codebase to see how it enforces this deterministic verification loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Orchestration and Tool Exposure: &lt;code&gt;reverify/cli.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The command-line interface (&lt;code&gt;reverify/cli.py&lt;/code&gt;) serves as the entry point for both human analysts and automated agents. It exposes commands that allow agents to query, parse, disassemble, and run emulation checks.&lt;/p&gt;

&lt;p&gt;Rather than just outputting raw text, the CLI outputs structured JSON that agents can parse directly to adjust their internal state. This structured feedback loop is critical for correcting the agent's path before it goes off the rails.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Validating Assumptions: &lt;code&gt;benchmarks/prologue_prior.py&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A classic hallucination point for LLM agents is identifying function entry points. When analyzing stripped binaries, agents often guess where functions start based on compiler-specific patterns (like &lt;code&gt;push rbp; mov rbp, rsp&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The benchmark and analysis script &lt;code&gt;benchmarks/prologue_prior.py&lt;/code&gt; validates whether function prologues actually exist at the addresses proposed by the model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified concept of prologue verification in Reverify
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verify_function_prologue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary_bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;architecture&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x64&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Read the bytes at the claimed offset
&lt;/span&gt;    &lt;span class="n"&gt;prologue_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binary_bytes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Define known valid prologues for validation
&lt;/span&gt;    &lt;span class="n"&gt;valid_prologues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x64&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x55\x48\x89\xe5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# push rbp; mov rbp, rsp
&lt;/span&gt;            &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x48\x83\xec&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# sub rsp, imm
&lt;/span&gt;        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x86&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x55\x89\xe5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# push ebp; mov ebp, esp
&lt;/span&gt;        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Force the agent to ground its claim in actual byte sequences
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prologue_bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;valid_prologues&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;architecture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Valid prologue found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid prologue at offset &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Found bytes: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prologue_bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an agent proposes a function boundary, Reverify executes a check like this. If the check fails, the agent receives an immediate, actionable error message: &lt;em&gt;“Failed: Bytes at 0x401050 do not match standard function prologues. Found 0x00000000 instead.”&lt;/em&gt; The agent is then forced to revise its hypothesis.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Verification Loop in Action
&lt;/h2&gt;

&lt;p&gt;How does this look in practice? Imagine an autonomous agent analyzing a piece of malware containing an obfuscated string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       +---------------------------------------------+
       |             AI RE Agent (LLM)               |
       |  "I think 0x4012A0 decrypts the payload"    |
       +----------------------+----------------------+
                              |
                     Hypothesis &amp;amp; Proof Request
                              v
       +---------------------------------------------+
       |             Reverify Engine                 |
       |  1. Disassemble 0x4012A0 (Capstone)        |
       |  2. Set up emulation state (Unicorn)        |
       |  3. Run to return instruction               |
       +----------------------+----------------------+
                              |
                     Deterministic Feedback
                              v
       +---------------------------------------------+
       |             AI RE Agent (LLM)               |
       |  "Ah, the register EDX held the key.        |
       |   The decrypted string is 'flag{u_got_me}'"  |
       +---------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Hypothesis:&lt;/strong&gt; The agent theorizes that calling the function at &lt;code&gt;0x4012A0&lt;/code&gt; with register &lt;code&gt;rdi&lt;/code&gt; pointing to a ciphertext buffer will decrypt a payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Verification Setup:&lt;/strong&gt; The agent invokes Reverify’s emulation tool via MCP. It configures a virtual CPU state:

&lt;ul&gt;
&lt;li&gt;Maps memory at &lt;code&gt;0x400000&lt;/code&gt; (binary base).&lt;/li&gt;
&lt;li&gt;Writes the ciphertext to a virtual stack/heap.&lt;/li&gt;
&lt;li&gt;Sets &lt;code&gt;rdi&lt;/code&gt; to the ciphertext address.&lt;/li&gt;
&lt;li&gt;Sets &lt;code&gt;rip&lt;/code&gt; to &lt;code&gt;0x4012A0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution:&lt;/strong&gt; Reverify uses &lt;strong&gt;Unicorn Engine&lt;/strong&gt; to emulate execution. It steps through instructions, tracking changes to memory and registers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; The emulation runs until a &lt;code&gt;ret&lt;/code&gt; instruction is hit, or a timeout occurs. Reverify inspects the memory address where the agent expected the decrypted string to appear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Verdict:&lt;/strong&gt; Reverify returns the precise memory state and registers back to the agent. If the memory contains plaintext, the hypothesis is confirmed. If the memory is unchanged or faulted, the agent is given the exact CPU state at the point of failure so it can debug its assumptions.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Key Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Automated Malware Analysis
&lt;/h3&gt;

&lt;p&gt;Malware authors use packer, crypters, and custom obfuscation to defeat static analysis tools. Reverify allows security analysts to build autonomous triage pipelines where AI agents can systematically strip obfuscation layers, run unpacking loops in safe emulated sandboxes, and verify decrypted payloads with absolute confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Autonomous CTF Solving
&lt;/h3&gt;

&lt;p&gt;In Capture The Flag (CTF) competitions, speed is key. An AI agent powered by Reverify can quickly parse binary targets, verify function logic, validate vulnerability hypotheses (like buffer overflow offsets), and test exploit payloads locally using emulated environments before throwing them at the remote flag server.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Copilot for Human Reverse Engineers
&lt;/h3&gt;

&lt;p&gt;Even when a human is in the loop, Reverify serves as an excellent assistant. You can ask an LLM to analyze a complex function, but have Reverify run behind the scenes to verify every assertion made by the model. This significantly reduces the time analysts spend manually double-checking hallucinated details in Ghidra.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The future of reverse engineering is undeniably collaborative. AI agents have the potential to speed up vulnerability research, malware triage, and binary analysis by orders of magnitude. However, they cannot do it alone. Without strict guardrails, they are prone to confident mistakes that waste analyst time.&lt;/p&gt;

&lt;p&gt;By introducing a deterministic validation loop, &lt;strong&gt;Reverify&lt;/strong&gt; turns LLMs from unreliable guess-engines into precise, verified analysis partners. &lt;/p&gt;

&lt;p&gt;Are you building AI-powered security agents, or looking to supercharge your binary analysis workflows? Check out &lt;strong&gt;Reverify&lt;/strong&gt;, explore the source code, and start building deterministic validation loops into your security stack today.&lt;/p&gt;

</description>
      <category>reverseengineering</category>
      <category>aiagents</category>
      <category>securitytools</category>
      <category>binaryanalysis</category>
    </item>
    <item>
      <title>Stop Wasting API Tokens: How to Bridge ChatGPT Web to Your IDE Using MCP</title>
      <dc:creator>Sandeep Kumar</dc:creator>
      <pubDate>Fri, 04 Sep 2026 03:27:13 +0000</pubDate>
      <link>https://dev.to/qisanxi/stop-wasting-api-tokens-how-to-bridge-chatgpt-web-to-your-ide-using-mcp-44kf</link>
      <guid>https://dev.to/qisanxi/stop-wasting-api-tokens-how-to-bridge-chatgpt-web-to-your-ide-using-mcp-44kf</guid>
      <description>&lt;p&gt;If you are an active user of AI-powered IDEs like Cursor, VS Code with Copilot, or Windsurf, you already know the sinking feeling of seeing this notification:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You have used 100% of your fast premium requests for this billing cycle."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suddenly, your snappy, context-aware coding assistant slows to a crawl or starts racking up expensive pay-as-you-go API bills. &lt;/p&gt;

&lt;p&gt;At the same time, you are likely paying $20/month for a ChatGPT Plus or Team subscription that sits underutilized in a browser tab. You use it for general questions, but it lacks direct, real-time access to your local codebase, forcing you to engage in a tedious dance of copying and pasting code blocks.&lt;/p&gt;

&lt;p&gt;What if you could bridge this gap? What if you could &lt;strong&gt;let ChatGPT Web do the heavy reasoning and planning using your local context, while saving your premium IDE tokens for fast auto-completions&lt;/strong&gt;? &lt;/p&gt;

&lt;p&gt;In this article, we’ll explore a highly novel, intermediate-level setup that does exactly this. By leveraging the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt;, and secure &lt;strong&gt;Cloudflare Tunnels&lt;/strong&gt;, you can route heavy code-planning tasks directly to your web-based ChatGPT Plus subscription safely and completely free of extra token charges.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Philosophy: Let ChatGPT Think, Let Your IDE Work
&lt;/h2&gt;

&lt;p&gt;When building complex software with AI, your workflow generally splits into two distinct phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning &amp;amp; Planning (High Token Usage):&lt;/strong&gt; This is where you ask the AI to read 10 source files, understand the architecture, design a new feature, or find a subtle bug. This consumes massive amounts of context window tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution &amp;amp; Autocomplete (Low Latency):&lt;/strong&gt; This is where the AI writes single lines of code, refactors a function, or autocompletes your imports. This requires fast, inline API queries.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Paying premium API rates (per token) for Phase 1 is incredibly expensive. This is where this open-source MCP bridge project shines. It exposes a &lt;strong&gt;read-only view of your local project&lt;/strong&gt; as an MCP server. Your web-based ChatGPT (via custom GPTs or MCP integrations) can securely read your workspace, do the heavy thinking, and output a detailed implementation plan. You then let your local IDE execute that plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works: The Tech Stack
&lt;/h2&gt;

&lt;p&gt;The magic lies in bridging your local file system to a remote web browser without opening risky ports on your home router.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────┐                   ┌────────────────────────┐
│   ChatGPT Web (Cloud)   │                   │   Local IDE (Cursor)   │
└───────────┬────────────┘                   └───────────┬────────────┘
            │ (Secure HTTPS)                             │ (Fast Autocomplete)
            ▼                                            ▼
┌────────────────────────┐                   ┌────────────────────────┐
│   Cloudflare Tunnel    │ ◄────────────────►│   Local Codebase       │
└────────────────────────┘                   └────────────────────────┘
            │
            ▼
┌────────────────────────┐
│ Local MCP Bridge Server│
│ (Node.js / Read-Only)  │
└────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js &amp;amp; pnpm:&lt;/strong&gt; To run the lightweight, local MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Context Protocol (MCP):&lt;/strong&gt; An open standard developed by Anthropic that allows LLMs to query local tools and file structures safely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Tunnels (&lt;code&gt;cloudflared&lt;/code&gt;):&lt;/strong&gt; Creates a secure, encrypted tunnel from Cloudflare’s edge directly to your local MCP server. No public IP or port forwarding required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth / Access Control:&lt;/strong&gt; Ensures that only &lt;em&gt;your&lt;/em&gt; authenticated ChatGPT session can access your files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step-by-Step Setup Guide
&lt;/h2&gt;

&lt;p&gt;This guide assumes you have &lt;strong&gt;Node.js (v18+)&lt;/strong&gt; and &lt;strong&gt;pnpm&lt;/strong&gt; installed on your machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Clone and Install the MCP Bridge
&lt;/h3&gt;

&lt;p&gt;First, clone the bridge repository and install its dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/your-repo/mcp-web-bridge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mcp-web-bridge
pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Note: Replace the URL with your specific fork or the community repository you are using).&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure Your Project Workspace
&lt;/h3&gt;

&lt;p&gt;The bridge relies on a &lt;code&gt;SKILL.md&lt;/code&gt; or a configuration file to understand which directories it is allowed to expose. To keep your system secure, the bridge operates on a &lt;strong&gt;strict read-only basis&lt;/strong&gt;. It will index your files but will never write changes back to your disk without your explicit consent via the terminal.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; file in the root directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PORT=3000
WORKSPACE_PATH=/path/to/your/active/project
ALLOWED_EXTENSIONS=.js,.ts,.tsx,.json,.md,.py,.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Set Up the Cloudflare Tunnel
&lt;/h3&gt;

&lt;p&gt;To allow your browser-based ChatGPT to query this local server, you need to expose your port &lt;code&gt;3000&lt;/code&gt; through a secure tunnel.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install the Cloudflare Tunnel CLI (&lt;code&gt;cloudflared&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; &lt;code&gt;brew install cloudflare/cloudflare/cloudflared&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows/Linux:&lt;/strong&gt; Download from Cloudflare's official releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authenticate and start a quick tunnel:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   cloudflared tunnel &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Copy the secure &lt;code&gt;.trycloudflare.com&lt;/code&gt; URL generated in your terminal. It will look something like this:
&lt;code&gt;https://your-unique-subdomain.trycloudflare.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Connecting ChatGPT Web via MCP
&lt;/h3&gt;

&lt;p&gt;With your tunnel running, you can now hook this up to ChatGPT. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;ChatGPT Web&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open your Custom GPT builder or use a client that supports custom MCP endpoints.&lt;/li&gt;
&lt;li&gt;Provide the OpenAPI schema exposed by your local server at:
&lt;code&gt;https://your-unique-subdomain.trycloudflare.com/openapi.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ChatGPT will recognize the tools available: &lt;code&gt;list_directory&lt;/code&gt;, &lt;code&gt;view_file&lt;/code&gt;, and &lt;code&gt;search_grep&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Putting it to the Test: A Real-World Workflow
&lt;/h2&gt;

&lt;p&gt;Let's look at how this changes your day-to-day development loop and saves you money.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario: Refactoring a Legacy Authentication Module
&lt;/h3&gt;

&lt;p&gt;Instead of asking Cursor to "Read all these 4 files and tell me how to refactor them" (which would cost you roughly 15,000 to 30,000 input tokens in your IDE API quota):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ask ChatGPT Web:&lt;/strong&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Using my connected local workspace, find the authentication helper file, read its contents, and design a modern OAuth2-compatible flow that integrates with our current database schema."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ChatGPT Web Acts:&lt;/strong&gt; &lt;br&gt;
Through the secure tunnel, ChatGPT calls &lt;code&gt;search_grep&lt;/code&gt; to locate files like &lt;code&gt;auth.ts&lt;/code&gt; or &lt;code&gt;db.ts&lt;/code&gt;. It reads only those files via &lt;code&gt;view_file&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Brainstorm:&lt;/strong&gt; &lt;br&gt;
Because you are on a flat-rate ChatGPT Plus plan, you can chat back and forth 20 times, refining the architecture, asking "what if" questions, and hashing out edge cases. &lt;strong&gt;Total cost: $0.00 in API tokens.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Execution:&lt;/strong&gt;&lt;br&gt;
Once ChatGPT Web provides the final, pristine code blueprint, you copy the target changes, jump into Cursor, and let your fast, local autocomplete implement the structural plan.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Security Best Practices: Keeping Your Code Safe
&lt;/h2&gt;

&lt;p&gt;Exposing your local files to the web should always be done with caution. Here is how this setup keeps you secure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Strict Read-Only Middleware:&lt;/strong&gt; The Node.js server contains no write APIs. Even if a malicious actor hijacked your tunnel URL, they could not delete or alter your local files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CORS and Token Authentication:&lt;/strong&gt; The project configuration allows you to set a custom authorization header token in your &lt;code&gt;.env&lt;/code&gt; file. ChatGPT will include this header in every request, blocking unauthorized web scrapers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope Limitation:&lt;/strong&gt; Never set your &lt;code&gt;WORKSPACE_PATH&lt;/code&gt; to your user root (&lt;code&gt;~/&lt;/code&gt; or &lt;code&gt;C:\Users\&lt;/code&gt;). Always point it to the specific project folder you are actively working on.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion: Smart Resource Allocation
&lt;/h2&gt;

&lt;p&gt;Being a productive developer in the age of AI isn't just about using the best models—it’s about using them &lt;strong&gt;efficiently&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;By offloading the heavy-lifting, high-context reasoning tasks to your flat-rate ChatGPT Web subscription via this secure MCP bridge, you can preserve your premium IDE tokens for what they do best: lightning-fast inline completions and real-time edits.&lt;/p&gt;

&lt;p&gt;Give this setup a try on your next major project, and watch your API bills plummet while your productivity stays sky-high!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you experimented with the Model Context Protocol (MCP) yet? Let us know your thoughts, configurations, or alternative cost-saving setups in the comments below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>developertools</category>
      <category>modelcontextprotocol</category>
      <category>costoptimization</category>
    </item>
    <item>
      <title>Escaping the Browser: Why We Need a Dedicated Desktop Client for MetaMask</title>
      <dc:creator>Sandeep Kumar</dc:creator>
      <pubDate>Tue, 01 Sep 2026 08:51:52 +0000</pubDate>
      <link>https://dev.to/qisanxi/escaping-the-browser-why-we-need-a-dedicated-desktop-client-for-metamask-3ba7</link>
      <guid>https://dev.to/qisanxi/escaping-the-browser-why-we-need-a-dedicated-desktop-client-for-metamask-3ba7</guid>
      <description>&lt;p&gt;The Web3 revolution was built on the back of the browser extension. For years, MetaMask has been the undisputed gateway to the decentralized web, living snugly in the top-right corner of Chrome, Brave, and Firefox. It made interacting with smart contracts as simple as clicking a button. &lt;/p&gt;

&lt;p&gt;But as Web3 transitions from a niche playground for early adopters into a mature ecosystem of decentralized finance (DeFi), institutional trading, and complex developer workflows, the limitations of the browser extension model are becoming increasingly obvious. &lt;/p&gt;

&lt;p&gt;If you are a Web3 developer, active trader, or power user, you've likely felt the pain points: browser performance lag, constant context-switching, and the nagging anxiety of keeping your private keys in the same application where you open random Twitter links.&lt;/p&gt;

&lt;p&gt;Today, we are looking at a paradigm shift: &lt;strong&gt;a standalone, cross-platform desktop client for MetaMask.&lt;/strong&gt; By taking the wallet out of the browser sandbox and running it as a dedicated desktop application, we can unlock a more secure, isolated, and highly performant Web3 workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with the Browser Extension Monopoly
&lt;/h2&gt;

&lt;p&gt;To understand why a desktop client is necessary, we must first look at the inherent limitations of browser extensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Security Risks and the Shared Memory Space
&lt;/h3&gt;

&lt;p&gt;Browsers are inherently noisy environments. Every time you install an extension, visit a sketchy website, or open a tab with unvetted JavaScript, you expose your system to potential threats. Cross-Site Scripting (XSS) attacks, malicious extensions designed to hijack your clipboard, and phishing pop-ups are constant threats. Running your primary cryptographic key manager inside the same program you use to browse the web is a massive attack surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Resource Clutter and Performance
&lt;/h3&gt;

&lt;p&gt;Modern browsers are notoriously memory-hungry. When you run heavy dApps, decentralized exchanges (DEXs), and analytics dashboards alongside an active wallet, your browser’s performance can tank. Memory leaks from active tabs can cause your extension to freeze right when you are trying to sign a time-sensitive transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Developer Friction
&lt;/h3&gt;

&lt;p&gt;For Web3 developers, testing local smart contracts (via Hardhat, Anvil, or Foundry) while connected to a browser extension can be frustrating. Extensions frequently cache state aggressively, struggle with local RPC network switches, and suffer from CORS issues. Resetting your wallet's state to clear a stuck nonce is a chore that developers have to perform far too many times a day.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing the Desktop Client: A Dedicated Web3 Workspace
&lt;/h2&gt;

&lt;p&gt;The desktop alternative solves these problems by creating a completely isolated environment for your digital assets. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"An unofficial, cross-platform desktop client for MetaMask that frees your Web3 workflow from the browser."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By moving MetaMask into a dedicated desktop application, you gain a focused, secure workspace. The project leverages modern desktop application frameworks to package the core MetaMask interface and wallet logic into a lightweight executable running natively on Windows, macOS, and Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architectural Blueprint
&lt;/h3&gt;

&lt;p&gt;Building a desktop wallet is a delicate balance of security, performance, and user experience. This project sits at the intersection of several powerful technologies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                    Desktop UI                           │
│     (React / TypeScript / Tailwind CSS)                 │
└──────────────────────────┬──────────────────────────────┘
                           │ IPC Bridge
┌──────────────────────────▼──────────────────────────────┐
│                    Desktop Runtime                      │
│             (Tauri / Rust or Electron / Node)           │
└──────────────────────────┬──────────────────────────────┘
                           │ Secure API Calls
┌──────────────────────────▼──────────────────────────────┐
│                   Web3 Core Engine                      │
│           (Web3.js / Ethers.js / Wallet Connect)        │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app's stack leverages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Electron &amp;amp; Tauri:&lt;/strong&gt; Offering the robust runtime of Electron alongside the lightweight, memory-safe footprint of Tauri (written in Rust).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;TypeScript:&lt;/strong&gt; Ensuring type-safety across complex transaction signing mechanisms and state management.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ethers.js &amp;amp; Web3.js:&lt;/strong&gt; Powering RPC provider communication, transaction gas estimation, and cryptographic key derivations.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Under the Hood: Resolving the "DApp-to-Wallet" Bridge
&lt;/h2&gt;

&lt;p&gt;One of the biggest technical challenges of a standalone desktop wallet is communication. When MetaMask lives in the browser, it injects a global provider object (&lt;code&gt;window.ethereum&lt;/code&gt;) directly into active web pages. This allows dApps like Uniswap or OpenSea to automatically detect the wallet.&lt;/p&gt;

&lt;p&gt;How does a standalone desktop application interact with a dApp running inside your browser?&lt;/p&gt;

&lt;p&gt;The desktop client solves this using a two-pronged approach:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Local RPC/WebSocket Bridge
&lt;/h3&gt;

&lt;p&gt;The desktop client can run a lightweight, highly secure local WebSocket server on localhost (e.g., &lt;code&gt;127.0.0.1:xxxx&lt;/code&gt;). &lt;br&gt;
When a dApp tries to connect, a companion browser extension (acting purely as a lightweight relay with no private keys stored in it) routes the request directly to your desktop client. This keeps your keys completely isolated in the desktop app while maintaining compatibility with your favorite browser-based dApps.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Integrated WalletConnect Support
&lt;/h3&gt;

&lt;p&gt;By leveraging the WalletConnect protocol, the desktop client can act as a native desktop companion. You simply scan a QR code or paste a connection URI from any dApp, and your desktop client establishes a secure, end-to-end encrypted session to sign messages and authorize transactions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up and Running the Client Locally
&lt;/h2&gt;

&lt;p&gt;For developers looking to audit the code, run their own build, or contribute to the project, setting up the repository locally is straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Make sure you have Node.js (v18+) and your preferred package manager (npm, yarn, or pnpm) installed. If you are building the Tauri-based version, you will also need the Rust toolchain installed on your machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the Repository:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/your-repo-link/metamask-desktop-client.git
   &lt;span class="nb"&gt;cd &lt;/span&gt;metamask-desktop-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Dependencies:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;install&lt;/span&gt;
   &lt;span class="c"&gt;# or&lt;/span&gt;
   pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run in Development Mode:&lt;/strong&gt;
To launch the application in a local hot-reloading development window:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build the Production Executables:&lt;/strong&gt;
To package the application for your specific operating system (generating a &lt;code&gt;.dmg&lt;/code&gt; for macOS, &lt;code&gt;.exe&lt;/code&gt; for Windows, or &lt;code&gt;.deb&lt;/code&gt;/&lt;code&gt;AppImage&lt;/code&gt; for Linux):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Developers Should Care
&lt;/h2&gt;

&lt;p&gt;If you are a developer, using a desktop client isn't just about security—it’s about streamlining your daily workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Independent Network Profiles:&lt;/strong&gt; You can configure your desktop client to stay permanently connected to your local Hardhat or Anvil node, while keeping your web browser free for standard mainnet research or DeFi interactions. No more constantly switching RPC endpoints back and forth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolated State:&lt;/strong&gt; Clear your test account nonces, reset your local state, and import disposable private keys for testing without affecting your actual personal browser profile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlined UI:&lt;/strong&gt; A dedicated window means you can snap the wallet to one side of your monitor while keeping your IDE open on the other, allowing you to watch state changes and incoming contract call requests in real time.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Security First: A Note on Best Practices
&lt;/h2&gt;

&lt;p&gt;While a desktop client drastically reduces your exposure to browser-based attacks, desktop environments have their own unique security vector. &lt;br&gt;
If you choose to use a desktop client, remember these security fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always run authenticated builds:&lt;/strong&gt; Build the binary directly from source if you are managing significant capital.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep your OS secure:&lt;/strong&gt; Isolated apps protect you from browser malware, but they cannot protect you from system-level keyloggers or RATs (Remote Access Trojans).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pair with a Hardware Wallet:&lt;/strong&gt; The ultimate setup is using this desktop client as a highly polished visual interface paired with a hardware wallet (like Ledger or Trezor) to handle the actual private key authorization.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The future of Web3 is moving toward dedicated, purpose-built workspaces. Just as developers moved from running everything in basic terminal windows to robust, dedicated IDEs, Web3 users are ready to move from lightweight browser extensions to robust, secure, and isolated desktop clients.&lt;/p&gt;

&lt;p&gt;Freeing your wallet from the browser browser-extension bottleneck is the first step toward a faster, safer, and more productive Web3 workflow.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you tried running Web3 wallets outside of the browser? What are your thoughts on the Tauri vs. Electron debate for secure desktop apps? Let’s discuss in the comments below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>blockchain</category>
      <category>desktopapp</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
