An evidence-driven experiment to determine whether a Jolt application can run through Chez Scheme's Emscripten portable-bytecode target and render with Raylib in a web browser.
The intended path is Jolt source → Jolt-emitted Scheme → a Chez pb-family boot
payload → Chez's portable-bytecode interpreter compiled to WebAssembly → a
statically registered C facade → Raylib PLATFORM_WEB → an HTML canvas. This is
not the existing Jolt Gambit-to-JavaScript backend, ClojureScript, or a JVM
runtime.
Completed evidence ladder: W3. Pinned Chez portable bytecode runs under Node and Chromium; pinned Raylib renders in Chromium; and Chez reaches a statically registered signed-scalar C facade. A two-scene integration witness visibly proves Scheme-selected green/red Raylib frames under browser/C frame ownership.
Jolt itself now runs on the distinct threaded Chez tpb32l browser target:
EXP-014 proves canonical Jolt output under Node and Chromium, including a
named Petite variant. The retained non-threaded pb control still aborts at
make-mutex; it is not representative of the threaded route. Raylib and input
integration remain downstream. See REPORT.md and EXP-014.
Read the complete PLAN.md for architecture, proof order, experiment format, acceptance criteria, and graded outcomes. Coding agents must also read AGENTS.md.
hypothesis
→ smallest reproducible experiment
→ native Jolt nREPL where possible
→ automate the successful observation
→ browser automation and screenshot inspection for visual claims
→ preserve evidence
→ atomic commit and push
The development-quality goal includes a debug-only, owner-thread-safe evaluation path that visibly redefines a Var-backed function in a running browser module. A normal native Jolt nREPL remains the primary fast loop for portable code.
- Jolt — local sibling
../jolt - Raylib-Jolt — local sibling
../raylib-jlt; binding and REPL-pattern reference, not WebAssembly proof - Chez Scheme
- racket-wasm-backend —
strong reference for threaded
tpb32l: it cross-builds libffi 3.5.2, exposes static symbols through Chez, and runs Racket CS in an isolated browser worker. Its Chez patches apply cleanly to this project's pin and are a concrete lead for the current no-libffi blocker, but it is not Jolt/Raylib proof: it usesPROXY_TO_PTHREADand disables Racket places after foreign calls in additional workers trapped. - Raylib
../jolt-android— experiment documentation and evidence conventions followed by this project
Live task state is tracked in Beads task tracker (read only); the plan remains a research specification.
Current Jolt pin: 0.8.21 (5b46858a). The unchanged Flappy Bird app passes
browser input/render validation; Wasm remains 1,097,110 bytes and preloaded data
falls 40.0% versus 6cb7d2e. See EXP-018
for build-host migration, changelog audit and exact size evidence.