muraldesk is a desktop mural layer. You drop images, videos, smart embeds, links, and notes onto a transparent overlay that floats over your real workspace. Cards stay fully interactive — drag, resize, hover controls — while empty space clicks through to whatever's underneath.
It also runs as a clean Progressive Web App in any modern browser. Same board, same shortcuts, same files.
Visual references end up scattered across browser tabs, screenshot folders, second monitors parked on Pinterest, and Slack DMs to yourself.
muraldesk gives them one quiet wall — pinned next to the work, not on top of it. No account, no cloud, no analytics.
▶ Try it in your browser — no install: wpgglabs.github.io/muraldesk
The hosted web app is the full board experience (images, videos, notes, links, smart embeds, backup/export, theming, undo/redo) — everything except the desktop-only transparent overlay, tray, and Desktop Mode. Your board lives in that browser's local storage. It's also an installable PWA.
Desktop app — prebuilt installers for all three platforms are on the Releases page:
| OS | Download | First-launch note |
|---|---|---|
| Windows | muraldesk-Setup-<version>.exe |
Unsigned → SmartScreen: More info → Run anyway |
| macOS | muraldesk-<version>-universal.dmg (Intel + Apple Silicon) |
Unsigned → right-click the app → Open (Gatekeeper) |
| Linux | muraldesk-<version>-x86_64.AppImage (chmod +x, run) or the .deb |
AppImage needs a FUSE runtime on some distros |
The desktop app keeps itself up to date (Windows & Linux/AppImage): it checks GitHub Releases on launch, downloads new versions in the background, and installs on quit. This is the only network request muraldesk makes on its own — turn it off any time via the tray's Startup → Check for updates toggle. (macOS auto-update needs code signing, which is out of scope while unsigned — grab new macOS builds from Releases.)
Each release is built automatically from a version tag on Windows, macOS, and Linux runners (see Releasing). Prefer to build it yourself? npm run build:desktop builds for your current OS.
- Transparent, frameless Electron window — only the cards are drawn.
- Empty regions click through to the apps underneath.
- System tray with Show / Toggle Desktop Mode / Quit.
- Toolbar is always compact in Electron (single clean row at any width — Image · Video · Note · Link · Sample · More · Desktop · Min · Close), with a More menu holding every advanced action. The web/PWA build keeps the full inline pill row above 1500 px and collapses to the same compact layout below it.
- Images — local files or direct URLs.
- Videos — local files or direct URLs, silent looping by default with hover controls.
- Notes — editable text cards with a small color palette.
- Links — see Smart link behavior below.
- Folders (desktop app) — pin real project folders to the mural; see Folder cards below.
- Per-card hover-only controls: opacity · fit (cover / contain) · lock · duplicate · delete.
- Tidy shelf-packs every card into a clean grid inside the viewport.
- Undo / redo (
Ctrl/Cmd + Z·Ctrl/Cmd + Shift + Z) for moves, resizes, styling, note edits, and Tidy. - Arrow-key nudge moves the selected card 1 px (Shift = 16 px) for precise placement.
- Focus mode centers and enlarges a card with a dimmed backdrop.
Escto exit. - Snap guides while dragging, with a soft 24 px grid.
- Board opacity, theme, and accent controls in the toolbar.
A single Add-Link input becomes the right card based on the URL — no source picker, no manual toggles. Embeds support an Interact toggle so playable cards (YouTube, Spotify, CodePen, etc.) can be left ambient or activated on demand.
- No account. No backend. No cloud.
- Layout in
localStorage, media blobs in IndexedDB. - Per-origin, per-profile — your board never leaves the device unless you export it.
- One-click Backup writes a single portable
.muraldesk.jsonfile (layout + base64-inlined media). - Layout-only Export for quick sharing without media.
- Import auto-detects which of the two formats it's reading and re-sanitizes link URLs on the way in.
Windows scrambles desktop icons whenever monitors change — muraldesk doesn't. Pin your real project folders to the mural and they stay exactly where you put them, forever.
- Drag a folder from your file manager onto muraldesk (or use the 📂 Folder pill) → its desktop icon disappears and a folder card appears on the mural.
- The folder never moves. muraldesk only sets the OS hidden attribute (Windows
attrib +h, macOSchflags hidden) — the folder stays at its exact original path, fully usable from your file manager, editor, git, and terminals. No copy, no move, no rename, ever. (On Linux there's no hidden attribute, so folders pin as visible pointer cards instead.) - Or pin without hiding. Uncheck "Hide its desktop icon" in the Pin dialog to keep the folder visible on the desktop too — the card is then a pure pointer, and removing it leaves the folder completely untouched.
- Double-click the card to open the folder in Explorer. Eject (or delete the card) and the desktop icon comes right back — instantly, regardless of folder size (it's a single attribute flip; contents are never touched).
- Positions survive everything — refresh, reboot, monitor connects/disconnects, resolution changes — because muraldesk owns its own layout. Move the muraldesk window to another screen and the folders travel with it.
- Uninstall-safe by design: every hidden folder is recorded in a manifest, the uninstaller un-hides them all automatically, the tray has a one-click Restore hidden folders, and even in the worst case the folders are just standard hidden folders anyone can un-hide from Explorer — no muraldesk required.
- Guard rails: directories only (never files), system locations (Desktop itself, user profile, drive roots) are refused, and clearing or replacing the board always un-hides the affected folders first.
The Electron build is where muraldesk earns its name.
- The window itself is transparent — your wallpaper and other apps show through unchanged.
- A renderer-side hit-test flips click-through on the fly: cards stay clickable, empty regions don't capture mouse events.
Ctrl/Cmd + Shift + D(or the toolbar Desktop pill) expands the overlay to cover the current display using window bounds — not OS-level fullscreen — so cards can move freely across the whole screen.- The toolbar tucks into a thin reveal-zone at the top — bring the cursor up to show it again.
| Capability | Status |
|---|---|
| Move muraldesk to any monitor (drag the window) | ✅ Available |
| Cover the current monitor as a transparent mural layer | ✅ Available |
| Span all displays as one big mural canvas | ✅ Available (Display toggle in Desktop Mode) |
| Separate independent boards per monitor | ⏳ Not available yet — see Roadmap |
Drag the window to whichever monitor you want, then press Ctrl/Cmd + Shift + D to make it cover that screen. The Display toggle in the toolbar switches between current display and all displays and is remembered between launches.
| Pasted URL | Becomes |
|---|---|
| YouTube video | Embedded player |
| Vimeo video | Embedded player |
| SoundCloud track | Embedded widget |
| Spotify track / album / playlist | Embedded widget |
| CodePen pen | Embedded pen |
Direct image URL (.png .jpg .gif .webp .svg) |
Image card |
Direct video URL (.mp4 .webm .mov .ogg) |
Looping video card |
Any other normal http(s) website |
Favicon + title web link card |
javascript: / data: / file: / other unsafe URL |
Blocked — no card created |
Anything that isn't http: or https: is stripped before a card is ever created — both on paste and on backup import.
- No account, no backend, no cloud sync.
- Layout / metadata lives in
localStorageundermuraldesk-board. - Uploaded media blobs live in IndexedDB (
muraldesk/media, keyed by UUID). - Cross-machine portability is handled by the explicit one-click
.muraldesk.jsonbackup. - The brand wordmark uses Vastago, loaded locally from
public/fonts/— no third-party font CDN.
| Layer | Choice |
|---|---|
| Renderer | React 18 · Vite 8 |
| Drag / resize | react-rnd |
| Desktop shell | Electron 43 |
| Packaging | electron-builder 26 (Windows NSIS · macOS dmg · Linux AppImage/deb) |
| Persistence | localStorage (layout) · IndexedDB (media blobs) |
| PWA | Hand-rolled manifest.webmanifest + service worker |
No backend. No auth. No analytics. No telemetry.
The Electron desktop build needs a real desktop OS (Windows, macOS, or Linux). The web/PWA build runs in any modern browser.
npm install
npm run dev:webVite serves the renderer at http://localhost:5000.
npm install
npm run dev:desktopSpins up a dedicated Vite instance on http://localhost:5173 and launches Electron pointed at it. Hot-reload works for renderer code; main-process changes need a manual restart.
npm run build:desktop # builds for your current OSelectron-builder can only build for the OS it runs on, so each platform is
built on its own machine (that's what the release CI matrix does):
| OS | Command | Output in release/ |
|---|---|---|
| Windows | npm run build:desktop:win |
muraldesk-Setup-<version>.exe (+ .blockmap, latest.yml) |
| Windows (Store) | npm run build:desktop:store |
muraldesk-<version>-x64.appx (unsigned MSIX for the Microsoft Store — see RELEASE.md) |
| macOS | npm run build:desktop:mac |
muraldesk-<version>-universal.dmg + .zip (+ latest-mac.yml) |
| Linux | npm run build:desktop:linux |
muraldesk-<version>-x86_64.AppImage + .deb (+ latest-linux.yml) |
For a folder build with no installer (quick smoke test):
npm run build:desktop:dirInstallers are unsigned by default — see Current limitations.
npm run lint # ESLint (React + hooks)
npm test # Vitest unit tests
npm run build # production web buildCI runs lint, tests, and the web build on every push and pull request.
Releases are cut from version tags. Bump the version, tag, and push:
npm version patch # or minor / major — updates package.json and tags
git push --follow-tagsPushing a v*.*.* tag triggers the Release workflow, which builds the
Windows installer and uploads muraldesk-Setup-<version>.exe to the matching
GitHub Release automatically.
- Open muraldesk.
- Click ✨ Sample in the toolbar.
- Click ▦ Tidy to shelf-pack everything into a clean grid.
- Drag and resize a few cards. Hover one and drop its opacity to ~40%. Press
Ctrl/Cmd + Zto undo. - Add a smart embed — paste a YouTube, Vimeo, SoundCloud, Spotify, or CodePen URL. Toggle Interact to play.
- Press
Ctrl/Cmd + Shift + Dto enter Desktop Mode. - Click empty space to confirm it passes through to whatever's behind.
- Click 📦 Backup to export a portable
.muraldesk.jsonfile.
- Not a full wallpaper engine. The overlay is a transparent window drawn on top of the desktop, not a true OS wallpaper layer drawn under desktop icons.
- Multi-monitor is single-window. Current-display and all-display overlays work today; separate independent boards per monitor are not available yet.
- Unsigned installers. First launch shows the OS "unrecognized app" prompt — Windows SmartScreen (More info → Run anyway) or macOS Gatekeeper (right-click → Open). Code signing requires a paid certificate.
- Folder-icon hiding is Windows & macOS only. Linux has no per-folder "hidden" attribute, so on Linux a pinned folder becomes a visible pointer card (the card still works; the desktop icon just isn't hidden). The folder is never moved on any OS.
- Auto-update runs on Windows & Linux (AppImage). macOS auto-update requires code signing (out of scope while unsigned) — update macOS by grabbing the latest
.dmgfrom Releases. - Uninstall auto-restores hidden folders on Windows only (via the NSIS uninstaller). On macOS/Linux there's no uninstaller hook, so un-hide first with the tray's Restore hidden folders before removing the app (folders are also recoverable manually —
chflags nohiddenon macOS). - No cloud sync, by design. Backup is a manual, explicit step.
- Web-version media is per-browser-profile. IndexedDB is per-origin / per-profile. Use Backup to move between browsers.
- Some link previews depend on the target site. Sites that block embedding via
X-Frame-OptionsorContent-Security-Policyfall back to a favicon + title card.
- Per-monitor overlay windows / independent boards per monitor
- Snap guides and richer layout tools
- More board organization (groups, tags, search)
- Startup options and tray polish
- More embed providers
- Template boards
- Wallpaper-layer experiments (Windows-first, exploratory)
- Optional sync / sharing — later, and strictly opt-in; the app stays local-first by default
See docs/ROADMAP.md for detail.
Released under the MIT License — see LICENSE.
