guide
The Mirror: A smart mirror that shows the weather while you ignore it — Build Guide
Two-way acrylic over an old monitor, a Raspberry Pi running MagicMirror², and suddenly your hallway does calendar, weather and headlines.
BUILD-03
The Mirror
Devs At Home is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program. We earn from qualifying purchases. This never affects what we recommend or what we say about it.
A smart mirror that shows the weather while you ignore it is two-way acrylic film mounted over an old monitor, driven by a Raspberry Pi running MagicMirror² software. The monitor shows black screen behind the mirror surface when pixels are off, and bright text appears through the acrylic when pixels light. You mount it where you already stop — the hallway, the bathroom door frame — and it displays calendar, weather, news headlines and commute times without asking you to look at it deliberately.
Key points
- Two-way mirror acrylic becomes transparent where the monitor pixels behind it light up, and reflective where the screen stays black.
- MagicMirror² is open-source software that runs on a Raspberry Pi and displays modular widgets on a dark background optimised for readability through acrylic.
- The Yookeer 3 Pcs Two Way Mirror ships as 12x16 inch sheets you cut to fit your monitor bezel, and the adhesive backing peels off to stick directly to the glass.
- The RasTech Raspberry Pi Zero 2W Kit with Pin Header includes the board, a case, a power supply and the GPIO header already soldered, so you connect the HDMI adapter and boot from the microSD card without further assembly.
- The build stalls most often when the Pi will not connect to WiFi because you mistyped the network password in the config file on a different machine, or because your router filters unfamiliar MAC addresses.
- Once the base build works, you add modules from the MagicMirror² community repository — transport times, stock tickers, Spotify now-playing, HomeAssistant sensor data — by editing a single JavaScript config file.
What you are building and why it is worth one to two weekends
You remove the stand and back panel from an old monitor you no longer use for work. You stick two-way mirror acrylic to the glass. You mount the monitor in a frame or screw it directly to the wall. Behind it, you tape a Raspberry Pi Zero 2W to the monitor housing and run an HDMI cable and a power lead. You flash MagicMirror² to a microSD card, edit a config file to add your location and calendar feed, and boot the Pi. The monitor lights up with the time across the top, weather and forecast down the left, and your day's calendar appointments down the right, all white text on black. Where text appears, you see through the mirror. Everywhere else, you see your reflection.
The appeal is ambient information you do not have to ask for. You walk past on your way out and you know if it will rain. You glance while brushing teeth and you remember the standup moved to ten. The mirror does not require you to pull a phone from a pocket or wake a screen. It just sits there, updating itself, answering questions you did not voice.
The build takes two evenings if you already have a monitor and a frame. Add a weekend if you are cutting lumber and learning mitres. The software setup is an hour, though getting WiFi to connect the first time can stretch that.
The parts list: what each item does
| Part | What it does | Tier |
|---|---|---|
| RasTech Raspberry Pi Zero 2W Kit with Pin Header | Single-board computer that runs MagicMirror² software, connects to WiFi, and drives the monitor via HDMI. Kit includes case, power supply and GPIO header pre-soldered. | Budget |
| SANDISK 128GB Extreme microSD Card + Adapter | Storage for the Raspberry Pi operating system and MagicMirror² installation. 128GB is overkill for this project but leaves room for additional modules and logs. | Mid-range |
| Yookeer 3 Pcs Two Way Mirror | Acrylic sheets, 12x16 inches each, with adhesive backing. Reflects like a mirror where the screen behind is black, and becomes transparent where pixels light up. | Budget |
You also need a mini HDMI to HDMI adapter cable for the Pi Zero 2W, available wherever the Pi itself is sold. The adapter connects the Pi's mini HDMI port to the monitor's standard HDMI input.
What you supply yourself, honestly
An old monitor you no longer love. Anything from 19 inches up works. Thinner bezels look cleaner once framed, but thick bezels are easier to hide inside a wooden frame. The monitor needs an HDMI input. VGA and DVI models exist but add unnecessary adapter trouble.
A picture frame or lumber to case it. The cheapest path is a picture frame from a charity shop, oversized enough that the monitor sits inside the opening. You remove the glass and backing, mount the monitor face-out, and let the frame hide the bezel and the Pi taped to the back. If you cut your own frame, you need four lengths of timber, wood glue, corner clamps, and confidence with a mitre saw. The frame does not need to be beautiful; it needs to be square and deep enough that the monitor does not poke out the back.
Patience with WiFi passwords typed on a tiny keyboard. You will edit a text file on the microSD card before the first boot, entering your network name and password. Get one character wrong and the Pi will not connect. You will not know which character until you plug the Pi into a monitor and keyboard, log in over the command line, and run sudo raspi-config to re-enter the credentials. Keep a USB keyboard and the mini HDMI adapter within reach for this inevitability.
Double-sided foam tape, electrical tape, cable ties and a wall-mounting bracket if you are not using a frame. The Pi and its cables need to stay attached to the back of the monitor without rattling loose or pulling the HDMI connector sideways.
The build, in numbered phases sized to an evening each
Phase one: prepare the monitor and apply the acrylic. Remove the monitor stand and the back panel. Most monitors have four screws holding the back on; some are hidden under stick-on feet or warranty seals. Once the panel is off, you will see the circuit board, the power supply, and the metal chassis. Leave them alone. Clean the front glass with isopropyl alcohol or glass cleaner and let it dry completely. Cut the Yookeer two-way mirror acrylic to match the visible screen area, not the bezel. Measure twice. Peel the backing and apply the acrylic to the glass, working from one edge to the other to avoid bubbles. Press firmly. Trapped air shows as cloudy patches; most smooth out if you press from the centre toward the edge with a credit card.
Phase two: flash the microSD card and configure WiFi. Download Raspberry Pi OS Lite from the Raspberry Pi website. Use the Raspberry Pi Imager tool to write the image to the SANDISK 128GB Extreme microSD card. Before ejecting the card, open the boot partition in your file manager and create a new text file called wpa_supplicant.conf. Paste in the WiFi configuration block with your network name and password. The exact syntax matters: country code, SSID in quotes, password in quotes, and curly braces closed. Save it. Create a second empty file called ssh with no extension. This enables SSH access so you can log in remotely if the Pi connects to WiFi but you cannot see the screen yet. Eject the card and slot it into the Pi.
Phase three: install MagicMirror² and test the display. Connect the Pi to the monitor with the mini HDMI to HDMI adapter. Plug in power. The Pi boots in thirty seconds. If WiFi connected, you will see the command prompt and eventually the graphical desktop. Open a terminal and run the MagicMirror² installation script, which downloads Node.js, installs dependencies, and sets up the default config. The script is a single curl command copied from the MagicMirror² documentation. It takes ten minutes. When it finishes, run npm start from the MagicMirror directory. The screen goes black, then displays a clock, calendar and weather. This is the base config. If nothing appears, check the terminal for errors. Most failures here are API keys missing from the config file or incorrect location settings.
Phase four: edit the config file to match your needs. Stop MagicMirror² with Ctrl-C. Open config/config.js in a text editor. The file is structured as JavaScript, but you do not need to write code. Change the lat and lon values to your location. Add your calendar feed URL to the calendar module. If you use Google Calendar, you need the secret iCal link from calendar settings, not the public HTML link. Save and restart MagicMirror². The weather updates to your city and your appointments appear on the right. Each module has settings for font size, update interval and position. Adjust them one at a time, save, restart, and check the result.
Phase five: mount the monitor in the frame. If you bought a picture frame, remove the glass and backing board. Lay the monitor face-down on a towel and position the frame around it. The monitor should sit inside the frame opening with the bezel hidden. If the monitor is too thick, you may need to remove part of the frame backing or add spacers. If you built a wooden frame, measure the monitor dimensions and cut the frame pieces to match, adding an inch to each side for the bezel. Glue the corners, clamp them square, and let the glue dry overnight. Attach the monitor to the frame with small L-brackets screwed into the frame and the monitor housing. Use double-sided foam tape as backup. Tape the Pi to the back of the monitor with electrical tape. Loop and tie the cables so nothing pulls on the HDMI connector. If the Pi is loose, it will work free and the HDMI connection will fail silently.
Phase six: hang the mirror and hide the power cable. Mount the frame to the wall with a heavy-duty picture hanger or a French cleat if the monitor is over ten kilograms. Run the power cable down the wall and either tuck it behind skirting board or run it through cable trunking. The mirror powers on automatically when plugged in. MagicMirror² is configured to start on boot, so you do not need to log in or click anything.
Where this build actually stalls, and how to get unstuck
The Pi will not connect to WiFi. You typed the password wrong in wpa_supplicant.conf, or your network name has a space or special character you did not quote correctly, or your router is filtering MAC addresses. Plug the Pi into a monitor and USB keyboard. Log in — default username pi, default password raspberry — and run sudo raspi-config. Navigate to network settings and re-enter the WiFi credentials through the menu. If the Pi still will not connect, check the router for MAC filtering or guest network isolation that blocks device-to-device communication.
MagicMirror² displays nothing but a black screen. The software started but no modules loaded, usually because the config file has a syntax error. SSH into the Pi or connect a keyboard and open config/config.js. Look for missing commas, unclosed quotes, or curly braces that do not match. JSON and JavaScript are unforgiving. Copy the whole config into an online JSON validator to find the line with the error. Fix it, save, and restart.
The display works but weather and calendar do not update. The weather module needs an API key from OpenWeatherMap, which is free but requires signup. The calendar module needs a valid iCal feed URL, and some calendar services rate-limit requests or expire the secret link after a few months. Check the MagicMirror² log in the terminal for HTTP errors. The log tells you which module failed and why.
The mirror is too dim to read in daylight. The monitor brightness is set too low, or the two-way acrylic is too dark. Open the monitor on-screen menu and set brightness to maximum. If that does not help, the monitor itself is too dim for this project. Older LCD panels and some laptop screens do not produce enough light to punch through acrylic. You need a monitor rated for at least 250 cd/m² brightness, which is most desktop monitors made after 2015.
The reflection is distorted or cloudy. The acrylic is not flat against the glass, or there are bubbles you did not press out, or the acrylic sheet is low quality and warped. Peel it off, clean the glass again, and reapply more slowly. Start at one edge, press down in a line, and smooth toward the opposite edge with a squeegee or credit card. If the sheet itself is bent, buy a replacement. Cheap acrylic under tension will never lie flat.
Safety, etiquette and the cleanup that keeps you allowed to do this again
The monitor back panel is off and mains voltage runs to the power supply inside. Do not touch the circuit board while the monitor is plugged in. If you need to adjust something, unplug it first, wait thirty seconds for capacitors to discharge, then touch the metal chassis to ground yourself before reaching inside. Most monitor power supplies are switch-mode and low risk, but the input side carries enough voltage to hurt.
The Pi runs hot when driving a monitor continuously. The RasTech kit includes a case with ventilation slots. Use it. If you tape the Pi directly to the monitor without a case, leave air space around the processor. The Pi Zero 2W will throttle itself if it overheats, which shows as stuttering animations or modules that stop updating. Adding a small heatsink to the processor chip solves most thermal problems.
If you are renting, get permission before screwing anything into the wall. A mirror hung on a picture hook leaves two small holes and is reversible. A mirror bolted through plasterboard with wall anchors is not. Offer to return the wall to its original state when you move out, and take photos before you start.
Clean up the packaging and offcuts as you go. If you are working in a shared space, the project should pack away between sessions into a box that does not sprawl across the table for a week. Two-way acrylic sheds its backing paper everywhere. Sweep it up or it will migrate into other rooms on sock feet.
Ways to take it further once the base build works
Add a motion sensor so the mirror wakes only when someone is in front of it. A PIR sensor module costs less than a sandwich, connects to the Pi GPIO pins, and MagicMirror² supports it through the MMM-PIR-Sensor module. The screen stays off until you walk up, then lights for two minutes. This saves power and extends the monitor backlight life.
Install third-party modules from the MagicMirror² community repository. The default install includes clock, calendar, weather and news. The repository adds hundreds of modules: transport times, cryptocurrency prices, Spotify now-playing, XKCD comics, Todoist tasks, HomeAssistant sensor data. Each module is a Git repository you clone into the modules folder, then enable in the config file. Some modules require API keys or additional npm packages.
Run MagicMirror² on a faster Pi if you add more than six or seven modules. The Pi Zero 2W handles the base config and a few extras without stuttering, but ten modules updating every thirty seconds will slow the interface. A Raspberry Pi 4 runs cooler and updates faster, though it costs more and needs active cooling.
Voice control the mirror with a USB microphone and the MMM-AssistantMk2 module, which connects to Google Assistant. You can ask it for weather, set timers, or control smart home devices. The appeal is niche — most people already have a phone in their pocket — but if you want the mirror to answer questions out loud, the module exists and works.
Build a second mirror for a different room. The config file is portable. Copy it to a new Pi, change the calendar feed and location if needed, and flash a second microSD card. The time investment is front-loaded; the second build takes an evening.
Common questions
Can I use a Raspberry Pi 3 or 4 instead of the Zero 2W?
Yes, and it will run faster and cooler. The Pi Zero 2W is cheap and small enough to tape behind a monitor, which is why it is specified here. A Pi 4 needs a case with a fan and more space, but it handles more modules without slowing down. If you already own a Pi 4, use it.
Does the mirror need to stay plugged in all the time?
Yes, unless you add a motion sensor to wake it on demand. The Pi draws about two watts and the monitor draws fifteen to thirty watts depending on size. Left on continuously, that is ten to twenty kilowatt-hours a month, which is cheaper than leaving a desktop computer on but more than leaving a phone charger plugged in. If the mirror is in a hallway you pass twenty times a day, the always-on model makes sense. If it is in a room you visit once a day, add the motion sensor.
What happens if the WiFi goes down?
The mirror continues to display the last data it fetched. The clock still updates because it runs locally, but weather, calendar and news freeze until WiFi returns. MagicMirror² does not show an error message; it just stops updating. When WiFi reconnects, the modules resume fetching data within a minute.
Can I use a TV instead of a monitor?
You can, but TVs are heavier, deeper, and harder to frame. A 32-inch TV weighs twice what a 24-inch monitor weighs and needs a French cleat or a proper TV wall mount. TVs also tend to display a logo or input label for a few seconds on power-up, which looks wrong on a mirror. Use a monitor unless the mirror is going in a room where size matters more than elegance.
How do I update MagicMirror² when a new version is released?
SSH into the Pi, navigate to the MagicMirror directory, and run git pull followed by npm install. This pulls the latest version from the repository and installs any new dependencies. Restart MagicMirror² and check that your modules still work. Most updates are backward-compatible, but occasionally a major version changes the config file format and you need to edit config.js to match the new syntax.
What if I want to display my own photos instead of news headlines?
Install the MMM-ImageSlideshow module from the MagicMirror² repository. Point it at a folder of images on the Pi or a network share, and it will cycle through them at an interval you set. You can run it alongside the clock and weather, or make it full-screen. The module supports JPEG and PNG.
Can I control which modules appear at different times of day?
Yes, through the MMM-ProfileSwitcher or MMM-ModuleScheduler modules. You define profiles or schedules that show or hide modules based on time of day, day of week, or manual switching. If you want the mirror to show calendar and weather in the morning, then switch to headlines and transport times in the evening, the scheduler does it automatically.
Is there a way to make the display portrait instead of landscape?
Add display_rotate=1 to /boot/config.txt on the Pi to rotate the display ninety degrees. Some modules do not lay out well in portrait, so you will need to adjust font sizes and positions in the config file. A portrait mirror works better in a narrow hallway or beside a door where a landscape mirror would block light switches.
The verdict
A smart mirror that shows the weather while you ignore it is worth building if you have an old monitor and a weekend, and if you already stop in the same spot every morning. The information is ambient and the build is forgiving — you can misconfigure MagicMirror² a dozen times and just edit the file again until it works. The hardware cost is under the price of three takeaway coffees if you already own the monitor, and the result is something you made that works every day without asking for attention.
Do not build this if you want it to do more than display information. Voice control and touch input exist but feel bolted on. The mirror is at its best when it just sits there, updating silently, answering questions you did not ask. If you want interactivity, a tablet on the wall is a better starting point.