<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh" -->

---
title: FreeCAD in your browser — magik.net | daily.dev
description: FreeCAD, a parametric 3D CAD application with ~1.5M lines of C++ and 700K lines of Python, has been ported to run in a browser tab via WebAssembly. The port...
canonical: https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: FreeCAD in your browser — magik.net | daily.dev
og:description: FreeCAD, a parametric 3D CAD application with ~1.5M lines of C++ and 700K lines of Python, has been ported to run in a browser tab via WebAssembly. The port...
og:url: https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh
og:image: https://api.daily.dev/og/posts/MThO9x3kH.png
og:image:alt: FreeCAD in your browser — magik.net
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# FreeCAD in your browser — magik.net

**[Hacker News](https://daily.dev/sources/hn)** · 18 min read · 2 upvotes · 1 comments

## Summary

FreeCAD, a parametric 3D CAD application with ~1.5M lines of C++ and 700K lines of Python, has been ported to run in a browser tab via WebAssembly. The port required compiling Qt 6.11 from source with JSPI support, cross-compiling OpenCASCADE, CPython 3.14, PySide6/shiboken6, VTK 9.3, and SMESH to wasm, and writing a fixed-function OpenGL emulator over WebGL2. Key challenges included handling 185+ modal dialog exec() sites via JSPI stack suspension, resolving wasm exception encoding mismatches with a Binaryen post-link pass, getting PySide6 running statically under wasm for the first time, and debugging memory-safety issues in Qt's async event pump. The result is a 96 MB compressed first load supporting 17+ workbenches including FEM with real mesh geometry. Notably, the engineering work was performed almost entirely by an AI agent (Fable/Claude Code) across 4 days, 3 sessions, 15 multi-agent workflows, and 159 sub-agent invocations, with the human providing direction, bug reports, and environment access.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://magik.net/freecad>

## Questions this post answers

### Why can't FreeCAD use a prebuilt Qt-for-wasm the way LibreCAD did?

FreeCAD relies heavily on modal dialogs — 185 C++ exec() sites plus 156 more in Python — and blocking code like QDialog::exec() can't be mechanically rewritten into callbacks. The only way to preserve that semantics is to suspend the wasm stack while a dialog is open, which requires WebAssembly JSPI, and JSPI requires a Qt built from source with -feature-wasm-jspi rather than a prebuilt Qt-for-wasm package.

_Anyone weighing JSPI-based porting strategies for desktop GUI apps can track deep technical writeups like this on daily.dev._

### What browsers support running the FreeCAD WebAssembly port?

Only recent Chromium-based browsers work, specifically Chrome or Edge version 137 and above, because the port depends on WebAssembly JSPI (JavaScript Promise Integration), which Firefox and Safari do not yet ship. First load transfers roughly 96 MB compressed via Brotli, cached by the browser afterward.

_Developers tracking browser support for cutting-edge wasm features like JSPI can follow updates on daily.dev._

### How was PySide6 and shiboken6 gotten to work under WebAssembly for the first time?

Shiboken6 and PySide6 were built statically with no dlopen against a wasm-compiled CPython, and Python's Gui.getMainWindow() was made to return a live PySide6 QMainWindow that round-trips to the real C++ window. This was a multi-week subproject and is described as the first known wasm build of PySide6/shiboken6, unlocking all Python-based FreeCAD workbenches.

_Engineers exploring Qt Python bindings in unconventional runtimes can find deep technical breakdowns like this on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@doncho** · 0 upvotes

> The whole article does not mention how many tokens/USD that effort costs. This means that someone else paid a dear price to have it done.
>
> Hopefully, that one knows what they're doing, as I do not see anything else but "we can do it, too" as a learning from it.

## Similar posts on daily.dev

- [Waterfall CAD Playground](https://daily.dev/posts/waterfall-cad-playground-2l8zehnkh) · Lobsters · 0 upvotes · 0 comments
- [SolveSpace 3.2 3D CAD Tool Adds Qt Frontend, Experimental Web Version](https://daily.dev/posts/solvespace-3-2-3d-cad-tool-adds-qt-frontend-experimental-web-version-ovug0mp7b) · Phoronix · 0 upvotes · 0 comments
- [Parametric CAD for everyone](https://daily.dev/posts/parametric-cad-for-everyone-x34089fcm) · Hacker News · 1 upvotes · 0 comments
- [FreeCAD: Your own 3D parametric modeler](https://daily.dev/posts/freecad-your-own-3d-parametric-modeler-gvgldjh6m) · Hacker News · 0 upvotes · 0 comments

---

Tags: [#ai-agents](https://daily.dev/tags/ai-agents), [#webassembly](https://daily.dev/tags/webassembly), [#cpython](https://daily.dev/tags/cpython)

[View this post on daily.dev](https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"FreeCAD in your browser — magik.net","url":"https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh"},"datePublished":"2026-07-11T01:54:22.370Z","dateModified":"2026-09-14T08:01:43.055Z","description":"FreeCAD, a parametric 3D CAD application with ~1.5M lines of C++ and 700K lines of Python, has been ported to run in a browser tab via WebAssembly. The port...","image":"https://media.daily.dev/image/upload/s--2-1xRawN--/f_auto/v1722860399/public/Placeholder%2011","thumbnailUrl":"https://media.daily.dev/image/upload/s--2-1xRawN--/f_auto/v1722860399/public/Placeholder%2011","isAccessibleForFree":true,"articleSection":"Hacker News","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Hacker News","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/hn","url":"https://daily.dev/sources/hn"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":2},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"ai-agents,webassembly,cpython","timeRequired":"PT18M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Hacker News","item":"https://daily.dev/sources/hn"},{"@type":"ListItem","position":3,"name":"FreeCAD in your browser — magik.net"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh","comment":[{"@type":"Comment","text":"The whole article does not mention how many tokens/USD that effort costs. This means that someone else paid a dear price to have it done.\nHopefully, that one knows what they’re doing, as I do not see anything else but “we can do it, too” as a learning from it.","datePublished":"2026-07-12T07:43:31.218Z","url":"https://daily.dev/posts/MThO9x3kH#c-M01weOGOH","author":{"@type":"Person","name":"Doncho Angelov","url":"https://daily.dev/doncho","image":"https://media.daily.dev/image/upload/s--j1MSm0hy--/f_auto/v1716369534/avatars/avatar_EB0j0Umzh5v3zGWUSL5ma"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/freecad-in-your-browser-magik-net-mtho9x3kh#faq","mainEntity":[{"@type":"Question","name":"Why can't FreeCAD use a prebuilt Qt-for-wasm the way LibreCAD did?","acceptedAnswer":{"@type":"Answer","text":"FreeCAD relies heavily on modal dialogs — 185 C++ exec() sites plus 156 more in Python — and blocking code like QDialog::exec() can't be mechanically rewritten into callbacks. The only way to preserve that semantics is to suspend the wasm stack while a dialog is open, which requires WebAssembly JSPI, and JSPI requires a Qt built from source with -feature-wasm-jspi rather than a prebuilt Qt-for-wasm package. Anyone weighing JSPI-based porting strategies for desktop GUI apps can track deep technical writeups like this on daily.dev."}},{"@type":"Question","name":"What browsers support running the FreeCAD WebAssembly port?","acceptedAnswer":{"@type":"Answer","text":"Only recent Chromium-based browsers work, specifically Chrome or Edge version 137 and above, because the port depends on WebAssembly JSPI (JavaScript Promise Integration), which Firefox and Safari do not yet ship. First load transfers roughly 96 MB compressed via Brotli, cached by the browser afterward. Developers tracking browser support for cutting-edge wasm features like JSPI can follow updates on daily.dev."}},{"@type":"Question","name":"How was PySide6 and shiboken6 gotten to work under WebAssembly for the first time?","acceptedAnswer":{"@type":"Answer","text":"Shiboken6 and PySide6 were built statically with no dlopen against a wasm-compiled CPython, and Python's Gui.getMainWindow() was made to return a live PySide6 QMainWindow that round-trips to the real C++ window. This was a multi-week subproject and is described as the first known wasm build of PySide6/shiboken6, unlocking all Python-based FreeCAD workbenches. Engineers exploring Qt Python bindings in unconventional runtimes can find deep technical breakdowns like this on daily.dev."}}]}
```

