Unreason

One HTML file. No install, no account. iPad and desktop, stylus welcome.

bornMarch 1, 2026·currentv00000-045 · July 2026

Unreason web build — a loft surface with degree/knot/control-point properties live in the side panel

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

Unreason3D — the paused native Swift version of the app

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.

UnWire node canvas showing the same loft surface as a live, editable node graph — SketchCurve, an offset constraint, and the Loft, wired together above a Sheet View of the perspective viewport

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.

Things Unreason does that mature modelers also do

  • NURBS curves and surfaces — the real math7
  • Subdivision modeling (Catmull-Clark), cage and limit surface
  • Loft, sweep, extrude, pipe, revolve, the usual surfacing verbs
  • Trims and booleans, built incrementally
  • Parametric history — change an input, the model updates
  • Undo/redo that actually respects the history graph

Things Unreason does that those modelers typically don't

  • Implicit and explicit history at once — the command stack and the node canvas are two views of one graph, both live
  • Linked copy-paste — paste a curve or surface and it keeps a live parent-child link back to its source; edit the source and the copies update, until you choose to break the link8
  • A coaching layer that steps in when something looks wrong — a twisted sweep, a bad revolve axis — and explains what happened in plain language, not just an error
  • Field-based (SDF) geometry planned as a first-class citizen of the same history graph, not an import/export neighbor6

Things we are not doing

  • A plugin system9
  • Detailed, customizable drafting10
  • A node system as open-ended as Grasshopper11
  • Real-time collaboration, accounts, cloud anything
  • Native desktop builds — the browser is the platform

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.