# T5DE Hub website The hub's website: accounts, linked IMVU accounts, who's online, signing T5DE in, and the moderation console. Next.js (App Router), Tailwind CSS and shadcn/ui. Pages are rendered on the server, which calls the hub's API (`apps/api`) with the visitor's cookie; forms use server actions. The browser only talks to this app: `/api/*` is rewritten to the API, so the API's session cookies belong to the website's origin. ## Develop From the repository root, `bun install`, then start the API (`cd apps/api && bun src/index.ts`) and the website: ```sh cd apps/web bun run dev # http://localhost:4100 bun run check-types bun run build ``` The first account created is the hub's admin. ## Configuration | Variable | Default | What | | --------- | ----------------------- | -------------------------------------------------------------------------------------- | | `API_URL` | `http://localhost:4101` | The API's address as this app reaches it. Needed at build time and at run time (below). | | `PORT` | `4100` | The standalone server's port (`next start` and `bun run dev` use 4100). | The API's `WEB_URL` must be this website's public address (it's where Better Auth trusts requests from, and where T5DE's sign-in code page is). `API_URL` is read in two places: by server code on every request, and by `next.config.ts`'s `/api` rewrite, which Next fixes when it builds. So build with the same `API_URL` the app will run with. ## Deploy ### Container The `Dockerfile` builds a standalone server (`output: "standalone"`). Build it from the repository root: ```sh docker build -f apps/web/Dockerfile --build-arg API_URL=http://api:4101 -t t5de-hub-web . docker run -p 4100:4100 -e API_URL=http://api:4101 t5de-hub-web ``` Next's own gzip is off (it held back the API's live event stream), so put a reverse proxy that compresses in front, and don't let it buffer `text/event-stream` responses (`/api/v1/online/events`). ### Vercel Import the repository with the project's root directory set to `apps/web` (Vercel installs the Bun workspace from the root). Set `API_URL` to the API's public address for both builds and runtime. Nothing else is needed: there's no custom server.