Skip to content

Building from source

Set up a Photovibe development environment, run the app, run the tests, and produce your own signed-free build.

Photovibe is MIT licensed and builds from source on any machine with the Rust and Node toolchains. The whole repository is at github.com/mory-dev/photovibe.

Prerequisites

RequirementNotes
Node.js 22+CI builds on Node 22.
pnpm 10npm install -g pnpm
Rust (stable)Tauri 2 compiles the native shell.
Microsoft Visual Studio Build ToolsWindows only, for the MSVC linker.
WebView2 runtimePreinstalled on Windows 11.

Run it

git clone https://github.com/mory-dev/photovibe.git
cd photovibe
pnpm install
pnpm tauri dev

The first pnpm tauri dev compiles the Rust side and takes a few minutes. After that, frontend changes hot-reload instantly.

Scripts

CommandWhat it does
pnpm tauri devRun the desktop app with hot reload
pnpm devRun only the frontend in a browser at localhost:1420
pnpm buildType-check and build the frontend bundle
pnpm testRun the Vitest unit tests
pnpm test:watchRun the tests in watch mode
pnpm tauri buildProduce a production desktop build

Running pnpm dev on its own is genuinely useful: the interface is plain web technology, and Tauri-only calls degrade gracefully, so most of the editor works in a normal browser. That is exactly how the screenshots on this site are captured.

How the code is laid out

src/
  app/AppShell.tsx          menus, shortcuts, top-level state
  canvas/                   viewport, pointer handling, 2D fallback renderer
  components/               toolbar, inspector, dialogs, options bar
  engine/
    compositor/             WebGL2 compositor and blend-mode shaders
    document/               document + layer model, layer operations
    history/                undo/redo manager
    pixels/                 paint, crop, resize, export, pixel store
    selections/             selection masks and operations
  store/                    Zustand stores: document, editor, viewport
src-tauri/                  Rust shell, native commands, bundling config
site/                       this website

The rendering path is worth knowing: CanvasViewport composites through the WebGL2 Compositor, and falls back to a plain 2D canvas renderer (drawDocument2D) if WebGL is unavailable. Both produce the same picture.

Tests

pnpm test
pnpm exec tsc --noEmit

These two commands are exactly what CI runs on every push and pull request.

Building an installer

pnpm tauri build --bundles nsis

The installer lands in src-tauri/target/release/bundle/nsis/. A local build is unsigned — code signing happens only in the release workflow, using Azure Trusted Signing credentials that exist solely in CI. See Installing and verifying for why.

Contributing

Issues and pull requests are welcome at github.com/mory-dev/photovibe. Please run pnpm test and pnpm exec tsc --noEmit before opening a PR — those are the same checks CI will run.