Most keychains just hang there. This one does something. Point a phone camera at it and it opens whatever the code holds — usually a link, but any text works, so a wifi-join string or a contact card lands on the screen too. It is a QR code you can hold, printed in plastic, with a keyring hole. The design step is the same browser configurator we use for the rest of the range, but this mode has one problem the others do not: a QR code only earns its keep if a camera can still read it after it stops being pixels and becomes a physical object.
This is a disip build. disip is the digital label of Van Riel Online Services, a Rotterdam studio for rapid development and digital solutions, and the keychains are the live showcase. The shared pipeline — design in the browser with React and Three.js, generate a .3mf on add-to-cart, store it, and attach it to the WooCommerce order at a fixed €4,50 enforced server-side — is covered in an earlier post. Here we only look at what is unique to the QR mode.
From data to geometry
You type what the code should contain into a single field — a URL, or any text you paste in. We turn that into a QR matrix in the browser with qrcode-generator, sized automatically at the error-correction level you pick. The result is a grid of dark and light modules. The naive move is to extrude one little box per dark module, but a real code is hundreds of modules and that means thousands of tiny boxes, which is a lot of triangles for the live WebGL preview to push.
So we compress instead. Each row of the matrix is scanned into horizontal runs of same-colored modules, and every run becomes a single watertight box spanning its width. Far fewer solids, the same code. A small overlap is baked into each box so neighbouring runs never pinch shut or leave a hairline gap — both of which would confuse a scanner or a slicer. A quiet zone — the blank margin a QR needs to be found at all — is built into the plate as a border around the code, not left to chance.
The modules and the base plate are separate colored parts. They go into the .3mf as distinct base materials with their own display colors, so the print comes out as a real two-color object: a base, and the code on top of it in a contrasting color. Bambu Studio reads those colors and suggests matching filaments.
Making it scannable in plastic
This is the part that is genuinely unique to this product. A QR code on a screen is flat and high-contrast, which is exactly what a phone camera wants. A printed one fights you on three fronts: module size, color contrast, and surface.
- Module size. Modules that print too small smear together and the code dies. The module size is a real control, and a longer URL packs more modules into the same plate, so the data and the error-correction level drive how dense it gets — a short link reads better than a paragraph. Drop below a sane cell size and the configurator warns you the modules may not print cleanly.
- Contrast. Scanners need dark modules on a light base, or the reverse — not two shades of the same thing. The configurator catches the obvious mistake: pick the same color for the base and the modules and it warns you outright, because a code with no contrast can’t be scanned. Choosing colors with enough separation is left to you, but the worst case is blocked.
- Surface. Raised modules cast tiny shadows and catch glare at an angle, which a camera can misread. So there is a flush inlay option: instead of sitting on top, the modules are embedded into the plate so the top surface is dead flat. A flat, high-contrast face is the closest a printed code gets to behaving like one on a screen.
The flush mode is more work than it sounds. You cannot just overlap a colored block into a solid plate — overlapping volumes are a mess for the slicer. We build it cleanly: a solid slab for the floor, a frame carved out where the code and any text label sit, and color-filled cells dropped into the gap, with the inlay depth clamped so a watertight floor always remains under it. The plate stays one solid object; the code just lives flush in its surface.
A QR code that does not scan is just a square. The whole job is keeping it readable in plastic.
Both sides, and a hole that does not split
A keychain flips around in a pocket, so you can print the code on both faces. The catch is that a mirror image of a QR code will not scan, and neither will mirrored text. So the back face is mirrored about the vertical axis: the geometry is flipped in X and the winding restored, which means a flipped keychain still shows a correctly oriented code and readable text. The back is always inlaid flush so it lies flat on the print bed; whichever way the keychain lands, a camera can read it.
The other physical worry is the keyring hole. On a small plate, a hole near the edge is exactly where a print likes to crack. Rather than bolt a thin bridge onto the plate, the loop is merged into the body: the bridge flares into a wider gusset where it meets the plate, and a morphological-closing pass fillets the concave corners at the neck so there are no sharp inside angles to start a split. It is the same technique we use to smooth the loop on the name keychain, applied to a square plate. The result is one continuous, watertight body — code, plate, and loop — that survives being thrown in a bag.
One last detail that is easy to miss: the product photos. They are shot nearly face-on, on purpose. An angled hero shot looks slicker — and the name keychain uses one to show off the extrusion — but it skews the code enough that you cannot scan it off the screen. The QR shot is kept flat so the photo itself is a working QR code — proof, on the product page, that the product does what it claims.
Try it yourself
Drop in a link, pick two contrasting colors, choose raised or flush, and watch the code take shape in the browser — then scan it off your own screen before you download. If you want a working custom product like this in your own shop, designed and shipping rather than a demo, disip can build it.