|
| 1 | +import Head from "next/head"; |
| 2 | +import type { NextPage } from "next"; |
| 3 | + |
| 4 | +export const POST = { |
| 5 | + title: "Building an AI-Native Ethereum Developer Stack", |
| 6 | + date: "February 2026", |
| 7 | + tags: ["AI-tools", "Scaffold-ETH", "Speedrun-Ethereum"], |
| 8 | + url: "/blog/ai-native-ethereum-stack", |
| 9 | +}; |
| 10 | + |
| 11 | +const codeCls = "bg-white/5 text-primary-content px-1 py-0.5 rounded text-[0.85em]"; |
| 12 | + |
| 13 | +function H2({ children }: { children: React.ReactNode }) { |
| 14 | + return <h2 className="text-secondary font-bold text-lg sm:text-xl mt-10 mb-1">{children}</h2>; |
| 15 | +} |
| 16 | + |
| 17 | +const AiNativeEthereumStack: NextPage = () => { |
| 18 | + return ( |
| 19 | + <> |
| 20 | + <Head> |
| 21 | + <title>{POST.title} — Sand Garden</title> |
| 22 | + <meta |
| 23 | + name="description" |
| 24 | + content="How we're restructuring our Web3 stack—Scaffold-ETH 2, Speedrun Ethereum, RAG pipelines—for a world where AI agents are primary users alongside developers." |
| 25 | + /> |
| 26 | + </Head> |
| 27 | + |
| 28 | + <article className="max-w-2xl px-4 py-12 mx-auto"> |
| 29 | + {/* Header */} |
| 30 | + <header className="mb-10"> |
| 31 | + <div className="flex items-center gap-3 mb-4 font-mono text-sm text-white/35"> |
| 32 | + <span>{POST.date}</span> |
| 33 | + <span>·</span> |
| 34 | + {POST.tags.map(tag => ( |
| 35 | + <span key={tag} className="text-primary/70"> |
| 36 | + {tag} |
| 37 | + </span> |
| 38 | + ))} |
| 39 | + </div> |
| 40 | + <h1 className="text-3xl sm:text-4xl font-bold leading-tight text-white">{POST.title}</h1> |
| 41 | + </header> |
| 42 | + |
| 43 | + {/* Body */} |
| 44 | + <div className="space-y-5 text-white/70 leading-relaxed text-sm sm:text-base"> |
| 45 | + <p> |
| 46 | + For years, we've been building our dev tools and learning materials primarily for humans. Docs |
| 47 | + explained what our toolkit did. We taught developers with guided, hands-on experiences. Extensions shipped |
| 48 | + as mergeable code. |
| 49 | + </p> |
| 50 | + <p>But we're finding that this model gets a bit clunky when an AI agent is driving the keyboard.</p> |
| 51 | + <p> |
| 52 | + Instead of just asking “how do we add AI to our tools” we started asking ourselves: what would |
| 53 | + our stack look like if we treated the AI as a primary user alongside the developer? |
| 54 | + </p> |
| 55 | + <p> |
| 56 | + For us, that meant rethinking some of our core primitives rather than just patching on new features. |
| 57 | + We've been doing exactly that across our dev toolkit ( |
| 58 | + <a |
| 59 | + href="https://github.com/scaffold-eth/scaffold-eth-2" |
| 60 | + target="_blank" |
| 61 | + rel="noopener noreferrer" |
| 62 | + className="link link-primary" |
| 63 | + > |
| 64 | + Scaffold-ETH 2 |
| 65 | + </a> |
| 66 | + ) and our Solidity curriculum ( |
| 67 | + <a |
| 68 | + href="https://speedrunethereum.com" |
| 69 | + target="_blank" |
| 70 | + rel="noopener noreferrer" |
| 71 | + className="link link-primary" |
| 72 | + > |
| 73 | + Speedrun Ethereum |
| 74 | + </a> |
| 75 | + ). The Sand Garden, an intentional team within BuidlGuidl, is executing this vision. |
| 76 | + </p> |
| 77 | + <p>Here is a look at how we're restructuring our own Web3 stack for this shift.</p> |
| 78 | + |
| 79 | + <H2>Structuring Docs for Agents</H2> |
| 80 | + <p> |
| 81 | + We removed Cursor rules from Scaffold-ETH 2 and replaced them with{" "} |
| 82 | + <code className={codeCls}>AGENTS.md</code>. |
| 83 | + </p> |
| 84 | + <p> |
| 85 | + Cursor rules only work in Cursor. <code className={codeCls}>AGENTS.md</code> is picked up by Claude Code, |
| 86 | + Cursor, Windsurf, and any other agent harness.{" "} |
| 87 | + <strong className="text-white font-semibold">One file, every tool.</strong> Every conversation starts with |
| 88 | + the full stack context already loaded. |
| 89 | + </p> |
| 90 | + <p> |
| 91 | + In these new workflows, we're noticing the main consumer of our docs is often an agent loading context |
| 92 | + before writing code. So we shipped <code className={codeCls}>llms-full.txt</code>: the entire SE-2 |
| 93 | + documentation as a single flat file. Not a website. A file an agent loads into context and reasons against. |
| 94 | + </p> |
| 95 | + <p>It's the exact same information, just formatted for how an AI actually consumes it.</p> |
| 96 | + |
| 97 | + <H2>Swapping Complex Code for AI Skills</H2> |
| 98 | + <p> |
| 99 | + Adding a Scaffold-ETH extension used to mean resolving <code className={codeCls}>package.json</code>{" "} |
| 100 | + conflicts through hundreds of lines of template processing code. |
| 101 | + </p> |
| 102 | + <p> |
| 103 | + We replaced it with <code className={codeCls}>/add-extension</code>: a simple agent skill built to work |
| 104 | + across different harnesses. Node.js handles the deterministic operations (fetching, copying), while the AI |
| 105 | + handles the judgment calls (merging).{" "} |
| 106 | + <strong className="text-white font-semibold"> |
| 107 | + Hundreds of lines of template code became a markdown file and a focused script. |
| 108 | + </strong> |
| 109 | + </p> |
| 110 | + <p> |
| 111 | + Same pattern for developer workflow. Our <code className={codeCls}>pr-create</code> skill is a markdown file |
| 112 | + that tells an agent how to inspect the diff, format the PR body, and open it via{" "} |
| 113 | + <code className={codeCls}>gh</code>. No custom script. No alias. Just context. |
| 114 | + </p> |
| 115 | + <p> |
| 116 | + We've started stripping out custom scripts wherever we find that a model just naturally handles the |
| 117 | + task better. |
| 118 | + </p> |
| 119 | + |
| 120 | + <H2>Rethinking How We Teach</H2> |
| 121 | + <p> |
| 122 | + Speedrun Ethereum is how many developers learn to build on Ethereum. We're rebuilding the learning |
| 123 | + layer to the same standard. |
| 124 | + </p> |
| 125 | + <p> |
| 126 | + <strong className="text-white font-semibold">Per-challenge context files.</strong> Each challenge gets an{" "} |
| 127 | + <code className={codeCls}>AGENTS.md</code> detailing the challenge overview, smart contract structure, and |
| 128 | + frontend architecture. When a learner opens a challenge in their IDE, the agent already knows the |
| 129 | + environment. |
| 130 | + </p> |
| 131 | + <p> |
| 132 | + <strong className="text-white font-semibold">AI Teacher Mode.</strong> Type{" "} |
| 133 | + <code className={codeCls}>/start</code> in the directory and an agent walks you through it. It asks |
| 134 | + questions, checks your understanding, guides you without giving the answer away, and reviews your code at |
| 135 | + your pace. |
| 136 | + </p> |
| 137 | + <p> |
| 138 | + Build ideas are also migrating. Old format: a GitHub repo link. New format: a prompt you paste into your |
| 139 | + agent. The agent reads context and starts building with you. |
| 140 | + </p> |
| 141 | + |
| 142 | + <H2>The Research Layer</H2> |
| 143 | + <p> |
| 144 | + The agent ecosystem shifts weekly. That's why we aren't assembling heavy wrappers. We need to |
| 145 | + understand the raw primitives so we can adapt the moment a new paradigm drops. |
| 146 | + </p> |
| 147 | + <p> |
| 148 | + <a |
| 149 | + href="https://github.com/BuidlGuidl/raked" |
| 150 | + target="_blank" |
| 151 | + rel="noopener noreferrer" |
| 152 | + className="link link-primary" |
| 153 | + > |
| 154 | + raked |
| 155 | + </a>{" "} |
| 156 | + is a minimal TypeScript agent built for exactly this: the agent loop, sessions, memory, tools, skills. |
| 157 | + It's under 100 lines for the core. Built to be read, understood, and extended to solve your specific |
| 158 | + use cases. |
| 159 | + </p> |
| 160 | + <p> |
| 161 | + Alongside it: an experimental RAG pipeline on Arbitrum DAO governance data. Vector search via{" "} |
| 162 | + <code className={codeCls}>pgvector</code>, retrieval via LlamaIndex, automated evaluation scoring |
| 163 | + Faithfulness, Relevancy, and Correctness. |
| 164 | + </p> |
| 165 | + <p> |
| 166 | + We built both because we really wanted to understand the underlying mechanisms before building heavier tools |
| 167 | + on top of them. |
| 168 | + </p> |
| 169 | + |
| 170 | + <H2>Figuring Out the Boundaries</H2> |
| 171 | + <p> |
| 172 | + Security stays deterministic. Wallet interactions, transaction signing, and key management require hard |
| 173 | + boundaries. An agent making onchain transactions autonomously is an attack surface. That problem isn't |
| 174 | + solved yet. |
| 175 | + </p> |
| 176 | + <p> |
| 177 | + But <strong className="text-white font-semibold">code review</strong> is a perfect fit for AI judgment. |
| 178 | + </p> |
| 179 | + <p> |
| 180 | + Take{" "} |
| 181 | + <a |
| 182 | + href="https://github.com/technophile-04/grumpy-carlos-personality-fetcher" |
| 183 | + target="_blank" |
| 184 | + rel="noopener noreferrer" |
| 185 | + className="link link-primary" |
| 186 | + > |
| 187 | + Grumpy Carlos |
| 188 | + </a> |
| 189 | + : a Claude Code subagent with a review personality inferred from scraped BuidlGuidl PR history. Drop it in{" "} |
| 190 | + <code className={codeCls}>.claude/agents/</code>, ask for a review, and it responds exactly the way Carlos |
| 191 | + would: specific, strict, no vague feedback. |
| 192 | + </p> |
| 193 | + <p> |
| 194 | + The right context, structured for an AI to use, produces better output than general AI applied to problems |
| 195 | + without context. |
| 196 | + </p> |
| 197 | + |
| 198 | + <H2>The Compounding Effect</H2> |
| 199 | + <p> |
| 200 | + To us, this is what going “AI-first” actually looks like in practice. It's not just |
| 201 | + dropping a Copilot plugin into Scaffold-ETH. It's a stack where every layer—the framework, the docs, |
| 202 | + the extensions, the curriculum—is structured to be used by an agent, not just tolerated by one. |
| 203 | + </p> |
| 204 | + <p> |
| 205 | + An agent building with SE-2 understands the stack. An agent teaching on Speedrun Ethereum understands the |
| 206 | + challenge. With <code className={codeCls}>/add-extension</code> the agent can install new capabilities |
| 207 | + without leaving the conversation. |
| 208 | + </p> |
| 209 | + <p> |
| 210 | + <strong className="text-white font-semibold">Next up:</strong> an open-source plugin that packages all of |
| 211 | + this into one installable toolkit for Claude Code, OpenCode, and Cursor. |
| 212 | + </p> |
| 213 | + |
| 214 | + <H2>Try It Today</H2> |
| 215 | + <p>The PRs are open and the code is live. If you're building at the intersection of AI and Ethereum:</p> |
| 216 | + <ol className="mt-4 space-y-3 list-none"> |
| 217 | + {[ |
| 218 | + <> |
| 219 | + <strong className="text-white font-semibold">Start with raked:</strong>{" "} |
| 220 | + <a |
| 221 | + href="https://github.com/BuidlGuidl/raked" |
| 222 | + target="_blank" |
| 223 | + rel="noopener noreferrer" |
| 224 | + className="link link-primary" |
| 225 | + > |
| 226 | + Read the agent loop. |
| 227 | + </a>{" "} |
| 228 | + Understand what a tool call actually is before building on top of abstractions. |
| 229 | + </>, |
| 230 | + <> |
| 231 | + <strong className="text-white font-semibold">Look at Scaffold-ETH 2:</strong>{" "} |
| 232 | + <a |
| 233 | + href="https://github.com/scaffold-eth/scaffold-eth-2" |
| 234 | + target="_blank" |
| 235 | + rel="noopener noreferrer" |
| 236 | + className="link link-primary" |
| 237 | + > |
| 238 | + See the AGENTS.md and /add-extension skills in progress. |
| 239 | + </a>{" "} |
| 240 | + Build your first Dapp with it and your favourite agent. |
| 241 | + </>, |
| 242 | + <> |
| 243 | + <strong className="text-white font-semibold">Try the AI challenges:</strong> Available on{" "} |
| 244 | + <a |
| 245 | + href="https://speedrunethereum.com" |
| 246 | + target="_blank" |
| 247 | + rel="noopener noreferrer" |
| 248 | + className="link link-primary" |
| 249 | + > |
| 250 | + Speedrun Ethereum |
| 251 | + </a>{" "} |
| 252 | + as they ship. |
| 253 | + </>, |
| 254 | + ].map((item, i) => ( |
| 255 | + <li key={i} className="flex items-start gap-3"> |
| 256 | + <span className="text-primary-content/40 font-mono shrink-0 mt-0.5">—</span> |
| 257 | + <span>{item}</span> |
| 258 | + </li> |
| 259 | + ))} |
| 260 | + </ol> |
| 261 | + </div> |
| 262 | + |
| 263 | + {/* Footer */} |
| 264 | + <div className="mt-16 pt-6 border-t border-white/10 font-mono text-sm text-white/35"> |
| 265 | + <p> |
| 266 | + Questions or want to build together?{" "} |
| 267 | + <a href="mailto:sandgarden@buidlguidl.com" className="link link-primary"> |
| 268 | + sandgarden@buidlguidl.com |
| 269 | + </a> |
| 270 | + </p> |
| 271 | + </div> |
| 272 | + </article> |
| 273 | + </> |
| 274 | + ); |
| 275 | +}; |
| 276 | + |
| 277 | +export default AiNativeEthereumStack; |
0 commit comments