Views6
Swappable content surfaces that fill a Layout's region — one per purpose.
DashboardView
Live in /sidebarMetrics surface — stat cards, charts, and a recent-activity table.
| Endpoint | Status | Latency | Time |
|---|---|---|---|
| /api/auth/login | 200 | 18ms | 2m ago |
| /api/users/me | 200 | 24ms | 3m ago |
| /api/data/sync | 500 | 1.2s | 5m ago |
| /api/events/push | 201 | 45ms | 8m ago |
| /api/auth/refresh | 200 | 12ms | 12m ago |
import { DashboardView } from "@workspace/ui/components/views/dashboard"
ChatView
Live in /footerConversation surface — message list, threading, reroll, compose bar.
Can you explain how the routing system works in this template?
src/routes/ becomes a route automatically.Layout routes use the
_ prefix — they wrap child routes via <Outlet /> without adding a URL segment. For example, _sidebar.tsx provides the sidebar shell for all routes under _sidebar/.The root layout (
__root.tsx) provides the outermost wrapper.What about data fetching?
@tanstack/react-query). The QueryClient is created in main.tsx and passed through context.API calls go through typed helpers in
lib/api.ts:const data = await get<MyType>("/endpoint")In dev, requests to
/api/* are intercepted by a Vite plugin and routed to the Hono server in-process — no CORS, no proxy, no separate server process.Nice. How would I add a new API endpoint?
api.ts:app.get("/api/my-endpoint", (c) => {
return c.json({ message: "hello" })
})That's it. The Vite plugin picks it up immediately in dev. In production,
server.ts serves the Hono app directly.import { ChatView } from "@workspace/chat/components/chat-view"
EntityBrowserView
Live in /sidebarCRUD surface — table + selection + bulk actions + detail panel.
Experiments
| Experiment | Status | Arms | Samples | Created | Actions | |
|---|---|---|---|---|---|---|
| Homepage CTA Color | running | 3 | 12,847 | 2h ago | ||
| Pricing Page Layout | completed | 2 | 45,230 | 3d ago | ||
| Onboarding Flow v2 | running | 4 | 8,920 | 5h ago | ||
| Search Ranking Model | failed | 2 | 1,204 | 1d ago | ||
| Email Subject Lines | completed | 5 | 67,100 | 1w ago | ||
| Checkout Simplification | running | 2 | 3,450 | 12h ago |
import { EntityBrowserView } from "@workspace/ui/components/views/entity-browser"
InboxView
Live in /splitList-detail surface — click a row, the detail updates in place.
Deployment succeeded
deploy-bot · 09:41
The production build for `web` completed in 42 seconds and is now live. All 214 smoke checks passed; no rollback was required.
import { InboxView } from "@workspace/ui/components/views/inbox"
CanvasView
Live in /sidebarSpatial editor surface — tool strip, canvas area, properties rail.
import { CanvasView } from "@workspace/ui/components/views/canvas"
WorkflowView
Live in /menubarNode/DAG editor surface — nodes with typed sockets and SVG edges.
import { WorkflowView } from "@workspace/ui/components/views/workflow"