Wear it before it's made

Fine jewellery ateliers don't sell off a shelf. Many pieces exist only as CAD files until a client commits, and the sales model is literally "please visit our studio." A client sees a photo, falls for it, and then has to imagine it on their own wrist, guess what it'll cost in a different metal, and book a visit to find out. Meanwhile, the studio learns nothing from all the people who looked but never came in.

We were inspired by a design studio whose CAD archive holds decades of work that clients have never been able to wear. Lumen turns those raw CAD files into pieces you can try on in live AR, priced to the gram, and turns every try-on session into insight the studio can act on.

What it does

  • Wear it live. Bracelets wrap your wrist and rings sit on your ring finger in real time, in 3D, straight from the browser. No app and no headset.
  • Customise with real numbers. Switch metal, karat, wrist or ring size, and the weight and price update instantly. They're calculated from the actual geometry, not estimated by a model.
  • Book the consultation. Saved looks and customisations become a Design Brief PDF that goes straight to the studio with a booked slot.
  • Signal → insight. Every session becomes a Session Report for the studio: favourite piece, metal preference, price sensitivity, hesitation, drop-off, and suggested talking points for the consultation.
  • No AI. Anywhere. Every number and every insight comes from deterministic geometry and statistics.

How we built it

1. Rebuilding solids from "sliced" CAD

The studio's files came from JewelCAD as layer-sliced STL exports, not solids. Our sample bracelet segment was 426k triangles split across 7,084 disconnected shells: 673 horizontal slabs, each exactly 0.0508 mm thick. There was no single solid, no parts, and no stones.

So we compute the exact metal volume layer by layer, taking the union of each slice's cross-section polygons:

$$V = t \sum_{k=1}^{N} A_k, \qquad t = 0.0508\ \text{mm},\ N = 673$$

For the sample that gives \( V = 671.5\ \text{mm}^3 \), so \( 10.4\ \text{g} \) in 18k yellow gold (\( \rho = 15.5\ \text{g/cm}^3 \)). We then rasterise every slice into a voxel grid, extract a watertight surface with marching cubes, smooth it, and check that the rebuilt mesh stays within 3% of the exact volume.

2. Finding the stones that aren't there

The files contain no gemstones, only the settings. We slice perpendicular to each protruding head and look for prongs: \( k \) equal-angle islands on a common circle. The prongs' inner radius gives the stone's diameter, and standard gem proportions give an estimated carat weight:

$$d \approx 2r_{in} + \epsilon, \qquad \text{ct} \approx 0.0061 \cdot d^2 \cdot (0.61\,d)$$

The sample segment has 9 four-prong settings, each holding a ~3.0 mm round stone (~0.10 ct).

3. Segments → full pieces

A bracelet file is one repeating segment. We build a full bracelet for any wrist size by instancing copies around the wrist and bending each one with an arc-length-preserving map, so the stone settings don't warp:

$$(\theta, r) \mapsto \left(\theta \cdot \tfrac{R_{seg}}{R_{path}},\ r - R_{seg} + R_{path}\right)$$

Rings resize the same way, which keeps the band's thickness constant.

4. Live hand AR in the browser

MediaPipe hand tracking gives 21 landmarks per frame. We recover depth from the apparent palm width with a pinhole model,

$$z = \frac{f \cdot W_{palm}}{\lVert p_5 - p_{17} \rVert},$$

build the wrist or finger pose, and render the piece with three.js. An invisible depth-only cylinder along the wrist or finger hides the back of the bracelet or ring, which is what makes it look worn rather than pasted on. One-Euro filtering removes the jitter.

5. Pricing, to the gram

$$P = \big(1.18 \cdot W \cdot r_{24} \cdot \pi_k + S\big)\times 1.03$$

where \( W \) is the weight, \( r_{24} \) the day's 24k rate, \( \pi_k \) the karat purity, 18% the making charge, \( S \) the stone value, and 3% GST.

6. Signal → insight

Every interaction is a time-series event in Tiger Data (TimescaleDB) hypertables, with continuous aggregates powering the studio dashboard. Session Reports are built from simple, explainable rules. For example, a client is flagged price-sensitive when they step a karat down right after a price increase, and undecided after toggling the same option four or more times. Every signal is shown alongside its evidence.

7. Private by design

The designs are the studio's IP, so security came first:

  • the app sits behind an access gate;
  • only simplified preview meshes are ever served, from a private DigitalOcean Spaces bucket through signed URLs that expire in 5 minutes;
  • raw CAD never leaves the pipeline machine;
  • camera frames never leave the device;
  • no third-party AI touches anything.

Challenges

  • The files weren't really 3D models. Discovering the sliced export format and rebuilding solids from 673 slabs was the biggest hurdle and the biggest win.
  • Stones had to be inferred from prong geometry alone.
  • AR realism: convincing depth and occlusion from a single webcam, with no depth sensor.
  • Making luxury feel like luxury. A design studio needs a quiet, gallery-like experience, not a flashy tech demo, so we built a full design system ("Quiet Heritage") before writing UI code.

What we learned

Geometry can do a lot of what people reach for AI to do. Exact volume, stone inference, and assembly all come out of careful computational geometry, and they're more trustworthy because every number is explainable. We also learned that for a design business, privacy and aesthetics aren't polish; they decide whether the product is usable at all.

What's next

Ear AR for studs, necklace AR, more CAD export formats (solid STLs with stones), and a studio-side flow that sends a customised piece straight back to CAD.

Built With

Share this project:

Updates

Submission history