Image → pixel art converter. Rust engine with Metal-accelerated GPU path, Tauri 2 desktop app, SolidJS frontend. Targets game-style chunky pixel output.
Status: M0 scaffold complete. See
TODO.mdfor milestones. Full design rationale indocs/PLANNING.md.
- macOS (Apple Silicon or Intel, Metal-capable)
- Rust 1.77+ (managed via
rust-toolchain.toml) - Node.js 20+ and pnpm 9+ (
corepack enable pnpmorbrew install pnpm) - Xcode Command Line Tools (
xcode-select --install)
Optional for distribution:
- Apple Developer account (code signing, notarization)
greedydots/
├── Cargo.toml workspace root
├── rust-toolchain.toml pinned stable + components
├── crates/
│ ├── greedydots-core/ pure engine (no UI deps)
│ └── greedydots-cli/ command-line binary
├── src-tauri/ Tauri 2 application
├── src/ SolidJS frontend
├── palettes/ bundled lospec palette JSON
├── test-images/ regression test corpus
└── docs/PLANNING.md design doc & decisions
# 1. Rust toolchain (auto-installed from rust-toolchain.toml on first cargo run)
cargo --version
# 2. Frontend deps
pnpm install
# 3. Tauri CLI — `pnpm exec tauri` works without global install.
# Global install optional: `cargo install tauri-cli --version '^2.0'`cargo test -p greedydots-core# build + run
cargo run -p greedydots-cli -- convert test-images/sample.jpg out.png --preset storybook
# list presets
cargo run -p greedydots-cli -- presetspnpm tauri:devThis starts Vite at http://localhost:5173 and launches the Tauri window pointing
at it. Rust and frontend hot-reload independently.
pnpm tauri:buildOutputs .app / .dmg to src-tauri/target/release/bundle/.
- Work marches through milestones in
TODO.md. - Every new algorithm addition gets a test in the same module.
- Quality regressions are caught by SSIM comparison against golden outputs
in
test-images/golden/(set up in M2). - Performance regressions are caught by
criterionbenches (set up in M3).
- Oklab color space for all distance math — dramatically better palette mapping.
- Gamma-correct pipeline — sRGB → Linear → Oklab → ... → sRGB.
- Edge-preserving quantization — Sobel mask forces silhouettes to darkest palette color.
- GPU-first with CPU fallback — wgpu (Metal) for big wins, CPU for reliability.
- Engine is UI-agnostic —
greedydots-coreknows nothing about Tauri.
See docs/PLANNING.md for the full document.
Dual-licensed under MIT OR Apache-2.0.