L Loom conversational CAD
Release · v0.1.0 · Rhino 8 / Grasshopper

Conversational
CAD.

Two plugins. One model. Speak geometry into existence on the Grasshopper canvas and the Rhino scene — no more hand-wiring definitions or hunting through menus.

  • 2surfaces
  • 6tool calls
  • ~0.2 smedian apply
v0.1.0 live Food for Rhino €10/mo · 14-day trial
§ 01

Two surfaces,
one vocabulary.

A

Loom

Grasshopper component

Drop a single component on the canvas. Feed it a prompt. It adds sliders, panels, circles, trees — and wires them up. Two-pass execution: add/remove, then move/set/connect.

B

Loom

Rhino command

A Loom command in Rhino. Type a prompt, the model returns a Python snippet, it runs on the active document. Edits curves, surfaces, layers, blocks — geometry you can immediately orbit around.

rhino> Loom
 Make a 12×8 grid of spheres on a
  sine-modulated plane, radius 0.4.
→  generating…
→  96 spheres added to layer "grid".
✓  done in 1.4s
§ 02

How it works.

  1. 01

    Describe

    A prompt goes in. The plugin serializes the current canvas or scene as plain text — components, parameters, layers, selection.

  2. 02

    Plan

    The model returns a structured tool-call plan. No raw JSON to parse, no regex. Each call is a typed operation with a schema.

  3. 03

    Apply

    Pass one: add/remove. Pass two: move/set/connect. The canvas (or document) is mutated in a single, undoable batch.

§ 03

In practice.

Prompt

“Add a number slider for the radius, add a circle, and wire the slider to the circle’s radius.”

Plan · 3 calls
add_component  Number Slider  nickname=R  (100,200)  {min:0 max:10 value:5}
add_component  Circle         nickname=C  (400,200)
connect        R.out  →  C.radius
Prompt

“Create a 12×8 grid of spheres on a sine-modulated plane.”

Plan · 1 call
Loom → python
  for x in 12×8 grid:
      y = sin(x*0.4) * 0.8
      rs.AddSphere((x, y, 0), 0.4)
Prompt

“Add a panel that displays the area of the largest closed curve on the canvas.”

Plan · 4 calls
add_component  Area            nickname=A     (300,100)
add_component  Largest         nickname=L     (500,100)
add_component  Panel           nickname=Area  (700,100)  text="—"
connect        C.out  →  L.curve
connect        A.out  →  L.area
connect        L.area →  Panel.text
§ 04

Get Loom.

Trial

0

14 days · full access

  • Grasshopper & Rhino surfaces
  • Unlimited generations
  • Bring your own OpenCode Go key
  • No credit card required

Studio

29/mo

up to 5 seats

  • Everything in Personal
  • 5 simultaneous seats
  • Priority email support
  • Volume license keys
Choose Studio

Lifetime · one-time

Pay once.
Use forever.

All current and future features. No subscriptions, no renewals. Updates included for major versions. Personal-tier seats; upgradable to Studio later.

349once

vs €108/yr on Personal · pays for itself in ~3.2 years

Buy Lifetime

Available now on the official McNeel directory.

Get on Food for Rhino

Mac & Windows · Rhino 8 · 14-day trial included · cancel anytime

Before you start. You'll also need an OpenCode Go subscription for the LLM backend (€5 first month, €10/mo after). Sign up at opencode.ai and drop your key in a .env next to the plugin — Loom picks it up automatically.