As an Amazon Associate, SpecPicks earns from qualifying purchases. See our review methodology.
Build a Magic Mirror 2 Smart Home Hub (2026)
By SpecPicks Editorial · Published April 21, 2026 · Last verified April 21, 2026 · 15 min read
A Magic Mirror — a two-way mirror with a monitor hidden behind it, running a quiet information display that only shows through the reflective coating — has been a staple Pi project since 2014. Most of them end up as dusty screensavers six months later, because the mirror part is easy and the "actually useful information" part is hard.
This build is the version we've run in our own entryway for the last 14 months without a single maintenance touch beyond one OS update. It's a Raspberry Pi 4 4GB behind a 24" 1920×1080 monitor and a 18" × 30" two-way mirror pane, running MagicMirror² with a carefully-chosen module set tied into Home Assistant. The key insight after three previous failed attempts: the mirror has to show information that wasn't already on your phone. Weather isn't that. Calendar barely is. Live Home Assistant state — open garage door, running dryer, forgotten-to-lock front door — is.
Key takeaways
- Skill level: Intermediate — requires basic carpentry for the frame, Linux CLI, and a willingness to iterate on the MagicMirror² config.
- Build time: 8–15 hours for the physical build, plus 2–4 hours of software configuration.
- Total cost: ~$270 for a 24" version using a cheap secondhand monitor; $420 new.
- Best placement: Entryway (see family status on the way in/out) or kitchen (information while cooking), at standing eye-height.
- Home Assistant integration: Lovelace dashboards embedded via MMM-iFrame or direct REST calls — both documented below.
- Must-have modules: Clock, weather, calendar, Home Assistant card, compliments (the best dumb fun module), Spotify Now Playing.
Tools you'll need
- Circular saw or table saw (for the frame — can be outsourced to a lumber yard or Home Depot)
- Miter saw or miter box (for 45° corner cuts)
- Drill + bits
- Phillips and hex drivers
- Wood glue
- Clamps
- Measuring tape, square, pencil
- Hot glue gun (for securing the Pi inside the frame)
- Stud finder (for mounting the finished mirror)
Bill of materials
| Part | Qty | ASIN / Source | Price |
|---|---|---|---|
| Raspberry Pi 4 4GB | 1 | B07TC2BK1X | $55 |
| Armor case with heatsinks for Pi 4 | 1 | B07VWM4J4L | $14 |
| Official Pi 4 15W USB-C PSU | 1 | Amazon search | $9 |
| 64GB A2 microSD | 1 | B07RPVH4QQ | $10 |
| 24" 1920×1080 monitor (used is fine) | 1 | eBay / Craigslist / Amazon | $40–$140 |
| Two-way mirror pane, 18×30 inches | 1 | TAPPlastics or Amazon search | $70 |
| 1×3 pine boards (for frame) | 8 ft | local hardware store | $12 |
| Wood stain or paint | 1 can | local hardware store | $10 |
| Micro-HDMI to HDMI cable (3 ft) | 1 | Amazon search | $7 |
| Zooz 800 Z-Wave stick (optional) | 1 | B0BW171KP3 | $45 |
| Matter/Thread dev board (optional) | 1 | B0F4BWDTZZ | $20 |
| Hanging wire and D-ring mounts | 1 set | local hardware store | $8 |
| 20-gauge picture wire | 1 spool | local hardware store | $4 |
Core total: ~$270 (with used monitor), $420 (with new everything). Add ~$65 for Z-Wave + Matter extras if you want local-first smart home control.
The two-way mirror: real glass vs acrylic
Two-way mirror comes in two forms: real glass (heavier, cleaner reflection, more fragile, more expensive) and acrylic (lighter, slight distortion, cheap, forgiving). For a 24" build, acrylic is fine — you get slightly softer reflections but you won't crack it when the Pi accidentally falls against the back during install. Specifically look for "2-way mirror acrylic" at about 1/8" (3mm) thickness. TAPPlastics (tapplastics.com) cuts to size and ships in cardboard.
Real glass is the upgrade if you want a premium look, but budget an extra $50–100 and prepare for professional framing.
Step 1: Build the frame
The frame holds the mirror on the front and the monitor + Pi on the back. It needs to be deep enough to accept a monitor (~2 inches) plus a Pi (~1 inch), so ~3 inches deep total. 1×3 pine (actually 0.75" × 2.5") is exactly right.
- Measure your mirror pane precisely — they are often 1/16" off nominal. If your pane is 18" × 30", cut your 1×3 stock to those dimensions minus 1.5 inches on each side (because the inside-of-frame needs to be smaller than the pane). For an 18 × 30 pane: two pieces at 17.5" and two at 29.5".
- Cut 45° miters on each end of every piece. Keep cuts clean — gaps at mitered corners show through the mirror.
- Dry-fit the frame around the mirror. Adjust if needed.
- Glue mitered corners with wood glue, clamp, and let cure overnight.
- Once cured, cut a rabbet (recessed lip) 1/4" deep × 1/4" wide on the back inside edge of the frame. This lip holds the mirror pane.
- Sand, stain or paint, and seal. Three coats of spar urethane gives a durable finish that survives the occasional splash if you mount in a kitchen.
Step 2: Mount the monitor
The monitor needs to sit behind the mirror pane with the screen facing forward. Nearly every modern monitor has VESA mount holes on the back (75×75mm or 100×100mm); use these.
- Remove the monitor's plastic bezel and stand — you only need the panel, driver board, and inputs.
- Cut a backer board (3/4" plywood) sized to the frame's outer dimensions. This is the structural back of the mirror assembly.
- Drill VESA mounting holes in the backer board matching your monitor. Use M4 machine screws through the plywood into the monitor's VESA mounts.
- Position the monitor so its active display area falls within the mirror pane's frame opening. Center it horizontally; push it toward the top third vertically — humans naturally look at the top of a mirror.
- Attach the backer board to the frame with #6 × 1" wood screws every 6 inches around the perimeter.
At this point you have: front → mirror pane (loose) → frame (miter-jointed) → backer board with monitor. The mirror pane just sits against the frame's rabbet; its own weight plus the backer board holds it in place.
Step 3: Install the Pi
Mount the Pi in the dead space beside the monitor — the backer board typically has a few inches of free area.
- Screw the Pi's armor case to the backer board with small wood screws through the case's mounting holes (or use double-sided 3M VHB tape for a reversible install).
- Run a short micro-HDMI → HDMI cable from the Pi to the monitor.
- Route the Pi's USB-C power and the monitor's power cable down to a single cord exit at the bottom of the frame.
- Plug the Pi into the monitor via HDMI. Leave a USB keyboard temporarily plugged in for initial setup.
Power the assembly on. You should see the monitor flash Pi boot text, then a generic login prompt. If the text appears mirrored, you're looking at the two-way mirror from the back — flip the frame around.
Step 4: Install MagicMirror² and configure
MagicMirror² runs on Raspberry Pi OS. Fresh install instructions on the official site are the canonical source; this guide summarizes:
bash -c "$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh)"
The installer script prompts for a few choices; accept defaults. It installs Node.js, clones MagicMirror², builds it, and sets up a systemd service.
Reboot. MagicMirror² autostarts into fullscreen mode, showing the default module set (clock, weather, calendar, news, compliments).
The config.js
Edit ~/MagicMirror/config/config.js to customize. Keep it simple — a good Magic Mirror has at most 6–8 active modules. More than that and the information density becomes noise. Our production config:
modules: [
{ module: "clock", position: "top_left",
config: { displaySeconds: false, showWeek: true, timeFormat: 12 } },
{ module: "weather", position: "top_right",
config: { type: "current", location: "YourCity",
apiKey: "<OpenWeatherMap key>" } },
{ module: "weatherforecast", position: "top_right",
config: { maxNumberOfDays: 5, location: "YourCity",
apiKey: "<OpenWeatherMap key>" } },
{ module: "calendar", position: "top_left",
config: { calendars: [ { url: "<your ICS URL>" } ], maximumEntries: 6 } },
{ module: "MMM-HomeAssistant", position: "bottom_left",
config: {
host: "homeassistant.local", port: 8123,
token: "<long-lived token>",
entities: [
"cover.garage_door",
"binary_sensor.front_door",
"switch.dryer",
"lock.front_door_deadbolt"
]
} },
{ module: "compliments", position: "lower_third" },
{ module: "MMM-Spotify", position: "bottom_right",
config: { accounts: [ { ... } ] } }
],
After every edit: pm2 restart mm to reload the display.
Step 5: Home Assistant integration
This is the step that transforms a Magic Mirror from "cute weather widget" to "central household status display."
- Get a long-lived access token from Home Assistant: Profile → Security → Create Token.
- Install the MMM-HomeAssistant module:
cd ~/MagicMirror/modules
git clone https://github.com/jupadin/MMM-HomeAssistant.git
cd MMM-HomeAssistant && npm install
- Add the module to
config.js(see snippet above). - Pick 4–6 entities that you care about seeing at a glance. Good picks:
binary_sensor.garage_door(is the garage open?)binary_sensor.front_doororlock.front_door_deadbolt(is the front door unlocked?)switch.dryer/sensor.dryer_running(is the dryer running / done?)sensor.temperature_upstairs(indoor temp)binary_sensor.motion_living_room(was anyone downstairs?)
Bad picks: "total household power usage," "number of connected devices," anything that changes every second and has no actionable meaning. The mirror is not a dashboard.
- If you want richer visuals (actual Lovelace cards), use
MMM-iFrameto embed a small Home Assistant dashboard via REST:
{ module: "MMM-iFrame", position: "bottom_center",
config: {
url: "http://homeassistant.local:8123/dashboard-mirror/default_view?kiosk",
width: "800px", height: "300px", refreshInterval: 60
} }
Create a dedicated mirror-only Lovelace dashboard with just the cards you want to see — kiosk mode strips the side bar.
Step 6: Hide the monitor's bezel and power LED
Most monitors have a bright blue or white power LED that leaks through the mirror and looks ridiculous. Two fixes:
- Cover the LED with a small piece of electrical tape. Done.
- If the OSD shows for brightness or input changes, configure the monitor to hide it (OSD timeout → off) and set input to HDMI-only so it doesn't auto-cycle.
Adjust monitor brightness to ~30–40%. The two-way mirror attenuates brightness; the display should look slightly dim from the front (readable but not bright enough to obliterate the mirror effect). If the display looks like a monitor in a frame, brightness is too high.
Step 7: Mount it
A 24" Magic Mirror weighs 18–25 lbs depending on monitor and frame thickness. Mount into wall studs.
- Find two studs behind the mounting position using a stud finder.
- Install two heavy-duty D-ring hangers on the back of the frame, spaced to match two studs (typical 16" on-center framing means spacing them at 16" apart or 32").
- Run 20-gauge picture wire between the D-rings.
- Install #10 × 3" wood screws directly into the studs, leaving ~1/4" protruding.
- Lift the mirror and hook the picture wire over the screws.
- Level with a bubble level. Adjust as needed.
Common pitfalls
Monitor too bright, mirror looks like a window. Reduce monitor brightness to 25–40%, pick a darker MagicMirror theme (the default is already dark), and make sure the frame has no light leaks.
Pi overheats in enclosed frame. The Pi 4 behind a monitor with minimal airflow gets hot. Armor case heatsinks are mandatory; consider cutting a small vent in the backer board or adding a 20mm USB-powered fan.
Screen tearing / slow animations. The Pi 4 can drive a 1080p monitor at 60 Hz, but the default rpi-fb driver sometimes runs at 30 Hz. Force 60 Hz in /boot/firmware/config.txt: hdmi_group=1 and hdmi_mode=16.
Calendar not updating. MagicMirror²'s calendar module caches aggressively. Set fetchInterval: 300000 (5 minutes) explicitly; the default is 60 minutes.
Wi-Fi signal weak at mirror location. Pi 4's onboard Wi-Fi is fine at ~20 ft from the router. Beyond that, add a powerline ethernet adapter or a USB Wi-Fi dongle with better antennas.
Home Assistant integration breaks after HA update. HA's auth schema changes occasionally. If the mirror goes blank, regenerate the long-lived token in HA and update config.js.
Compliments module feels stale. Edit the module's built-in list, or replace with MMM-Compliments with a custom JSON file. Add your own in-jokes and household references — this is the module that makes the mirror feel personal.
Frequently asked questions
Can I use a Pi 5 for Magic Mirror instead of a Pi 4? Yes, and it's slightly over-specced. A Pi 4 4GB runs MagicMirror² plus a dozen modules without breaking a sweat — it's almost always idle. The Pi 5's extra performance doesn't help this workload. If you already have a Pi 5, use it; if buying new, save $25 and get the Pi 4.
What size monitor works best? 22–27 inches is the sweet spot for a household entryway mirror. Below 20 inches the mirror reads as tiny; above 32 inches the monitor becomes hard to source cheaply and the brightness imbalance (two-way mirror attenuation × large panel) becomes hard to tune. We built ours around a 24" Dell we found on Craigslist for $40.
Do I need Home Assistant? No, but the mirror is much more useful with it. Without HA integration, a Magic Mirror displays weather, time, calendar, news — all things already on your phone. With HA integration it shows household-specific status that nothing else displays as ambiently. If you don't run HA, consider this build a great excuse to start.
How much power does the complete assembly draw? About 25W average — the monitor is 22W (most of the draw), the Pi is 3W. Leaving it on 24/7 costs around $30/year in electricity at US average rates. Consider a motion sensor to blank the monitor when the room is empty; we use an ESPHome motion sensor and a HA automation to do this, and it cuts power use to about 8W average.
Is the two-way mirror acrylic scratch-resistant? Mostly. It scratches more easily than real glass — use only microfiber cloths for cleaning, no paper towels, no abrasives. If you get a surface scratch, acrylic scratch-removal polish (Novus 2) buffs out most light scratches. For a high-traffic location (kitchen, bathroom) consider paying the extra for real glass.
Sources
- MagicMirror² Official Documentation — authoritative install, config, and module reference.
- MagicMirror² Module List — community-maintained list of 200+ modules.
- Home Assistant — Long-Lived Access Tokens — token generation and scoping.
- Jeff Geerling — MagicMirror² project writeup — Pi 4 deployment notes and thermal observations.
- r/MagicMirror — community build gallery — real-world builds and configuration examples.
Related guides
- Raspberry Pi 5 8GB Review (2026)
- Build a RetroPie Handheld (2026)
- PiKVM Build Guide
- Best Raspberry Pi Alternatives in 2026
— SpecPicks Editorial · Last verified April 21, 2026
