Labs · Timber Shell Studio

The architect shapes the horn. The engineer watches it turn red.

A browser tool with 2 layers on 1 model. Layer 1 is form: 14 sliders that bend a glulam rib shell into a horn. Layer 2 runs a frame analysis on every rib and purlin and checks each one against EN 1995-1-1 as you drag.

Chiang Ning · October 2026 · Concept design study
Open Timber Shell Studio → Open the carport study →
Timber Shell Studio: on the left, the horn shell in timber and glass from the architect layer; on the right, the same ribs coloured by Eurocode 5 utilisation in the engineer layer
Left, Layer 1 at its defaults. Right, Layer 2 with wind suction raised to 1.6 kN/m²: η max 0.80, nothing failing yet.
Contents
  1. Where it started
  2. 2 layers, 1 model
  3. How to drive it
  4. What's under the sliders
  5. The numbers at the defaults
  6. What it won't tell you

01Where it started

It started with a 40 second screen recording on LinkedIn.

A structural engineer had rebuilt the Grasshopper experience in their own web app (no Rhino), with a homemade FEM solver underneath. They credited Ahmed Zakzouk for the idea. Drag a slider and a wavy timber carport reshapes, and every member re-checks itself against Eurocode 5.

I rebuilt that video first, to see how far a single session could get. The result is the carport study linked above: 2,004 members, 4,074 degrees of freedom, solved in about 230 ms. Push the snow load from 0.68 to 1.40 kN/m² and the worst bottom chord goes from η 1.08 to 2.37.

Then I wanted an architect's version. The starting point was a photograph of a timber model: a ribbed glasshouse shaped like a horn, with arched ribs fanning around a narrow neck and opening into a tall tilted mouth. I wrote down the rule I could see in it and built a generator that makes that whole family of shapes.

022 layers, 1 model

Architects and engineers usually trade the same building across a gap of days. I wanted both on 1 screen, each with its own controls, sharing 1 set of geometry.

LayerWho drives itWhat you see
1 ArchitectForm and skin14 form sliders, 3 skin sliders, timber ribs, glass, mullions and a reflecting pool. Quantities update live: floor area, glazed area, height, mouth opening, timber volume and an indicative cost. No analysis runs here, so dragging stays instant.
2 EngineerSections and loadsThe form arrives as 1 locked "Horn" input. Rib, purlin and mouth ring sizes, glazing, live and wind loads, glulam grade, service class and base fixity. Members go green, yellow or red by utilisation, with animated deflection and a full worked check on any member you click.

If the architect stretches the mouth past what the ribs can carry, the engineer sees it the moment they switch layers.

03How to drive it

  1. Shape it in Layer 1. Start with Neck position, Mouth height and Mouth tilt; they change the character fastest. Flare decides how suddenly the horn opens, and Profile moves the arches from pointed (1.4) to almost square (4.0).
  2. Switch to Layer 2 (top left). The analysis runs straight away on the shape you left.
  3. Load it. Raise wind suction or live load and watch the colours move. Anything over η = 1.0 turns red, and the Results card counts it.
  4. Click a red member. The panel lists all 11 checks, sorted worst first, with the internal forces and every step of the governing calculation.

Drag the grid behind the sliders to pan, scroll to zoom, and drag any card by its title. The wire from the slider you're moving lights up.

04What's under the sliders

The geometry rule

Each rib is a superellipse arch standing in a vertical plane. The planes fan around 1 centre point and step along a spiral spine, so the ribs crowd together on the inside of the curve and open out on the outside. Span and height flare away from the neck in both directions (a tail bell and a mouth bell), and the last ribs lean forward so the mouth ring tilts open.

The analysis

Every rib segment and purlin is a 3D Euler-Bernoulli frame element with 12 degrees of freedom and rigid joints. Nodes are renumbered with Reverse Cuthill-McKee to keep the stiffness matrix narrow, then a banded Cholesky factorisation solves all 4 load combinations from 1 factorisation. It's plain JavaScript, with no library behind the maths.

CombinationFactorskmod duration
CO1 ULS1.35 GPermanent
CO2 ULS1.35 G + 1.5 QShort-term
CO3 ULS1.0 G + 1.5 W (suction)Instantaneous
CO4 SLSG + Q, characteristicDeflection only

G is self-weight (member volume × ρmean) plus glazing on the surface area. Q acts on the plan area of up-facing panels, and wind suction acts normal to the skin.

The member checks

Each member is checked at both ends under every ULS combination; η is the worst result. The 11 checks follow EN 1995-1-1 section 6:

Glulam strengths come from EN 14080 for GL24h, GL28h and GL32h, with γM = 1.25 and kmod set by load duration and service class.

05The numbers at the defaults

ItemValue
Ribs and purlins34 ribs · 561 purlins · 1,173 members
Degrees of freedom3,468
Solve time, all 4 combinationsabout 35 ms on my laptop
Sections240 × 800 GL28h ribs, 160 × 160 purlins
Worst memberη 0.35, a purlin
Largest movement45 mm under CO3 wind suction
Floor area · glazed skin598 m² · 1,726 m²

Wind governs deflection, which surprised me. A tall glazed mouth is mostly sail.

06What it won't tell you

This is a concept design tool. It tells you early whether a shape is in the right range, long before an engineer builds the proper model.


Shape it first, then switch layers and see what the timber says about it.

Inspired by a structural engineer's browser FEM video on LinkedIn (they credited Ahmed Zakzouk) and by a photograph of a timber horn model whose designer I haven't been able to identify. Neither is reproduced here, and the geometry is my own generator. If you know who made the model, tell me and I'll credit them.

Built in a single session with Claude Code. If your practice has a form worth stress-testing this way, message me on LinkedIn.

Chiang Ning · chiangning.net