Apps
Every deployable in the monorepo — what it is, which port it takes, and what they all share.
An app is a deployable. Code that two of them share is a package instead.
web
The Next.js product site. Replacing legacy.
admin
The internal data-ops console, over the Go API.
api
The Go HTTP API, ported route-for-route from legacy.
expo
The React Native app. Documented under Mobile.
docs
This site — Fumadocs on Next.js.
playground
The component workbench and the web route map.
csv-deduplicator
A standalone Flask utility, outside the workspace.
legacy
The previous Next.js app. Being replaced.
Ports
| App | Dev port |
|---|---|
legacy | 3000 |
docs | 3001 |
web | 3002 |
admin | 3003 |
playground | 3004 |
api | 8080 |
expo (Metro) | 8142 |
bun run dev starts all of them except legacy. Two apps sharing a port fail
in a way that reads like a caching bug, so check this table before picking one
for a new app.
What every deployable has
apps/<name>/Dockerfile, built with the repository root as the context, not the app directory. The first stage runsturbo prune <name> --dockerso a change in an unrelated app does not invalidate the layer cache.- A service in
docker-compose.yml. - Scripts named
dev,build,lint,typecheck— Turbo picks a task up by script name, so nothing has to be registered. - Root shortcuts:
bun run dev:<name>,build:<name>,start:<name>.
Add an app is the walkthrough.