| Filename | Latest commit message | Latest commit date |
|---|---|---|
emcc only runs Binaryen at link -O2+ (link.py: should_run_binaryen_optimizer returns OPT_LEVEL >= 2) and we link at -O1, so the shipped module had never seen wasm-opt at all — it kept its entire 19.56 MB name section, ~20% of the editor (-sJSPI sets ASYNCIFY=2, which suppresses wasm-ld's --strip-debug, leaving wasm-opt as the only thing that would drop it). Step 8.2 runs it post-link and in-container, so CI's cached compile phase covers it and the host post-process stays pure-host. Default -O2, picked by measuring every level on the same module: -O0 already captures 27% of the raw win (it is mostly the name section), -O2 costs 23 s and gives the best frame rate, and -O3/-O4/-Os/-Oz cost 48-132 s for at most 1.5% more brotli — -O4 is not even smaller than -O3. Targets that already link -O2/-Oz (occ_service, kicad_tools) are skipped by testing for the target_features section, which emcc strips whenever it ran the optimizer itself, so there is no hard-coded target list to drift. Feature flags come from the module's own target_features section and so cannot diverge from the link. The perf specs reported requestAnimationFrame ticks as "FPS". That is not a frame rate: rAF fires on the compositor's schedule whether or not the GAL redrew, and it read 120/s on a board where the renderer completed zero frames in six seconds. measureInteractionFps now counts completed GAL frames — runs of draws to the default framebuffer, exactly one per frame in every AA mode — and drives a pure middle-drag pan after a zoom-to-fit. Mixing wheel zoom into the drive made the result depend on where the wheel left the view: +-20% across identical repeats, against +-2% for pan alone. The report gains a GAL fps column with a regression flag on the 1x number; rAF is kept so historical runs stay comparable. CI has no GPU, so its number is a software-rasteriser redraw rate — a regression signal, not a user-facing frame rate. Method and measurements in the bench report. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016X9eh1s5sTx1o9Em9KBuwR |
||
| .. | ||
| asyncify-allocator-suspend | ||
| debugging | ||
| features | ||
| research | ||
| build.md | ||
| ci-build-slowness-findings.md | ||
| README.md | ||
| wasm-exceptions-experiment.md | ||
Documentation Map
A central index of the documentation in this repo. The goal of the project is to build KiCad with WASM and run it in a browser.
Note: per-area
README.mdfiles stay next to the code they describe (they're linked below). Cross-cutting guides live underdocs/. Per-feature design notes live underfeatures/.
Start here
- Project README — overview, prerequisites, quick start, project structure
- CLAUDE.md — project/agent context and contribution conventions
Build
- docs/build.md — Docker-based KiCad WASM build system (single-phase build, outputs, memory)
- docker/README.md — Docker build environment, branch-specific containers, troubleshooting
- wasm/README.md — WASM compatibility layer (overrides/shims without patching KiCad)
Debugging & WASM runtime
- docs/debugging/DEBUG.md — debugging guide: the JSPI runtime's observability (
__wxWaitDump, beacons), reading a SuspendError, the harnesses - docs/features/async/23-jspi-runtime.md — the JSPI runtime architecture (scheduler/turnstile, libcontext backend, embind call shapes)
- docs/debugging/learning.md — historical: Asyncify + consecutive modal dialogs, the lock pattern (asyncify era)
- docs/research/threading_1.md — historical deep dive: the Asyncify single-slot
currDatacollision bug and its era's fix - docs/research/threading_2.md — external research that pre-studied the alternatives (JSPI/WasmFX/state machines), QEMU analysis
Architecture
- wasm/README.md — WASM compatibility layer structure
- web/README.md — web app (create/open KiCad projects), tech stack, URL routing, WASM artifact serving
Testing
- tests/README.md — Playwright test infrastructure, element registry, logs, screenshots
- tests/WHATWORKS.md — wxWidgets-in-WASM feature coverage matrix and KiCad readiness
- tests/GL_README.md — Emscripten legacy GL immediate-mode quirks (color-per-vertex)
- tests/gal-regression/README.md — GAL visual regression suite (native OpenGL vs WebGL WASM)
Feature design docs
Per-feature design notes and porting records live under features/:
- web-init — web app spec
- schematic — eeschema WASM bring-up
- symbol-editor — symbol editor (eeschema kiface launcher)
- gerbview — Gerber viewer port
- pl-editor — page-layout editor port (incl. file-dialog usability fixes)
- browser-tools — tool-activation / coroutine deep dives
- fix-asyncify-O2-and-modal-promise-rejection — RTree wasm overflow bug investigation
Archived / historical
features/archive/ holds docs whose work is done or superseded
(each carries a status banner):