mahnoor·fatima

computational creative direction

TENON

Parametric furniture: a chair solved from your body, your room and your budget

FIT Give it a body and a room; the chair is solved from them

HEIGHT
POSTURE
FLOOR
AESTHETIC SOFTSEVERE
BUDGET
SEED 0X7E10 SOLVED

TENON

Volume XII: A parametric furniture marketplace

Computational Product Design: Solved Geometry, Flat-Packed


The premise

There are two furniture markets and nothing in between.

At one end, mass production. A chair costs $90 and is built for a person who does not exist: the statistical average of a population, rounded to whatever tools the factory already owns. The seat is 450mm because the seat is always 450mm.

At the other end, bespoke. A chair costs $4,000, takes eleven weeks, and requires you to know a maker, have opinions about timber, and be the sort of person who commissions furniture.

TENON is the argument that the gap between them is a software problem. Not a gallery piece with a parametric excuse, and not a configurator that lets you pick between four fabric swatches. A chair whose every dimension is solved from what you tell it, manufactured on the same CNC line as everything else, and priced like flat-pack.

The pitch that gets it funded: Spotify Wrapped meets Herman Miller. The pitch that makes it true: the file is the product.

Why 450mm is the whole thesis

A standard dining chair seats you at 450mm off the floor. That figure comes from a mid-century anthropometric survey and it has barely moved since, because tooling is expensive and averages are cheap.

The number that should set your seat height is your popliteal height: floor to the underside of your knee, sitting. It runs about 0.246 of your stature. So:

StaturePoplitealStandardError
152 cm374 mm450 mm+76 mm
172 cm423 mm450 mm+27 mm
191 cm470 mm450 mm−20 mm

At 152cm your feet do not reach the floor, so your thighs carry your weight through the seat edge and your legs go numb. At 191cm your knees sit above your hips and your lower back does the work instead.

Nobody is arguing that 450 is right. It is just what happens when a chair has to be one chair. Once the chair is a file, it does not have to be.

What the customer actually gives you

Five inputs. No more, because a configurator that asks twenty questions gets abandoned at question six.

  • Height, which drives every primary dimension through anthropometric ratio
  • Posture, which is what the chair is for: upright to work, relaxed to read, perched to draw
  • Floor area, because a 19m² studio and a 60m² apartment cannot afford the same footprint
  • Aesthetic, one axis from soft to severe, controlling section, corner radius, splay and how many members the back is broken into
  • Budget, which is a hard constraint on the solve rather than a filter on a catalogue

Everything else, the whole cut list, is derived.

The TENON pipeline: five customer inputs resolved through anthropometry and constraints into a cut list and a CNC file Five inputs on the left: height, posture, floor area, aesthetic and budget. They feed a solver with three stages. Anthropometry turns height and posture into primary dimensions. Constraints apply the room and the budget, dropping the build tier until the price fits. Generation emits parts. The output is a cut list, a price and a machine file. A loop returns from price to the budget constraint, showing the solver retries at a lower tier rather than refusing. 01: INPUTS five, never twenty HEIGHTPOSTUREFLOOR AREA BUDGETAESTHETIC 02: SOLVE no catalogue is consulted at any point ANTHROPOMETRYCONSTRAINTSGENERATION seat 0.246H · depth 0.24H · back 0.30H footprint from room · tier from budget posts, rails, slats, panel, joints 03: OUTPUT the file is the product CUT LIST 2 × REAR POST2 × FRONT LEG 2 × SIDE RAIL2 × CROSS RAIL n × SLAT1 × SEAT PANEL PRICEG-CODE over budget: drop a tier and solve again, never refuse 04: WHY IT IS A MARKETPLACE AND NOT A STUDIO ONE LINEONE FILE EACH FLAT PACKNO STOCK same machines, any geometry unique is free, not premium ships in a box, not a van nothing made unsold
The pipeline. The only interesting part is the orange return path: when the price lands over budget the solver drops a build tier and runs again, so a small budget produces a cheaper chair rather than an error message.

The solver

Three stages, and the order matters. Anthropometry first, because the body is not negotiable. Constraints second, because the room and the money are. Generation last, because parts are a consequence and not a decision.

// Stage 1: the body. Ratios, not preferences.
let seatH = 0.246 * H;      // popliteal height, floor to under-knee
let seatD = 0.240 * H;      // buttock to popliteal, less clearance
let backH = 0.300 * H;      // sitting shoulder height
let backAng = 104, tilt = 4;

// Stage 2a: what the chair is for
if (posture === "UPRIGHT") { backAng = 96;  tilt =  2; backH = 0.23 * H; seatD = 0.22 * H; }
if (posture === "RELAXED") { backAng = 111; tilt =  7; backH = 0.35 * H; seatD = 0.26 * H; }
if (posture === "PERCHED") { backAng = 94;  tilt = -5; backH = 0.13 * H; seatD = 0.19 * H;
                             seatH = 0.33 * H; }

// Stage 2b: the room. Under ~36 m2 the piece narrows, and loses its
// arms before it loses anything structural.
const tight = clamp((36 - floor) / 22, 0, 1);
const width = 0.155 * H * (1 - tight * 0.14) + 30;
const wantsArms = floor >= 30 && posture !== "PERCHED";

// Stage 2c: the budget, as a constraint rather than a label. Take the
// richest build that fits, and if none does, say so honestly.
let tier = 2, spec = build(2);
while (tier > 0 && spec.price > budget) spec = build(--tier);

// Stage 3: parts fall out of the geometry
const rearPost  = seatH - seatD * Math.tan(rad(tilt)) + backH;
const crossRail = width - section * 2;

There is no if (style === "scandi") anywhere in it, and that absence is the product. The moment a configurator contains a list of looks it is a catalogue with sliders on top, and the marketplace claim collapses.

The aesthetic axis

One slider, soft to severe, and it drives four things at once: stock section, corner radius, leg splay, and how many members the back is broken into. Soft gives you thin round stock, generous radii, splayed legs and six slats. Severe gives you heavy square section, a 1mm arris, plumb legs and two.

One axis rather than a style menu, for the same reason there are five inputs and not twenty. It also means the extremes are genuinely different objects while every intermediate is coherent, which a menu of named styles can never promise.

Budget as a constraint, not a filter

Most configurators treat money as a filter: you set a maximum and options disappear. TENON treats it as a constraint on the solve, and the difference shows up in one behaviour.

Drag the budget down and the chair does not vanish. It loses its arms, then drops from solid oak and brass to beech and steel, then to birch ply and flat-pack joinery, then sheds slats. Every one of those is a real build, and the geometry your body needs survives all of them. What money buys is material and joint count. What money does not buy is fit.

That ordering is a stated position: fit is not a premium feature. The cheapest TENON is still solved to your popliteal height. It is just made of plywood.

If nothing fits, it says so rather than quietly serving something that does not fit. The three build tiers:

  • Birch ply, flat pack. Machined from sheet, folded joints, no hardware beyond fasteners.
  • Steamed beech, steel. Turned stock, steel sleeve joints, sprung back.
  • Solid oak, brass. Mortise and tenon cut on the same line, brass ferrules, oiled.

Unique is a by-product, not a selling point

Every TENON is one of one, and it costs nothing extra to be, because the machine does not care what numbers are in the file. This is the part that makes it a marketplace instead of a studio: uniqueness is not craft time being sold at a markup, it is a property of the manufacturing method.

Which is also why the serial matters. Each solve hashes its parameter vector into an identifier, stamped on the underside of the seat. Two customers with identical inputs get the same serial and genuinely the same chair, and that is correct: the serial identifies the solution, not the transaction.

The Spotify Wrapped instinct is right, and it is worth being precise about why. Wrapped works because it hands you a fact about yourself you did not previously have words for. TENON’s version is the delta line: your seat is 423mm and the chair you have been sitting in is 450. That 27mm is why you shift in your seat at hour two. Most people have never been told this, and it lands harder than any styling choice the configurator could offer.

Business model

The unit economics are the same as flat-pack and nothing like bespoke.

  • One line, any geometry. Sheet goods on a CNC router, stock on a CNC lathe. A different file is not a different setup.
  • Nothing made unsold. The piece is cut after the order, so there is no inventory bet and no warehouse of the sizes that did not sell.
  • Ships in a box. Flat pack is not a compromise here, it is what makes solved geometry affordable to deliver.
  • Marginal cost of uniqueness: zero. The whole margin story rests on this line.

The endgame is not selling chairs. It is that the solver becomes the platform other makers publish to: a maker uploads a parametric family, the marketplace handles the solve, the pricing, the routing to a machine near the customer. The first parametric furniture marketplace is a claim about infrastructure, and chairs are just what proves it works.

What is genuinely hard

Three things, and none of them are the geometry.

Comfort is not fully anthropometric. Popliteal height gets you a seat that does not cut off circulation. It does not get you a chair that is pleasant after two hours, which involves pressure distribution, lumbar support and materials that give. The honest claim is that TENON removes a specific well-understood failure, not that it solves comfort.

People do not know their measurements. Height is the only body figure most people can state without a tape measure, which is exactly why the solver derives everything from stature rather than asking. A phone-camera measurement step would be more accurate and would lose customers.

Returns are structurally awkward. A chair cut for one body cannot be resold to another, so a return is a write-off in a way it never is for mass production. That pushes the model toward getting the solve right up front and toward a resale market where the serial can be looked up and matched to a body it also fits.

Reflection

The interesting discovery was that the constraint hierarchy is the design.

I expected the hard part to be the geometry, and it was not; the anthropometry is a century old and the parts fall out of it in an afternoon. The hard part was deciding what yields to what. Once body before room before money was fixed, most other decisions stopped being open questions: it is why the budget slider takes the arms before it takes the fit, why aesthetic is one axis rather than a menu, and why there are five inputs and not twenty.

A parametric product is not a shape that can flex. It is a ranked list of what you are willing to give up, and the shape is what is left standing.