Let’s start with the homepage of the UI. It’s made in React with Mantine. The frontend is largely vibe coded, as I did the backend by hand and I coded enough frontends for the year. It’s not public, it does the trick, and it’s been generated for the

Eiffel Tower Control

Not too long ago, I built a LEGO Eiffel Tower in my apartment and installed a Brickstuff light kit on it. This light kit is extremely impressive by light kit standards - with 500+ LEDs and full Wi-Fi control via WLED via APIs, MQTT, etc etc.

The real Eiffel Tower automatically switches on at sunset and sparkles on the hour until 12 AM (1 AM in the summer). But, I want my LEGO Eiffel Tower to light up just like the actual Eiffel Tower (6 hours behind of course, I don’t need a light show at 11 AM my time).

Eiffel Tower Control solves this problem by being a smart cronjob system. Every night, it generates a list of jobs for the day, determined by which schedule the tower is (supposed) to be on, when sunset is, and using WLED presets that I programmed, can change the lighting of the tower via HTTP.

This control is exposed via another API, which is then consumed by the Eiffel Tower Control frontend so I can see (and control) the cronjob system from my phone, tablet, or laptop.

It’s a fun, hacky project that controls what is now a centerpiece in my apartment, and makes great use of the premium light kit I bought.

Timeframe: December 2025

 Let’s start with the homepage of the UI. It’s made in React with Mantine. The frontend is largely vibe coded, as I did the backend by hand and I coded enough frontends for the year. It’s not public, it does the trick, and it’s been generated for the

Let’s start with the homepage of the UI. It’s made in React with Mantine. The frontend is largely vibe coded, as I did the backend by hand and I coded enough frontends for the year. It’s not public, it does the trick, and it’s been generated for the low price of free with Gemini & Codex, so that’s a good win in my book.

The first box is tower status, which shows what the LEGO Eiffel Tower is doing. This includes details on the schedule & current preset it’s running, or if the cronjobs are running, paused (until the next day), or stopped, with buttons below that to control such state. The tower has different schedules for different times of year, and for special holidays with holiday lighting presets. I’ve done a lot of work to ensure that the tower is matching up to the real Eiffel Tower - thankfully, there’s a webcam on YouTube pointed at the tower so I can verify what I’m doing!

Below that is the list of upcoming jobs to execute, which includes which preset it’ll be set to, the execution time, and options to pause & delete a specific cronjob.

 At the bottom of the page lists the cronjobs that were executed (anything that isn’t in a scheduled state). The badge will change if a cronjob was paused at execution time, if the job failed, etc.  There are two fields on the backend for scheduled e

At the bottom of the page lists the cronjobs that were executed (anything that isn’t in a scheduled state). The badge will change if a cronjob was paused at execution time, if the job failed, etc.

There are two fields on the backend for scheduled execution time vs actual execution time, this uses the latter, so it’s useful to see if cronjobs are getting executed at the right time.

Screenshot 2025-12-29 at 6.29.17 PM.png
 Next up is the presets page, which is where WLED presets are mapped into system presets for Eiffel Tower Control.  Now, I could’ve relied on the preset system built into WLED, but the Eiffel Tower comes with a lot of very cool (but not very useful t

Next up is the presets page, which is where WLED presets are mapped into system presets for Eiffel Tower Control.

Now, I could’ve relied on the preset system built into WLED, but the Eiffel Tower comes with a lot of very cool (but not very useful to realism) presets loaded by Brickstuff. This is meant to pare that down to a much more manageable list for the context of Eiffel Tower Control.

The five system level presets here are simple enough - and there’s an add preset button in case things change in the future.

 This is what the modal looks like to add a new preset. It’s very similar for editing a preset as well.

This is what the modal looks like to add a new preset. It’s very similar for editing a preset as well.

 For any presets that are non system presets, edit & delete buttons will appear next to the preset.

For any presets that are non system presets, edit & delete buttons will appear next to the preset.

 Finally, this is the system settings page. This is where stuff like the presets used for lighting effects can be configured, the WLED controller IP, and also has controls for system state as well.  Overall, Eiffel Tower Control has been a very fun p

Finally, this is the system settings page. This is where stuff like the presets used for lighting effects can be configured, the WLED controller IP, and also has controls for system state as well.

Overall, Eiffel Tower Control has been a very fun project that I’ll continue working on as I get the lighting schedule down pat!