The vacation your codebase deserves. Stop swimming in configuration files. Start surfing your dream product.
Honolulu is a high-octane, Bun-fueled engine designed to launch your next product fast.
Create a new project:
bun create honoluluThe CLI will guide you through:
- Architecture: Opinionated (batteries-included) or Clean Slate
- Styling: Tailwind CSS, Shadcn UI, or Classic CSS
- Database: PostgreSQL, MySQL, SQLite, or Supabase
- Auth: Supabase, Clerk, Auth.js, or None
- API: Basic Logger or OpenAPI + Scalar
Or clone this template:
bun install
bun run dev- 🌺 Web:
http://localhost:5173 - ⚡ API:
http://localhost:3000
| Layer | Technology |
|---|---|
| Runtime | Bun |
| Backend | Hono + Pino |
| Database | Drizzle ORM + Supabase |
| Frontend | React + Vite (SWC) |
| Styling | Tailwind CSS v4 |
| State | Zustand + TanStack Query |
| Validation | Valibot |
| Testing | Vitest |
├── api/ # Hono backend
│ └── src/
│ ├── routes/ # Route modules
│ └── db/ # Drizzle schema & connection
├── web/ # React frontend
│ └── src/
│ ├── components/
│ └── lib/ # Stores, utils, query client
├── shared/ # Shared types & schemas
└── .github/ # CI/CD workflows
This template is flexible by design. For medium-to-large projects, we recommend the following patterns:
Based on Hono Best Practices:
-
Modular Routing — Use
app.route()to split routes into separate files:// api/src/routes/users.ts import { Hono } from 'hono' const app = new Hono() app.get('/', (c) => c.json({ users: [] })) export default app // api/src/index.ts import users from './routes/users' app.route('/users', users)
-
Avoid Controllers — Write handlers inline for type inference. Use
factory.createHandlers()if you need reusable handlers. -
Validation First — Use Valibot with
@hono/valibot-validatorat the route level. -
Service Layer — For complex logic, extract to
/serviceswith pure functions.
-
Feature-Based Structure:
src/ ├── features/ │ ├── auth/ │ │ ├── components/ │ │ ├── hooks/ │ │ └── api.ts │ └── dashboard/ ├── components/ # Shared UI └── lib/ # Utils, stores -
Server State = TanStack Query — For API data.
-
Client State = Zustand — For UI state.
-
Colocation — Keep related code together.
- Use RPC-style with Hono's type-safe client (
hc) for internal APIs. - Use REST for public-facing APIs.
- Share types via
shared/package.
This project uses Dependabot for automatic weekly dependency updates. PRs are created automatically when updates are available.
| Command | Description |
|---|---|
bun run dev |
Start all dev servers |
bun run build |
Build all packages |
bun run lint |
Lint with Biome |
bun run test |
Run Vitest |
bun run format |
Format code |
MIT. Build something cool.