The package named @workspace/ui once looked like a design system. Its exports included a global stylesheet, wildcard component paths, and hooks. It also contained a button and application-wide CSS. That made it easy to put product components there simply because the package name sounded right.
The problem was ownership, not whether the components rendered. Product UI needs to move with the product feature. Map primitives need to be reusable without importing the product's tokens, layout, or route-specific behavior. A package that owns both has no useful answer when a visual change affects only the web app.
The Aug. 20 ownership refactor removed the button, global stylesheet, and broad export patterns. The meaningful part of the change was the smaller public surface:
- "./globals.css": "./src/styles/globals.css",- "./lib/*": "./src/lib/*.ts",- "./components/*": "./src/components/*.tsx",- "./hooks/*": "./src/hooks/*.ts"+ "./components/ui/map": "./src/components/ui/map.tsx",+ "./components/ui/map-source": "./src/components/ui/map-source.tsx",+ "./lib/utils": "./src/lib/utils.ts"That historical diff is from f4f327e. The follow-up moved application runtime and map styles into explicit web-owned locations in 27e7b31. Those changes did not create a finished design system. They made the current owner visible.
This diagram shows the ownership correction in one view. The “before” side is historical; the “current” side reflects the checked-out source.
The current package exports confirm the narrower boundary:
{ "exports": { "./components/ui/map": "./src/components/ui/map.tsx", "./components/ui/map-source": "./src/components/ui/map-source.tsx", "./lib/utils": "./src/lib/utils.ts" }}The map entry point exports MapLibre components, markers, overlays, controls, and their types. The small cn utility is also shared by some web components. The package does not own the web app's tokens, feature cards, dialogs, route panels, or runtime layout. Those live under apps/web/src/ui. Map-specific CSS lives under apps/web/src/map/styles.css.
Current ownership
| Boundary | Owns | Does not own |
|---|---|---|
packages/transit | Transit data schemas, route geometry, fares, bundles, and the planner | Browser screens and HTTP request policy |
packages/contracts | Shared assistant request, intent, result, and validation contracts | Transit facts or model prompting |
packages/collector | Vehicle collection, derived intelligence, Durable Objects, and D1 access | Public CORS or dashboard rendering |
apps/api | Public HTTP routes, CORS, response caching, rate limits, and collector binding calls | Browser UI state and private operator authorization |
apps/web | Rider UI, map composition, local persistence, place search, and planner worker use | Collector database access |
apps/dashboard | Private operator UI, Access/share checks, and collector RPC requests | Public rider features |
packages/ui | Reusable MapLibre primitives and a small class-name utility | A durable Davao Transit design system |
The dependency direction is visible in the imports. The API and browser consume @aidrecabrera/transit; the collector also uses transit geometry and generated data; the API imports the shared assistant schemas; and the browser consumes the public API type plus the shared contracts. The dashboard reaches the collector through a Cloudflare service binding rather than through the public API.
The external Spine repository is a possible design-system boundary, not a completed migration target in this source tree. No current package export establishes that the Davao Transit UI has moved to Spine. Until that changes, application UI remains web-owned and provisional.
The boundary is expressed by exports, imports, and file ownership. The package name alone does not enforce it. When a new module needs transit truth, put it near packages/transit or packages/collector. When it needs a rider-facing layout, put it in apps/web. When it needs a map primitive that has no product knowledge, consider packages/ui.
Current evidence is in packages/ui/package.json, its map entry point, the web UI tree, and the web map styles.