A full-stack blockchain application template: bun + foundry + hono + nextjs + ponder + drizzle
# Create a new project from this template
gh repo create my-app --template calebguy/vono
cd my-app
bun install
bun dev| Layer | Technology | Purpose |
|---|---|---|
| Runtime | Bun | Fast JavaScript runtime and package manager |
| Frontend | Next.js 16 + React 19 | App router, server components, Tailwind CSS 4 |
| Backend API | Hono | Lightweight, type-safe HTTP framework |
| Database | PostgreSQL + Drizzle ORM | Type-safe database queries and migrations |
| Blockchain Indexing | Ponder | Index and query on-chain data via GraphQL/SQL |
| Smart Contracts | Foundry (Solidity) | Forge, Cast, Anvil for contract development |
vono/
├── packages/
│ ├── web/ # Next.js frontend (port 3000)
│ ├── server/ # Hono API backend (port 3001)
│ ├── db/ # Drizzle ORM + PostgreSQL schemas
│ ├── ponder/ # Blockchain indexer
│ └── chain/ # Foundry smart contracts
├── package.json # Workspace root
└── docker-compose.yml
- Next.js 16 with App Router
- React 19 with TanStack Query for data fetching
- Tailwind CSS 4 for styling
- Type-safe API client via Hono RPC
- Hono framework on Bun runtime
- CORS enabled, base path
/api - Exports types for frontend type safety
- Drizzle ORM with PostgreSQL
- Docker Compose for local PostgreSQL
- Migration system via Drizzle Kit
- Commands:
bun --filter db dev,bun --filter db migrate
- Indexes Ethereum mainnet events
- Exposes GraphQL at
/graphqland SQL at/sql/* - Configure contracts in
ponder.config.ts - Define schemas in
ponder.schema.ts
- Foundry for Solidity development
forge build- compile contractsforge test- run testsanvil- local Ethereum node
# Development (runs all packages)
bun dev
# Individual packages
bun --filter web dev # Frontend
bun --filter server dev # Backend API
bun --filter db dev # Start PostgreSQL + migrate
bun --filter ponder dev # Blockchain indexer
# Database
bun --filter db migrate # Run migrations
bun --filter db gen-migration # Generate migration
# Smart Contracts
cd packages/chain
forge build # Compile
forge test # Test
anvil # Local node# Database (packages/db)
DATABASE_URL=postgresql://db:db@localhost:5432/db
# Ponder (packages/ponder)
PONDER_RPC_URL_1=https://eth-mainnet.g.alchemy.com/v2/YOUR_KEYIncludes Docker and Render.yaml configuration:
- Multi-stage Dockerfile with Bun
- Render free tier deployment ready
- Create contract in
packages/chain/src/ - Add ABI to
packages/ponder/abis/ - Configure in
packages/ponder/ponder.config.ts - Define indexed tables in
packages/ponder/ponder.schema.ts - Write indexing handlers in
packages/ponder/src/
- Edit
packages/server/src/index.ts - Add route:
api.get("/endpoint", (c) => c.json({ data })) - Frontend auto-inherits types via
Apiexport
import { hc } from "hono/client";
import type { Api } from "server";
const client = hc<Api>("/api");
const res = await client.index.$get();
const data = await res.json();import { db } from "db";
import { users } from "db/schema";
const allUsers = await db.select().from(users);- Repository: https://github.com/calebguy/vono
- Create from template: https://github.com/new?template_name=vono&template_owner=calebguy