Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A successful compile and link proved that FreeCAD’s code could be built for WebAssembly; it did not prove that a person could use the application in a browser. The hard work came after that milestone: making real clicks reach dialogs, keeping asynchronous Qt event handling safe, translating legacy graphics behavior, and replacing native assumptions about memory, threads, processes, and files. Two 2026 project accounts illustrate those challenges, but they describe separate builds: Virtastic’s FreeCAD Web 1.0 is presented as wasm64, while magik.net’s implementation is wasm32.

Why a successful build was only the starting point

For a desktop application, “it builds” usually means the compiler and linker accepted the code and produced an executable. In a browser port, that result says little about whether the application can respond to user input, render its interface and model correctly, or complete a real workflow. The browser supplies a different execution environment, and WebAssembly itself specifies module imports rather than a universal set of host APIs or system calls. The WebAssembly portability page describes wasm64 as supporting linear memory above 4 GiB through 64-bit pointers or indices; it does not make browser APIs or native operating-system facilities appear automatically.

Virtastic’s September 22, 2026 release account says its FreeCAD Web 1.0 effort involved 1,031 commits and an 8,500-line patch set across 18 upstream trees. That scale is a useful signal of the integration work involved, not an independent measure of quality. The separate magik.net technical account describes its own wasm32 implementation and its own debugging history. Their results should not be read as successive releases of one port.

What failed when someone actually used the interface

Dialogs and event loops

Virtastic reports that scripted checks could pass even while dialogs failed to open from real clicks. Its account points to JSPI’s restrictions on which exports may suspend, Qt WebAssembly keyboard-focus behavior, incomplete GL emulation, and browser caching as sources of problems. These failures sit beyond compilation: a click must enter the right event path, the UI must yield and resume correctly, and the browser must preserve the state needed to finish the interaction.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The magik.net account describes a related but distinct Qt issue. Combining libraries into one module exposed C++ static-initialization ordering problems. Qt’s WebAssembly platform plug-in also needed exported functions and a suspendable event loop for modal exec() calls. An early Qt message handler helped that project identify the event-loop problem. A linked GUI library, therefore, was not evidence that modal UI behavior worked.

Asynchronous workflows and object lifetime

The magik.net account traces crashes during CAM/BIM activation and STEP import to modal dialogs being invoked inside an asynchronous activation pump. It also describes a dangling Qt focus-proxy pointer after a widget was deleted later than expected; the reported fix was a liveness guard. These are implementation-specific diagnoses, but they show why a port must be tested through complete, asynchronous user workflows rather than just startup or scripted dialog checks.

Why the model did not render correctly

FreeCAD’s Coin3D rendering path uses legacy OpenGL patterns, including matrix stacks and immediate-mode calls. WebGL2 does not provide those fixed-function behaviors directly, so the magik.net implementation describes building an emulator and compositing through an offscreen framebuffer. Reaching a draw call was only part of the problem: depth-clear defaults, rejected legacy queries, overlays, missing draw calls, and stale scratch VBO bindings each produced additional failures.

The same account reports that correcting the vertex-array path changed rendering from roughly 1.3 frames per second on the immediate-mode path to interactive behavior. It also reports about a 22% improvement on a simple-scene rendering spin after performance work. Those are figures from magik.net’s own account and workloads, not independently verified benchmarks or comparisons with Virtastic’s wasm64 build. They illustrate a broader point: a renderer can compile, link, and display something while still being functionally incomplete or too slow for practical use.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How ABI and exception mismatches became runtime traps

WebAssembly makes interface assumptions visible at runtime. In one magik.net failure, FEM parsing of .vtu files triggered an indirect-call trap because the bundled expat library and its consumers disagreed about the XML_Size ABI. Aligning the generated header resolved that mismatch. The lesson is not simply to inspect source declarations: generated headers, compiled libraries, and consumers must agree on the actual types and calling conventions crossing a module boundary.

The same account describes migrating from Asyncify and JavaScript exceptions toward JSPI and native exceptions. Mixed legacy and newer WebAssembly exception encodings were rejected by V8; the project reports using a Binaryen post-link normalization step and wrapping JavaScript callbacks as the remedy. Emscripten’s documentation treats exception behavior and JavaScript BigInt integration as build/runtime compatibility choices, rather than details that can safely be assumed from a successful link.

What had to change beyond the GUI and renderer

A browser is not a desktop operating system with a different window. Native assumptions about process creation, threading, dynamic loading, filesystem access, networking, and available memory must be checked individually. The magik.net account reports serializing work that expected threads, replacing child-process behavior, registering Python modules statically rather than relying on dlopen, and adjusting resource paths and startup order.

FEM also required more than enabling a workbench. The magik.net account says its implementation first separated document restoration from mesh dependencies, then compiled a VTK data-model subset and SMESH-related components. The expat ABI mismatch surfaced during this work. Virtastic, by contrast, lists single-threaded CalculiX as a limitation of its browser release. That specific limitation belongs to Virtastic’s build; it should not be generalized to the separate wasm32 project.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

What the two 2026 browser builds report

The figures below come from the projects’ own published accounts. They are not results from a common test setup, so differences do not establish which implementation is faster or more capable under matched conditions.

Area Virtastic FreeCAD Web 1.0 magik.net implementation
WebAssembly target Described as wasm64 in the September 2026 release account Described as wasm32 in the July 2026 technical account
Memory ceiling 16 GB stated ceiling, according to Virtastic 4 GB stated ceiling, according to magik.net
Initial module/download size About 115 MB initial download, according to Virtastic 196 MB raw module, according to magik.net; this is not the same size measure as an initial download
Browser requirement Chrome or Edge 137 or newer; Virtastic says Firefox and Safari are refused because, according to its article, they do not yet ship the required JSPI support Chrome or Edge 137 or newer, according to magik.net
Interaction and workbench coverage Virtastic reports all 20 workbenches activating on first click and about 500 upstream unit tests passing in-browser Not stated in the magik.net account as a comparable all-workbench or upstream-test result
Rendering evidence No directly comparable rendering benchmark stated in the release account About 1.3 fps before a reported vertex-array fix, then interactive behavior; about 22% improvement on a simple-scene spin after performance work, per magik.net
FEM and solver evidence Virtastic reports FEM meshing and solving in the tab and results within 1% of beam theory across several FEM cases; CalculiX is single-threaded The account describes FEM-related component work and a .vtu parsing ABI fix; no matching beam-theory validation figure is stated
File and session behavior Virtastic says documents remain in browser storage until sharing starts; shared-session documents are stored unencrypted on the session server Not stated in the magik.net account as a comparable local-storage or sharing policy
Example workload A 42 MB, 34-part project reportedly opened in about 20 seconds; an 18 MB STL reportedly opened in about 5 seconds, according to Virtastic No matching workload and timing stated

The table’s “not stated” entries mean the cited project account does not provide a directly comparable figure; they are not evidence that a feature is absent. In particular, wasm64’s ability to address more than 4 GiB is an architectural capability, not a guarantee that a browser build can use that much memory. Virtastic’s 16 GB ceiling is a stated limit for its build, not a general wasm64 limit.

What the reported validation does—and does not—establish

Virtastic reports about 500 upstream unit tests passing in the browser, all 20 workbenches activating on first click, and FEM results within 1% of beam theory across several cases. These are useful claims about that publisher’s FreeCAD Web 1.0 build and stated tests. They are not independent audits, and they do not establish the behavior of magik.net’s wasm32 implementation. Nor do unit tests alone demonstrate that every supported browser input path, graphics feature, file format, or long-running workflow behaves correctly.

The projects’ own performance numbers also have different measures and workloads: one describes initial transfer and file-opening examples, while the other describes rendering behavior and a simple-scene spin. Without common hardware, browser settings, test files, and procedures, those figures should not be turned into a head-to-head ranking.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A practical checklist for evaluating a browser port

  • Exercise real input paths. Open dialogs and menus from mouse and keyboard input, then check focus, modal behavior, and return from suspended work.
  • Run full workflows. Test activation, import, editing, save/restore, and failure recovery rather than relying on startup checks or scripted calls alone.
  • Validate rendering behavior. Check geometry, depth, overlays, selection, and redraws, then measure performance on named workloads.
  • Audit boundaries and generated artifacts. Confirm ABI types, pointer widths, exception configuration, JavaScript interop, and generated headers match across libraries and callers.
  • Replace unavailable host assumptions explicitly. Identify uses of threads, child processes, dynamic loading, resources, networking, and filesystem APIs; decide how each maps to browser behavior.
  • Keep results scoped to the tested build. Record the WebAssembly target, browser/version, feature flags, test procedure, and workload alongside every compatibility or performance claim.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.