Skip to content

Commit 6a906c3

Browse files
Pabl0ckscarletex
andauthored
Update homepage and add AI-Native Ethereum Stack blog post (#27)
Co-authored-by: Carlos Sánchez <oceanrdn@gmail.com>
1 parent b090672 commit 6a906c3

File tree

12 files changed

+1846
-141
lines changed

12 files changed

+1846
-141
lines changed

packages/nextjs/components/Menu.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ export const Menu = () => {
2525
Projects
2626
</Link>
2727
</li>
28-
<li>
29-
<Link href="/faq" className={`${asPath === "/faq" ? "" : "link"} link-primary underline-offset-2`}>
30-
F.A.Q.
31-
</Link>
32-
</li>
3328
<li>
3429
<Link href="/2025" className={`${asPath === "/2025" ? "" : "link"} link-primary underline-offset-2`}>
3530
2025 Recap
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
---
2+
title: "Shifting to an AI-Native Ethereum Developer Stack"
3+
date: "February 2026"
4+
description: "How we're restructuring our Ethereum developer stack: Scaffold-ETH 2 and Speedrun Ethereum to be AI native."
5+
---
6+
7+
For years, we've been building our dev tools and learning materials primarily for humans: docs explained what our toolkit did, we created videos, we taught developers with guided and hands-on experiences.
8+
9+
The reality now is that an AI agent is almost always present across the whole development and learning loop. So instead of asking "how do we add AI to our tools," we asked ourselves: what would our stack look like if we treated the AI as a primary user alongside the developer?
10+
11+
And if the AI truly understands the stack, a new question opens up: what if the person on the other side isn't a developer at all? What if they are someone with a vision and the ability to direct an agent, but not necessarily with a technical background?
12+
13+
For us, that meant rethinking some of our core primitives rather than just patching on new features. Thinking about builders and not just developers. We've been doing exactly that across our dev toolkit ([Scaffold-ETH 2](https://github.com/scaffold-eth/scaffold-eth-2)) and our Solidity curriculum ([Speedrun Ethereum](https://speedrunethereum.com)).
14+
15+
## Making Scaffold-ETH Agent-Ready
16+
17+
Here are the three biggest changes we've made so far.
18+
19+
### Agent-first docs
20+
21+
We noticed in early 2025 that the main consumer of our docs was already an agent loading context before writing code. So we shipped `llms-full.txt`: the entire SE-2 documentation as a single flat file. It's the exact same information, just formatted for how an AI actually consumes it.
22+
23+
We added Cursor rules to Scaffold-ETH 2 as an early way to give agents project context. But we quickly realized their limitations, replacing them with `AGENTS.md`, which is picked up by Claude Code, Cursor, Windsurf, and any other agent harness. **One file, every tool.** Every conversation starts with all the context it needs.
24+
25+
### Skills over scripts
26+
27+
We've started stripping out custom scripts wherever we find that a model just naturally handles the task better.
28+
29+
**/add-extension** Adding a Scaffold-ETH extension used to mean resolving `package.json` conflicts through hundreds of lines of template processing code. We replaced it with `/add-extension`, a simple agent skill built to work across different harnesses. `Node.js` handles the deterministic operations (fetching, copying), while the AI handles the judgment calls (merging).
30+
31+
**/pr-create** Writing a good PR is key when you are working asynchronously with a team. This file tells an agent how to inspect the diff, create a good PR body (summary, how to Test, things to look out for, etc.), and open it via `gh`.
32+
33+
The same pattern extends to Ethereum protocol knowledge. SE-2 now has a growing library of domain skills: `erc-20`, `erc-721`, `eip-5792`, `eip-712`, `siwe`, `ponder`, `solidity-security`, `defi-protocol-templates`. Each one is a focused context file the agent loads before implementing the functionality.
34+
35+
### AI-assisted code review
36+
37+
Code review is a perfect fit for "AI as a judge".
38+
39+
Take [Grumpy Carlos](https://github.com/scaffold-eth/scaffold-eth-2/blob/main/.agents/agents/grumpy-carlos-code-reviewer.md): a subagent with a personality inferred from [scraped BuidlGuidl PR history](https://github.com/technophile-04/grumpy-carlos-personality-fetcher). Ask for a review, and it responds exactly the way Carlos would: thorough, strict, with actionable feedback, and yes, occasionally grumpy.
40+
41+
> Human review is still critical for us, but AI review is a great first pass.
42+
43+
## Rethinking How We Teach
44+
45+
Speedrun Ethereum is how most developers get started building on Ethereum. With AI in the loop, we're making that experience accessible to all levels, not just developers (i.e. Builders).
46+
47+
**Per-challenge context files.** Each challenge gets an `AGENTS.md` detailing the challenge overview, gotchas, smart contract structure, and frontend architecture. When a learner opens a challenge in their IDE, the agent already knows the environment.
48+
49+
**AI Teacher Mode.** Type `/start` in the directory and an agent walks you through it. It asks questions, checks your understanding, guides you without giving the answer away, and reviews your code at your pace.
50+
51+
We're also shipping `/build-prompts`: curated build ideas that you copy one into your agent, get a working demo, then tweak it and make it yours.
52+
53+
> Going from idea to working dapp has never been easier.
54+
55+
## The Research Layer
56+
57+
The AI space is moving fast and there's a lot of noise. We are focusing on understanding the primitives of AI engineering and adapt to whatever comes next.
58+
59+
**[raked](https://github.com/BuidlGuidl/raked)** is a minimal TypeScript agent built for exactly this: the agent loop, sessions, memory, tools, skills. It's under 100 lines for the core. Built to be read, understood, and extended to solve your specific use cases.
60+
61+
**[Experimental RAG pipeline](https://github.com/BuidlGuidl/arbitrum-dashboard/pull/19)** on Arbitrum DAO governance data. Lets an agent pull relevant data before answering. We built this to understand how retrieval and evaluation actually work.
62+
63+
## Give it a try
64+
65+
We're iterating on all of this in the open. Check the code, the PRs, and try it yourself:
66+
67+
- **Create your own agent with raked:** [Read the agent loop.](https://github.com/BuidlGuidl/raked) Understand how tools, skills and sessions work. Then, build your own agent on top of it.
68+
- **Build your first onchain app with Scaffold-ETH 2:** [Check out all the available skills](https://github.com/scaffold-eth/scaffold-eth-2). Install it, open it with your favourite agent, and start building.
69+
- **Try SpeedRun Ethereum challenges with AI assistance:** Available on [Speedrun Ethereum](https://speedrunethereum.com) as they ship.

packages/nextjs/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
"@uniswap/sdk": "^3.0.3",
2222
"daisyui": "^2.31.0",
2323
"ethers": "^5.0.0",
24+
"gray-matter": "^4.0.3",
2425
"luxon": "^3.3.0",
2526
"next": "^13.4.1",
27+
"next-mdx-remote": "^6.0.0",
2628
"nextjs-progressbar": "^0.0.16",
2729
"react": "^18.2.0",
2830
"react-blockies": "^1.4.1",
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import Head from "next/head";
2+
import type { GetStaticPaths, GetStaticProps, NextPage } from "next";
3+
import { MDXRemote, MDXRemoteSerializeResult } from "next-mdx-remote";
4+
import { serialize } from "next-mdx-remote/serialize";
5+
import { BlogMeta, getAllBlogSlugs, getBlogBySlug } from "~~/services/blog";
6+
7+
const codeCls = "bg-white/5 text-primary-content px-1 py-0.5 rounded text-[0.85em] font-mono";
8+
9+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10+
const components: Record<string, any> = {
11+
h2: ({ children }: { children?: React.ReactNode }) => (
12+
<h2 className="text-secondary font-bold text-lg sm:text-xl mt-10 mb-1">{children}</h2>
13+
),
14+
h3: ({ children }: { children?: React.ReactNode }) => (
15+
<h3 className="text-white/90 font-semibold text-base sm:text-lg mt-8 mb-1">{children}</h3>
16+
),
17+
blockquote: ({ children }: { children?: React.ReactNode }) => (
18+
<blockquote className="border-l-2 border-secondary/40 pl-4 py-1 my-4 bg-white/[0.03] rounded-r text-white/50 italic">
19+
{children}
20+
</blockquote>
21+
),
22+
a: ({ href, children }: { href?: string; children?: React.ReactNode }) => {
23+
const isExternal = href?.startsWith("http");
24+
return (
25+
<a
26+
href={href}
27+
className="link link-primary"
28+
{...(isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {})}
29+
>
30+
{children}
31+
</a>
32+
);
33+
},
34+
code: ({ children }: { children?: React.ReactNode }) => <code className={codeCls}>{children}</code>,
35+
strong: ({ children }: { children?: React.ReactNode }) => (
36+
<strong className="text-white font-semibold">{children}</strong>
37+
),
38+
ul: ({ children }: { children?: React.ReactNode }) => <ul className="mt-4 space-y-3 list-none">{children}</ul>,
39+
li: ({ children }: { children?: React.ReactNode }) => (
40+
<li className="flex items-start gap-3">
41+
<span className="text-primary-content/40 font-mono shrink-0 mt-0.5"></span>
42+
<span>{children}</span>
43+
</li>
44+
),
45+
};
46+
47+
interface Props {
48+
source: MDXRemoteSerializeResult;
49+
meta: BlogMeta;
50+
}
51+
52+
const BlogPost: NextPage<Props> = ({ source, meta }) => {
53+
return (
54+
<>
55+
<Head>
56+
<title>{meta.title} — Sand Garden</title>
57+
<meta name="description" content={meta.description} />
58+
</Head>
59+
60+
<article className="max-w-3xl px-4 py-8">
61+
<header className="mb-10">
62+
<div className="flex items-center gap-3 mb-4 font-mono text-sm text-white/35">
63+
<span>{meta.date}</span>
64+
</div>
65+
<h1 className="text-3xl sm:text-4xl font-bold leading-tight text-white">{meta.title}</h1>
66+
</header>
67+
68+
<div className="space-y-5 text-white/70 leading-relaxed text-sm sm:text-base mb-10">
69+
<MDXRemote {...source} components={components} />
70+
</div>
71+
</article>
72+
</>
73+
);
74+
};
75+
76+
export const getStaticPaths: GetStaticPaths = async () => {
77+
const slugs = getAllBlogSlugs();
78+
return {
79+
paths: slugs.map(slug => ({ params: { slug } })),
80+
fallback: false,
81+
};
82+
};
83+
84+
export const getStaticProps: GetStaticProps<Props> = async ({ params }) => {
85+
const slug = params?.slug as string;
86+
const { meta, content } = getBlogBySlug(slug);
87+
const source = await serialize(content);
88+
return { props: { source, meta } };
89+
};
90+
91+
export default BlogPost;

packages/nextjs/pages/faq.tsx

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)