Hi everyone,
I’m an architecture student, and this last semester I have been working on my bachelor’s seminar paper on the topic of topology optimization in architecture. I’m a Mac user, and one thing that bothered me while writing my paper is that there aren’t really many good options to run topology optimization on macOS… That’s why I naively decided that I’m going to build my own tool for running TO inside of Grasshopper, since Rhino is my favorite 3D-modeling software. The result is Diatom; it’s free and open source (MIT), and it runs directly inside Rhino 8 Grasshopper rather than as a separate app you export to and from.
It’s built on top of PyTopo3D (Jihoon Kim and Namwoo Kang — paper here: [2504.05604] PyTopo3D: A Python Framework for 3D SIMP-based Topology Optimization), which does the actual SIMP optimization. Diatom adds the Grasshopper side with a few new features, which do not exist in the original PyTopo3D code. There are components for domain/supports/loads, a solver that runs in the background so Rhino doesn’t lock up, a live preview of the design as it converges in the viewport, and a few things I found useful along the way, like setting the minimum member size in actual model units instead of voxel counts.
Before you check Diatom out, please read this: I’m an architecture student, not a programmer, and this project was my first real coding experience with Python. All of the code was written with the help of agentic AI models (Claude Fable 5, Opus 4.8, Opus 5). Quite honestly, if these tools didn’t exist, I probably would have never even thought of making my own tool in Grasshopper. I intentionally wanted to make Diatom as simple as possible, without going through the hassle of packaging it as a compiled C# component, because I believe I shouldn’t be pushing an AI slop plugin out there. That’s why Diatom is simple. It’s basically a collection of Python scripts and packages pretending to be a plugin, which is exactly what I personally needed. I decided to make it fully open-sourced and publish it on GitHub because I want to provide people using Mac computers with the ability to run TO inside of Rhino. I know there are some people out there that are willing to try it out because I myself was one and have been looking for such options for a long time now. My secondary goal is to attract people who would be interested in potentially building an actual Grasshopper plugin, which works on macOS and has the capabilities of plugins like Millipede and tOpos. If you think you’re that person, feel free to check out Diatom, play around with it, fork it, upgrade it, or do whatever you want with it. I’d love to hear that someone got inspired and built an alternative to tOpos for Mac!

An optimization run using Diatom, which took 226 seconds to complete on an M2 Pro with 16 GB of unified memory (the total iteration count was capped at 30). The final frame is the baked result coming straight out of Diatom, with no post-processing.
Diatom is roughly laid out as follows: Domain/Supports/Loads feed into a Model component, which feeds the Solver, which outputs to Result – plus a few optional components for settings, live preview and GIF export. The domain can be any closed Brep or mesh, not just a box, and you can wire in multiple load regions each pulling in its own direction.
A diagram illustrating how a Diatom definition flows.
To install it, you run the install.sh on Mac, install.ps1 on Windows. These scripts do not need admin/sudo, and finish with a self-test so you know right away if something didn’t set up correctly. You need about 1.5GB of disk space for the Python environment.
Two more things to note before anyone installs it. First, I’ve only actually run this on Apple Silicon Macs. The Windows path exists since PyTopo3D is originally built for Windows, but I haven’t been able to test it on real hardware, so if anyone’s on Windows and willing to try it, I’d like to know whether it works. Second, the physics is dimensionless, so this is meant as a form-finding tool rather than something to verify a structure with, so please run your own FEA before building anything off what comes out of it. That being said, I’ve already done some 3D-printed tests of output geometries, and they turned out quite nice and functional. ![]()
There’s also no Heaviside projection with beta continuation, so on some models (branching ones especially) you’ll get a thin membrane where you’d expect a clean gap. Raising the penalization setting usually clears it – there’s a worked example of this in the repo. If you have no idea what any of that means, I (with the help of my dear friend Claude) tried to explain it in the README.md.
Here is the link to the GitHub repo: GitHub - vaglyarov/Diatom: 3D SIMP topology optimization for Rhino Grasshopper, on Apple Silicon · GitHub
One last thing, I do not intend to keep this project active. Coding is not really my priority, and maintaining such a project would be way too big of an undertaking. I’d be happy to answer questions and maybe fix some small bugs, but it’s very unlikely that I’ll push any major new features. If anyone’s interested in maintaining Diatom/porting the core to a compiled C# component at some point, feel free to fork the repo. Still, I’d love to hear from you! Have fun playing around with Diatom!
