CadPal takes DWG and DXF drawings and converts them to JT (Jupiter Tessellation) format, entirely on the local machine, for a client project with a real non-technical acceptance tester on the other end.
CadPal is an Electron desktop application wrapped around a Node/Express conversion engine. It reads DWG and DXF drawings and writes JT assemblies, running entirely on-device with no dependency on a remote service to do the actual conversion work.
CADPAL-Win7-1.1.5.exe, cross-built from macOS for a Windows 7 SP1 32-bit workstation. It carries LibreDWG, every DLL LibreDWG imports, and a sha256-pinned 32-bit Python 3.8.10 with ezdxf, so the target machine needs nothing installed.The Electron shell spawns the Express engine as a hidden local child process, waits for it to report healthy, then hands the UI its API base address. No network round trip does the actual CAD work.
An optional native C++ OpenCASCADE (OCCT) bridge exists in the codebase at src/native/occt-bridge/, and a Supabase Edge Function pipeline exists in supabase/. Neither is part of the working Phase 0 conversion path. The OCCT bridge is reserved for a later phase; the cloud function is currently non-functional for the reasons above.
Four layers, cleanly separated: an Express engine, an Electron shell that owns process lifecycle, a React client, and a set of Python helpers for the drawing-format edge cases.
| Layer | Technology | Location |
|---|---|---|
| Backend engine | Node.js + Express | server.js, src/routes, src/controllers, src/services |
| Core JT logic | Binary engine, TOC parser, kinematics, property atoms | src/lib/jt-forge/ |
| DWG/DXF pipeline | Format conversion into the JT writer | src/lib/dwg-pipeline/ |
| Desktop shell | Electron, contextIsolation on, nodeIntegration off | electron/main.js |
| Client | React + Vite + Tailwind | client/ → client/dist |
| Native bridge (reserved) | C++17, OpenCASCADE (OCCT), node-gyp | src/native/occt-bridge/ |
| Format helpers | Python, DXF extraction, STL/STEP conversion | scripts/dxf-extract, scripts/stl2step.py |
| Data store | Supabase Postgres (RLS) + Storage | supabase/ |
The test suite runs entirely against the local conversion pipeline. It needs no Supabase connection and no network access, which keeps it fast and keeps the result honest about what it is actually checking. It includes real-file integration tests: a binary DWG through dwg2dxf, a damaged DWG through the dwgread JSON rebuild, and block INSERTs becoming named child nodes in the output assembly. The figures below are from a run on 2026-08-18, not from documentation.
Phase 0 is built, tested and running on the machine it was written for. Getting there took four rounds of field testing on a Windows 7 SP1 workstation, and produced a specific class of bug: the application failed silently on the target while passing on every developer and CI machine. Five of those landed in four days. Each fix is paired with a check that fails the build rather than the customer.
DWG and DXF to JT 8.1 with zero OpenCASCADE, 318 tests passing offline across 25 files, no cloud dependency on the active path.
Frozen Python sidecars needed a Windows box or CI, and the organisation account was billing-locked. A staging script downloads a sha256-pinned 32-bit Python 3.8.10 and ezdxf from macOS straight into the build, which is what made a converting executable shippable at all. The executable grew from 62 to 75 MB.
Written JT files opened and rendered correctly in JT2Go 13.1.0 and Siemens Process Simulate across six review rounds with a named human tester, with exact scale verified in Process Simulate.
An installer that lets the user choose a location, since the portable executable self-extracts to Temp, and an export-folder picker.
Not a platform demo. A working converter, proven on the hardware it actually has to run on: 19,210 entities in a single architectural DWG, 0 skipped, 217k triangles, 156 of 156 hatches.
Client project, in acceptance testing