GrampsWeb's SPA has <base href="/"> hardcoded at build time. The GRAMPSWEB_BASE_URL env var is a full URL for API/OIDC, not a path prefix. This means assets always load from root, hitting Django instead of GrampsWeb. Fix: nginx sub_filter rewrites <base href="/"> to <base href="/ahnenforschung/"> so the browser resolves all SPA assets under the correct subpath. Also revert BASE_URL default to a proper URL (not a path). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>