Portrait (vertical) MagicMirror² for a Raspberry Pi kitchen display. Node is managed with mise. Weather uses Open-Meteo (no API key).
Files in this bundle:
config.js— the mirror layout (already set for Chandler, AZ / °F / 12h)custom.css— portrait font/layout tuning
Current MagicMirror needs Node >=22.21.1 (or >=24). Let mise pin it
rather than the bundled install script.
git clone https://github.com/MagicMirrorOrg/MagicMirror.git ~/MagicMirror
cd ~/MagicMirror
mise use node@22 # pins Node in ./mise.toml (use node@24 if you prefer)
mise install
mise exec -- node --run install-mm # installs deps — takes a while, don't interruptcp config.js ~/MagicMirror/config/config.js
cp custom.css ~/MagicMirror/css/custom.cssThe only content TODO left in config.js: replace the US-holidays
calendar feed with your own private ICS URL
(Google Calendar → Settings → your calendar → "Secret address in iCal format").
MagicMirror reads the system clock, so pin the zone that never springs forward:
sudo timedatectl set-timezone America/Phoenix
timedatectl # confirm: America/Phoenix (MST, -0700)cd ~/MagicMirror && node --run start(mise's shims make a plain node resolve to the pinned version inside this repo.)
MagicMirror runs on Wayland by default now. If you're on X11 instead,
use node --run start:x11.
The old display_rotate in config.txt no longer rotates the desktop on
current Raspberry Pi OS (Wayland/labwc). Two options:
GUI: desktop menu → Preferences → Screen Configuration → right-click the HDMI output → Orientation → left (or right).
CLI (permanent): find your output name, then set it in labwc autostart (covered in the next step). Check the name first:
wlr-randr # note your output, usually HDMI-A-1 (sometimes HDMI-A-2)Don't use system-level systemd here — it won't have the Wayland session's display env or mise activation. Put both the rotation and the launch in labwc's autostart, which already runs inside the graphical session:
# ~/.config/labwc/autostart
wlr-randr --output HDMI-A-1 --transform 90 &
cd $HOME/MagicMirror && $HOME/.local/bin/mise exec -- node --run start &Notes:
- labwc autostart runs under
/bin/sh(not a login shell), so mise isn't auto-activated — that's why the full path$HOME/.local/bin/miseandmise execare used (it reads the repo'smise.toml). - Match
HDMI-A-1to whateverwlr-randrreported.
Reboot to test:
sudo reboot- Blank 5-day forecast: change
type: "daily"totype: "forecast"in the second weather block (some builds still use the older keyword). - Weather empty: re-check the lat/lon in both weather blocks. Open-Meteo needs no key, so a blank widget is almost always coordinates.
- Clock/calendar times off: re-run the
timedatectlstep (Section 3). - Node version error on start:
mise currentinside~/MagicMirrorshould show 22.x or 24.x; re-runmise installif not. - Rotation lost after monitor power-cycle: known Pi OS quirk — a reboot restores it; putting the display on standby (not full power-off) avoids it.
These need a git clone into ~/MagicMirror/modules plus a config block —
ask and I'll wire them in:
- MMM-GoogleTasks — shopping list on the mirror
- A timer/pomodoro module — hands-free cooking timers
- MMM-CalendarExt3 — a monthly grid view if you want a full calendar