<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Docker MagicMirror + a separate "dumb" display Pi (remote kiosk over a reverse proxy)]]></title><description><![CDATA[<p dir="auto">Sharing a setup that’s been working well for me, in case it’s useful to anyone else juggling a physical MM display on aging/fragile hardware.<br />
Background: I had MagicMirror running natively on a Raspberry Pi 3B with a monitor attached. I wanted to move to Docker, but didn’t want to run Docker on the same Pi that’s driving the display, that Pi is old, and I didn’t want display/GPU quirks tangled up with container management.</p>
<p dir="auto">What I ended up with instead:</p>
<ul>
<li>MagicMirror runs as a single Docker container on a separate, more capable Pi on the same home network , completely headless, no monitor attached.</li>
<li>The Pi with the physical monitor doesn’t run MagicMirror at all anymore. It just runs a browser in kiosk mode, pointed at a small local reverse-proxy process running on that same Pi, which in turn proxies through to the Docker container’s web UI.<br />
Why the proxy, instead of just pointing the browser straight at <code>containerhost:8080</code>?<br />
Two reasons:</li>
</ul>
<ol>
<li>MagicMirror sends <code>X-Frame-Options: SAMEORIGIN</code>, which matters if you want to wrap the feed in your own page (see #2).</li>
<li>I wanted a couple of small custom status overlays on the display itself — e.g. a banner if the Docker host becomes unreachable, or if internet connectivity drops but the local container is still fine. To overlay anything on top of MM’s own page you need it loaded same-origin, so a tiny local Node reverse-proxy on the display Pi re-serves the container’s content from <code>localhost</code>, strips that header, and the wrapper page around it handles the status banners.<br />
Why this arrangement, generally:</li>
</ol>
<p dir="auto">One MagicMirror instance/config to maintain, no matter how many physical screens you eventually want — each display Pi is just “a browser + a small proxy,” nothing module- or backend-specific.<br />
Any hardware-specific pain (GPU driver quirks, monitor power management, etc.) on the display Pi stays isolated from the actual MagicMirror process, a crash or leak in a module’s backend logic can’t take the display down, since they’re not sharing a process tree anymore.</p>
<p dir="auto">Honest caveat: this doesn’t make the display Pi itself lighter, it’s still a real browser doing real DOM/JS rendering and image decoding locally, so don’t expect a resource-usage miracle on the display side. What you get is architectural: single source of truth for MM itself, and a much smaller, simpler thing running on whatever hardware is stuck driving a screen<br />
I’m pairing this with a Radar motion sensor for wake-on-motion, poll a GPIO pin and call dpms_control on on a HIGH reading, dpms_control off after N minutes of no motion. One thing worth knowing if you’re doing the same: Trixie’s kernel exposes the GPIO chip at a different base offset than older Raspberry Pi OS versions, so older libraries like onoff that write raw BCM pin numbers straight to sysfs (/sys/class/gpio/export) fail with EINVAL. Shelling out to gpioget/gpiomon from libgpiod-tools instead sidesteps that entirely:</p>
]]></description><link>https://forum.magicmirror.builders/topic/20342/docker-magicmirror-a-separate-dumb-display-pi-remote-kiosk-over-a-reverse-proxy</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 00:06:12 GMT</lastBuildDate><atom:link href="https://forum.magicmirror.builders/topic/20342.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Aug 2026 15:16:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Docker MagicMirror + a separate "dumb" display Pi (remote kiosk over a reverse proxy) on Mon, 24 Aug 2026 16:55:40 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/rags" aria-label="Profile: Rags">@<bdi>Rags</bdi></a> I might try that out. But use a Fully Kiosk Browser on an Android tablet for the display.<br />
I could probably use the camera for motion detection.</p>
]]></description><link>https://forum.magicmirror.builders/post/131778</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/131778</guid><dc:creator><![CDATA[bwente]]></dc:creator><pubDate>Mon, 24 Aug 2026 16:55:40 GMT</pubDate></item></channel></rss>