Pantograph is a local-first desktop app that turns sketches and prompts into editable Svelte UI.
- Clone the repository.
- Install dependencies:
npm install
- Run the desktop app:
npm run dev:desktop
- Node.js (for
npm) - Rust toolchain (
cargo,rustc) - Tauri system libraries for your OS
Install Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"Install Tauri system dependencies:
# Debian/Ubuntu
sudo apt install pkg-config libsoup2.4-dev libjavascriptcoregtk-4.0-dev
# Fedora
sudo dnf install pkgconf-pkg-config libsoup-devel javascriptcoregtk4.0-devel
# Arch
sudo pacman -S pkgconf libsoup2 webkit2gtkInstall project dependencies:
npm installnpm run dev:desktopnpm run devnpm run build:desktop./launcher.sh --help- External OpenAI-compatible server (for example LM Studio)
- Bundled
llama.cppsidecar with local model files
- Node.js + npm
- Rust toolchain
- Tauri system dependencies (above)
# Lint (configured scope)
npm run lint
# Full lint scan
npm run lint:full
# Critical anti-pattern gate (src/ + packages/)
npm run lint:critical
# Type check
npm run typecheck
# Tests
npm test
# Runtime separation guard (no compile-time Python linkage)
npm run test:runtime-separation
# All quality gates
npm run checkPython-backed model execution is intentionally out-of-process and externally provisioned.
See docs/python-runtime-separation.md for configuration and migration details.
For a local diffusion worker smoke path, run:
./.venv/bin/python scripts/diffusion_cli_smoketest.py --model-path /path/to/tiny-sd-turboPantograph exposes a Rust-first headless workflow API for host integrations
through crates/pantograph-workflow-service:
workflow_runworkflow_get_capabilitiesworkflow_get_ioworkflow_preflightcreate_workflow_sessionrun_workflow_sessionclose_workflow_sessionworkflow_get_session_statusworkflow_list_session_queueworkflow_cancel_session_queue_itemworkflow_reprioritize_session_queue_itemworkflow_set_session_keep_alive
Integration boundary:
- Headless hosts should integrate with the core API/service crate directly.
src-tauricommands are desktop app transport adapters, not the headless API.- HTTP binding exports are opt-in frontend adapters for modular standalone GUI
hosting (
frontend-httpin UniFFI and Rustler). - Recommended headless flow:
workflow_get_io->workflow_preflight->workflow_run.
Reference docs:
- Contract:
docs/headless-embedding-api-v1.md - Migration guide:
docs/headless-embedding-migration.md - Service boundary ADR:
docs/adr/ADR-001-headless-embedding-service-boundary.md - Implementation notes:
docs/headless-embedding-implementation-notes.md
| Path | Description |
|---|---|
src/ |
Frontend Svelte app, UI components, stores, and services |
src-tauri/src/ |
Tauri backend commands and runtime wiring |
crates/ |
Shared Rust crates (inference, node-engine, workflow-nodes, bindings) |
packages/svelte-graph/src/ |
Reusable graph editor package modules |
scripts/ |
Validation and tooling scripts |
docs/ |
Architecture and process documentation |
- Create a focused branch for one logical change.
- Follow coding, tooling, accessibility, and documentation standards.
- Run
npm run checkand relevant targeted Rust tests before opening a PR. - Use Conventional Commits for all commits.
Workspace crates declare MIT OR Apache-2.0 in Cargo metadata. Review individual package metadata for any exceptions.
