Astro's static middleware was serving public/studio/index.html directly,
bypassing the [...path].ts route that rewrites /static/ to /studio/static/.
Deleting it makes all /studio requests go through the SSR rewrite.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lock file was generated with npm 11.x (Node 24 local) but node:20-alpine
has npm 10.x which enforces stricter lock file consistency. Using
npm install avoids the picomatch version conflict on CI.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
npm ci fails on alpine when lock file was generated on a different npm
version. --legacy-peer-deps handles the styled-components peer dep too.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Builds studio/ separately during Docker build and copies output to
public/studio/ so it is served as static files by the Astro Node adapter.
Catch-all route redirects deep studio links back to /studio for SPA routing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>