# Changelog

## [1.1.23] - 2026-07-12

### Added
- **Remove Solid Color Background.** A new Original-panel menu item drops out a uniform background by *color* — click the background, adjust Tolerance while watching a live preview, and the matching region becomes transparent. This is the right tool for flat graphics (signs, logos, badges) on a solid background, where the AI remover — which guesses at a photographic subject and has no notion of color — leaves a ragged, blotchy edge. Brush/eraser touch-ups from the mask editor are available in the same dialog.
- **Auto-trim to content.** Both Remove Solid Color Background and Edit Mask now offer a "Trim to content" option that crops the canvas to the tight bounding box of the remaining opaque pixels on apply. On by default for the solid-color flow (you almost always want the isolated subject cropped) and off for general mask editing (so Bleed + Cut prep keeps the canvas).

### Changed
- **"Remove Background" is now "Remove Background (AI)."** Renamed so it's clearly distinct from the new color-based remover — it remains the best choice for photos and complex subjects.
- **Finer zoom in the mask window.** The Edit Mask / Remove Solid Color Background preview now zooms in 5% steps instead of jumping ~25% near 100%, for pixel-precise mask work.

## [1.1.22] - 2026-06-16

### Changed
- **The main action button now reads "Trace" instead of "Run."** The label better reflects what the button does now that the workbench has grown to include many other features.

## [1.1.21] - 2026-06-15

### Changed
- **Smaller download: the background-removal model is now fp16.** The bundled isnet matting model was quantized from 32-bit to 16-bit floating point, shrinking it from ~170 MB to ~86 MB (about 84 MB off the installed app) with no visible change to cutouts — the silhouette that the Bleed + Cut workflow relies on matches the previous model to within 0.05% in the worst case. Background removal still runs fully offline.

## [1.1.20] - 2026-06-14

### Added
- **Generate Cut Path… for image sources.** The Original (image) hamburger now offers Generate Cut Path directly from a transparent image — it traces the image's transparency edge at its native resolution (no DPI rasterization step) into a single-layer cut-path SVG. Previously cut paths could only be generated from a vector result.
- **Flip horizontal (mirror) option for cut paths.** The Generate Cut Path and Bleed + Cut dialogs now include a mirror toggle so the cut path can match a print that was mirrored for heat transfer onto a substrate. It's on by default in the Bleed + Cut flow (where the bleed image is already mirrored) and off by default for a standalone cut path.

### Changed
- **"Background Mask" is now "Edit Mask."** The dialog and its menu item were renamed to reflect that it edits any mask, not just background removal. Opening it on an already-cut image now seeds the red selection from the image's existing transparency, so you refine the current mask instead of starting from blank — and applying preserves the prior background removal.
- **Live brush/eraser preview while masking.** Red paint now appears under the brush in real time as you stroke, instead of only after you release. A new opacity slider controls how see-through the red overlay is, so you can dial it down to watch the artwork beneath your brush.

### Fixed
- **More robust image printing.** Large images are now fully decoded before printing, fixing occasional blank pages and (in packaged builds) crashes during print. Subprocess and print-window crashes are now logged so a failed print leaves a diagnostic trail instead of the app vanishing silently.

## [1.1.19] - 2026-06-06

### Fixed
- **vTracer results now display correctly instead of showing a blank box.** VTracer's output carried no `viewBox`, so the Result panel — which strips the physical width/height for display — had nothing to size the SVG with and collapsed it to an empty 300×150 box. The trace itself always worked; only the preview was blank. A `viewBox` matching the traced image is now added so the result renders and fills the panel.

### Added
- **End-to-end test suite (Playwright + Electron).** Drives the real packaged app through the full workbench — load image, run vTracer and Potrace, Save SVG, Add Bleed, Generate Cut Path, Set Resolution, Simplify Paths, Mirror, and Undo — including a regression guard that fails if a traced result ever renders blank again. See `docs/E2E-TESTING.md`; run with `npm run package` then `npm run test:e2e`.

## [1.1.18] - 2026-06-01

### Fixed
- **Saving a bleed + cut path from the single image view now displays the cut SVG in the Result panel** instead of getting stuck on a perpetual "Processing…" spinner. The save succeeded and the 2-panel layout opened, but the panel never rendered the promoted SVG.

## [1.1.17] - 2026-06-01

### Added
- **Simplify Paths** under the Result (vector) hamburger — an in-dialog iterative editor for reducing node count and optionally smoothing traced SVGs. Drag **Tolerance** for a live preview, optionally enable **Smooth output** (rebuilds paths as quadratic Bézier curves), then **Apply** to commit a stage and keep iterating, or **Done** to ship the result to the Result panel. **Undo** / **Ctrl+Z** steps back through stages, **Reset** returns to the original, and **Show Original** A/B-compares against the input. A live badge reports node count before → after and the total reduction percentage.
- **Cut path now appears in the Result panel** after an image-side Add Bleed that generates a cut path — no need to re-open the saved SVG. You can immediately Simplify, Set Resolution, or re-print it.

### Fixed
- **Zoom in the preview dialogs now scales correctly and always centers on the mouse cursor.** In Simplify Paths the preview would stop growing past 150% even as the zoom number climbed; it now scales the full range. Across Simplify Paths, Background Mask, and the Bleed + Cut Preview, mouse-wheel zoom anchors to the point under the cursor on every step (including the first step out of Fit), and the zoom range now extends up to 64×.

## [1.1.16] - 2026-05-31

### Added
- **Background Mask** under the Original hamburger — interactive background masking with three tools:
  - **Magic Wand (W)** — click to flood-fill from that pixel with color tolerance. **Contiguous** checkbox controls whether the selection follows connectivity (default ON) or matches every pixel in the image within tolerance of the clicked color (Photoshop "Contiguous off").
  - **Brush (B)** — drag to paint pixels into the transparent selection.
  - **Eraser (E)** — drag to restore selection pixels back to opaque.
  - Bracket keys **[** and **]** shrink and grow the brush/eraser radius. Circular cursor outline tracks current size at current zoom.
  - **Ctrl+Z** inside the dialog pops the last op (wand click, brush stroke, or eraser stroke).
  - Live red translucent preview overlay updates ~120 ms after every change; toggleable.
  - Apply runs the full op stack server-side, writes RGBA, and feeds the working-image undo stack so outside-the-dialog Ctrl+Z reverts the entire operation.

### Changed
- **Swapped the rembg model from u2net to isnet-general-use.** isnet is trained on the DIS5K dataset (general objects, broad categories) instead of being person-biased like u2net. Handles graphic-design composites, logos, and mixed scenes materially better while staying strong on humans. Inference is ~30% slower; mask sizes are similar (~170 MB).
- **Flatten Image now operates on the current working image** instead of always going back to the original. After Magic Wand / Remove Background / Refine Mask, Flatten composites that mask onto your chosen background color. The "re-pick a different flatten color" use case is now handled by Ctrl+Z undo.

## [1.1.15] - 2026-05-31

### Added
- **Undo (Ctrl+Z) for image edits.** Every image-edit operation now pushes the prior working image onto an undo stack: Mirror, Flatten, Remove Background, Refine Mask, and Set Resolution. Press **Ctrl+Z** anywhere outside an input field, or open the Original hamburger menu and click the top entry (which names the operation that will be undone, e.g. "Undo Refine Mask"). Status bar reports "Undid: <operation>". Stack is capped at 20 entries — oldest temp PNGs are deleted on overflow. History clears when you open a new image, revert to original, or close all.

## [1.1.14] - 2026-05-31

### Added
- **Remove Background dialog with "Fill interior holes" option** (default ON). u2net occasionally classifies background-colored regions *inside* the subject as background and punches holes through the silhouette (e.g. wood grain visible through the gap between an arm and a torso). When the option is on, the sidecar takes the mask-only path, morphologically closes thin leaks, fills every enclosed hole, and produces a hard binary alpha — every pixel is either fully opaque or fully transparent. Recovered hole pixels show the *original* source colors (not black) because the cutout is composited manually against the source RGB. Turn the option off only if the subject has a legitimate interior cutout, or if you need soft anti-aliased edges.
- **"Save and Print" on the Add Bleed and Bleed+Cut Preview dialogs.** Replaces the old "Save and Load" button. One click writes the bleed PNG (and cut SVG, in the preview flow) to disk and opens the system print dialog at the artwork's native physical size. The laser-shop-ready finish for the bleed/cut workflow.

### Changed
- The Bleed dialog's secondary action is now **Save and Print** (was: Save and Load). If you want to load the bleed PNG back into the workbench without printing, use **Save** and then drag the saved file in — or use Open File on the saved path.

## [1.1.13] - 2026-05-31

### Added
- **Refine Mask** on the Original panel hamburger (under Remove Background). Cleans up the soft halo that AI background removal leaves on edges so the bleed pipeline gets a clean binary boundary. Two controls:
  - **Alpha threshold** (0-255, default 200) — snaps each pixel to fully transparent (below cutoff) or fully opaque (at/above).
  - **Erode pixels** (0-10, default 1) — shaves the opaque edge inward by N pixels after thresholding.
- Greyed out when the current image has no alpha channel. Outward expansion is deliberately not offered — that's what Add Bleed does (with the correct edge-color fill).

## [1.1.12] - 2026-05-31

### Fixed
- **Result SVG now fills the panel.** Previously a traced SVG with declared physical units (e.g. `width="101.6mm"`) rendered at ~384 px because browsers compute SVG intrinsic size from physical units at the CSS spec's 96 dpi. The Result panel display now strips those attributes from the display copy so the browser sizes by viewBox + container, matching how the Original raster fills the panel. The saved/printed/bled/cut SVG keeps its physical dimensions intact.
- **Set Resolution on the SVG now defaults to the SVG's actual physical size.** A 4-inch-wide trace used to open the dialog at 1200 px → switch to IN → show 12.5" (because the dialog used the CSS spec's 96 dpi). It now reads the SVG's declared width/height and seeds the dialog from there — so the same 4-inch trace opens at 101.6 mm / 4 in.
- Rare crash when opening Set Resolution (Image side) — hook order violation in the dialog.

### Changed
- **Click outside Set Resolution and Add Bleed dialogs no longer closes them.** Those dialogs hold entered values (size, DPI, bleed amount, unit) that are easy to lose by mis-clicking past the dialog. Close them via Cancel, X, Apply / Save, or Escape.

### Added
- **Click the panel size badge to toggle mm ↔ in.** Default is mm. Both panels stay in sync — clicking either flips both. Resets to mm on app restart. Hover the badge for the full breakdown (pixels, DPI, mm, and in).

### Documentation
- **User manual rewritten end-to-end for v1.1.11+.** Covers every feature added since v1.1.1: Open SVG / standalone SVG workflow, single-panel-until-Run layout, panel header Save / Print icons, both hamburger menus in detail (Mirror, AI Remove Background, Flatten, Set Resolution with auto AI upscale, Add Bleed), the full Add Bleed + Cut Path workflow, viewBox-only auto-prompt, mm/in size badge toggle, dialog backdrop behavior, Save Image semantics, and updated troubleshooting.
- **New "The Mocha Bleed & Cut Workflow — End-to-End" section** in the user manual — a five-step recipe from "I have this AI image" to "I have my craft-ready print and cut files," with the full audience callout (laser owners, AI artwork users, Etsy sellers, UV/transfer users, designers).
- **README at the repo root replaced** with a Mocha-Trace-specific overview. The previous README was upstream Electron-template scaffolding, which made the public GitHub page look like a template rather than a real app.

## [1.1.11] - 2026-05-29

### Fixed
- **Set Resolution no longer leaves the sidebar spinner stuck at "AI upscale 99.17%" forever.** The IPC sends pipeline:status events to drive the progress text, which also sets the global `isProcessing` flag — but the handler was only clearing its local dialog flag. The progress events would leave isProcessing=true after the IPC returned and the spinner would never stop. Set Resolution now explicitly brackets the whole operation with `setProcessing(true/false)`.
- **The Result panel no longer shows "Processing…" while running an image-edit operation** like Set Resolution, Mirror, Flatten, or Remove Background. The Result panel is now driven by a separate `pipelineRunning` flag that only the Run button toggles. Image edits don't pretend a trace is in progress.

### Changed
- **Loading an image now shows only the Original panel full-width** until the user clicks Run. The 2-panel grid only appears when a trace pipeline result exists or is being produced. Image-edit operations don't open the Result panel.

### Added
- **Save Image** (Download icon) on the Original panel header, between the existing controls. Saves the current working image — including post-Set-Resolution / post-Mirror / post-Flatten / post-Remove-Background results — to a user-chosen path. Re-encodes via sharp when the target extension differs from the source (PNG/JPG), copies verbatim otherwise to preserve metadata.

## [1.1.10] - 2026-05-29

### Added
- **Set Resolution on the Original (image) panel hamburger.** Resample to a target physical size (mm/in/px) at a chosen DPI. Auto-picks the resampling engine: **AI super-resolution (Real-ESRGAN)** when the target pixel count exceeds the source on either axis, **Lanczos** when downscaling, and a pure DPI metadata rewrite when the dimensions match. The dialog shows a clear AI-upscale hint badge when enlarging, blocks 4×-exceeding targets with a friendly error, and indicates "DPI metadata only" when no resize is needed.

### Changed
- **Print is now an icon button on both panels** (left of the hamburger), not a menu item. Single click opens the system print dialog with the artwork sized to its physical dimensions.
- **Upscale Image (4x) entry removed** from the Original panel hamburger. The same AI upscaler now folds automatically into Set Resolution whenever the user enlarges the image.

## [1.1.9] - 2026-05-29

### Added
- **Upscale Image (4x)** on the Original panel hamburger menu. AI super-resolution via Real-ESRGAN with the `realesrgan-x4plus` model. Uses Vulkan compute — works on any modern GPU including integrated AMD/Intel iGPUs, no dedicated GPU required. ~6 seconds for an 800×600 → 3200×2400 upscale on a typical integrated GPU. Output replaces the working image so Bleed/Cut/Trace see the higher-resolution version.
- **Print…** on both hamburger menus. Opens the system print dialog with the artwork sized to its declared physical dimensions — for images, the page size is derived from pixel dims ÷ DPI; for SVGs, from the root width/height. Choose any installed printer or "Print to PDF" for a digital copy at exact physical size. Verified end-to-end with a 100×75mm SVG → 100×75mm PDF and an 800×600 px image at 72 dpi → 282.2×211.7mm PDF.
- realesrgan-ncnn-vulkan binary + models bundled at `bin/realesrgan/` (gitignored, shipped via forge.config.cjs).

## [1.1.8] - 2026-05-29

### Added
- **Remove Background** on the Original panel hamburger menu. AI-based background removal via rembg using the u2net model (168 MB, bundled). Runs on CPU — typical inference is 2-5 seconds for 1080p images. Writes a transparent RGBA PNG to a temp file and swaps it in as the working image, so Bleed/Cut/Trace see the cut-out subject automatically.
- rembg + onnxruntime CPU installed into the embedded Python at `python-embed/`. u2net.onnx pre-bundled at `python/models/u2net.onnx` so the first run is offline (no model download).
- forge.config.cjs now bundles `python/rembg_inference.py` and `python/models/u2net.onnx` into packaged builds.

## [1.1.7] - 2026-05-29

### Added
- **Mirror Image now commits the flip.** Toggling Mirror Image on the Original panel writes a horizontally flipped temp PNG and swaps it in as the working image (same pattern as Flatten). Bleed + Cut, vector trace, and SVG export all see the mirrored pixels. The DPI metadata is preserved so physical-size calculations stay correct. Toggle twice and you're back to bit-identical original. Revert button resets the mirror flag.
- **Close All** button in the toolbar (left of Open Image). Closes the loaded image and result, returning to the empty drop-zone state. Disabled when nothing is loaded.

### Changed
- Mouse-wheel zoom now works on the single-SVG layout (no source image). Previously the zoom math required a source-image width to multiply against, so wheel events updated state but the rendered width never changed. Falls back to the SVG's viewBox width when no image is loaded.

### Removed
- **SAM + vTracer pipeline.** Dropped entirely along with the Python sidecar (`sam_inference.py`), the 2.4 GB model dependency, the `samData` state, all SAM IPC handlers, the MCP server's `segment_image` tool, and SAM sections from user manual / build docs / PRD. Per-color Potrace already handles the use cases SAM+vTracer was meant for, with no GPU required. Your local `python/models/sam_vit_h_4b8939.pth` file is untouched — delete it manually to reclaim the 2.4 GB.

## [1.1.6] - 2026-05-29

### Added
- **Drag & drop and Open commands for SVG files.** Two toolbar buttons: **Open Image** and **Open SVG**. Drop an SVG on the Result panel to load it; drop an image on the Original panel to load it; drop either on the empty workbench to begin. Each zone only accepts its file type — wrong-type drops surface a clear status hint.
- **Standalone SVG workflow.** Loading an SVG with no source image switches to a single Result panel layout. Add Bleed and Generate Cut Path work on the SVG's own dimensions; no trace step required.
- **Auto-size prompt for viewBox-only SVGs.** When a loaded SVG has only a `viewBox` (no declared width/height), Set Resolution opens automatically with the viewBox dimensions pre-filled so you can assign a physical size before Bleed/Cut.

### Changed
- **Set Resolution now works on standalone SVGs.** Source dimensions fall back to the SVG's viewBox when no image is loaded, so you can scale a vector to a physical size without a raster source.
- Set Resolution menu item is hidden when neither a source image nor a usable viewBox is available.

### Known issues
- Mouse-wheel zoom does not work in the single-SVG layout (when an SVG was loaded standalone with no source image). Zoom dropdown still works.

## [1.1.5] - 2026-05-29

### Added
- **Add Bleed… on the Original (image) panel.** Run the Bleed + Cut workflow directly from the source PNG — no vector trace step. Output dimensions and DPI are locked to the source image's embedded resolution (no DPI input). Menu item is disabled with an explanatory tooltip when the source has no alpha channel.

### Changed
- Hamburger menu items now support a `disabled` state with hover tooltips, used for the new "Add Bleed…" entry when the source is fully opaque.

## [1.1.4] - 2026-05-29

### Fixed
- **Add Bleed no longer fails with "Array buffer allocation failed" on large sources.** A 2250×3000 PNG at 300 DPI was being interpreted as a 23-inch-wide canvas (CSS spec 96 DPI default for unitless pixel SVGs), which made the bleed work buffer balloon past 1 GB. Trace pipelines now embed the source image's physical size (mm) into the output SVG's width/height, so Add Bleed and Generate Cut Path measure the canvas correctly regardless of trace coordinate space.
- **Bleed and Cut dialogs now interpret unitless-pixel SVGs at the dialog's chosen DPI** as a safety net, instead of the CSS 96 DPI default. Belt-and-braces protection for SVGs that arrive without physical units.
- **Bleed errors are now surfaced inline in the Add Bleed dialog** in a red banner, instead of only the status bar. Diagnosing failures no longer requires opening the log.

### Changed
- **Downscale images >2K is back ON by default** for both vTracer and Potrace. Since the output SVG now declares the source image's physical size, downscaling for trace speed/cleanliness no longer affects Add Bleed or Generate Cut Path output dimensions.
- The downscale tooltips were updated to explain this — the previous warning about bleed/cut is no longer relevant.

### Added
- **Pixel dimensions, DPI, and physical size readouts in panel headers.** The Original panel shows `WxH px · DPI · mm`; the Result panel shows the SVG's native units alongside the mm equivalent. Hover for a full breakdown (px / dpi / mm / in).

## [1.1.3] - 2026-05-29

### Changed
- **Add Bleed now fills every transparent pixel near a solid one**, including letter bowls (B, e, o, a), eyes, and other interior cutouts. This is required so the laser has a registration safety margin everywhere it cuts, not just on the outer boundary. The previous "outer-only" default was wrong for laser cutting.
- **Generate Cut Path now preserves interior holes** — letter bowls, face details, and other cutouts are traced as inner subpaths via Potrace's even-odd winding. The laser physically cuts those holes out instead of leaving them filled.
- **Potrace slider raised from 5 to 7 colors** with two new presets: "Detailed" (6 colors) and "Extra Detailed" (7 colors). MCP `trace_image_potrace` validator and the user manual were also updated to allow 1-7.

### Added
- **Stale image cache buster.** When you load the same image path twice (e.g. after editing it externally), the renderer now appends a `?v=N` query string to the image URL so Chromium re-fetches from disk instead of serving cached bytes. The protocol handler strips the query before reading the file.
- **Busy overlay during bleed generation.** A prominent full-dialog spinner with "Generating bleed and cut path…" appears while the bleed runs (10-30 seconds on larger artwork). Replaces the previous tiny button spinner that was easy to miss.

### Fixed
- **Preview dialog no longer closes when you click the backdrop.** The bleed and cut temp files are generated before the preview opens and an accidental click would discard them. Closing now requires the Cancel or X button explicitly.

## [1.1.2] - 2026-05-28

### Changed
- **Add Bleed** now uses outer-only mode by default. Bleed extends only outside the artwork's outer envelope; interior shapes (letters, sun, palm fronds, wine glass details) stay exactly as the trace produced them. Earlier per-shape mode was caused interior detail to be obliterated by colors bleeding into each other.
- **Generate Cut Path** now outputs a single outline of the artwork's outer footprint (one path, ~1 KB) instead of tracing every individual shape (~85 KB). A flood-fill step fills interior gaps before Potrace so cutters get a single clean envelope outline ready for laser cutting.
- "Also save cut path (preview before saving)" checkbox in the Add Bleed dialog now defaults to **ON** so the typical print-and-cut workflow is one click.

### Added
- **Clean small color specks** checkbox in the Add Bleed dialog (default ON). Per-color connected-component analysis demotes tiny same-color regions (typically trace quantization artifacts like a green pixel cluster inside a blue region) to transparent, then the bleed paints the surrounding majority color over them.

### Fixed
- Eliminated the faint 1–2 pixel partial-alpha outline that appeared at silhouette edges. Edge pixels with anti-aliased alpha are now forced to fully opaque after the bleed paint, so silhouettes and their bleed bands are a single continuous opaque region.
- Single-pixel salt-and-pepper noise in the rasterized SVG is now removed via a 3×3 median filter before mask construction.

## [1.1.1] - 2026-04-20

### Changed
- User manual now shows an annotated screenshot of the Potrace settings panel with numbered callouts for Presets, Number of Colors, and Remove Background.
- Updated the Getting Started screenshot reference to the current UI.

## [1.1.0] - 2026-04-18

### Changed
- **Potrace pipeline rewritten for correct color output.** Replaced the luminance-banded `Posterizer` (which produced wrong colors or empty SVGs on multi-color artwork) with per-color tracing: quantize → 1-bit mask per palette color → B&W Potrace → stacked SVG. Logos, icons, and flat-color graphics now trace with the correct colors at every count.
- Alpha-aware quantization: sources with transparency get an extra internal palette slot so the transparent region never steals from the user's color budget.

### Added
- **Remove Background** checkbox in the Potrace settings panel — detects the corner background color from the quantized palette and skips that layer.
- **`trace_image_potrace` MCP tool** — exposes the new Potrace pipeline to external agents with `numColors` and `removeBackground` options.

### Removed
- **SAM + Potrace** pipeline. The new per-color Potrace already separates colors cleanly, making SAM segmentation redundant (and per-segment quantization fragmented what should be a single color layer). SAM + vTracer remains for complex/photographic sources.

## [1.0.4] - 2026-03-30

### Added
- Embedded Python bundled with app (vTracer works out of the box, no Python install needed)
- Auto-downscale option for images larger than 2K pixels
- Resolution indicator in top bar (yellow for large, orange for small images)
- Friendly error message when SAM model is missing with download instructions
- New MT pen nib app icon
- BUILD.md with complete build and distribution instructions

### Changed
- Updated user manual and CLAUDE.md to reflect current architecture
- Build excludes SAM model (2.4 GB) — users download separately

## [1.0.3] - 2026-03-30

### Added
- Remove Background option that strips background color and matching letter holes (e.g., inside o, a, e)
- Photoshop-style checkerboard transparency grid in the result panel
- Hard Surface preset for mechanical/industrial images with sharp edges
- Newbie-friendly tooltips on all vTracer settings
- About/Help screen with hero image, version, and Documentation link
- Dark title bar on Windows
- Dynamic version display in status bar and About screen (reads from package.json)

### Changed
- WEBP and TIFF images are now auto-converted to PNG before tracing (fixes grayscale-only output)
- Version shown in footer and Help screen now always matches package.json

### Removed
- Potrace and SAM+Potrace pipelines (Potrace is monochrome-only, vTracer handles all use cases better)

## [1.0.2] - 2026-03-30

### Changed
- Renamed app from MOCHA to Mocha-Trace across all files and UI

### Added
- MCP server for AI integration (trace_image, get_image_info, list_presets, segment_image tools)
- MCP config file (`.mcp.json`) for automatic Claude Code detection
- Full user manual (`docs/USER_MANUAL.md`)

## [1.0.1] - 2026-03-30

### Added
- Full Electron workbench app with side-by-side original/result comparison
- Four tracing pipelines: vTracer, Potrace, SAM+vTracer, SAM+Potrace
- vTracer settings panel with all parameters (filter speckle, color precision, gradient step, curve fitting, corner/segment/splice thresholds)
- Eight presets: Photo High/Medium/Low, Graphics Color/B&W, Line Art Clean, Cutout Flat, Pixel Art
- Pipeline selector sidebar to run individual pipelines
- Python vTracer sidecar with full parameter control (replaces limited npm preset-only package)
- Python SAM sidecar using ViT-H model on CUDA GPU for AI-powered image segmentation
- Color quantization via image-q (WuQuant algorithm)
- Synchronized zoom and pan across both image panels
- Mouse wheel zoom centered on cursor position
- Click-and-drag panning when zoomed in
- Right-click to reset to Fit view
- Zoom dropdown with Fit, 25%, 50%, 75%, 100%, 150%, 200%, 500% (relative to original image resolution)
- Drag-and-drop image loading (both empty state and onto existing image)
- Full file path shown in status bar footer
- SVG save/download button per result
- Mocha coffee cup app icon
- Taskbar shortcut script
- Pipeline test runner (`test_pipelines.js`) with comprehensive report
