- Create welcome surface: topbar + getting-started card shown when
no extension surfaces are installed. Admins see a link to Packages,
non-admins see a message to contact their administrator.
- Update resolveDefaultSurface priority chain:
user preference → global config → first extension → /welcome
- Register welcome as a core surface with authenticated auth
- Final fallback is now /welcome instead of /admin, breaking the
infinite back-button loop
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Regex cache-header locations (~* \.(css|js)$) used root directive,
which caused 404s when BASE_PATH is set (e.g., /test/css/app.css
looked for /usr/share/nginx/html/test/css/app.css). Moved regex
locations inside the alias block so they inherit the path stripping.
Also added healthz/ prefix match for liveness/readiness probes.
Tested with BASE_PATH=/test: health, login, CSS, JS all return 200.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- nginx: use alias for BASE_PATH fallback so static assets resolve
correctly when deployed under a sub-path (fixes white page on K8s)
- base.html: remove dead template refs (chat, notes, projects) that
caused html/template to fail silently with Content-Length: 0
- login hero: rebrand from "Chat Switchboard" to "Switchboard Core",
update tagline and feature pills to reflect platform pivot
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- nginx.conf → nginx.conf.template with ${BASE_PATH} in all locations
- NGINX_ENVSUBST_FILTER=BASE_PATH so nginx vars ($host, $uri) are preserved
- Entrypoint injects BASE_PATH into frontend HTML/JS (%%BASE_PATH%% → actual)
- Fixes: /test routes falling through to static SPA, %%BASE_PATH%% visible in URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>