Self-hosted emergence-engineering/pcbjam (browser KiCad WASM) — CMMS embed fork. Upstream tracked as remote "upstream".
- TypeScript 49.1%
- C++ 36%
- Shell 4.2%
- C 2.9%
- JavaScript 2.6%
- Other 5.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Brings up KiCad's pagelayout_editor (drawing-sheet editor) in the browser, to roughly the same "boots, canvas visible, partially usable in-session" level as the existing pcbnew/eeschema/calculator ports. Build: - docker/build.sh: add pl_editor to the unified app dispatch (case, subdir map, all-loop). - scripts/kicad/build-kicad-target.sh: add pl_editor to the case; upstream target name pl_editor under source subdir pagelayout_editor. - scripts/kicad/build-pl_editor.sh: 7-line thin wrapper matching the pcbnew/eeschema/calculator pattern. - tests/scripts/setup-kicad-wasm.sh: copy_app pl_editor. App glue: - wasm/stubs/nl_pl_editor_plugin_stub.cpp: no-op SpaceMouse plugin so pl_editor_frame.cpp's NL_PL_EDITOR_PLUGIN symbols resolve. Mirrors nl_pcbnew_plugin_stub.cpp. - tests/apps/kicad/pl_editor.html: browser shell. preRun creates /home/kicad and FS.chdir there so file dialogs land somewhere friendly instead of MEMFS root (/dev/, /proc/, etc.). E2E coverage: - tests/kicad/pl_editor.spec.ts: 5 tests — smoke (canvas, no abort), wizard, File menu has Open/Save As, file-dialog folder-navigation regression, canvas + toolbar metrics. - tests/e2e/filedialog-folder-nav.spec.ts: wxWidgets-level twin of the regression test (exercises the underlying widget directly via the standalone filedialog_test app). Submodule bumps: - kicad → feature/pl-editor (WASM gating in pagelayout_editor's CMakeLists + navlib stub). - wxwidgets → feature/pl-editor (wxGenericFileDialog::OnOk navigates into selected directories; wasm/mouse.cpp emits wxEVT_LEFT_DCLICK via timestamp-based double-click detection — the latter benefits every wxWidgets-WASM app). See features/pl-editor/ for the design doc + per-repo diff patches. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
| .claude | ||
| docker | ||
| features | ||
| kicad@881ab17181 | ||
| logs | ||
| research | ||
| scripts | ||
| tests | ||
| wasm | ||
| wxwidgets@6583b43447 | ||
| .dockerignore | ||
| .gitignore | ||
| .gitmodules | ||
| build.md | ||
| CLAUDE.md | ||
| DEBUG.md | ||
| learning.md | ||
| README.md | ||
KiCad WebAssembly Port
Run KiCad PCBnew in the browser using WebAssembly.
Quick Start
Full Build (KiCad + All Tests)
# 1. Initialize submodules
git submodule update --init --recursive
# 2. Build KiCad WASM (Docker, ~10 min incremental, ~1-2 hours full)
./docker/build.sh
# 3. Build wxWidgets for local testing
./scripts/build-wxuniversal-wasm.sh
# 4. Build wxWidgets test apps
./scripts/build-wasm-test.sh
# 5. Run all tests
cd tests && npm install
npm test # wxWidgets tests (256 tests)
npm run test:kicad # KiCad tests (2 tests)
wxWidgets Only (No Docker)
# Requires: Node.js 18+ (Emscripten SDK auto-installed on first build)
./scripts/build-wxuniversal-wasm.sh
./scripts/build-wasm-test.sh
cd tests && npm install && npm test
Project Structure
kicad-wasm/
├── kicad/ # KiCad source (git submodule)
├── wxwidgets/ # wxWidgets source (git submodule)
├── wasm/ # WASM compatibility layer
│ ├── bindings/ # Embind bindings for JavaScript
│ ├── cmake/ # CMake find modules
│ ├── kiplatform/ # Platform abstraction (app, UI, printing)
│ ├── libcontext/ # Coroutine/fiber implementation
│ ├── shims/ # Runtime JavaScript shims
│ └── stubs/ # Stub implementations (libgit2, curl)
├── scripts/ # Build scripts
│ ├── build-wxuniversal-wasm.sh # Build wxWidgets for WASM
│ ├── build-wasm-test.sh # Build wxWidgets test apps
│ ├── deps/ # Dependency build scripts
│ ├── kicad/ # KiCad build scripts
│ ├── common/ # Shared utilities
│ └── config/ # Build config wrappers
├── docker/ # Docker build environment
├── tests/ # Playwright E2E tests
│ ├── e2e/ # Test specs
│ └── apps/ # WASM test applications
├── tools/ # External tools (binaryen)
└── output/ # Build output (pcbnew.js, pcbnew.wasm)
Feature Branches
Each feature branch has a folder in features/<branch-name>/ containing:
- Documentation and research notes
root.patch- changes to main repokicad.patch- changes to KiCad forkwxwidgets.patch- changes to wxWidgets fork
Generate patches: ./scripts/create-feature-patches.sh [branch-name]
Two Build Workflows
1. KiCad Build (Docker)
Full KiCad PCBnew build using Docker:
# Build KiCad WASM
./docker/build.sh
# Copy output to test directory
./tests/scripts/setup-kicad-wasm.sh
# Run KiCad tests
cd tests && npm install && npm run test:kicad
Output: output/pcbnew.js, output/pcbnew.wasm
See build.md for detailed build documentation.
2. wxWidgets Test Apps (Local)
Build standalone wxWidgets test apps for feature testing:
# Build wxWidgets for WASM
./scripts/build-wxuniversal-wasm.sh
# Build test apps
./scripts/build-wasm-test.sh
# Run wxWidgets tests
cd tests && npm install && npm test
Output: tests/apps/standalone/
Prerequisites
For KiCad Build (Docker)
- Docker Desktop with 16GB+ RAM allocated
- 10+ GB disk space for build cache
For wxWidgets Build (Local)
- Node.js 18+ (for tests)
- Emscripten SDK (auto-installed on first build)
# Initialize submodules
git submodule update --init --recursive
# Install Emscripten SDK (auto-runs on first build, or run manually)
./scripts/setup-emsdk.sh
Testing
cd tests
npm install
# Run all tests
npm test
# Run specific tests
npm run test:kicad # KiCad tests only
npx playwright test menu # Menu tests only
See tests/README.md for test documentation.
Current Status
- wxWidgets WASM: Core widgets working (menus, dialogs, grids, trees, OpenGL)
- KiCad PCBnew: Builds and loads in browser, canvas rendering working
- In Progress: Testing wxWidgets features used by KiCad
Documentation
- Build System - Docker build details
- Docker README - Container setup
- Tests README - Test infrastructure
License
KiCad is GPL-3.0. This project follows the same license.