Three-column frontend aligned with the redesign docs:
- Collapsible left rail
- Thread list + long-thread conversation pane
- Series timeline/detail/version/compare workspace
- Diff file-tree + lazy file/full diff workspace
- Integrated search controls in thread and series list panes
- Series browse/search merged-unmerged filtering plus mainline merge metadata in detail views
The app is a static Next.js export served by nginx:
- Next.js builds static assets (
output: export). - nginx serves the exported files.
- Browser code calls Rust API directly via same-origin
/api/v1/*. - nginx reverse-proxies
/api/v1/*(and/admin/v1/*) to backend.
There is no Next.js server runtime and no app/api/* BFF layer.
Web container runtime env:
NEXUS_API_UPSTREAM(optional, defaulthttp://api:3000)- Used by nginx template for API proxy pass.
No NEXUS_WEB_API_BASE_URL or NEXT_PUBLIC_* env vars are required.
From repo root:
podman compose -f compose.yml up -d --build web api worker postgres meilisearchor:
docker compose -f compose.yml up -d --build web api worker postgres meilisearchAfter frontend code changes, rebuild/restart web:
podman compose -f compose.yml up -d --build webThe compose web service is intentionally production-shaped in local dev: static export plus nginx proxying. Frontend verification should use the rebuilt container, not an ad hoc next dev sidecar.
Build:
docker build -t nexus-web-app:prod -f Dockerfile .Run:
docker run --name nexus-web --rm -p 3001:3001 \
-e NEXUS_API_UPSTREAM=http://127.0.0.1:3000 \
nexus-web-app:prodOpen http://localhost:3001.
pnpm lint
pnpm typecheck
pnpm test
pnpm build