Hono + Inertia + React Setup — Bun / Vite / TypeScript Bootstrapped in 30 Minutes [2026]
A 30-minute setup guide for a minimum Hono + Inertia + React app on Bun + Vite + TypeScript. Covers the directory layout, Hono server + Inertia adapter, React + Vite client, hot reload, and first page render — with concrete commands.
What you'll have in 30 minutes
End state for this guide: - A Hono server running on Bun - React rendered through the Inertia adapter - Vite hot-reloading TypeScript + React - A browser showing "Hello, Inertia" on first load Later parts of this series cover CRUD, auth, and deployment.
Prerequisites
- Node.js 20+ or Bun 1.0+ (this guide uses Bun) - Package manager: Bun (the `bun` command) - Editor: VS Code with TypeScript / ESLint / Tailwind extensions - A browser Install Bun: `curl -fsSL https://bun.sh/install | bash`.
Directory layout
A simple monorepo-ish layout is the most ergonomic.
my-app/
├─ server/ ← Hono app
│ ├─ index.ts ← entry
│ ├─ routes/ ← route definitions
│ └─ inertia.ts ← Inertia adapter init
├─ client/ ← React app
│ ├─ main.tsx ← createInertiaApp
│ └─ pages/ ← Inertia-resolved page components
├─ vite.config.ts
├─ tsconfig.json
└─ package.jsonWhen scaling, split into `apps/server` and `apps/web` under Turborepo / pnpm workspaces.
Step 1: bootstrap the project
In your terminal:
mkdir my-app && cd my-app
bun init -y
bun add hono @hono/vite-build @hono/vite-dev-server
bun add @inertiajs/react @inertiajs/server
bun add react react-dom
bun add -d typescript @types/react @types/react-dom @vitejs/plugin-react viteThis pulls in Hono, Inertia, React, and dev tooling.
Step 2: Vite config
Enable the React plugin in `vite.config.ts` and use the Hono dev server during development. Refer to Hono's official Vite integration and Inertia.js's React client-side setup and adapt to your project. If you use Tailwind CSS, the `@tailwindcss/vite` plugin is the 2026 default.
Step 3: Hono server + Inertia adapter
What `server/index.ts` does: 1. Create a Hono instance 2. Register the Inertia adapter as middleware (shared props, route helpers) 3. Define routes (e.g., `/` → return an Inertia response for page `Home`) 4. Start the server (`Bun.serve` on Bun, `@hono/node-server` on Node, `export default app` on Workers) A mental model: `c.inertia('Home', { title: 'Hello' })` returns a page name plus shared props. Verify exact APIs against the version of the adapter library you install.
Step 4: React side — createInertiaApp
In `client/main.tsx` call Inertia's `createInertiaApp`: - `resolve`: function to resolve page names to `pages/{name}.tsx` - `setup`: mount with `ReactDOM.createRoot` - `progress`: configure the navigation progress bar In `client/pages/Home.tsx` write a normal React component and use `usePage()` to access props from the Hono side. For your first page, returning `<h1>{props.title}</h1>` is enough.
Step 5: verify
Run `bun run dev` and open `http://localhost:3000`: - The initial GET serves complete HTML (depending on SSR/CSR setup) - Subsequent link clicks use XHR + JSON for SPA-like navigation - Editing React components hot-reloads via Vite HMR With this in place you have the foundation for the CRUD / auth / deployment chapters that follow.
Common gotchas
- `pages/` resolution mismatch: if the `resolve` glob doesn't match the actual file layout, you'll see `Page not found`. - Bloated shared props: Inertia shared props travel to every page. Keep shared props small — user info, flash messages, csrf, etc. - CSRF / session cookies: Inertia requests must carry a CSRF token. Wire that up in middleware. - Strict TypeScript page-prop types: `usePage<{ title: string }>()` saves you from drift in later chapters.
Next up — forms and CRUD
Part 3 covers forms and CRUD patterns with Drizzle / Zod / useForm. For the series overview see Part 1.
FAQ
Q1: I want Node, not Bun. A: Install `@hono/node-server` and switch the start to `serve(app)`. The application code is unchanged. Q2: How do I dev locally on Cloudflare Workers? A: Use `wrangler dev`. Hono runs natively on Workers — no extra config required. Q3: Can I skip Vite? A: Possible, but Vite's HMR for React + TS is hard to beat in 2026. Stick with it. Q4: When should I split into a monorepo? A: Once 3+ shared types / validators / utilities show up between server and client, that's the threshold.
References
Feel free to contact us
Contact Us