Pixel Splash Studio is a fast, grid-snapped pixel art editor built with Electron + React.
It focuses on a responsive “infinite canvas” workflow: paint pixels in blocks, pan/zoom freely, keep a minimap for navigation, and use reference images as an underlay for planning.
- Full feature list: see
features.md.
- Infinite canvas (positive + negative world space) with a camera-driven viewport
- Block-based pixel storage (
64x64) for speed and efficient invalidation - Non-destructive palette indexing (change a palette color → updates all pixels)
- Palette import: LoSpec URL/slug +
lospec-palette://<slug>deep links - Layered workflow: reference underlay, pixels, selection mask, and live preview layer
- Tools: Pen, Line, Rectangle, Oval, Fill Bucket, Eyedropper, Selection (rect/oval/lasso), Scroll, Stamp
- Reference images: paste/drag-drop/import, move/rotate/scale, flip, opacity, snapping
- Minimap: zoom/pan controls, axes, camera readout
.splashproject format: zipped payload with pixel blocks + embedded reference assets
- Home:
docs/index.html - Tutorials:
docs/tutorials.html - Browser demo:
docs/demo.html
lospec-palette://<slug> deep links require the app to be installed with a desktop entry that registers
x-scheme-handler/lospec-palette (e.g. .deb / .rpm / .flatpak). Zipped builds typically won’t
register a URL handler automatically.
If you’re running from a zip (or other unpacked build), you can register it yourself:
- In-app:
Options → Register LoSpec URL Handler (Linux)… - Script:
scripts/register-lospec-url-handler-linux.sh /absolute/path/to/pixel-splash-studio
- Node.js (recommend Node 20+)
- npm
- If you see a GTK warning like
Theme parsing error ... Failed to import ... window_decorations.css, it's coming from your local GTK theme config (usually~/.config/gtk-3.0/gtk.css). Fix by removing the missing@importline or creating an empty~/.config/gtk-3.0/window_decorations.css. - If you see Vulkan/RADV warnings on startup, Pixel Splash Studio disables Vulkan by default on Linux to keep logs clean. To re-enable, set
PIXEL_SPLASH_ENABLE_VULKAN=1.
npm cinpm run devThis runs:
- Vite dev server for the renderer
- TypeScript watch build for Electron (
electron/) - Electron app pointed at the dev server
npm run build./scripts/docker-make.shnpm startnpm testE2E tests (Playwright):
npm run test:e2eelectron/– Electron main/preload and worker codesrc/renderer/– React UI, canvas, tools, and state (Zustand)src/constants.ts– Cross-project constants (shared by renderer + Electron)tests/– Unit and E2E tests
- Pixels are stored by palette index (not raw RGBA) for efficient edits and smaller project payloads.
- The pixel layer is chunked into
64x64blocks (CanvasStore) so rendering and operations can be localized. - Tools write to a preview layer while interacting, then commit a batch to the pixel store + history.
- The viewport is camera-based (x/y + zoom) and maps screen coordinates to world coordinates.
- References are rendered underneath the pixel grid (toggleable) and support transforms (move/rotate/scale/flip/opacity).
Pixel Splash Studio is actively evolving; contributions are welcome.
- Report bugs (include repro steps, platform, and a short recording if possible)
- Improve tools, UI ergonomics, and performance hot spots
- Add documentation and real screenshots
- Add tests around core math (viewport transforms, selection, file persistence)
- Prefer removing “magic numbers” by putting shared values in
src/constants.ts. - Keep changes focused and avoid drive-by refactors.
- If you add a new tool or feature, include a small unit test when it’s easy to do so.
- Fork + create a feature branch
- Run
npm test(andnpm run test:e2ewhen relevant) - Open a PR describing the change and how to verify it
See blueprint.md for the evolving design notes and planned features.