Changelog — June 5, 2026
Major migration from Next.js to TanStack Start, Bun package manager adoption, and critical SSR/Docker fixes that restore production stability.
Release
v1.51.0✨ New Features
-
Next.js → TanStack Start Migration — The entire
apps/webdashboard has been migrated from Next.js 15 (App Router) to TanStack Start (TanStack Router + Vite + Nitro). All 38 routes were ported to file-based routing, i18n switched fromnext-intltouse-intl, and a new Nitro-based server handles SSR, API proxies, and auth. Verified with full authenticated Playwright QA and 71 passing unit tests.#PR-690 -
Booking Integration: Emails, Calendar Sync & Source Tracking — Reservations created from the etouch studio calendar now trigger confirmation/notification emails and an immediate CalDAV calendar push (matching the public website flow). A new
bookings.sourcecolumn tags the origin ("etouch" vs "website"), surfaced as a badge in the calendar booking sheet.#PR-694
🐛 Bug Fixes
-
SSR GraphQL Hit Public URL — Dashboard data pages crashed during SSR because the GraphQL client fell back to
NEXT_PUBLIC_API_URL(the public origin), which is unreachable from inside the Node container. A sharedresolveInternalApiBaseURL()is now used by both auth-client and graphql-client so SSR auth and SSR GraphQL always target the same internal backend.#PR-696 -
Sentry Lazy-Load Prevents Rollup Crash — The production Nitro build crashed on linux-x64 with a Rollup null-reference error caused by
@sentry/tanstackstart-reactbeing imported at the top level inanalytics-init.tsx. Sentry is now loaded via a dynamicimport()behind animport.meta.env.SSRguard, keeping it client-only.#PR-695 -
Vite 8 → Vite 7 Downgrade Fixes SSR Crash — Production SSR rendered blank pages (
ERR_EMPTY_RESPONSE) because Vite 8's rolldown bundler duplicated React across CJS deps. Downgraded to Vite 7 (Rollup) which handles the interop correctly.#PR-693 -
Server-Side Auth Targeted Public URL — SSR session resolution used the app's public origin (
AUTH_BASE_URL), which is unreachable from inside the container. Server-side auth now targets the backend directly viaINTERNAL_API_URL/api/auth.#PR-692 -
Deterministic Docker Build —
turbo pruneproduced abun.lockthat Bun couldn't parse, stalling Coolify deploys. Switched to a full-workspace build withbun install --frozen-lockfilefor deterministic, network-light installs.#PR-691
♻️ Refactoring & Technical Improvements
- pnpm → Bun Migration — The monorepo package manager was switched from pnpm to Bun, removing
pnpm-lock.yamlandpnpm-workspace.yamlin favor ofbun.lock. This unifies the toolchain and improves install performance across all workspaces.#PR-688
📦 Dependencies & Infrastructure
- Bun Docker Build Fixes — Updated turbo in the prune step (2.5.8 → 2.9.16), dropped
--frozen-lockfilein pruned stages, guardedprisma generatefor web-only builds, and pinned esbuild to 0.28.0 to resolve version mismatches across all three Docker images (api, web, docs).#PR-689