React + Vite + Hono + Tailwind + Cloudflare Workers
src/web/— React frontend: pages, components, styles, hookssrc/api/— Hono API server (/api/*), database schema and migrationspublic/— Static assets (favicon, og-image, logo)
# Install dependencies
bun install
# Generate types and run migrations
bun cf-typegen
bun db:generate
bun db:migrate
# Start dev server
bun devAdd components you need, customize them however you want.
bun x shadcn@latest add button card dialogComponents land in src/web/components/ui/, import with @/components/ui/button.
import { Button } from "@/components/ui/button"
<Button variant="outline">Click me</Button>Client-side routing uses wouter. Add routes in src/web/app.tsx:
import { Route, Switch } from "wouter";
<Switch>
<Route path="/" component={Home} />
<Route path="/about" component={About} />
</Switch>Uses Drizzle ORM with Cloudflare D1.
bun db:generate # Generate migrations from schema
bun db:migrate # Apply migrations locallySchema is in src/api/database/schema.ts, migrations in src/api/migrations/.
Backend uses Hono on Cloudflare Workers. All routes are under /api/* in src/api/index.ts.
app.get('/api/hello', (c) => c.json({ message: 'Hello' }));website.config.json contains the site name, description, and URL — use it as the source of truth for site-wide values.
CRITICAL: This project uses Tailwind CSS v4. No tailwind.config.js, no postcss.config.js, no @tailwind directives. All configuration is CSS-first via @theme in src/web/styles.css and the @tailwindcss/vite plugin. Do NOT use Tailwind v3 syntax.
IMPORTANT: Don't assume how a package works from memory. Run bun build to catch type errors. If anything fails, check the package docs.