03 · Backend · MVP · Internal
Hono + SQLite + server-rendered HTML
An internal tool is a few tables and a few forms; render them on the server and skip the frontend build entirely.
Agent fit5/5 MVP · Ship it Reviewed
The stack
- Framework
- Hono with JSX (server-rendered) or Supabase Edge Functions
- Runtime
- Bun
- Data
- SQLite via Drizzle, or the product's Postgres in read-only
- Auth
- Google Workspace or GitHub OAuth allow-list
- Hosting
- Fly or a VPS behind a company VPN
- Also
-
- htmx or plain forms for interactivity
- Tailwind via CDN for styling
- A cron for the automation parts
Why agents do well here
5/5- Server-rendered HTML is the simplest thing an agent can write and verify; there is no client state to reason about.
- One codebase for both the screens and the automation keeps the whole tool in the agent's context.
- An OAuth allow-list is a ten-line middleware the agent will get right, unlike a home-grown login.
Avoid at this tier
- A React frontend for a CRUD screen.
- Writing to the product database from an internal tool; read from a replica, write through the product API.
- A separate automation service; put the cron in the same process.
How it fits together
Internal tools are where over-engineering hides. Render HTML from the handler, submit forms, and put the automation in the same process on a schedule. The agent can add a screen and a table in one change.
Folder layout
src/
index.ts Hono app + OAuth allow-list middleware
pages/ <screen>.tsx rendered on the server
db/ schema.ts, migrations/
jobs/ nightly-report.ts, run by a cron route First five decisions
Lock these in before the agent writes the second feature. Each one removes a choice it would otherwise make differently every time.
- 01 Server-rendered HTML
- 02 OAuth allow-list
- 03 SQLite or a read replica
- 04 Cron inside the app
- 05 Forms over fetch calls
When to move on
Stay here until the product forces the next tier. You are ready for Growth when:
- A breaking response change would break a client
- Background work, emails or webhooks exist
- Someone asks for an API reference
- You have been paged at least once