Compare live web components against Figma frames using pixel-level diffing and heatmap visualization. One desktop app, one companion Figma plugin, one repo.
This version of loupe must only be run from source, not downloaded from any other sources.
Linux (Debian/Ubuntu):
sudo apt-get install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libgtk-3-dev libsoup-3.0-dev libjavascriptcoregtk-4.1-devLinux (Fedora):
sudo dnf install webkit2gtk4.1-devel openssl-devel libappindicator-gtk3-devel librsvg2-devel pango-devel gtk3-devel libsoup3-devel javascriptcoregtk4.1-develmacOS / Windows: No additional system dependencies required.
git clone https://github.com/TitaniumCladStudios/loupe.git
cd loupe
npm install
npm run tauri devTo create a production build:
npm run tauri buildOutput will be in src-tauri/target/release/bundle/.
The Figma plugin is included in the repo and loaded locally (it is not published to the Figma Community).
- Open Figma
- Go to Plugins > Development > Import plugin from manifest...
- Select
figma-plugin/manifest.jsonfrom the cloned repo - The plugin will now appear under Plugins > Development > Loupe
Loupe is a four-step wizard:
Open the Figma plugin, select a frame, and click Send to Loupe. The plugin exports the frame as a PNG and sends it to the app over localhost:7700.
Enter a URL (e.g. your local dev server) and click Open Browser. A browser window opens with an element picker — hover to highlight elements, click to capture one. The capture appears back in the app.
Review both captures side by side, adjust the pixelmatch threshold, and click Run Comparison. The diff runs automatically and advances to the result.
View the output three ways:
- Heatmap — pixelmatch diff output showing where the pixels differ
- Side by Side — web capture and Figma frame next to each other
- Overlay — Figma frame layered over the web capture with an opacity slider
Similarity percentage and diff pixel count are shown persistently. The diff image can be downloaded.
loupe/
├── src/ # Svelte 5 frontend (SvelteKit + Tauri)
├── src-tauri/ # Rust backend (HTTP server, window management)
├── figma-plugin/ # Figma plugin (loaded via manifest)
│ ├── manifest.json
│ ├── code.js
│ └── ui.html
└── package.json
- Tauri v2 with a Svelte 5 frontend and Rust backend
- Local HTTP server on port
7700receives images from the Figma plugin and the browser capture - pixelmatch handles pixel-level image comparison
- html2canvas is injected into the browser window for element capture
MIT