Hono Monorepo Project Structure
Multiple Workers sharing packages. Ideal for edge microservices and platform APIs.
Project Directory
myproject/
apps/
Individual Workers
api/
Main API Worker
src/
index.ts
routes/
wrangler.toml
package.json
auth/
Auth Worker
src/
index.ts
wrangler.toml
package.json
webhook/
Webhook handler Worker
src/
index.ts
wrangler.toml
package.json
packages/
Shared code
shared/
Common utilities
src/
index.ts
middleware/
Shared middleware
schemas/
Shared Zod schemas
types/
package.json
tsconfig.json
db/
Database package
src/
index.ts
schema.ts
Drizzle schema
package.json
turbo.json
Turborepo config
package.json
Workspace root
pnpm-workspace.yaml
tsconfig.json
Base TypeScript config
.gitignore
Why This Structure?
Multiple Hono Workers sharing code via internal packages. Each Worker deploys independently to its own route or subdomain. Turborepo caches builds. Share middleware, schemas, and database code without duplication.
Key Directories
- apps/-Each folder is a deployable Cloudflare Worker
- packages/shared/-Middleware, types, and utilities used by all Workers
- packages/db/-Drizzle schema and database utilities
- turbo.json-Build pipeline and caching configuration
Worker Using Shared Packages
// apps/api/src/index.ts
import { Hono } from 'hono'
import { logger, errorHandler } from '@myproject/shared'
import { db } from '@myproject/db'
const app = new Hono()
app.use('*', logger())
app.onError(errorHandler)
app.get('/users', async (c) => {
const users = await db.query.users.findMany()
return c.json(users)
})
export default app
Getting Started
pnpm create turbo@latest- Add Hono to each app in
apps/ - Create shared packages in
packages/ pnpm installpnpm devto run all Workers
When To Use This
- Platform with multiple APIs or subdomains
- Microservices on Cloudflare Workers
- Shared business logic across services
- Teams owning separate Workers
- Gradual migration from monolith
Trade-offs
- Complexity-Monorepo tooling adds cognitive overhead
- Build coordination-Package changes affect downstream Workers
- Local dev-Running multiple Workers locally needs setup
Best Practices
- Use
@myproject/namespace for internal packages - Keep Workers focused—split by domain, not size
- Share Zod schemas between Workers for RPC validation
- Use Cloudflare Service Bindings for Worker-to-Worker calls
- Pin shared package versions during active development
Naming Conventions
- Apps-Named by domain:
api,auth,webhook - Packages-Named by purpose:
shared,db,email - Internal imports-
@myproject/{package}namespace