A browser-based digital signage platform for DIY smart mirrors — pair a display in seconds, drag-and-drop widgets onto a live preview, and let scheduled layouts and a burn-in-safe screensaver handle the rest.
Reduce the setup time and make managing your display easy from anywhere on any device.
Smart mirror builds have been a DIY favourite for years — an old monitor, a sheet of two-way acrylic, and a Raspberry Pi propped up behind it. The problem is every build ends up with the same headaches: hardcoded widget positions, no way to preview a layout before it's stuck to a wall, and configuration that means SSH-ing into a Pi at 11pm to change a font size.
MirrorOS is my answer to that: a fully browser-based digital signage platform built specifically for this use case, but flexible enough to run on any screen.
The setup is deliberately simple. You create a display in the dashboard, give it a name, orientation, and size — then open mirror.imkylejk.me/display on the actual TV or monitor. It shows a pairing code. Enter that code in the dashboard, and the two are linked. No flashing SD cards, no config files.
Once paired, the display drops into an ambient idle screen — slow, generative black-and-white line animations. It's a deliberate choice: colour barely reads through mirror film, and a static screen behind glass 24/7 is a burn-in problem waiting to happen. The idle animation solves both at once, while quietly confirming the screen is alive and connected.
Every widget on the mirror — clock, weather, calendar, to-do list — is placed on a grid canvas in the dashboard, with a live preview that matches the real screen's aspect ratio. Drag to move, drag the corner to resize, and the mirror updates in near real time over a WebSocket connection.
Layouts aren't static either. A schedule engine swaps between them automatically — a busy "morning" layout with weather and calendar, dropping back to the idle screensaver for the rest of the day.
SvelteKit for the whole app — dashboard and display client share one codebase SQLite via Drizzle, running in WAL mode Clerk for authentication, configured as a satellite domain of imkylejk.me WebSockets for real-time sync between dashboard edits and the paired display A plugin-style widget architecture, so new widgets can be added without touching core layout logic
MirrorOS is still an active build. The core pieces — pairing flow, the layout engine, the screensaver, scheduling — are in place, with more widgets and integrations rolling in as I go.
Building something similar?
Get in touch