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%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Viktor Vaczi 51b158f6b1 fix(wasm): Fix Asyncify modal errors with global lock mechanism
Update wxwidgets submodule with fix for consecutive modal dialog crashes.
The fix prevents overlapping Asyncify operations that caused "indirect call
to null" and "func is not a function" errors when a second modal was
triggered immediately after the first one completed.

Also includes:
- docs: Clarify build script order and descriptions in CLAUDE.md
- refactor(test): Remove debug logging from wizard test

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 14:35:08 +01:00
docker refactor(webgl): Move WebGL GAL from test harness to KiCad source tree 2026-01-10 13:15:58 +01:00
features feat(wasm): Disable 3D viewer with comprehensive stubs 2026-01-10 15:15:50 +01:00
kicad@d8a9ac4304 feat(wasm): Disable 3D viewer with comprehensive stubs 2026-01-10 15:15:50 +01:00
logs Added logs .gitignore. 2026-01-03 13:52:34 +01:00
scripts fix(wasm): Fix Emscripten empty callback functions for pthreads builds 2026-01-12 14:19:13 +01:00
tests fix(wasm): Fix Asyncify modal errors with global lock mechanism 2026-01-19 14:35:08 +01:00
wasm feat(wasm): Disable 3D viewer with comprehensive stubs 2026-01-10 15:15:50 +01:00
wxwidgets@dd370ac191 fix(wasm): Fix Asyncify modal errors with global lock mechanism 2026-01-19 14:35:08 +01:00
.dockerignore Add Docker build environment for KiCad WASM 2025-12-08 12:07:01 +01:00
.gitignore refactor(webgl): Move WebGL GAL from test harness to KiCad source tree 2026-01-10 13:15:58 +01:00
.gitmodules Remove unused legacy build scripts and directories 2025-12-27 11:07:54 +01:00
build.md Update documentation to reflect current project structure 2025-12-27 11:13:17 +01:00
CLAUDE.md fix(wasm): Fix Asyncify modal errors with global lock mechanism 2026-01-19 14:35:08 +01:00
learning.md fix(wasm): Fix Asyncify modal errors with global lock mechanism 2026-01-19 14:35:08 +01:00
README.md Add feature branch patch management system 2026-01-06 16:17:52 +01:00

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: Emscripten SDK 4.0+, Node.js 18+
./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 repo
  • kicad.patch - changes to KiCad fork
  • wxwidgets.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)

  • Emscripten SDK 4.0+
  • Node.js 18+ (for tests)
# macOS
brew install emscripten node

# Initialize submodules
git submodule update --init --recursive

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

License

KiCad is GPL-3.0. This project follows the same license.