···195195196196If you're writing XRPC component handlers, [`@inlay/cache`](packages/@inlay/cache) lets you declare cache lifetime and invalidation tags (`cacheLife()`, `cacheTagRecord()`, `cacheTagLink()`). The host uses these to know when to re-render.
197197198198-[`proto/`](proto/) is a simple but complete host with streaming, caching, and prefetching.
198198+[`proto/`](proto/) is a prototype host built with Hono and htmx.
199199200200## Development
201201202202```bash
203203npm install
204204-npm run build # generate lexicons + build all packages
205205-npm run typecheck # type-check everything
206206-npm test # run tests
204204+npm run dev # start the Next.js dev server (Turbopack)
205205+npm run build # production build (Next.js)
206206+npm run typecheck # type-check
207207+npm run lint # lint
207208```
208209209210## Project structure
210211211212```
213213+app/ — Next.js app (host UI, routes, pages)
212214packages/@inlay/core/ — element primitives and JSX
213215packages/@inlay/render/ — rendering engine
214216packages/@inlay/cache/ — cache declarations
217217+db/ — database schema (Drizzle)
218218+ingester/ — AT Protocol firehose ingester
219219+invalidator/ — cache invalidation service
215220proto/ — prototype host server (Hono)
216216-invalidator/ — cache invalidation service
217221lexicons/ — AT Protocol lexicon definitions
218222generated/ — generated TypeScript from lexicons
219223```