Browser-based viewing for Altium, KiCad, and Gerber files.
Loading README and project media…
Browser-based viewer for Altium, KiCad, Gerber, and CircuitJSON design files.
Open schematics, inspect PCB layouts and Gerber fabrication layers, and explore interactive 3D boards directly in your browser. Altium .SchDoc/.PcbDoc files, KiCad .kicad_pro, .kicad_sch, .kicad_pcb, folder selections, KiCad ZIP projects, Gerber/Excellon files, Gerber ZIP archives, and CircuitJSON .json files are supported and parsed locally.
Version 1.13.4 masks ordinary Gerber via annuli like covered tracks while
keeping plated drill walls copper. Via-in-pad openings remain side-specific:
only a surface whose larger host pad is opened by solder-mask artwork exposes
the via copper. The app consumes gerber-toolkit 0.4.3 and
pcb-scene3d-viewer 1.3.1 directly without app-owned geometry rules.
LIVE: https://ecadforge.app/
altium-toolkit, kicad-toolkit, gerber-toolkit, and
circuitjson-toolkit, with reusable CircuitJSON document contextsParser and ProjectLoader contracts
for every format; ZIP expansion, project context, and validation remain in
the source libraries rather than app compatibility shimspcb-scene3d-viewer without URL-promotion or resolver wrappers in the app.
The viewer retains source.format and treats omitted CircuitJSON trace,
pour, and via mask-opening flags as covered copper; explicit openings remain
exposed.@sunbox/occt-import-js JavaScript, WASM,
and package-owned worker directly; local and static servers expose the same
scoped package path without app-vendored copies or a custom worker${KIPRJMOD} model references arrive as canonical cad_component
rows linked to exact project asset paths. Multiple visible models retain
separate rows; parsed board thickness determines top/bottom surface height,
while board placement stays separate from model-local transforms.vrml as
first-class companion-model formats before handing exact source bytes to the
viewersrc/server.mjsaltium-toolkit: printable-record extraction, normalized Altium parsers, schematic SVG, PCB SVG, BOM HTML, and complete non-interactive 3D scene-description utilitieskicad-toolkit: KiCad 9 S-expression parsing, project loading, schematic/PCB normalization, BOM generation, renderers, and complete data-only 3D scene helpersgerber-toolkit: Gerber/Excellon project loading, ZIP expansion, fabrication-layer normalization, deterministic SVG rendering, bare-board 3D scene data, and PCB interaction helperscircuitjson-toolkit: CircuitJSON document loading plus local SPICE transient experiment helpers for standards-native board, assembly, and simulation datasrc/ui/: viewer shell and interaction controllerssrc/core/ecad/: app-owned format registry plus parser, renderer, and scene facadessrc/core/simulation/: app-owned simulation worker client and message handlersrc/core/webmcp/: loaded-session WebMCP inspection, privacy-safe usage diagnostics, and explicit agent feedbacksrc/demo/: bundled demo project files plus source and license noticessrc/workers/ecad-parser.worker.mjs: off-main-thread native parsingsrc/workers/spice-simulation.worker.mjs: off-main-thread local SPICE transient simulationscripts/build-static-deploy.mjs: Apache/shared-hosting frontend artifact buildertests/: app state, server, interaction, and structure testsdocs/: architecture, setup, testing, security, troubleshootingspec/: product scope and acceptance criterianpm install
npm start
Open http://localhost:3000/ and load one or more native Altium
.SchDoc/.PcbDoc files, KiCad .kicad_pro/.kicad_sch/.kicad_pcb files,
KiCad project ZIPs, Gerber/Excellon files, Gerber ZIP archives, CircuitJSON
.json files, or companion STEP/STP, WRL/VRML, GLB/GLTF, STL, OBJ, and 3MF
files. KiCad projects can also be selected as folders from the header.
Demo projects are available at /demo/kicad, /demo/altium, /?demo=kicad, and /?demo=altium. GitHub-hosted files can be opened with /?url=<raw-or-github-blob-url> or /?github=owner/repo/path/to/file&ref=<optional-ref> when the remote host allows browser fetching. Share links can also include view=<tab>, document=<loaded-file-path>, component=<designator>, and net=<net-name> to restore the active tab, document, selected component, and selected net.
Production deployment is available at https://ecadforge.app/.
ECAD Forge uses native document.modelContext registration directly when
available, preserving browser schemas, execution options, and annotations.
Otherwise it loads @mcp-b/global with same-origin transport options as a
fallback. MCP-B tab and iframe transports are installed only on that fallback
path. It then registers read-only
tools for the designs already loaded in the current session. Agents can list
loaded designs, components, nets, search metadata, review coverage, audit
metadata/connectivity issues, cross-reference schematic nets against PCB pads,
compare schematic/PCB parity, query BOM rows, list component pins, query
direct nets, list diagnostics, compare BOM/PCB coverage, query component pins,
inspect PCB placements, PCB net geometry, board summaries, design rules, and
fabrication-readiness signals, and trace extended connectivity without
uploading files or scanning local paths. The adapter uses the current
document.modelContext API. The app shell carries the production WebMCP
origin-trial token for https://ecadforge.app/, and served/deployed responses
apply the same-origin tools permissions policy. Netlist extraction, search
validation, component grouping, and traversal rules are delegated to the Altium
and KiCad toolkit query APIs; the app WebMCP layer owns session-level review,
audit, BOM/component search, cross-reference, PCB inspection, focused
inspection summaries, and pagination summaries.
Object-form WebMCP execution callbacks also forward the browser's optional
AbortSignal separately from tool JSON. Pre-aborted app-owned and
toolkit-backed queries stop before synchronous work begins without changing
existing tool inputs or result shapes.
All tools declare consequentialHint: false alongside their read-only and
untrusted-content hints. See WebMCP compatibility for current
Chrome API changes and fallback limitations.
Use the Request support header button for public GitHub support requests.
AI agents can discover reporting instructions in /llms.txt
or prepare a GitHub draft with the prepare_issue_report WebMCP tool.
See WebMCP for tool names, arguments, examples, privacy constraints, and unsupported browser-only operations.
npm run build:static
The static build writes .deploy-src/ with versioned browser module URLs and an Apache cache policy. The FTP workflow uploads that artifact to the LIVE document root.
npm test
Parser, deterministic renderer, and non-interactive scene-data tests live in the shared toolkit repositories. This app test suite covers app state, server behavior, interaction controllers, and ECAD Forge integration.
Privacy-safe activation events are emitted through the optional centralized tracker when present. Event properties intentionally exclude file names, raw URLs, file contents, and other personal data.
npm run format
This project is available under two licensing options.
GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).
You may use, modify, and distribute this project under the AGPL. If you modify the software and make it available to users over a network, the AGPL requires that those users can access the corresponding source code of the modified version.
For use in closed-source, proprietary, or otherwise AGPL-incompatible products, a separate commercial license is required.
Commercial licensing contact: https://github.com/SunboX
Copyright (C) 2026 André Fiedler.
Copyright, license, attribution, and source-origin notices must be preserved as required by the AGPL and the notice files in this repository.
Documentation and non-code media are licensed under Creative Commons
Attribution-ShareAlike 4.0 (CC-BY-SA-4.0) where marked in .reuse/dep5.
Package-manager dependencies retain their own licenses and notices. The
installed OCCT importer preserves its LGPL notices and Open CASCADE exception
under node_modules/@sunbox/occt-import-js/dist/; source links are recorded in
NOTICE.md.