Inspiration
During a research internship, I spent weeks reconstructing a THz-range MEMS switch from a published paper in a commercial full-wave EM tool — matching an OFF-state isolation target above 12 dB across a wide frequency sweep. For a long stretch, my OFF-state simulation was simply wrong: the isolation wasn't there because a contact/gap element in the geometry wasn't forming the way I assumed, and the model was quietly returning a plausible-looking but physically meaningless result. Tracking that down — realizing a simulation can look done and still be lying to you — left a mark. Around the same time, I was reading about ML-generated antenna and metasurface geometries that look almost like pixelated noise or QR codes, geometries no human would sketch, that genuinely outperform conventional designs. Two ideas collided: AI can clearly find real electromagnetic designs humans wouldn't try, but the tools that could combine that with a solver you can actually trust are locked behind five-figure licenses. I wanted to build the thing in between.
What it does
EM-assist Studio is a cross-platform desktop electromagnetic simulator built on a finite-element core — Nédélec edge elements for the vector fields, verified with measured convergence orders against manufactured solutions, not just "it runs." On top of that: lumped ports and RLC boundary elements, full S-parameter extraction with Touchstone export, analytical single-mode waveguide ports, arbitrary-geometry import through Gmsh's OpenCASCADE kernel so you're not limited to boxes, and a small ONNX surrogate for fast pixelated-patch design search. GPT-5.6 sits on top as a real design agent: describe a target — "a cavity resonant at 8.2 GHz" — and it reasons about the physics, proposes parameters grounded in real design equations, and drives an actual numerical optimizer against the solver until the result converges. It never just tells you a number. It only ever reports one the solver has actually computed.
How we built it
The entire project was built with Codex, in deliberate phases: get a verified solver core first, add capability — ports, S-parameters, geometry import — one piece at a time with its own test before moving to the next, and only then wire in the AI layer. The governing rule is written down explicitly in the repo's AGENTS.md: any change to solver physics ships with a test that would fail if the change were wrong, and nothing gets marked "supported" in the product until it's verified, not just implemented.
Challenges we ran into
The most honest one: partway through, I found the "AI design assistant" wasn't calling GPT-5.6 at all — it was a hardcoded heuristic picking between a few canned scenarios that just looked like an agent. Catching that and replacing it with a real API integration was the single most important fix in the project, and a direct echo of that internship lesson: a result that looks finished isn't the same as a result that's actually correct. On the physics side, adding an open-radiation boundary (PML) turned out to require a full anisotropic tensor extension to the solver's assembly, far bigger than expected — the only safe path through was decomposing it into steps, each one checked by forcing it to reduce back to the already-trusted isotropic case before layering anything new on top. Integrating external tools like Gmsh also meant being careful from day one about licensing — running them as isolated subprocesses rather than linking them, so the project stays permissively licensed without cutting corners.
Accomplishments that we're proud of
Getting the core solver to reproduce textbook convergence orders — ( O(h^2) ) in ( L^2 ) for the electrostatic path, first-order for the Nédélec curl-curl formulation — against an independent manufactured solution before any feature work started. Catching the fake agent before it shipped, and replacing it with genuine GPT-5.6 tool-calling that proposes objectives and parameters for a real optimizer to verify. Keeping every unimplemented capability honestly marked unsupported in the product itself, including our own open-radiation boundary, rather than letting the UI imply more than the physics actually delivers. And getting a real cross-platform desktop app — not a browser demo — packaged and running with a genuine external CAD geometry pipeline behind it.
What we learned
The biggest one: an LLM is a poor electromagnetics solver and a genuinely good electromagnetics orchestrator. The moment we stopped asking GPT-5.6 to guess at physics and started asking it to choose objectives and parameters for a real deterministic optimizer to check, the system got more capable and more trustworthy at the same time. Verification isn't a tax on AI-assisted engineering — it's what makes it worth trusting at all.
What's next for EM-assist
Finishing open-radiation support so real antenna design is possible, multi-mode waveguide ports beyond the current single-mode limit, generalizing lumped elements to arbitrary imported geometry, and eventually fine-tuning on real usage logs from the agent itself, now that it's making real calls worth learning from.
Built With
- c++
- cmake
- codex
- github-jobs
- gmsh
- gpt-5.6
- onnx
- opencascade
- python
- pytorch
- react
- recharts
- rust
- tailwindcss
- tauri
- typescript

Log in or sign up for Devpost to join the conversation.