# Project export: Hot Trimmer

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: OpenAI Build Week
- Tagline: Turn material photos into authored trim sheets and exportable PBR maps.
- Devpost: https://devpost.com/software/hot-trimmer
- GitHub: https://github.com/daveranan/HotSpotter
- Video: https://www.youtube.com/embed/ry2eTirT5XY?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 1 GitHub contributor(s) — David Svez (57 commits)

## Devpost submission (written by the team)

No Devpost description available.

## README (from the GitHub repository)

# Hot Trimmer

**Turn material photos into authored trim sheets and exportable PBR maps.**

Hot Trimmer is a focused desktop application for 3D artists who want to turn reference photos and material captures into structured trim-sheet assets. It combines source registration, patch authoring, layout tools, GPU-backed material processing, preview, and export in one local workflow.

Instead of trying to replace Blender or become a general-purpose material library, Hot Trimmer concentrates on one path:

```text
Sources -> Workbench -> Hotspot Sheet -> Processing -> Export
```

## Why Hot Trimmer?

Building a trim sheet from photographs normally means moving between image editors, layout tools, material utilities, and a DCC application. That makes iteration slow and makes it difficult to preserve the relationship between original captures, corrected patches, layout decisions, and generated maps.

Hot Trimmer keeps that work in a single project. Source images remain traceable, edits are non-destructive, layout decisions are explicit, and generated outputs come from a repeatable pipeline.

## Current Features

- Create, open, save, recover, and version local `.hottrimmer` projects.
- Import PNG, JPEG, and TIFF material captures.
- Register related PBR inputs such as base color, normal, roughness, height, metallic, and ambient occlusion.
- Inspect large sources through a mipmapped pan-and-zoom viewport.
- Capture rectangular, four-point, and assisted-polygon patches.
- Apply perspective correction and edit patch geometry non-destructively.
- Author trim-sheet regions with direct, repeating, and radial sampling behavior.
- Preview the material through a GPU-backed `wgpu` rendering pipeline.
- Inspect base color, normal, height, roughness, metallic, ambient-occlusion, and edge-mask outputs.
- Add and tune material-processing effects through the Processing workspace.
- Export enabled material maps and package metadata.
- Preserve deterministic project state, provenance, autosave, recovery, and revision-aware output behavior.

## Demo Workflow

1. Start Hot Trimmer and create a project.
2. Import a material photograph as the base-color source.
3. Add related PBR maps when available.
4. Capture and correct useful source patches in the Workbench.
5. Build the authored layout in Hotspot Sheet.
6. Inspect and refine the generated maps in Processing.
7. Use **Export All Maps** to write the enabled outputs.

No special sample data is required. A well-lit, front-facing photograph of brick, wood, stone, architectural trim, or another structured surface is enough to exercise the main workflow.

## Running the Project

### Supported platform

The current qualified target is **Windows 10/11 x64**. The Rust and Tauri architecture is largely portable, but macOS and Linux builds have not yet completed product qualification.

### Prerequisites

- Node.js 24
- Rust (the repository's `rust-toolchain.toml` selects the expected toolchain)
- Microsoft C++ Build Tools with the Desktop C++ workload
- WebView2 Runtime, included with current Windows installations

### Development

```powershell
npm.cmd install
npm.cmd run check
npm.cmd run dev
```

`npm run dev` starts the native Tauri application with the Vite development server.

### Native build

```powershell
npm.cmd run build:native
```

The executable is written to:

```text
target/release/hot-trimmer-desktop.exe
```

The current command creates a native executable without an installer bundle or code signature.

## Technology

- **Tauri 2** for the native desktop shell and platform services
- **React 19 + TypeScript** for the interface and editing workspaces
- **Rust** for project state, geometry, image processing, rendering, and export
- **wgpu + WGSL** for GPU-backed material-map generation and preview
- **SQLite via rusqlite** for durable, versioned project storage
- **Vite** for the frontend development and build pipeline
- **Blender Python API** for the companion integration under development

## Project Structure

```text
apps/desktop/        Tauri desktop application and React interface
crates/              Rust domain, storage, geometry, rendering, and export crates
packages/            Shared TypeScript UI, editor, and IPC contracts
integrations/blender Blender companion add-on
assets/              Built-in trim-sheet templates
fixtures/            Cross-language, project, and rendering test fixtures
docs/                Product decisions, technical specifications, and phase reports
```

The frontend communicates with the Rust application through versioned, typed Tauri commands. Project persistence and source ownership live in Rust; the React layer presents projections of that authoritative state. Rendering is tile-aware and revision-aware so that large outputs can be generated within explicit memory limits without publishing stale work.

## Built with Codex and GPT-5.6

Hot Trimmer was developed during OpenAI Build Week with Codex and GPT-5.6 as active engineering collaborators.

Codex helped turn product goals into bounded implementation plans, inspect the existing code before changes, implement features across the React/Rust boundary, run focused verification, and diagnose failures. It was especially useful during the migration from CPU-bound rendering to a GPU-backed `wgpu` pipeline, where changes had to remain consistent across domain contracts, WGSL shaders, application commands, fixtures, and tests.

GPT-5.6 was used through Codex for architectural reasoning, implementation, debugging, code review, and verification. Key collaboration areas included:

- Designing versioned domain and IPC contracts shared by Rust and TypeScript.
- Building durable project persistence, recovery, and revision semantics.
- Decomposing the rendering migration into testable stages.
- Implementing GPU atlas generation and material-map processing.
- Tracing behavior through fixtures and focused regression tests.
- Reviewing platform assumptions and release readiness.

The human-directed decisions remained the product scope, creative workflow, interaction model, visual priorities, acceptance criteria, and final tradeoffs. GPT-5.6 is a development-time collaborator; Hot Trimmer does not require an OpenAI API key and does not send project images or files to an AI service at runtime.

The repository's dated commit history and implementation reports document the work completed during the hackathon period.

## Verification

Run the full project gate with:

```powershell
npm.cmd run check
```

This covers repository contracts, TypeScript checks and tests, Rust formatting and linting, and the Rust workspace test suite. GPU and Blender behavioral fixtures may require compatible local hardware or a Blender installation for their dedicated checks.

## Known Limitations

- Windows is currently the only qualified desktop target.
- **Send to Blender** is not yet enabled in the desktop workflow.
- The native build is currently unsigned and is not packaged as an installer.
- GPU behavior and performance vary by adapter and driver.
- Some processing and layout workflows are still being refined as the project moves from hackathon prototype toward a distributable release.

## Roadmap

- Complete and qualify the Blender handoff workflow.
- Package signed Windows releases and add a streamlined first-run experience.
- Add macOS build and runtime qualification.
- Expand templates, sample projects, and visual documentation.
- Continue improving GPU scalability and material-processing controls.

## License

Hot Trimmer is open source under the [MIT License](LICENSE).


## Detected evidence (automated analysis)

Indexed codebase: 216 recognized source files, 5684 KB.
- CSS (language) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Rust (language) — detected in the code
- SQL (language) — detected in the code
- TypeScript (language) — detected in the code
- AI coding agent: Codex — evidence: config files committed to the repository

## Codebase structure (from repository index)

### Files (120 of 295)

```
.codex/config.toml
.editorconfig
.github/workflows/ci.yml
.github/workflows/release.yml
.gitignore
AGENTS.md
apps/desktop/app.js
apps/desktop/index.html
apps/desktop/package.json
apps/desktop/src-tauri/build.rs
apps/desktop/src-tauri/capabilities/default.json
apps/desktop/src-tauri/Cargo.toml
apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml
apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml
apps/desktop/src-tauri/icons/icon.icns
apps/desktop/src-tauri/src/commands.rs
apps/desktop/src-tauri/src/diagnostics.rs
apps/desktop/src-tauri/src/document_commands.rs
apps/desktop/src-tauri/src/lib.rs
apps/desktop/src-tauri/src/main.rs
apps/desktop/src-tauri/src/mcp.rs
apps/desktop/src-tauri/src/paths.rs
apps/desktop/src-tauri/tauri.conf.json
apps/desktop/src/document-app.css
apps/desktop/src/document-app.tsx
apps/desktop/src/document-workbench.test.ts
apps/desktop/src/feedback-workbench-contract.ts
apps/desktop/src/feedback-workbench.tsx
apps/desktop/src/gpu-tiled-preview.test.ts
apps/desktop/src/hierarchical-layout-templates.ts
apps/desktop/src/hotspot-preview-lifecycle.test.ts
apps/desktop/src/layout-authoring.test.ts
apps/desktop/src/layout-authoring.ts
apps/desktop/src/layout-workspace.tsx
apps/desktop/src/live-rectified-canvas.tsx
apps/desktop/src/main.tsx
apps/desktop/src/manual-layout-presets.test.ts
apps/desktop/src/manual-layout-presets.ts
apps/desktop/src/material-preview.tsx
apps/desktop/src/multi-source-patch-assignment.test.ts
apps/desktop/src/mvp-edge-wear.test.ts
apps/desktop/src/patch-authoring.test.ts
apps/desktop/src/patch-authoring.ts
apps/desktop/src/patch-workspace.tsx
apps/desktop/src/serial-task-queue.test.ts
apps/desktop/src/serial-task-queue.ts
apps/desktop/src/source-assignment.test.ts
apps/desktop/src/source-assignment.ts
apps/desktop/src/source-first-app.tsx
apps/desktop/src/source-frame-partition.test.ts
apps/desktop/src/source-frame-preview-controller.ts
apps/desktop/src/source-frame-preview-performance.test.ts
apps/desktop/src/source-workbench-geometry.ts
apps/desktop/src/stage15-20-feedback.test.ts
apps/desktop/src/workbench-interactions.test.ts
apps/desktop/src/workbench-interactions.ts
apps/desktop/styles.css
apps/desktop/test-runner.mjs
apps/desktop/tsconfig.json
apps/desktop/vite.config.ts
assets/templates/detail_heavy_props/1.0.0/template.json
assets/templates/detail_ribbon_microtrim/1.0.0/region-id-2048.json
assets/templates/detail_ribbon_microtrim/1.0.0/region-id-4096.json
assets/templates/detail_ribbon_microtrim/1.0.0/template.json
assets/templates/generic_architecture/1.0.0/guide.md
assets/templates/generic_architecture/1.0.0/region-id-2048.json
assets/templates/generic_architecture/1.0.0/region-id-4096.json
assets/templates/generic_architecture/1.0.0/template.json
assets/templates/hard_surface_panel/1.0.0/template.json
assets/templates/horizontal_moulding/1.0.0/region-id-2048.json
assets/templates/horizontal_moulding/1.0.0/region-id-4096.json
assets/templates/horizontal_moulding/1.0.0/template.json
assets/templates/radial_accents/1.0.0/template.json
assets/templates/vertical_trim/1.0.0/region-id-2048.json
assets/templates/vertical_trim/1.0.0/region-id-4096.json
assets/templates/vertical_trim/1.0.0/template.json
assets/templates/wood_board_moulding/1.0.0/region-id-2048.json
assets/templates/wood_board_moulding/1.0.0/region-id-4096.json
assets/templates/wood_board_moulding/1.0.0/template.json
Cargo.lock
Cargo.toml
crates/domain/Cargo.toml
crates/domain/src/algorithm_stack.rs
crates/domain/src/channel.rs
crates/domain/src/document.rs
crates/domain/src/error.rs
crates/domain/src/id.rs
crates/domain/src/layout.rs
crates/domain/src/lib.rs
crates/domain/src/material_source.rs
crates/domain/src/patch.rs
crates/domain/src/protocol.rs
crates/domain/src/source_frame.rs
crates/domain/src/templates/mod.rs
crates/domain/src/units.rs
crates/effect-compiler/Cargo.toml
crates/effect-compiler/src/edge_detail.rs
crates/effect-compiler/src/lib.rs
crates/effect-compiler/src/stage10.rs
crates/effect-compiler/src/stage15.rs
crates/effect-compiler/src/stage16.rs
crates/export/Cargo.toml
crates/export/src/lib.rs
crates/geometry/Cargo.toml
crates/geometry/src/layout.rs
crates/geometry/src/lib.rs
crates/image-io/Cargo.toml
crates/image-io/src/lib.rs
crates/image-io/src/normalization.rs
crates/material-analysis/Cargo.toml
crates/material-analysis/src/delighting.rs
crates/material-analysis/src/feature_fields.rs
crates/material-analysis/src/lib.rs
crates/material-analysis/src/quality_classification.rs
crates/material-analysis/src/scale_orientation.rs
crates/material-synthesis/Cargo.toml
crates/material-synthesis/src/lib.rs
crates/material-synthesis/src/material_domain.rs
crates/material-synthesis/src/patchmatch.rs
crates/material-synthesis/src/procedural.rs
[175 more files omitted for size]
```

### Dependencies

- apps/desktop/package.json: @hot-trimmer/ipc-contracts@0.1.0, @tauri-apps/api@^2.0.0, @tauri-apps/cli@^2.0.0, @tauri-apps/plugin-dialog@^2.0.0, @tauri-apps/plugin-opener@^2.0.0, @types/react@^19.0.0, @types/react-dom@^19.0.0, @vitejs/plugin-react@^4.3.0, react@^19.0.0, react-dom@^19.0.0, typescript@^5.7.0, vite@^6.0.0
- apps/desktop/src-tauri/Cargo.toml: base64, hot-trimmer-domain, hot-trimmer-effect-compiler, hot-trimmer-export, hot-trimmer-geometry, hot-trimmer-image-io, hot-trimmer-material-analysis, hot-trimmer-material-synthesis, hot-trimmer-placement-solver, hot-trimmer-preview, hot-trimmer-project-store, hot-trimmer-render-core, hot-trimmer-sheet-compiler, image, png@0.18, serde, serde_json, sha2, tauri@2, tauri-build@2, tauri-plugin-dialog@2, tauri-plugin-opener@2, tauri-plugin-single-instance@2, tauri-plugin-window-state@2, tracing, tracing-subscriber@0.3, uuid
- crates/domain/Cargo.toml: serde, serde_json, sha2, thiserror, uuid
- crates/effect-compiler/Cargo.toml: hot-trimmer-domain, hot-trimmer-placement-solver, hot-trimmer-render-core, serde, serde_json, thiserror
- crates/export/Cargo.toml: hot-trimmer-domain, serde, serde_json, thiserror
- crates/geometry/Cargo.toml: hot-trimmer-domain, serde, serde_json, thiserror
- crates/image-io/Cargo.toml: hot-trimmer-domain, image, kamadak-exif, moxcms, serde, sha2, thiserror
- crates/material-analysis/Cargo.toml: hot-trimmer-domain, hot-trimmer-geometry, hot-trimmer-image-io, hot-trimmer-render-core, serde_json, thiserror
- crates/material-synthesis/Cargo.toml: hot-trimmer-domain, hot-trimmer-image-io, hot-trimmer-material-analysis, hot-trimmer-render-core, sha2, thiserror
- crates/placement-solver/Cargo.toml: hot-trimmer-domain, hot-trimmer-material-analysis, hot-trimmer-material-synthesis, serde, serde_json
- crates/preview/Cargo.toml: hot-trimmer-domain, pollster, serde, thiserror, wgpu, wgpu-hal
- crates/project-store/Cargo.toml: hot-trimmer-domain, hot-trimmer-geometry, hot-trimmer-image-io, image, rusqlite, serde, serde_json, sysinfo, thiserror, uuid
- crates/render-core/Cargo.toml: hot-trimmer-domain, hot-trimmer-geometry, hot-trimmer-image-io, serde, serde_json, sha2, thiserror
- crates/sheet-compiler/Cargo.toml: base64, hot-trimmer-domain, hot-trimmer-effect-compiler, hot-trimmer-export, hot-trimmer-geometry, hot-trimmer-image-io, hot-trimmer-material-analysis, hot-trimmer-material-synthesis, hot-trimmer-placement-solver, hot-trimmer-preview, hot-trimmer-project-store, hot-trimmer-render-core, image, pollster, serde, serde_json, sha2, sysinfo, thiserror, uuid, wgpu

### Recent commits (newest first)

- App works + plugin works
- fix: ignore superseded preview failures
- feat: refine trim export and Blender fitting
- ci: publish rolling Windows release
- chore: adopt GitHub main branch
- fix: refine Blender slot matching
- fix: serialize radial preview updates
- prep: prepare for Devpost submission
- Initial commit
- ED-2 & 3 completion
- ED-2
- ED-1 stage complete
- Prompt 20a hardening before edge wear implementation
- Prompt 20a
- Prompt 16 (works!)
- Prompt 15
- Prep for prompt 15
- Prompt 005 done. Passing the torch
- Prompt 005 hardening
- Export works! Prompt 005 big pogs in chat it exports!!!

## Key source files (fetched from GitHub, selected and truncated for size)

### AGENTS.md

```markdown
Keep the task scoped to the requested outcome.
Do not widen the search or add agents unless it could change the result.
Run the cheapest targeted check that could show the current approach is wrong.
Stop optional investigation when more work stops changing the answer.
Always run the required safety checks and acceptance criteria, using one focused verification command when the task allows it.

## Subagents

Default to doing the work in the root thread without subagents.

Do not automatically launch an explorer, tester, reviewer, Sol reviewer, or general audit worker. A separate tester or reviewer must not create a new definition of done after the assigned implementation is already green.

Use at most one worker by default, and only for a concrete bounded implementation slice with:

- concrete scope
- acceptance criteria
- relevant files or subsystem
- exactly one targeted verification command

Prefer `phase_worker_fast` for normal delegated implementation. It uses Terra (`gpt-5.6-terra`) with high reasoning effort and should inspect only directly relevant files, implement the assigned behavior, run the specified verification command, make at most one correction pass, rerun the same command, and stop.

Use `phase_worker_hard` only after `phase_worker_fast` fails and the parent explicitly requests escalation for the reported blocker. It uses Sol (`gpt-5.6-sol`) with high reasoning effort.

Do not launch `phase_worker_hard` for sandbox or tool-infrastructure failures. Restart or repair the execution environment before retrying the slice.

The parent thread owns synthesis, integration, and the final user response. After a worker reports success, do not run a parent diff audit, broad test sweep, production build, browser inspection, documentation pass, or unrelated cleanup unless the user explicitly asked for it or the focused verification exposes a concrete regression.

### Sequential render-prompt workflow

When the user explicitly invokes `docs/render/orchestrator-prompt.md`, that workflow overrides the normal worker preference above only for the queued render migration:

- The root thread is an orchestrator only. It does not implement the queued prompt.
- Use exactly one render worker at a time. Prefer `render_prompt_worker` (Spark) for the initial implementation and its
  one remediation turn.
- Before spawning a full-prompt Spark worker, the root must classify prompt size. If the prompt contains multiple
  dependent implementation responsibilities that are likely to exhaust Spark's context, split it into two or three
  sequential slices and use fresh `render_prompt_slice_worker` agents. Only one slice worker may run at a time.
- Render workers must never reread and restart the whole task after context compaction. If Spark's context compacts
  before its first cohesive edit, or it reaches its read budget without enough information to edit safely, it must stop
  with `NEEDS_SPLIT` and return a two-or-three-slice proposal. The root then owns decomp
[truncated — 2647 more characters]
```

### docs/gpu-prompt-1-status-report.md

```markdown
# GPU Migration Prompt 1 status report

Date: 2026-07-18

Status: **Prompt 1 accepted as the compiler/baseline phase; Prompt 1.5 accepted for executor-owned CPU composition**.

## Implemented

- Added and validated the deterministic `CompiledAtlasPlanV1` contract.
- Routed production SourceFrame Stage 14 pixel synthesis through `CpuAtlasRenderExecutor` beneath `compile_persisted`.
- Moved complete SourceFrame Base Color atlas composition behind `CpuAtlasRenderExecutor`, while retaining the existing CPU composition implementation byte-for-byte.
- Kept the existing CPU sampler as the Prompt 1 pixel implementation.
- Added the long-lived native GPU capability-service skeleton and application-owned lifetime.
- Pinned `wgpu` 26.0.1 and the published compatible `wgpu-hal` 26.0.0 dependency graph.
- Added a genuine 7952×4016 PNG/RGBA8 source and 8192×8192 Base Color release harness with 64 regions.
- Relabeled misleading small fixtures that previously implied real 8K coverage.

## Focused verification

```text
cargo test -p hot-trimmer-sheet-compiler gpu_execution_contract
```

Result: 1 matching production contract test passed. The test confirms that a production SourceFrame request executed through the CPU executor and published the immutable plan identity.

Prompt 1.5 focused verification:

```text
cargo test -p hot-trimmer-sheet-compiler gpu_executor_owns_base_color_composition
```

Result: passed. The test confirms that production `compile_persisted` publishes the immutable plan identity, records `compose_executor=cpu`, preserves the fixed CPU-composed Base Color output digest, and rejects cancelled/stale work at the composition boundary without returning an artifact.

## Real-8K baseline

```text
cargo test -p hot-trimmer-sheet-compiler --release --test real_8k_baseline -- --ignored --nocapture
```

The restricted child-process sandbox could not create the trace directory, so the successful run used the harness's documented `HOT_TRIMMER_GPU_BASELINE_DIR` override with an approved unsandboxed execution. Workload semantics and build profile were unchanged.

Qualification machine:

- Windows 10 Home
- AMD Ryzen 9 5900XT, 16 physical / 32 logical cores
- 51,444,936,704 bytes RAM
- NVIDIA GeForce RTX 3090, Vulkan, NVIDIA driver 610.74
- 25,769,803,776 bytes VRAM
- Maximum 2D texture dimension: 32768
- Selected tile recommendation: 2048
- Timestamp queries: supported

Workload and results:

| Run | Total | Decode | Stage 14 | Compose | Decode cache | Render cache |
| --- | ---: | ---: | ---: | ---: | --- | --- |
| Cold | 24.904 s | 3.370 s | 8.802 s | 12.728 s | miss, 1 decode | 0/64 hits |
| Warm 1 | 13.401 s | 0 ms | 0 ms | 13.398 s | hit, 0 decodes | 64/64 hits |
| Warm 2 | 13.351 s | 0 ms | 0 ms | 13.346 s | hit, 0 decodes | 64/64 hits |

- Stable plan hash across all runs: `8509b9180233c06988132cd3d91eb3831b23531be0d764dea0779ad159e77e96`
- Peak observed RSS: 5,500,157,952 bytes
- Reported artifact allocation: 1,946,157,056 bytes per run
- Base Col
[truncated — 411 more characters]
```

### package.json

```
{
  "name": "hot-trimmer",
  "version": "0.1.0",
  "private": true,
  "license": "MIT",
  "type": "module",
  "workspaces": [
    "apps/desktop",
    "packages/*"
  ],
  "scripts": {
    "build": "npm run build:web && cargo build --workspace",
    "build:native": "npm run tauri --workspace @hot-trimmer/desktop -- build --no-bundle",
    "build:web": "npm run build --workspace @hot-trimmer/desktop",
    "check:algorithm-stage-20b": "node scripts/check-algorithm-stage-20b.mjs",
    "check": "node scripts/check.mjs && npm run typecheck --workspaces --if-present && npm run test --workspaces --if-present && cargo fmt --all -- --check && cargo clippy --workspace --all-targets -- -D warnings && cargo test --workspace",
    "dev": "npm run tauri --workspace @hot-trimmer/desktop -- dev",
    "format": "cargo fmt --all",
    "test": "npm run test --workspaces --if-present && cargo test --workspace"
  }
}

```

### Cargo.toml

```
[workspace]
resolver = "2"
members = [
  "apps/desktop/src-tauri",
  "crates/domain",
  "crates/export",
  "crates/geometry",
  "crates/image-io",
  "crates/material-analysis",
  "crates/material-synthesis",
  "crates/placement-solver",
  "crates/effect-compiler",
  "crates/preview",
  "crates/project-store",
  "crates/render-core",
  "crates/sheet-compiler",
]

[workspace.package]
version = "0.1.0"
edition = "2024"
rust-version = "1.85"
license = "MIT"

[workspace.dependencies]
base64 = "0.22"
hot-trimmer-domain = { path = "crates/domain" }
hot-trimmer-material-analysis = { path = "crates/material-analysis" }
hot-trimmer-material-synthesis = { path = "crates/material-synthesis" }
hot-trimmer-placement-solver = { path = "crates/placement-solver" }
hot-trimmer-effect-compiler = { path = "crates/effect-compiler" }
image = { version = "0.25", default-features = false, features = ["jpeg", "png", "tiff"] }
kamadak-exif = "0.6"
moxcms = "0.8"
rusqlite = { version = "0.32", features = ["backup", "bundled"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
sha2 = "0.10"
thiserror = "2"
tracing = "0.1"
sysinfo = "0.33"
uuid = { version = "1", features = ["serde", "v4"] }
wgpu = { version = "=26.0.1", default-features = true }
# wgpu 26.0.1 permits later 26.x HAL patches. Pin the published baseline HAL so
# the Rust 1.85 workspace does not drift to the incompatible 26.0.6 Windows graph.
wgpu-hal = "=26.0.0"
pollster = "=0.4.0"

[workspace.lints.rust]
unsafe_code = "forbid"
unused_must_use = "deny"

[workspace.lints.clippy]
all = "warn"
pedantic = "warn"

```

### packages/ui/package.json

```
{
  "name": "@hot-trimmer/ui",
  "version": "0.1.0",
  "private": true,
  "type": "module",
  "exports": "./src/index.ts",
  "scripts": { "typecheck": "tsc --noEmit" }
}


```

### packages/editor/package.json

```
{
  "name": "@hot-trimmer/editor",
  "version": "0.1.0",
  "private": true,
  "type": "module",
  "exports": "./src/index.ts",
  "scripts": { "typecheck": "tsc --noEmit" }
}


```

### packages/ipc-contracts/package.json

```
{
  "name": "@hot-trimmer/ipc-contracts",
  "version": "0.1.0",
  "private": true,
  "type": "module",
  "exports": "./src/document-contracts.ts",
  "scripts": {
    "test": "node --test src/document-contracts.test.ts",
    "typecheck": "tsc --noEmit"
  }
}

```

### crates/export/Cargo.toml

```
[package]
name = "hot-trimmer-export"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true

[dependencies]
hot-trimmer-domain.workspace = true
serde.workspace = true
serde_json.workspace = true
thiserror.workspace = true

[lints]
workspace = true
```

### crates/geometry/Cargo.toml

```
[package]
name = "hot-trimmer-geometry"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true

[dependencies]
hot-trimmer-domain.workspace = true
thiserror.workspace = true

[dev-dependencies]
serde.workspace = true
serde_json.workspace = true

[lints]
workspace = true

```

### crates/domain/Cargo.toml

```
[package]
name = "hot-trimmer-domain"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true

[dependencies]
serde.workspace = true
serde_json.workspace = true
sha2.workspace = true
thiserror.workspace = true
uuid.workspace = true

[dev-dependencies]

[lints]
workspace = true

```

[190 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]