One HTML file. No install, no account. iPad and desktop, stylus welcome.
bornMarch 1, 2026·currentv00000-045 · July 2026
Dev build, not final — v00000-045. A loft surface, control-point and degree/knot properties live in the panel.
Unreason is a design and collaborative coding exercise that takes the form of a hybrid 3D modeler. It runs in the browser — one HTML file, iPad and desktop, stylus welcome.1 It borrows modeling paradigms from several commercial tools and folds in several of our own experiments, and it is not trying to replace any of the tools it borrows from.2
It's teaching-oriented and learning-oriented, and I mean both directions — it's built to put in front of students, and it's how I learn what these systems actually are by building them.
1 Single-file PWA, no install, no account, no build step.
2 Rhino will still be Rhino. Unreason is a place to try the ideas Rhino can't easily try.
Unreason started as a native Swift app — one of the first things I tried to build when I started working with Claude, and probably overambitious for both of us at the time. We paused it rather than killed it. The custom geometry kernel started there, and when we came back to the project the kernel came with us into the web version.3
The native Swift build, paused rather than killed. The geometry kernel it proved out came with us into the web version.
3 The pause turned out to be the useful part. The second version knew what it was for.
There are good web modelers built on Open CASCADE now,4 and the reasonable question is why we didn't do that. The short answer is that taking something mature and making it do new things can be harder than building the new things in from the start.
The specific thing we wanted from the start is a history system that is implicit and explicit at once — a fairly traditional history stack of the kind Rhino users would recognize, running in parallel with a node canvas that gives you explicit control over the same graph.5 That's a foundation decision, not a feature. A mature B-rep kernel assumes its own history model all the way down, and retrofitting a second, parallel mode of control into that assumption is the kind of work that fights you forever. Building it in from day one is why everything after it has slotted in cleanly: subdivision surfaces came in as a new object type without rearchitecting anything, and the field-based work we're planning next6 gets the same treatment.
Dev build, not final — v00000-045. The same object as above, in UnWire — one graph, two live views.
4 Serpentine3D is a nice recent one.
5 The node canvas is called UnWire. Fewer nodes than Grasshopper, each one more powerful — a deliberate trade, discussed below.
6 An integration of Glisten, our SDF sketch modeler — implicit field geometry living in the same history graph as the NURBS and SubD objects.
7 Degree, knots, continuity — evaluated properly, not approximated with meshes and vibes.
8 I don't know of another modeler that treats copy-paste as a relationship instead of a one-time duplicate. This one is only possible because we own the whole history graph.
9 It's open source. If you want a new tool, you don't write a plugin — you write it into your copy of the app. The fork is the plugin system.
10 There is drafting, but it aims at simple, mostly-automatic spec sheets a student can hand over — a template system, not the level of detail you'd use to specify a building.
11 By design: fewer nodes, each more powerful. The cost is that they're harder to recombine into things we didn't anticipate. Grasshopper optimizes for the opposite and is very good at it.
Unreason is in active development — the surfacing and trim tools have gone further than the plan expected, Rhino file exchange hasn't started yet, and the fall semester is still the near-term target for a teachable core.