3 Commits
Author SHA1 Message Date
anthony e3ec3a8ba3 fix(seo): load the entry module with defer instead of async
window.__VITE_REACT_SSG_HASH__ (read by every route's data loader to fetch
static-loader-data-manifest-<hash>.json) is set by a plain inline <script>
placed later in the document body. With script: 'async', the module script
in <head> can start executing as soon as it finishes downloading, racing
ahead of the HTML parser reaching that later inline script — intermittently
reading the hash as undefined depending on network/cache timing, and
producing a 404 on .../static-loader-data-manifest-undefined.json followed
by a React hydration crash (error #418).

'defer' guarantees the module only executes after the full document,
including that inline script, has been parsed — this removes the race
structurally rather than just making it less likely.
2026-08-02 12:51:09 +02:00
anthony 3b53d82b3d feat(seo): migrate to build-time prerendering with vite-react-ssg
Fixes SeoHead (title/canonical/hreflang/JSON-LD) to render during SSR via
vite-react-ssg's Head component instead of a client-only useEffect, so
crawlers see real tags without executing JS. Also fixes an SSR crash in
useTheme (localStorage access with no window during server render) and
removes now-duplicated static meta tags from index.html.
2026-08-02 10:30:26 +02:00
anthonyandClaude Sonnet 5 21cca36595 feat: add React frontend and serve it from Express
Also fixes a Windows-specific bug in worker.js and cleanup.js: the
"run only if executed directly" guard compared import.meta.url against
`file://${process.argv[1]}`, which never matches on Windows (backslash
path separators, missing extra slash before the drive letter). main()
silently never ran, so the worker process started and exited
immediately without ever polling. Caught during this task's manual
verification of the full upload-convert-download flow. Fixed with
node:url's pathToFileURL, which builds a correct file:// URL cross-platform.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 09:54:27 +02:00