diff --git a/plans/host-spa.md b/plans/host-spa.md index c76efd67..216a9bab 100644 --- a/plans/host-spa.md +++ b/plans/host-spa.md @@ -1,5 +1,24 @@ # Host blog → SPA via the SX-htmx engine (WASM OCaml kernel) +## ✅ COMPLETE 2026-06-29 — live SPA on the WASM OCaml kernel + +blog.rose-ash.com is now a single-page app: the browser boots the SAME OCaml +kernel the server runs (compiled to WASM), `sx-boost` fragment-swaps every link +into #content with URL push + working back button, no full reload. Verified: +native host conformance 271/271; `lib/host/playwright/spa-check` 4/4 in chromium; +LIVE blog.rose-ash.com boost 19/19 + click nav + zero errors. + +The boot crash was the crypto stack assuming 63-bit int (fixed in `fce9e0c6`). +The boost then needed six more source-load/boost-path fixes (commit `689dae7d`): +import double-apply (library_loaded_p got a key not a spec), unloaded-import +crash (library_exports nil -> empty dict), value_to_js missing Integer (broke +dom-query-all -> only 1 link boosted), browser-same-origin? rejecting relative +URLs, dom-query-in undefined (= dom-query), and lazy-deps never preloaded under +source fallback (CEK can't lazy-resolve). Everything below is the history. + +--- + + Turn the blog (lib/host/blog.sx) into a single-page app using the in-repo SX hypermedia engine (web/engine.sx — "our htmx"): boot the **WASM OCaml kernel** (the same evaluator the server runs) in the browser, and `sx-boost` every