Tealight lamp reveals a hidden image when you turn the cap

Oct 22, 2026 Last reply: 13 hours ago 3 Replies
Jump to replies (3)

The hard part here is making an image disappear twice over. Each disc on its own has to read as pure noise, yet the pair must agree cell by cell once aligned. The maker handled it with two black plates covered in grids of tiny windows, exactly one open in every neighbouring pair, chosen at random. Where light should pass, the matching cells line up on both plates; where it should not, the openings sit opposite and the light is blocked. It is visual cryptography in plastic form, and a Python script generates both plates from a matrix input, which strikes me as the right tool for the job.



The structure is simple: a body, a diffuser and a bottom cap, all printed on an X2D with a 0.4 nozzle. Inside sits any 38 mm LED tealight as the light source. The lamp reads as a translucent white cylinder with ridged black caps at top and bottom. Ten designs come with it, from a Jack-o'-lantern to an alien, each offered in 0.4 mm and 0.2 mm versions. Lining the cap's notch up with the rim mark turns the static into a lit pixelated picture; a turn of a few degrees throws every pair of cells out of step and the noise returns.



The finer option looks like the winner to me: the 0.2 mm discs carry a 50 by 50 grid on 0.1 mm layers and come out noticeably sharper than the 28 by 28 grid at 0.4 mm. Those thin layers are the price for that extra resolution, in my view. One open question remains around custom art. The maker has said image-to-matrix processing is not really doable in OpenSCAD and has asked for suggestions, offering to put in the time. Personal pictures would suit this design beautifully, and I hope a workable route turns up.


Keeping one body and swapping the cap and lower disc to change the pattern seems like a smart call to me. It keeps the part count low and lets a single lamp carry several designs. The catch, as I see it, is that each cap only works with its matching disc, but for a lamp built entirely around hidden alignment that constraint feels like part of the charm.

How does the maker get from a chosen picture to the matrix the script needs? Is the matrix drawn by hand or derived some other way before the Python script generates the two plates? With ten designs already done, I am curious whether adding an eleventh is minutes of work or an evening of careful cell placement.

A natural next step would be a small front end that converts ordinary images into the two matrices directly. The Python script already generates the plates from a matrix; only the conversion step would be missing. The maker has said image-to-matrix work is not really doable in OpenSCAD, but a separate script sidesteps that, and the offer to put in the time is already there.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required