Monorepo overview
A map of the StatsHub apps, shared packages, task graph, and ownership boundaries.
StatsHub is one Bun workspace managed by Turbo, but it is not one application.
Deployable and runnable surfaces live under apps/; code and configuration
shared across those surfaces live under packages/.
Turborepotask graphBunworkspace runtimeNext.jsweb surfacesExponative clientsGoHTTP APIPostgreSQLdata layer
README.md — start here
package.json
turbo.json — shared task graph
Apps and services
| Workspace | Role | Stack | Local port |
|---|---|---|---|
web-app-router | Product website | Next.js | 3002 |
statshub-expo | iOS and Android app | Expo and React Native | 8142 |
statshub-api | HTTP API over Postgres | Go, Chi, Huma, and Bun ORM | 8080 |
statshub-docs | This documentation renderer | Next.js and Fumadocs | 3001 |
statshub-playground | Component workbench and route previews | Next.js | 3004 |
statshub-legacy | Previous website and parity reference | Next.js | 3000 |
expo-legacy | Previous mobile client | Expo and React Native | 8142 |
Shared packages
| Package | Owns |
|---|---|
statshub-api-client | The typed HTTP client used by the web and Expo apps |
statshub-api-contract | Recorded cases and comparisons between the legacy and Go APIs, at packages/tests/api-contract |
statshub-i18n | English, Spanish, and Portuguese message catalogs and loaders |
statshub-tooling | Shared Next.js, Tailwind, ESLint, TypeScript, port, and tailnet configuration |
@statshub/ui-web | Web UI primitives shared by the website and playground |
@statshub/ui-native | Native UI primitives shared by the current and legacy Expo apps |
A package should own a rule only when more than one app needs the same answer. App-specific routes, state, and product behavior stay with the app that uses them.