Pull Schedule

No. 35 imagineering

The star ceiling I built, and the one I'm building now

I built a fiber-optic star ceiling to beat the price of a kit, hit a wall six LEDs couldn't get past, and ended up designing the thing the market didn't sell.

A dark home theater ceiling scattered with points of light from fiber optic stars, above a projector that is switched on
The first panel, lit, in my basement theater.

I have a star ceiling in my basement theater. People look up and say “Wow,” or “I’ve always loved star ceilings.” Clients mostly don’t say anything, because they don’t know to ask for one.

Why a fake sky works

There’s a field of research that helps explain why people react to a star ceiling the way they do. It’s called biophilic design, and it looks at how natural patterns and cues affect stress and wellbeing indoors.

The study everyone starts with is Roger Ulrich’s, published in Science in 1984. He compared patients recovering from surgery whose hospital windows looked out on trees with patients whose windows faced a brick wall. The patients with the view of trees had shorter stays, took fewer strong painkillers, and had fewer negative notes in their charts.

In 1993, Ulrich and two colleagues tried it with pictures instead of windows. Heart surgery patients who were shown a photo of trees and water reported less anxiety and were more likely to step down to weaker painkillers than patients shown abstract art or nothing at all.

A 2026 review of biophilic design in hospitals lands in the same place, with a fair caveat. Real nature does the most. Simulated nature, including virtual nature, still produces moderate reductions in anxiety, just weaker ones. And the evidence for long-term effects is still limited.

A star ceiling is a pretty literal version of that. It isn’t the night sky, and everyone under it knows that. But the pattern is natural enough, and the room is dark and quiet enough, that some of the response seems to happen anyway.

Theme parks have worked this way for decades. Disney’s designers use environmental cues to make you feel something before anything moves. Forced perspective is the famous example: Cinderella Castle uses it to look taller than it actually is. You know it’s a trick, and your brain accepts it anyway.

That’s probably why star ceilings show up in rooms meant for rest and escape: theaters, bedrooms, spas. In a theater it does the same job as everything else in the room. It gets you settled in the dark before the movie starts.

The kit was too expensive, so I built my own

The off-the-shelf answer existed. Wiedamark sells a 4-by-8-foot fiber-optic star ceiling panel kit: $515 for 192 fibers, run off a light engine with effects you set with DIP switches.

I didn’t want to pay for the kit. I wanted to build the light engine myself and see if there was any interest in it once it worked. So I built a more cost-effective version of that same panel.

I used the same fiber the kit used, bundles of 24 strands. That kit drives eight of those bundles off eight LEDs. I used six bundles off six LEDs, so 144 fibers. My panel was a 4-by-8 sheet of 2-inch pink XPS foam wrapped in black velvet. We didn’t drill the fiber holes. We poked them through the foam with toothpicks, three of us, about 2 hours to route all the fibers. Then we sealed every hole with Elmer’s glue to hold the fibers and keep them from sliding back through, and let it cure overnight.

Two people working on the back of a large foam ceiling panel propped on its edge, with fiber strands running across it
Sealing the fiber holes with Elmer's glue.
The back of a large framed ceiling panel standing on carpet, with fine fiber optic strands running from holes across the panel to the light engine board in the middle
The back of the panel, every fiber running to the middle.
A long black ceiling panel lit with scattered fiber optic stars, standing upright on a carpeted floor, with a person standing behind it
The finished panel, before it went up.

The morning it lit up

The next morning my wife and a friend were with me when I powered it up. It landed the way I’d hoped, and it was a lot brighter than I expected. Which is when I realized the code still needed work.

The control board was an ATmega328P I programmed in Arduino, with DIP switches to select effects: a slow twinkle, a fast twinkle, fades. I’d fabbed a real PCB for it through JLCPCB after starting on a breadboard and moving to a proto board. I wanted it done properly, and I wanted to see if it was a product.

An Arduino board taped to the back of a foam panel, wired to a single bright LED aimed into a bundle of fiber optic strands taped down beside it
Early testing: an Arduino driving one LED into a fiber bundle.
A green circuit board layout render with six LED positions in a row, resistors, a chip socket and a DIP switch
The light engine board layout I sent to JLCPCB.
A green circuit board with six bright white LEDs in a black housing along one edge, a red DIP switch and a socketed chip, on a granite counter
The light engine board. Six LEDs, and the DIP switches that pick the effect.
The light engine board at an angle on a granite counter, with its six LEDs lit inside the assembled black manifold and a heatsink on the voltage regulator, a power cable plugged in
The assembled manifold, and the heatsink I added.
The light engine board on a granite counter, its six white LEDs brightening and dimming one by one
The light engine running.

I never gave that board a way to connect USB serial. So every time I changed the code, I had to pull the ATmega328P chip off the board, move it to an Arduino Uno, flash it, and move it back to the light engine to test. Compile, flash, pull, seat, power up: about 2 minutes a round trip. I did that somewhere around 200 times.

And what was I chasing, 200 times? A few hundred milliseconds. A star flashing instead of flickering. A fade that ramped down in visible steps instead of dissolving. A twinkle a hair too bright or too long. I was trying to make a light look like a star.

A square black test panel with scattered fiber optic stars lit, standing on a kitchen island
A test panel on my kitchen counter.

Six LEDs can’t fake a sky

I got it going in the right direction. But it never looked realistic, and the problem was the architecture, not the code.

With 144 fibers and six LEDs, that’s 24 fibers hard-wired to each LED, so 24 stars twinkle as one group whether you want them to or not. We tried deliberately scattering each bundle’s fibers across the panel so the groups wouldn’t clump. Didn’t matter. It’s noticeable. It’s clearly not random. No twinkle routine fixes a sky where a sixth of it blinks in lockstep.

So I shelved it. Life got in the way, since I have two jobs and I’m a dad, but the real reason is I’d hit a wall I didn’t know how to get past.

What I actually wanted wasn’t for sale

When I looked at what was on the market, the closest thing was Wiedamark’s SkyMax RGB+white kits: color, an app, and twinkle effects. They were cost-prohibitive for me. And they still work the way my board did: fibers run in bundles off ports, a whole bundle lighting as one. More ports and color than mine, but the same bundled architecture. They weren’t extensible, and they didn’t do exactly what I wanted.

What I wanted didn’t exist. So I’m building it.

Starlight

Starlight is the version that gets past the wall. It has 110 fibers, but 70 individually addressable RGBW LEDs instead of six single-color ones. Each LED has PWM, pulse-width modulation, which just means switching the LED on and off faster than your eye can see, so it reads as a dimmer level instead of fully on or fully off. That’s what makes fades smooth and lets a star be any color and any brightness, not just white and on.

The back of a Starlight panel: two black LED strips with loose fiber optic strands running from them, and small groups of fibers lighting up from individual LEDs in different colors
The back of a Starlight panel. Each LED lights on its own, in its own color.

That resolution is what lets me run scenes instead of just twinkles. There’s an ocean scene where the panel sits in blues and greens and aquas and a white wave sweeps across it. You can’t do a wave when your fibers light in six fixed groups.

A dark star panel standing in a room, with a small cluster of lit stars moving across it as the Pong ball
Starlight running Pong. Can your star ceiling do this?

It’s ESP32-based now with its own app, so I update firmware over the air. No more pulling a chip. I can mount the panels, sit under the ceiling with a laptop, push a new build, and watch the effect change in real time, the exact thing I couldn’t do the first time around. It’s extensible too: a microphone, a button or switch, I2C, an IR eye, an API, and a wall controller.

A green circuit board labeled Starlight with an ESP32 module, a USB-C port and screw terminals, on a wood table
The Starlight controller board.
A phone screenshot of the Starlight app showing a dark panel layout with colored stars and scene buttons labeled Calm summer night, Winter sky and Aurora
The Starlight app.
Two black controller enclosures with a Starlight logo and green screw terminals, on a granite counter
Starlight controller enclosures.

The panels are built to be repeatable instead of eyeballed: 2-by-4-foot frames of 1-by-2 boards with a 1/8-inch MDF face, wrapped in black velvet, and a PDF template you tape down and drill straight through so the layout is the same every time.

The first ceiling was one 4-by-8 panel in a theater I meant to finish with two or three more and never did. So I’ve never actually demonstrated it to a client, and most of them don’t know to ask. Starlight is me finally building the thing I wanted when I started poking fibers through foam with a toothpick.