context
Agents work in smaller trees
Open `apps/ui` for UI work without loading the whole API schema graph unnecessarily.
Repository contract
BoringStack ships as a single monorepo. API, UI, docs site, and Compose infra
live in one tree with path-filtered CI and root-level bun run regen /
bun run check for cross-app contracts.
apps/
api · ui · docs
infra/
compose · bootstrap
1
template clone
The runtime is composed from apps/api, apps/ui, and infra/compose. Optional VPS provisioning lives in infra/bootstrap. The docs site source is apps/docs (deployed to boringstack.xyz).
Each app keeps its own package.json, lockfile, and lint config. CI workflows live at the repo root (.github/workflows/) with path filters such as apps/api/** and infra/compose/**.
context
Open `apps/ui` for UI work without loading the whole API schema graph unnecessarily.
release
API and UI each publish their own GHCR image. Compose pins versions via env.
contract
OpenAPI, ACL types, lint-meta RULES, and docs JSON catalogs are regenerated from root.
/swagger/json)From the repo root:
bun run regen # ACL types → OpenAPI schema → RULES.md → docs JSONbun run check # drift checks (api on :3000 required for OpenAPI check)| Contract | Producer | Consumer | Generated artifact |
|---|---|---|---|
| ACL types | apps/api | apps/ui | apps/ui/src/lib/acl/acl.types.generated.ts |
| OpenAPI | apps/api /swagger/json | apps/ui | apps/ui/src/lib/api/schema.d.ts |
| lint-meta | each app scripts/lint-meta/ | committed RULES.md | per app |
| Docs catalogs | api + ui scripts/README | apps/docs | src/data/*.json |
CI runs the same checks from one checkout on GitHub main.
The API exposes its OpenAPI document at /swagger/json. The UI ships bun run generate:api that reads that document and rewrites src/lib/api/schema.d.ts. When the API changes routes, the UI either fails typecheck or you run bun run regen at the repo root.
See OpenAPI client for the full flow.
infra/compose/compose/docker-compose.yml defines api-dev / api / ui-dev / ui services whose build context is apps/api and apps/ui. Env vars are documented in compose/api.dev.env.example and compose/api.prod.env.example.
In prod the default image: reference pulls a pre-built image from GHCR, published by the release workflows. See Deployment.