Files
t5de-hub/apps/web
dhkatzandClaude Opus 5.5 21e1bd8790
CI / test (push) Successful in 57s
CI / image (apps/web/Dockerfile, t5de-hub-web) (push) Successful in 5s
CI / image (apps/api/Dockerfile, t5de-hub-api) (push) Successful in 5s
A slim Staging bar on staging
Shown above the header when the site is served from a staging. address, or with HUB_ENVIRONMENT=staging
(production hides it), read per request since staging and production run the same image.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-02 09:09:22 -08:00
..
2026-11-02 09:09:22 -08:00
2026-11-02 09:09:22 -08:00

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:

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:

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.