[workspace] resolver = "3" members = ["crates/*", "apps/*", "xtask"] [workspace.package] version = "0.7.1" edition = "2024" license = "MIT OR Apache-2.0" rust-version = "1.90" repository = "https://github.com/storytold/lightcraft" [workspace.dependencies] craft-ui = { git = "https://github.com/storytold/craft-libs", rev = "5c874d51eeb3de70e735c8ce87a59a7dedd47675", features = ["serde"] } # internal lightcraft-denoise-core = { path = "crates/denoise-core" } lightcraft-denoise = { path = "crates/denoise", default-features = false } lightcraft-geom = { path = "crates/geom" } lightcraft-faces = { path = "crates/faces" } lightcraft-sysmem = { path = "crates/sysmem" } lightcraft-color = { path = "crates/color" } lightcraft-raster = { path = "crates/raster" } lightcraft-tiff = { path = "crates/tiff" } lightcraft-raw = { path = "crates/raw" } lightcraft-codecs = { path = "crates/codecs" } lightcraft-meta = { path = "crates/meta" } lightcraft-develop = { path = "crates/develop" } lightcraft-lensdb = { path = "crates/lensdb" } lightcraft-inpaint = { path = "crates/inpaint" } lightcraft-scenes = { path = "crates/scenes" } lightcraft-pipeline = { path = "crates/pipeline" } lightcraft-gpu = { path = "crates/gpu" } lightcraft-catalog = { path = "crates/catalog" } lightcraft-preview = { path = "crates/preview" } lightcraft-merge = { path = "crates/merge" } lightcraft-engine = { path = "crates/engine" } lightcraft-ui-egui = { path = "crates/ui-egui" } lightcraft-mcp = { path = "crates/mcp" } lightcraft-fetch = { path = "crates/fetch" } lightcraft-heif = { path = "crates/heif" } lightcraft-segment = { path = "crates/segment" } lightcraft-geocode = { path = "crates/geocode" } # foundation thiserror = "2" sha2 = "0.10" serde = { version = "1", features = ["derive", "rc"] } serde_json = { version = "1", features = ["float_roundtrip"] } log = "0.4" rayon = "1" proptest = "1" bytemuck = { version = "1", features = ["derive"] } crc32fast = "1" siphasher = "1" libc = "0.2" # dev-only: process CPU time in benches dhat = "0.3" # opt-in heap profiling (lightcraft-cli --features dhat-heap); never in default builds # formats quick-xml = "0.38" miniz_oxide = "0.8" # codecs image = { version = "0.25", default-features = false, features = ["png", "jpeg", "tiff", "webp"] } zune-jpeg = { version = "0.5", default-features = false, features = ["std", "x86", "neon"] } zune-core = { version = "0.5", default-features = false, features = ["std"] } jpeg-decoder = { version = "0.3", default-features = false } jpeg-encoder = { version = "0.7", default-features = false, features = ["std"] } ab_glyph = { version = "0.2", default-features = false, features = ["std"] } # Apache-2.0, pure Rust glyph rasterizer (export watermarks) png = "0.18" tiff = "0.11" image-webp = "0.2" moxcms = { version = "0.9", default-features = false, features = ["lut"] } jxl-oxide = { version = "0.12", default-features = false } jixel = "=0.3.4" # BSD-3-Clause OR Apache-2.0, pure-Rust JPEG XL encoder (export; port of libjxl-tiny) zune-jpegxl = { version = "0.5", default-features = false, features = ["std"] } # MIT/Apache-2.0/Zlib lossless JXL encoder (test fixtures only) ravif = { version = "0.13", default-features = false, features = ["threading"] } # no "asm": it needs nasm (non-Rust) # HDR AVIF (PQ): ravif fixes the sRGB transfer curve, so HDR files drive its rav1e + avif-serialize directly rav1e = { version = "0.8.1", default-features = false, features = ["threading"] } avif-serialize = "0.8.6" # gpu (crates/gpu; native backends only, no GL: everything stays pure Rust) # SAM 3 inference (lightcraft-segment). 0.9.2: later releases pull `tokenizers` with the # Oniguruma C library into candle-core, and the product is pure Rust. candle-core = { version = "=0.9.2", default-features = false } candle-nn = { version = "=0.9.2", default-features = false } wgpu = { version = "30", default-features = false, features = ["std", "parking_lot", "metal", "vulkan", "dx12", "wgsl"] } pollster = "1" # ui egui = "0.36" egui_extras = { version = "0.36", default-features = false } eframe = { version = "0.36", default-features = false } egui_kittest = "0.36" rfd = "0.17" muda = { version = "0.21", default-features = false } # native menu bar (macOS: objc2/AppKit, pure Rust; no GTK) # macOS: the profile of the screen showing the window (safe AppKit bindings; muda and wgpu use the same) objc2 = { version = "0.6", default-features = false, features = ["std"] } objc2-app-kit = { version = "0.3", default-features = false, features = ["std", "NSApplication", "NSColorSpace", "NSResponder", "NSScreen", "NSWindow"] } objc2-foundation = { version = "0.3", default-features = false, features = ["std", "NSArray", "NSData"] } # Linux: the desktop's dark/light setting from the XDG settings portal (Settings ▸ Interface ▸ # Appearance Mode ▸ Auto). Pure Rust; the version accesskit already brings in, pinned to it. zbus = "=5.19.0" web-time = "1" # web (apps/lightcraft-web) wasm-bindgen = "0.2.129" wasm-bindgen-futures = "0.4" js-sys = "0.3" web-sys = "0.3" [workspace.lints.rust] unsafe_code = "deny" [workspace.lints.clippy] dbg_macro = "warn" todo = "warn" too_many_arguments = "allow" needless_range_loop = "allow" type_complexity = "allow" excessive_precision = "allow" [profile.dev.package."*"] opt-level = 2 [profile.dev] opt-level = 1 [profile.release] debug = "line-tables-only" [profile.dist] inherits = "release" lto = "thin" codegen-units = 1 debug = false # `cargo xtask web`: the browser build. Size matters more than build time: fat LTO, one codegen # unit, no symbols, abort on panic (wasm32 can't unwind anyway), size-optimized code — except the # crates that do per-pixel work, which stay at opt-level 3 (opt-level "s"/"z" there costs ~50 %/ # ~130 % render time; measured in docs/web.md → Bundle size). [profile.web] inherits = "release" debug = false lto = "fat" codegen-units = 1 strip = true panic = "abort" opt-level = "s" [profile.web.package] lightcraft-pipeline = { opt-level = 3 } lightcraft-raster = { opt-level = 3 } lightcraft-color = { opt-level = 3 } lightcraft-develop = { opt-level = 3 } lightcraft-geom = { opt-level = 3 } lightcraft-raw = { opt-level = 3 } lightcraft-codecs = { opt-level = 3 } lightcraft-scenes = { opt-level = 3 } lightcraft-preview = { opt-level = 3 } zune-jpeg = { opt-level = 3 } zune-core = { opt-level = 3 } jpeg-decoder = { opt-level = 3 } jpeg-encoder = { opt-level = 3 } png = { opt-level = 3 } miniz_oxide = { opt-level = 3 }