Files
routstr-core/ui
Jeroen UbbinkandClaude Opus 4.8 6b1b4285fa docs(ui): document dev/build/serve workflow; make missing-bundle warning actionable
The ui/README.md was still stock create-next-app boilerplate. Replace it with the
real story: the UI is a Next.js static export served by FastAPI from ui_out/, the
two-process dev loop (backend :8000 + `make ui-dev` :3000 with hot reload, auto-
targeting :8000), the build/integration commands, and the cross-origin CORS note.

Also make the "ui_out not found" startup warning actionable — it now points to
`make ui-build` / `make ui-dev` instead of silently saying it skipped serving.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 10:54:26 +02:00
..
2026-06-19 11:53:30 +02:00
2026-06-01 23:27:26 +02:00
2026-03-25 10:21:18 +01:00
2026-06-01 23:27:26 +02:00
2025-10-24 15:55:48 +02:00
2026-03-07 18:15:29 +08:00
2026-03-07 18:15:29 +08:00
2025-10-21 22:07:47 +02:00
2026-03-07 18:15:29 +08:00
2026-01-06 11:48:53 +01:00
2026-01-06 11:48:53 +01:00
2026-03-07 18:15:29 +08:00
2026-05-10 11:18:27 +02:00
2026-05-10 10:42:17 +02:00
2025-10-21 22:07:47 +02:00
2026-03-07 18:15:29 +08:00

Routstr node admin UI

A Next.js app (App Router, static export) that provides the admin dashboard for a routstr-core node: login, settings, providers, balances, transactions, usage, and logs.

There is no separate web server in production. next build produces a fully static export (next.config.ts sets output: 'export'), and the FastAPI backend serves it directly from ../ui_out/ (see routstr/core/main.py). So the UI and the API are served from the same origin in production.

Developing the UI (hot reload)

The everyday loop runs two processes side by side — you do not rebuild the static export while developing:

  1. Start the backend on :8000 — from the repo root: make docker-up (or uvicorn routstr.core.main:app --reload).
  2. Start the Next.js dev server on :3000 — from the repo root: make ui-dev (or cd ui && pnpm dev). Edits hot-reload instantly.

Open http://localhost:3000. With no NEXT_PUBLIC_API_URL set, the UI falls back to http://127.0.0.1:8000 in development (see lib/api/services/configuration.ts), so it talks to the local backend out of the box.

Because dev is cross-origin (:3000:8000), it relies on the backend's CORS allowing the UI origin. The default cors_origins is ["*"]; if you tighten CORS, keep http://localhost:3000 allowed for development.

Building the integrated/static UI (what production serves)

To produce the bundle that FastAPI serves from ../ui_out/:

  • make ui-build — builds with local Node/pnpm (scripts/build-ui.sh), then moves ui/out/* to ../ui_out/.
  • make ui-build-docker — same, but inside Docker (no local Node needed).

NEXT_PUBLIC_* variables are read from the repo-root .env at build time and baked in. For a same-origin deployment leave NEXT_PUBLIC_API_URL empty (relative paths); the UI uses window.location.origin at runtime. After building, start the backend and open http://localhost:8000 — the dashboard is served at / and /admin.

If ../ui_out/ does not exist, the backend logs a warning at startup and serves the API only (hitting a UI route returns a small JSON fallback instead of the dashboard).