Interactive, browser-based labs that teach Ethereum, the EVM, and Solidity by doing. You build real contracts, compile, deploy, and wire them with an UI. All in the browser, with an AI tutor that grades your answers and coaches you the Socratic way.
The first lab, Ethereum 101, takes you from "what is Ethereum" to writing, deploying, and using your own crowdfunding contract.
Built on Scaffold-ETH 2.
- Node (>= v22.12)
- Docker (for the local database)
- Yarn (v1 or v2+)
- Git
- An OpenRouter API key that powers the AI grader
- Google and GitHub OAuth apps for sign-in (see OAuth credentials). Wallet sign-in needs no credentials, only the database schema from
yarn drizzle-kit migrate.
-
Install dependencies:
yarn install -
Copy the env template:
cp packages/nextjs/.env.example packages/nextjs/.env.localSet
OPENROUTER_API_KEY,BETTER_AUTH_SECRET( you can useopenssl rand -base64 32) and the four OAuth vars from the section below.DATABASE_URLandBETTER_AUTH_URLalready point at localhost in the committed.env.development. -
Start Postgres, apply the migrations and seed it:
docker compose up -d yarn drizzle-kit migrate yarn db:seed -
Start the app:
yarn start
Open http://localhost:3000 and pick a lab. Labs compile and deploy contracts in the browser, so you don't need to run a local chain. yarn drizzle-kit studio opens a browser view of the database.
Sign-in with Google, GitHub and an Ethereum wallet is handled by Better Auth. The wallet option uses Sign-In with Ethereum through Better Auth's siwe plugin and works out of the box.
Each OAuth provider needs an app that points back at http://localhost:3000.
GitHub: Settings → Developer settings → OAuth Apps → New OAuth App.
- Homepage URL
http://localhost:3000, callback URLhttp://localhost:3000/api/auth/callback/github. - Copy client ID and client secret, put them as
GITHUB_CLIENT_IDandGITHUB_CLIENT_SECRET.
Google: Google Cloud Console → APIs & Services → Credentials → Create credentials → OAuth client ID, type "Web application".
- Add
http://localhost:3000under authorized JavaScript origins andhttp://localhost:3000/api/auth/callback/googleunder authorized redirect URIs. - If the project has no consent screen yet, Google asks you to set one up first (External, add your own email as a test user).
- Client ID and secret as
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRET.
Drizzle + Postgres: schemas in packages/nextjs/services/database/config/, queries in repositories/. Run drizzle-kit from the root with yarn drizzle-kit.
- Our tables live in
schema.ts. After editing the schema, runyarn drizzle-kit generate, thenyarn drizzle-kit migrate. Commit the migration files. auth-schema.tsis generated frompackages/nextjs/lib/auth.tsbyyarn workspace @se-2/nextjs auth:generate.yarn db:seedinserts one user and one lab progress row; it refuses to run against anything but localhost.
Vercel applies migrations at the end of each build. Preview builds use their own Neon database copy; builds on main use production.