Reverse-engineering a 1970 sofa bed, with an AI at Blender's controls
Three theories, a single pivot, and a backrest that does a front flip

Illustration: a manga-style reinterpretation of one of the seller’s photos — the original is on justchairs.eu.
I came across a 1970s Czechoslovak convertible sofa online, made by OPP Drevovyroba, for sale at a dealer in Budapest. Low profile, sculptural armrests in bent teak plywood, and a mechanism described in a single sentence: “the sofa turns into a bed in one motion.” €1,550, 1,500 km from home, and dimensions that don’t fit my living room. The conclusion was obvious: rather than buy it, redraw it — and understand it along the way.
This post is the story of that exercise, carried out with an AI (Claude) driving Blender live. Spoiler: the AI got the mechanism wrong three times, and that is precisely what makes the story interesting.
The setup
On the tooling side, this has become almost mundane: Blender, a small add-on that opens a server on the machine (BlenderMCP), and the AI that connects to it. Ten minutes to install. From there, it writes Python inside Blender, builds geometry, takes screenshots of the viewport to check its work, and starts over. Me, I watch the model turn live on my screen and comment.
The choice made from the outset: a parametric model. Not mouse-driven sculpting, but a script with a block of parameters at the top — width, seat height, cushion thickness, backrest angle — and all the geometry, mechanism included, recomputed whenever a value changes. As we’ll see, that choice saved the day more than once.

Three theories for one mechanism
The seller provides about fifteen photos, none of the mechanism in action. So it had to be deduced.
Theory no. 1: the simple hinge. The AI’s first interpretation: the backrest tips backward on a hinge, like a click-clack sofa. Modeled, animated… and demolished by looking more closely at the photos: in bed position, the front strip of the sleeping surface is in front of the seat, not behind it. So the backrest passes over the top of the seat. Exit the hinge.
Theory no. 2: four-bar kinematics. If the backrest has to fly over the seat without hitting it, I told myself, it has to rotate and translate — hence two pivots and some connecting links. The AI took the idea seriously, very seriously in fact: it wrote a solver that places the pivots by numerical search along the perpendicular bisectors of the two poses, maximizing the clearance between backrest and seat throughout the swing. Result: a perfectly functional four-bar mechanism, 17 mm clearance verified over the whole travel. Elegant. And completely wrong.
Theory no. 3: the single pivot. A close-up of the armrest settled it: the screws attaching the arm to the backrest are a rigid fastening, not a pivot. Arm and backrest form a single moving part, which rotates around the round trunnion visible on the side of the box. One pivot per side. And then everything falls into place: since the pivot is low and central, the arc of rotation rises above the seat. There never was a collision problem to solve. The Czech designers didn’t need linkages — they had simply placed an axle well.
The lesson deserves a frame: when the AI misunderstands the real world, it doesn’t err timidly — it over-engineers. The four-bar mechanism was the brilliant answer to a problem that didn’t exist.

The beautiful mathematical gesture survived the shipwreck of theory no. 2: two poses of a rigid body in the plane determine a unique center of rotation — the intersection of the perpendicular bisectors. No more numerical search: the pivot is computed, exactly. And when given the right input geometry, it lands within a few millimeters of the original trunnion’s location. A nice cross-validation, fifty years later.
The armrest that becomes a leg
Another find from the bed-position photos: the backrest cantilevers 46 cm out in front of the box, and it’s the armrest that supports it — as it swings, the armrest’s branch points toward the floor and its tip rests there, an improvised strut. The little platform where you rested your elbow becomes a foot pad.
In the parametric model, we inverted the logic: rather than draw the armrest and then observe where it lands, the AI computes its bearing points by inverse rotation from their target on the floor. The tip of the armrest is defined as “the point which, after a 110° rotation, touches the floor at y = -47 cm.” Check at the final frame: z = 0.0 mm. Which also explains why the original armrest is so short and set back: its position is not an aesthetic choice, it’s the landing constraint. Form follows mechanism.

Where we go beyond the original
Understanding is good; improving is better. Three flaws of the original piece went through the wringer.
The two-firmness sleeping surface. On the original, a thick seat and a thinner backrest make for a bed with two zones. Fix: a common thickness of 14.5 cm everywhere, a perfectly uniform 126 × 200 cm sleeping surface.
The 65 cm deep seat. Impossible to lean back while keeping your feet on the floor. On closer inspection, the original already cheats: its backrest isn’t at the rear edge but pushed forward on the platform, and the dead zone behind it becomes sleeping surface when unfolded. We parameterized that cleanly: prof_utile = 50 cm, and the pivot recomputes itself.
The soft side facing the wrong way. The real head-scratcher. The forward swing exposes the back of the backrest as the sleeping surface: if the front face is soft for sitting, you sleep on the firm face. The original made its choice, and too bad for the seat. Our solution: a central axle running through the middle of the backrest. During the swing, the backrest makes a half-turn on itself — and the same soft face serves as backrest by day and sleeping surface by night. Cascading consequence: the arm now stops halfway up the backrest to carry that bearing… exactly at armrest height. The armrest is the bearing.
That left keeping the backrest from spinning freely. First idea: a slide bolt. Second idea, much better: a pin running in a 180° semicircular groove, concentric with the axle, milled into the inner face of the arm. The ends of the groove are the stops for the two positions — the travel of the groove is the travel of the half-turn. No latch to operate, automatic indexing, and in both poses the loads press the pin against its stop. Verified in the model: the pin sits exactly at the end of the groove in both positions.


What I take away from it
A picture is worth a thousand tokens. The three decisive corrections came from close-ups I sent to the AI: the rigid screws, the armrest-turned-leg, the forward-set backrest. It reasons remarkably well — but about what it’s shown.
The AI over-engineers when it misunderstands. The four-bar solver was magnificent and useless. Beware of brilliant solutions: check the problem first.
Parametric makes mistakes cheap. Three complete overhauls of the mechanism, and each time a few minutes of recomputation rather than hours of remodeling. Since the anchor points (pivot, floor contacts, bearing) are computed rather than placed by hand, everything follows.
The collaboration makes sense. It computes intersections of perpendicular bisectors and checks clearances to the millimeter; I can see that a 65 cm deep seat is unlivable and that a screw is not a pivot. Neither of us would have produced this design alone.
To be continued in the next episode: dimensioned 2D drawings, details of the bearing and the groove, and fabrication in 18 mm plywood. The script and the model are already running — all that’s missing are the dimensions of my living room.
The files
Everything is downloadable, help yourself:
sofa_parametrique.py— the complete script: parameters, pivot computation, construction, animation. Open it in Blender (Scripting tab) and rerun it after changing thePARAMS.canape_convertible.blend— the Blender scene with the swing animation (frame 1 = sofa, frame 61 = bed).canape_convertible.glb— the model in glTF format, animation included, readable everywhere (online 3D viewers, game engines, AR).
Photos of the original sofa: justchairs.eu. 3D model: Blender 5.1 + BlenderMCP.