---
title: "@hono/inertia or popweb?"
description: "@hono/inertia is an Inertia adapter for Hono; popweb is a framework built on both. What each does, the Inertia features each supports, and which to use."
url: "https://web.popcomputer.com/hono-inertia"
updated: "2026-10-30"
---

# @hono/inertia or popweb?

@hono/inertia is an adapter: Hono middleware that speaks Inertia’s protocol and leaves the rest of the app to you. popweb, @popcomputer/web, is a framework built on Hono and Inertia for Cloudflare Workers, which adds the app around the protocol: sign-in, validation, route model binding, the database, guards and a page cache. @hono/inertia is ahead on Inertia’s newer props, such as deferred, merge and infinite-scroll props. popweb is ahead on forms, history encryption and everything outside the protocol.

## An adapter, or the app around it

With @hono/inertia you write a Hono app as you would anyway, add the middleware, and answer each route with c.render, a page’s name and its props. Which sign-in, validation, database and permission checks to use is yours to choose and wire together.

With popweb those choices are made. Each route runs an action, an Effect program that loads the records its route names, checks the form against its schema, writes through Drizzle and renders a page. The framework settles who may load which record, what a failed form does and what may be cached, the same way on every route.

## What @hono/inertia does, and where it’s ahead

As of 0.8.1, from its [README](https://github.com/honojs/middleware/tree/main/packages/inertia) and [source](https://github.com/honojs/middleware/blob/main/packages/inertia/src/index.ts):

- The protocol’s core: an HTML page on the first visit, JSON page objects after it, and a 409 when the client’s assets are out of date. A route also answers plain JSON when the request asks for it.
- Lazy props: a function prop runs only when a partial reload asks for it. In popweb an action works out every prop before it renders, and a partial reload sends only those asked for.
- Deferred props, in groups, which the page fetches after it first shows. popweb has none.
- Merge, prepend and deep-merge props, matched on a field, and infinite scroll built on them. popweb has none of these either.
- Shared props from a share callback, with their keys in the page object, which Inertia’s client uses for instant visits.
- Types without a schema: its Vite plugin turns a misspelt page name into a compile error, and infers each page’s props from the route that renders it.
- React, Vue or Svelte, on any runtime Hono runs on. popweb is React only, and built for Cloudflare Workers.

## What popweb adds, and where it’s ahead

As of 1.8.0, from its [docs](https://github.com/PatrickOgilvie/popcomputer-web/tree/main/docs) and source:

- Failed forms: a form that fails validation goes back to its page with a 303 and each field’s error, under its error bag when the form names one. With @hono/inertia, errors are a prop you set yourself.
- Flash data, in Inertia 3’s page flash field, for messages such as “Project saved.”
- History encryption: pages rendered to a signed-in visitor are encrypted in the browser’s history, and the first page after sign-out clears it, so the next person at that browser can’t press Back through them.
- Redirects to another site, such as a payment page or a sign-in provider, answered with the 409 Inertia asks for, so the browser loads them in full.
- Typed pages from Effect Schema: each page’s props are declared once, checked when an action renders the page, and used to type its React component.
- The app around the protocol: Better Auth sign-in, validation with Effect Schema, route model binding that loads only the records a visitor may see, Drizzle on D1 or Postgres, guards and roles, a page cache at Cloudflare’s edge, and background, queued and scheduled work.
- Safe defaults: requests forged by other sites refused, security headers sent, and a page meant for one visitor kept out of shared caches. [How the security works](/security) has the rest.

## What neither does

Neither renders React pages on the server. Each sends an HTML page holding the page object and an empty element, and React draws the page in the browser. Both let you write that HTML yourself, through @hono/inertia’s rootView or popweb’s render template, so you can put a page’s words in it, as this site does. Behind sign-in, where search engines don’t look, it rarely matters.

Neither has once props, optional props, rescued deferred props, fragment redirects or Precognition. Inertia’s always props are missing too, except that popweb always sends errors.

## Which to use

- Use @hono/inertia if you already have a Hono app, want Vue or Svelte, run somewhere other than Workers, want deferred, merge or infinite-scroll props today, or would rather choose sign-in, validation and the database yourself.
- Use popweb if you’re building a whole app on Cloudflare Workers and want those choices made: sign-in, forms that fail safely, records only their owners can load, history cleared at sign-out, and checks your AI runs before every commit.
- Use neither if public pages must be rendered on the server. [Inertia without Laravel](/inertia-without-laravel) lists the TypeScript options that do.

## Inertia.js with Hono, either way

Both run on Hono. popweb’s setupWeb takes a Hono app, installs its middleware and error handling, and returns the app with its routes. A plain Hono handler can still render a page, through c.var.web, and [Lower-level composition](https://github.com/PatrickOgilvie/popcomputer-web/blob/main/docs/lower-level.md) shows the middleware on its own.

popweb doesn’t use @hono/inertia. It has its own Inertia middleware, and its docs don’t cover running the two in one app. Moving from one to the other changes how each route renders, c.render in @hono/inertia and render in a popweb action, while React pages keep using @inertiajs/react.

## Which Inertia features popweb supports

popweb 1.8.0 speaks Inertia 3 to Inertia’s React client: it’s developed against @inertiajs/core and @inertiajs/react 3.9.1. [Pages and props](https://github.com/PatrickOgilvie/popcomputer-web/blob/main/docs/pages.md) and [Forms](https://github.com/PatrickOgilvie/popcomputer-web/blob/main/docs/forms.md) document the details. For anyone comparing adapters, as [Inertia’s list of community adapters](https://inertiajs.com/docs/v3/installation/community-adapters) does, here is what it supports:

- The first visit: an HTML document with the page object in a script element, escaped so a prop can’t close it.
- Inertia visits: the page object as JSON, varying on X-Inertia.
- Asset versioning: a GET from a client on an old version gets a 409 with X-Inertia-Location, and the client reloads.
- Partial reloads: only and except, through the X-Inertia-Partial headers. The errors prop is always sent.
- Shared data: props every page shows, declared once and computed when a page renders.
- Validation errors in the errors prop, after a 303 back to the form’s page.
- Error bags, named by X-Inertia-Error-Bag.
- Flash data, in the page object’s flash field.
- History encryption and clearing, through encryptHistory and clearHistory: signed-in pages are encrypted by default, and history is cleared when a session ends.
- Redirects: a 302 after POST, PUT, PATCH or DELETE becomes a 303.
- External redirects: a 409 with X-Inertia-Location for a redirect to another site.
- Prefetching: a prefetch leaves flash data and errors for the visit that shows the page.
- Not supported: lazy, deferred, optional, once, merge and infinite-scroll props, always props other than errors, the sharedProps keys, fragment redirects, Precognition and server-side rendering. The client is React: Vue and Svelte aren’t supported.

## Questions people ask

### @hono/inertia vs @popcomputer/web: what’s the difference?

@hono/inertia is an adapter: it speaks Inertia’s protocol in a Hono app and leaves the rest to you. @popcomputer/web, popweb, is a framework built on Hono and Inertia for Cloudflare Workers, with sign-in, validation, route model binding, the database and caching decided. @hono/inertia supports more of Inertia’s props; popweb supports more of its form and history features.

### How do I use Inertia.js with Hono?

Either add @hono/inertia to a Hono app and answer routes with c.render, or start a popweb app from [its template](https://github.com/PatrickOgilvie/popcomputer-web-demo), which sets up Hono, Inertia and React for you. Either way, Inertia’s client, @inertiajs/react for React, shows the pages in the browser.

### Is popweb built on @hono/inertia?

No. Both run on Hono, but popweb has its own Inertia middleware, which also handles error bags, flash data and history encryption. Its docs don’t cover using the two together.

### Which version of Inertia does popweb support?

Inertia 3, with Inertia’s React client. popweb 1.8.0 is developed against @inertiajs/react 3.9.1, and the list above says which of the protocol’s features it supports.

### Does either render pages on the server?

No. Both send the page’s props in an HTML page, and React draws it in the browser. AdonisJS, Guren and Stratal render on the server, and [Inertia without Laravel](/inertia-without-laravel) compares them.

### Can I use Vue or Svelte?

With @hono/inertia, yes: it works with React, Vue and Svelte. popweb’s pages are React components, typed from each page’s schema.

## Read next

- [A full-stack web framework built on Effect.](https://web.popcomputer.com/effect)
- [Inertia.js without Laravel: your TypeScript options.](https://web.popcomputer.com/inertia-without-laravel)
