Skip to content

wpggLabs/muraldesk

Repository files navigation

muraldesk

muraldesk

A local-first visual mural layer for your desktop.

Electron 43 React 18 Vite 8 Local-first CI License: MIT

Try in browser Download


muraldesk — local-first visual mural layer for your desktop



Features · Folder Cards · Desktop Mode · Smart Embeds · Try / Download · Build · Demo · Roadmap

What is muraldesk?

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.

Why it exists

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 / Download

▶ 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.


Core features

Desktop overlay

  • 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.

Mural objects

  • 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. Esc to exit.
  • Snap guides while dragging, with a soft 24 px grid.
  • Board opacity, theme, and accent controls in the toolbar.

Smart embeds

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.

Local-first storage

  • 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.

Backup & export

  • One-click Backup writes a single portable .muraldesk.json file (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.

Folder cards (desktop)

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, macOS chflags 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.

Desktop Mode

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.

Multi-monitor support

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.


Smart link behavior

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.


Local-first storage

  • No account, no backend, no cloud sync.
  • Layout / metadata lives in localStorage under muraldesk-board.
  • Uploaded media blobs live in IndexedDB (muraldesk / media, keyed by UUID).
  • Cross-machine portability is handled by the explicit one-click .muraldesk.json backup.
  • The brand wordmark uses Vastago, loaded locally from public/fonts/ — no third-party font CDN.

Tech stack

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.


Run locally

The Electron desktop build needs a real desktop OS (Windows, macOS, or Linux). The web/PWA build runs in any modern browser.

Web

npm install
npm run dev:web

Vite serves the renderer at http://localhost:5000.

Desktop

npm install
npm run dev:desktop

Spins 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.

Build the desktop app

npm run build:desktop         # builds for your current OS

electron-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:dir

Installers are unsigned by default — see Current limitations.

Develop

npm run lint     # ESLint (React + hooks)
npm test         # Vitest unit tests
npm run build    # production web build

CI runs lint, tests, and the web build on every push and pull request.


Releasing

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-tags

Pushing a v*.*.* tag triggers the Release workflow, which builds the Windows installer and uploads muraldesk-Setup-<version>.exe to the matching GitHub Release automatically.


Demo flow

  1. Open muraldesk.
  2. Click ✨ Sample in the toolbar.
  3. Click ▦ Tidy to shelf-pack everything into a clean grid.
  4. Drag and resize a few cards. Hover one and drop its opacity to ~40%. Press Ctrl/Cmd + Z to undo.
  5. Add a smart embed — paste a YouTube, Vimeo, SoundCloud, Spotify, or CodePen URL. Toggle Interact to play.
  6. Press Ctrl/Cmd + Shift + D to enter Desktop Mode.
  7. Click empty space to confirm it passes through to whatever's behind.
  8. Click 📦 Backup to export a portable .muraldesk.json file.

Current limitations

  • 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 .dmg from 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 nohidden on 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-Options or Content-Security-Policy fall back to a favicon + title card.

Roadmap

  • 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.


License

Released under the MIT License — see LICENSE.

About

A local-first desktop mural layer — pin images, videos, links, notes, and real folders onto a transparent overlay that floats over your work, or try it in the browser. No account, no cloud, no telemetry.

Topics

Resources

License

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors