···103103104104Bun workspaces: `packages/@wisp/*`, `apps/main-app`, `apps/hosting-service`
105105106106-There are two typescript apps
106106+There are three typescript apps
107107**`apps/main-app`** - Main backend (Bun + Elysia)
108108109109- OAuth authentication and session management
···112112- Admin database view in /admin
113113- React frontend in public/
114114115115-**`apps/hosting-service`** - CDN static file server (Node + Hono)
116116-117117-- Watches AT Protocol firehose for `place.wisp.fs` record changes
118118-- Downloads and caches site files to disk
115115+**`apps/hosting-service`** - CDN static file server (Bun + Hono)
119116- Serves sites at `https://sites.wisp.place/{did}/{site-name}` and custom domains
120117- Handles redirects (`_redirects` file support) and routing logic
118118+- Pulls sites from Tiered Storage (packages/@wispplace/tiered-storage)
119119+120120+**`apps/firehose-service`** - ATProto Firehose consumer (Bun or Node)
121121+- Watches AT Protocol firehose for `place.wisp.*` record changes
122122+- Downloads and caches site files to S3
121123- Backfill mode for syncing existing sites
124124+122125123126### Shared Packages (`packages/@wisp/*`)
124127···130133- **`constants`** - Shared constants (limits, file patterns, default settings)
131134- **`observability`** - OpenTelemetry instrumentation
132135- **`safe-fetch`** - Wrapped fetch with timeout/retry logic
136136+- **`tiered-storage`** - KV caching where reads bubble up from cold tier to warm/hot tier and writes bubble down from selected tier down. Streaming as well as buffering support. Used to store files in S3 cold tier as source of truth
133137134138### CLI
135139