• 3D printing
  • Light & shadow
  • DIY hardware

Build story · LumenCast

LumenCast: DIY 3D-Printed Shadow Lamp with Paper Art

An Instagram idea, a pile of printed prototypes, and the point where a sheet of paper made the whole project more useful.

A paper-front lamp with a bald illustrated character, casting a large winged shadow on a textured wall.
One of the paper-front experiments. The small picture and the much larger shadow belong to the same physical object.

LumenCast is a DIY 3D-printed shadow lamp: one image sits on the front, while an LED and four shaped side panels cast a different image on the wall. This build combines a reusable A5 frame, replaceable paper artwork and a browser-based editor that generates the printable parts.

I came across orosi.light on Instagram and immediately wanted to try making a shadow lamp myself. The appeal was the relationship between two pictures: something you recognise on the front, and another image that appears around it when the light comes on. My starting pair was Ellie and Joel from The Last of Us.

That became LumenCast. I wanted more than a one-off shape: an editor where I could place two images, move the light, and turn the result into parts I could actually print. The inspiration belongs to orosi.light. What follows is my own attempt to work through the geometry, printing and assembly.

The ideaTwo pictures, one light source

A small LED sits on a stem in front of the artwork and shines back toward the lamp and the wall. Four shaped panels around the front interrupt that light. Their silhouettes combine into the larger wall image. The front picture is what you see on the object itself.

It is tempting to think of this as projecting a photograph. It is really a set of carefully placed obstructions. Move the LED and the geometry changes. Make a panel thicker and it casts more shadow. Add a connector and that connector gets a vote in the image too.

LumenCast editor showing Atreus artwork, a Kratos target image and the calculated assembled shadow.
The editor during the Atreus and Kratos iterations: front artwork, target shadow, then the calculated result.

The browser became the workbench: image placement, thresholding and cleanup, a 3D assembly preview, and STL export. But the preview needed to use the actual parts, including their thickness, supports and holders. Showing the target picture behind the model would look convincing without proving that the lamp could cast it.

Colour-coded exploded lamp illustration: blue rear frame, orange contour walls, pink reusable socket grid behind the black-and-white Ellie artwork, purple LED holder and green battery support.
The parts at a glance: the paper artwork sits in front of the reusable socket grid. Colours distinguish the components in this annotated exploded-view illustration.

First prototypesStart with something measurable

Before chasing faces and tiny details, I printed a measurement grid and simple comb-shaped side panels. A ruler, a desk and an actual LED told me more than another polished render. The test made the central rectangular shadow, the direction of the light and the effect of the mounting edges very obvious.

Four black comb-shaped calibration side panels lying separately on a 3D printer build plate.
Simple combs first: known shapes were easier to diagnose than a face.
An illuminated grid-front prototype on a desk beside a folding ruler, with comb-shaped shadows spreading outwards.
Then the real light test. The ruler gives the projected lines a physical scale.

Some of the unwanted rectangular shadow came from the structure around the picture. We moved the side connections outward and worked toward a fastening edge that did not stick forward beyond the front surface. The contour panels still had to extend toward the LED: those are the parts that make the image.

The front itself was another limit. An opaque plate blocks light, so there will be an area the side panels cannot magically illuminate. Later the editor gained a front overlay in the shadow-placement view. That made it much easier to arrange a face or a pumpkin without hiding the important bit behind the centre of the lamp.

The slicer disagreedA connected mesh is not a sturdy print

Atreus and Kratos made a good next test: recognisable heads, an axe, and plenty of awkward narrow contours. They also exposed the difference between a detail surviving in an image and surviving as plastic.

An Atreus-front prototype held against the wall with a large Kratos silhouette surrounding it.
Atreus on the front, Kratos in the shadow. The real result made missing features and stray shadows much easier to spot.
The full effect: Atreus in daylight, then Kratos when the light comes on.

Some walls had isolated fragments even before slicing. Others looked connected in the model, but the slicer could not preserve a hairline link with my 0.4-mm nozzle and roughly 0.4-0.45-mm line width. Enlarging the construction helped, and the standard front eventually became A5, 148 × 210 mm. Scale alone did not fix the topology.

We added island connections and checks for narrow passages. Then a pumpkin design revealed a different problem: a large outer section could be connected, printable, and still hang from one long, thin neck. The next step was short cross-braces across nearby gaps, giving those sections another route back into the rest of the panel.

Every extra bridge changes the shadow. I tried more constrained bridge directions, including ones aligned with the light, but preferred the original short supports. The goal became a useful compromise: keep the important features, connect the fragile parts, and show the extra material in the preview instead of hiding its effect.

A detail brush helped express which areas mattered most, such as Kratos's head or the axe outline. It prioritises those features; it cannot make physically unreachable parts of a target appear.

The turning pointThe best front artwork was not 3D printed

The original front used a printed relief with a filament change for the contrasting image. It worked, but replacing the picture meant printing another large front. My Atreus front came out at 102 g of filament and 4 hours 32 minutes in the slicer. That is a lot of plastic and printer time to repeat just to change the picture.

So I tried a normal paper print laid over a reusable front. Atreus already looked good on paper. It removed the need to print every line of the front picture, opened the door to colour, and made changing the artwork much cheaper in time and material.

A solid reusable plate still had a catch: its LED hole stayed in one place. If the next image needed the light somewhere else, I would have to print the front again. The answer was a full grid of sockets. The LED snaps to an available position, and the paper template gets its hole at that same location.

Atreus paper artwork mounted on a black front plate on a blue work mat.
The replaceable part: ordinary printed artwork.
A black rectangular modular front with staggered circular sockets held above a work mat.
The reusable part: a grid of possible LED positions.

The reuse has a boundary: moving the LED changes the shadow geometry, so the contour walls may still need reprinting. The expensive front structure and the rear frame can stay when their dimensions and fittings remain compatible.

Even holding a sheet of paper took several attempts. Corner retainers did not work well. Sloping tabs were no better in practice. I went back to small, flat lips with a short overhang: a 0.4-mm paper gap, followed by a 0.4-mm lip, or two layers at a 0.2-mm layer height. There are two tabs on each edge. The print template also gained a thin cutting outline and a half-A4 option for printers that can handle borderless output.

Close view of a printed retaining lip holding the edge of the paper artwork.
A close look at one of the early paper retainers. Small overhangs and clear gaps turned out to matter.

Let the shadow continue across the picture

Another idea was to print the part of the shadow hidden by the front onto the paper itself. That dark pattern would sit behind the front subject, aligned with the shadow on the wall, so the larger image reads as a complete composition. The front character and its enclosed light areas should stay intact. I also wanted an inverted-shadow option to try different contrasts. This is a visual treatment to explore with the paper print.

Physical feedbackSmall fits, many iterations

The LED stem had its own cycle of fit coupons, promising prints and revisions. One snap fit seemed right, then its small hooks proved too fragile. We enlarged the receiver and strengthened the hooks. A later print was harder to insert than expected, so the spring section regained 1 mm of length that I had previously removed.

Close-up of the LED stem snap fit, showing orange retention hooks and the slot beside the spring section.

This is why the current geometry comes from shared dimensions across the stem, the front sockets and the test pieces. A hole that follows one formula and a plug that follows yesterday's formula are an excellent way to waste an evening.

The software needed the same care. Draft names, overwrite confirmation, recoverable revisions and revision suffixes on downloads became important once there were several nearly identical versions on disk. I also wanted every blocked STL download to explain the reason, and a paper template to remain downloadable while the slower 3D preview was calculating.

Behind the pictureMake the back as useful as the front

The early experiments had a power cable. For the battery version I used a switched four-AAA holder behind the front, with its cable running upward to the LED. The switch faces the wall. That meant increasing the rear space and making the frame and hanger do more work.

A battery box also has a lid that needs to move. A frame that traps that lid looks tidy until the batteries run out. Rather than build a permanent box around the battery holder, I moved to a separate support plugged into the front grid from behind.

A narrow printed battery support bar with tubular posts at both ends on the printer bed.
First, a bridge between two tubular plugs.
A printed cross-shaped battery support with end stops and two tubular plugs on a printer bed.
Then a cross with stops to locate the battery holder.

The next revision separated two jobs that the tubes had been doing: locating the battery and fitting the socket grid. Four small stops now define the 63 × 48.5-mm interior, while the tubes can move outward to match a suitable pair of holes. That lets a non-A5 design use the same battery holder too.

For my older 135 × 180-mm Bloody x Setup front, the smaller 8.8-mm sockets use a 14-mm grid. The newer grid has roughly 10.1-mm sockets at 15-mm spacing. The adaptive cradle uses 84 or 90 mm between its tubes respectively. The old front does not need replacing just because the new standard exists.

Rear of the lamp showing the perforated front, upper keyhole hanger, wiring and battery case retained by a cross support.
The assembled back: battery support below, wiring upward, and a reinforced hanger above.

The frame gained extra snap points at the top and bottom, plus a smooth support plug below the nail opening. The separate battery cradle uses 17.9-mm outer tubes and 3.5-mm insertion pins. The latest frame reference has 18.8 mm of rear space. These dimensions came from successive fitting attempts, not from getting every measurement right on the first drawing.

Point the light the right wayThe light and the wiring

The light source is a through-hole LED sold on AliExpress as a 0.5-W LED. In the early setup, the LED largely shone away from the wall and the cap redirected some light back. For the later arrangement I bent the LED legs through 180 degrees so the LED points back down the stem toward the artwork and wall. That physical orientation matters just as much as where the editor places the light.

For quick tests, the first version used a cable and a PENGLIN USB-C socket breakout board. It gave me a small, solderable power connection while I worked through the optics and printed parts. The battery holder came later, to make the finished lamp self-contained. The USB-C board is a connector, not an LED current regulator.

I had also tried an adjustable driver. Flicker after a few minutes, slight warming and a trimmer that did not produce the brightness change I expected made that stage confusing. The battery build uses a 10-Ω and a 20-Ω resistor in series, giving 30 Ω in total. I used those because I already had them lying around. Power comes from four AAA batteries, not rechargeable cells, with the switch built into the battery holder. The resistors are soldered directly at the LED and insulated there; they are not attached to the battery holder. The two-pin connector lets that LED assembly unplug from the battery leads.

Open four-AAA holder containing Amazon Basics 1.5-volt batteries, with red and black wires, a small connector and heat-shrink insulation.
The battery assembly from the album: four 1.5-V AAA batteries, a removable two-pin connector, and insulated joints.
Battery holder and switch connect through a removable two-pin plug to the LED assembly. The 10-ohm and 20-ohm resistors are soldered in series directly at the LED; the cathode returns to battery negative.
10 Ω + 20 Ω in series = 30 Ω. The dashed box marks the resistor joints at the LED, separate from the battery holder. Open the full-size schematic.

This records my build, not a universal resistor recommendation. The wattage of my spare resistors and the LED's continuous-current rating are not documented here. Verify those ratings and the actual current before reproducing the circuit.

The seller's 0.5-W label is not a measurement of this lamp's power. With a resistor circuit, current depends on battery voltage, LED forward voltage and resistance. I have not established a measured current, runtime or thermal rating here. Those numbers should not be inferred from how bright a photo looks.

The actual hardwareWhat went into the build

This is the parts list for the later battery-and-paper version. The earlier USB-C test board is listed separately below. The adjustable driver and the clear sleeve considered during development were not part of this build.

PartWhat I used it for
1 × AliExpress LED, sold as 0.5 WThe light source in the printed stem. The AliExpress listing I bought from, selecting the 0.5-W variant.
1 × 10-Ω resistor
1 × 20-Ω resistor
Soldered in series directly at the LED for 30 Ω total, from parts I already had. The power ratings of these spare resistors are not recorded.
1 × switched four-AAA battery holderThe enclosed 63 × 49 × 16-mm style discussed during the build. Original Amazon listing; the package contains multiple holders, the lamp uses one.
4 × AAA batteriesFour ordinary AAA batteries, not rechargeables. The photographed cells are Amazon Basics, labelled 1.5 V.
1 × two-pin connector pair with leadsLyeteung PH 2.0-mm connector set, sold as JST-PH-compatible with 150-mm, 22-AWG leads. One mating pair disconnects the battery from the lamp.
Heat-shrink tubing and solderInsulate the resistor and wire joints. The connector leads provide the short wiring runs.
Opaque printing filamentThe socket front, four contour walls, LED stem and cap, rear frame and battery cradle. Black for the light-blocking parts.
Printer paper and a paper printerThe replaceable front image, printed at 100% scale with its cutting outline and LED opening.
A suitable wall fixingThe rear frame hangs from its keyhole. Match the fixing to the wall and the finished lamp.

Earlier bench-test part: one PENGLIN USB-C socket breakout board, with a USB supply and cable, for the initial wired version. It is not needed for the battery version above.

Product links are included for reference and are not affiliate links.

Built on open sourceThe code behind the lamp

LumenCast is a browser-based modelling tool written in TypeScript. The path from two pictures to a printable kit combines a few excellent libraries with the projection and printability logic developed for this project:

  • React connects the image editors, dimensions and LED controls to the application's state. Lucide supplies the interface icons.
  • Three.js renders the assembled lamp and its parts, with orbit controls for inspecting the model and transform controls for moving the light.
  • Manifold is the geometry engine. Its WebAssembly build turns outlines into solid parts and performs the unions, intersections and cuts needed for contour walls, sockets and holders.
  • fflate packages the generated files into the downloadable ZIP kit, directly in the browser.

The geometry calculation runs in a native Web Worker, off the main UI thread. LumenCast's own code handles the relationship between the target image, LED position and side panels, then adds island connections, narrow-passage repairs and cross-braces. The resulting parts feed the preview and export. That distinction mattered throughout the build: a geometry library can construct a solid, but deciding where a fragile contour needs another bridge is specific to this lamp.

Vite handles development and bundling, and Vitest runs the automated checks. A big thank you to the maintainers and contributors behind all these projects. Their work let me spend my time on shadows, paper fronts and physical prototypes instead of building a renderer, geometry engine or ZIP library from scratch.

Before printingDIY shadow lamp: common questions

Which parts need to be 3D printed?

The front structure, four contour walls, LED stem and rear frame are printed parts. The paper version replaces the printed front artwork with an ordinary paper print held against a reusable socket grid. The LED, resistors and battery holder are separate components listed in the parts list.

Can I change the picture without printing a new lamp?

A compatible paper front, rear frame and holder can be reused. Changing the target shadow or LED position can require new contour walls. For my Atreus comparison, the reusable front was 68 g versus 102 g for the relief front, a 34-g saving on the initial print. Later compatible paper swaps avoid another front print entirely.

Where do the STL files come from?

The LumenCast editor calculates a kit for the chosen images, dimensions and LED position, then exports the STL files in a ZIP. Open the public LumenCast editor to generate your own kit. Its geometry and export run in the browser.

From a pair of characters to a toolWhere LumenCast goes next

Ellie and Joel were the spark. Atreus and Kratos became a demanding geometry test. A ghost and a pumpkin pushed the paper version further. The reusable front is what makes me want to keep trying new combinations: change the picture, choose the LED socket, print the walls that belong to that arrangement.

A ghost illustration on the front of the assembled lamp, with black patterned side panels visible around it.
The later ghost front. The artwork can change while the reusable structure stays.
Zoom out from the little ghost, switch on the light, and the pumpkin appears.

The biggest lesson was to keep bringing the design back to the real object. A disconnected sliver in the slicer, a hook that breaks on insertion, a paper tab that sags or a battery lid that cannot slide open are all information the next iteration needs. The useful version of LumenCast grew out of those corrections.

Still on my list

Next, I want to try:

  • LED cap: revisit the cover over the LED and test its shape on the real lamp.
  • A transparent tube: try an acrylic tube or clear plastic film rolled into a small sleeve around the LED.
  • Rechargeable power and automatic light: explore USB-C charging, a rechargeable battery, and an ESP32 with an ambient-light sensor to turn the lamp on when it gets dark outside and off when it is bright again.

More build photos: the LumenCast album. Original inspiration: orosi.light. Character artwork is shown here as part of my personal builds; the characters belong to their respective creators.