Commit Graph
489 Commits
Author SHA1 Message Date
a1e11dff74 feat(gif-tools): SOTA upgrade with 6 processing modes (#52)
* feat(find-duplicates): upgrade to 128-bit dHash with metadata and thumbnails

* feat(find-duplicates): add custom-results display mode and duplicate store

* feat(find-duplicates): add results overview grid and detail comparison view

* feat(find-duplicates): overhaul settings with sensitivity presets and download actions

* feat(find-duplicates): update i18n description

* chore: replace jsqr with zxing-wasm for barcode reading

* feat(barcode-read): rewrite backend with zxing-wasm for all barcode types

* feat(barcode-read): rewrite frontend with multi-file, results table, progress, export

- Multi-file sequential processing with per-file progress
- Structured results table with type badges and copy per-result
- Copy All and Export CSV functionality
- Thorough scan toggle (maps to tryHarder in zxing-wasm)
- Before/after view shows annotated image with bounding boxes
- Updated tool description in constants and i18n

* feat(stitch): update tool name and description for redesign

* feat(stitch): add grid layout, alignment, border, radius, quality, and new resize modes

* feat(stitch): redesign settings UI with grid, alignment, border, radius, quality

* test(stitch): add stitch to e2e tool navigation suite

* feat(vectorize): redesign with dual-engine backend and preset-driven UI

- Backend: potrace for B&W, VTracer (@neplex/vectorizer) for full-color vectorization
- Frontend: 5 presets (logo, illustration, photo, sketch, custom)
- Settings: color precision, gradient step, detail, smoothing, corner threshold, invert
- Updated OpenAPI spec and i18n description

* feat(border): redesign with presets, shadow, padding color, swatches

- Add 8 one-click presets (Clean White, Gallery Black, Shadow, Rounded, Polaroid, Vintage, Minimal, Cinematic)
- Implement proper shadow rendering with blur, offset X/Y, color, opacity
- Add padding color control (was hardcoded white)
- Add color swatches for quick color selection
- Wrap in form for Enter key submission
- Add smart validation (requires at least one effect active)
- Align frontend/backend slider ranges
- Organize UI with sections and collapsible shadow toggle

* feat(split): overhaul image splitting with live grid overlay and tile preview

- Add interactive-split display mode with SplitCanvas component
- Live SVG grid overlay on uploaded image showing split boundaries
- Two split modes: Grid (NxM) and Tile Size (px dimensions)
- 9 grid presets (2x1, 1x2, 2x2, 3x1, 1x3, 3x3, 2x3, 3x2, 4x4)
- Output format selection (original/PNG/JPG/WebP) with quality slider
- Post-split tile preview thumbnails with individual download
- Download All as ZIP button
- HEIC/HEIF preview with loading spinner
- Backend: tile-size mode, output format conversion, quality control
- Zustand store for split state management

* feat(split): rewrite backend and frontend settings

Backend: tile-size mode, output format conversion, quality control.
Frontend: split modes, presets, format selector, tile preview grid.

* feat(border): add live CSS preview and remove before/after slider

- Add imageWrapperStyle prop to ImageViewer for live border preview
- Add onImageStyle callback through tool-page to settings components
- Change border displayMode to no-comparison (no slider)
- BorderControls sends live CSS styles (border, padding, radius, shadow)
- Preview updates instantly as user adjusts sliders or clicks presets

* fix: repair i18n file corrupted by formatter during merge conflict resolution

* feat(border): enable live CSS preview in right pane as settings change

* fix(border): keep CSS preview visible after processing for WYSIWYG consistency

* chore(gif-tools): scaffold for SOTA upgrade

- Add animated GIF test fixture (3 frames, 100x100)
- Update tool description to reflect new capabilities
- Add fflate dependency to API for ZIP creation

* feat(gif-tools): rewrite backend with 6 processing modes

Modes: resize (with percentage), optimize (colors/dither/effort),
speed (delay manipulation), reverse (frame reorder), extract
(single/range/all with ZIP), rotate (90/180/270 + flip).

Adds /api/v1/tools/gif-tools/info metadata endpoint.

* test(gif-tools): add integration tests for all 6 modes

Tests metadata endpoint, resize (pixel + percentage), optimize,
speed, reverse, extract (single/range/all), and rotate (angle + flip).

Fix animated.gif fixture to be a real 3-frame animation (was a single
100x300 frame). Fix reverse and rotate modes to process frames
individually and reassemble via GIF binary concatenation, since
Sharp 0.33.x loses page-height metadata when reconstructing from raw
pixel data.

* feat(gif-tools): rewrite frontend with tabbed 6-mode UI

- useGifInfo hook for metadata (frame count, dimensions, duration)
- Info bar showing GIF properties
- 3x2 mode grid: Resize, Optimize, Speed, Reverse, Extract, Rotate
- Animation modes disabled for static images
- Loop control (infinite/once/custom)
- Batch processing support

* test(gif-tools): add to representative tools in e2e suite

---------

Co-authored-by: Siddharth Kumar Sah <siddharth123sk@gmail.com>
2026-04-13 16:23:07 +08:00
stirling-imageandGitHub 4e99150a08 Merge pull request #51 from stirling-image/feat/svg-to-raster-redesign
feat(svg-to-raster): redesign with scale presets, DPI, 7 formats, batch support
2026-04-13 14:21:10 +08:00
Siddharth Kumar Sah 570de25a2f chore: resolve merge conflicts with main (keep convertSvg helper) 2026-04-13 14:20:46 +08:00
Siddharth Kumar Sah a51da2070e fix(svg-to-raster): validate input is SVG before processing
Reject non-SVG files with a clear error message instead of letting Sharp
fail with cryptic HEIF/corrupt header errors. Applies to both single-file
and batch endpoints.
2026-04-13 13:47:34 +08:00
stirling-imageandGitHub c357765d45 Merge pull request #50 from stirling-image/feat/pdf-to-image-v2
feat(pdf-to-image): redesign with thumbnails, page selection, color mode
2026-04-13 13:43:40 +08:00
Siddharth Kumar Sah d9704fda82 feat(pdf-to-image): redesign with thumbnails, page selection, color mode, and expanded formats
- Add preview endpoint for page thumbnails with clickable selection
- Add 8 output formats (PNG, JPEG, WebP, AVIF, TIFF, GIF, HEIC, HEIF)
- Add quality slider for lossy formats, color mode (Color/Grayscale/B&W)
- Add custom DPI input (36-1200) alongside preset buttons
- Replace reply.hijack() ZIP streaming with JSON response + server-side ZIP
- Add dedicated Zustand store with bidirectional page range sync
- Add ResultsPanel with per-page download, format/size badges
- Update integration tests (16 cases) and e2e tests (3 cases)
2026-04-13 13:43:07 +08:00
df372ee1ca feat(svg-to-raster): extend settings schema with DPI, quality, and 4 new output formats (#49)
Add user-configurable DPI (36-1200) and quality (1-100) instead of
hardcoded values. Support avif, tiff, gif, heif output in addition to
png, jpg, webp. Width is now optional, defaulting to SVG intrinsic size
at the given DPI. Generate browser-previewable webp thumbnails for
non-browser formats (tiff, heif). Remove unused _contentType variable.

Co-authored-by: Siddharth Kumar Sah <siddharth123sk@gmail.com>
2026-04-13 13:06:34 +08:00
Siddharth Kumar Sah c6e1c4a6f7 docs(svg-to-raster): update OpenAPI spec for new settings and batch endpoint 2026-04-13 12:52:58 +08:00
Siddharth Kumar Sah 4618f9b866 docs(svg-to-raster): update tool description for new format and DPI support 2026-04-13 12:52:33 +08:00
Siddharth Kumar Sah 8b974e0ab6 test(svg-to-raster): extend integration tests for all formats, quality, DPI, preview
Expand the svg-to-raster dedicated endpoint test suite from 3 to 10 tests:
- All 7 output formats (png, jpg, webp, avif, tiff, gif, heif)
- Quality setting verification (low vs high quality jpg file sizes)
- DPI setting verification (72 vs 300 dpi png file sizes)
- Preview URL generation for non-browser formats (tiff)

HEIF test skips gracefully if heif-enc is not installed (422 response).
2026-04-13 12:51:56 +08:00
Siddharth Kumar Sah 43c41755cc feat(svg-to-raster): rewrite settings UI with modern controls and batch support
Switch from manual fetch to useToolProcessor hook for consistency and
batch support. Add scale/custom sizing modes, DPI presets, 7-format
button grid, quality slider, transparent/color background toggle with
preset swatches, and ProgressCard during processing.
2026-04-13 12:47:28 +08:00
Siddharth Kumar Sah 07f95e988f fix(svg-to-raster): add progress tracking, clientJobId, sanitizeFilename to batch
- Add clientJobId field support for SSE progress correlation
- Add updateJobProgress calls matching generic batch route pattern
- Use sanitizeFilename() instead of basename() for security
- Map Zod errors to {path, message} format for consistency
- Include errors array in all-failed response body
2026-04-13 12:44:26 +08:00
Siddharth Kumar Sah 2f0f0930c4 feat(svg-to-raster): add batch processing endpoint with SVG-specific sanitization
The generic batch route validates image buffers by magic bytes, which
fails for SVG input. This adds a dedicated /batch endpoint that sanitizes
each SVG individually before conversion, using p-queue for concurrency
and streaming the results as a ZIP with X-File-Results header.

Also extracts shared conversion logic into a reusable convertSvg helper
to avoid duplication between single-file and batch endpoints.
2026-04-13 12:40:23 +08:00
Siddharth Kumar Sah 3713cf91fe fix(svg-to-raster): use encodeHeic for HEIF output, fix preview decoding
Sharp cannot encode HEVC directly. Use encodeHeic() (same as convert tool)
to go through heif-enc. Also decode HEIF before Sharp for preview generation.
Hoist NON_PREVIEWABLE set to module scope.
2026-04-13 12:38:10 +08:00
Siddharth Kumar Sah 078b344660 feat(svg-to-raster): extend settings schema with DPI, quality, and 4 new output formats
Add user-configurable DPI (36-1200) and quality (1-100) instead of
hardcoded values. Support avif, tiff, gif, heif output in addition to
png, jpg, webp. Width is now optional, defaulting to SVG intrinsic size
at the given DPI. Generate browser-previewable webp thumbnails for
non-browser formats (tiff, heif). Remove unused _contentType variable.
2026-04-13 12:35:41 +08:00
Siddharth Kumar Sah 018fd943d8 fix(qr-generate): align default size to slider step boundary (1000px) 2026-04-13 10:07:27 +08:00
Siddharth Kumar Sah 73139e4313 feat(qr-generate): add ResultsPanel to ToolRegistryEntry interface 2026-04-13 10:00:33 +08:00
Siddharth Kumar Sah 4a3883e5dd feat(qr-generate): register preview panel, update descriptions, update e2e test 2026-04-13 09:59:12 +08:00
Siddharth Kumar Sah 0091a5660a feat(qr-generate): rewrite settings with content types, style pickers, colors, logo 2026-04-13 09:57:32 +08:00
Siddharth Kumar Sah 67ab5e0cab feat(qr-generate): add live QR preview panel with qr-code-styling 2026-04-13 09:55:51 +08:00
Siddharth Kumar Sah 267e2bce6b feat(tool-page): render ResultsPanel for no-dropzone tools when available 2026-04-13 02:51:49 +08:00
Siddharth Kumar Sah 02178df8d3 feat(qr-generate): add Zustand store for QR generator state 2026-04-13 02:51:25 +08:00
Siddharth Kumar Sah 15cf7e2f27 feat(qr-generate): add qr-code-styling library for styled QR generation 2026-04-13 02:50:36 +08:00
Siddharth Kumar Sah d6d65b6b61 fix(test): correct edit-metadata assertion from toBeUndefined to toBeNull
The inspectMetadata function returns null (not undefined) when no EXIF
data is present. Fix the test assertion to match.
2026-04-13 01:13:30 +08:00
Siddharth Kumar Sah 498cf4ab3c fix(ci): install exiftool in test job for edit-metadata tests
The edit-metadata integration tests require exiftool (libimage-exiftool-perl)
which was missing from the CI test runner, causing 4 tests to fail with 422.
2026-04-13 01:02:28 +08:00
Siddharth Kumar Sah 0a506efe24 feat(erase-object): overhaul object eraser with LaMa inpainting improvements
Update erase-object pipeline, eraser canvas, and inpainting Python script.
Add LaMa model download script and update Dockerfile for model support.
Update multi-file tool routes for consistency.
2026-04-13 00:48:05 +08:00
Siddharth Kumar Sah 92d4d2d9c6 feat(smart-crop): overhaul with face detection, social presets, and 3 modes
Replace the confusing 2-mode smart crop with a clear 3-mode system:
- Subject Focus: Sharp attention/entropy saliency crop with social media presets
- Face Focus: MediaPipe face detection with headshot framing presets
- Auto Trim: Border removal with optional pad-to-square

Adds detectFaces() to AI package, face preset constants, backward
compatibility for old mode names, and comprehensive integration tests.
2026-04-13 00:47:53 +08:00
Siddharth Kumar Sah 29fafd0722 fix(ocr): fix PaddleOCR crashes, add multi-image and auto-detect language
- Pin PaddlePaddle to 3.0.0 on ARM64 to fix segfault in PIR inference
  engine (3.1+ crashes on aarch64 Debian Bookworm)
- Fix text extraction for PaddleOCR 3.4.x result format (rec_texts)
- Add Node.js-level fallback chain (best -> balanced -> fast) when
  Python subprocess crashes
- Add multi-image OCR: processes all uploaded files sequentially with
  per-file progress and filename headers in combined output
- Convert input images to PNG via Sharp before OCR so HEIC, AVIF, WebP,
  TIFF all work transparently
- Implement real auto-detect language using Tesseract multi-lang script
  detection (analyzes Unicode ranges for Hangul, CJK, Kana, Latin)
- Default enhance to off (hurts clean digital images)
2026-04-12 23:46:39 +08:00
Siddharth Kumar Sah f2e17d2d44 fix(upscale): overhaul UI, fix AI pipeline bugs, add format support
- Replace Auto/AI/Fast buttons with Fast/Balanced/Best (consistent with other tools)
- Rename "Denoise" to "Noise Reduction" with explanatory subtitle
- Change output format from 3 buttons to dropdown with all formats (PNG, JPG, WebP, AVIF, TIFF, GIF, HEIC, HEIF)
- Add HEIC/HEIF input decoding (was missing unlike other tools)
- Add HEIC/HEIF/AVIF output conversion via Sharp and heif-enc
- Generate browser-compatible WebP preview for non-previewable output formats
- Fix torchvision compatibility shim so Real-ESRGAN actually loads (was silently falling back to Lanczos)
- Fix denoise crash: Image.fromarray() instead of type(img).fromarray()
- Redirect stdout for entire AI pipeline to prevent library messages corrupting JSON output
- Add GFPGAN model download for face enhancement
- Use batch endpoint for multi-file uploads (enables Download All ZIP)
2026-04-12 21:22:55 +08:00
stirling-imageandGitHub ed5f71e2fc Merge pull request #48 from stirling-image/fix/upscale-bugs-and-features
feat: overhaul upscale with bug fixes and advanced features
2026-04-12 19:09:22 +08:00
stirling-imageandGitHub d179021203 Merge pull request #47 from stirling-image/feat/ocr-overhaul
feat: OCR overhaul with three quality tiers and preprocessing
2026-04-12 19:07:29 +08:00
Siddharth Kumar Sah fe376aebd2 feat: overhaul upscale with bug fixes and advanced features
- Fix multi-image: process selected file, not always first
- Fix progress bar: asymptotic fill prevents visual stalling
- Fix slider: write results to captured index, not current selection
- Add model selection (Auto/AI/Fast), face enhancement, denoise
- Add output format (PNG/JPEG/WebP) with quality control
- Add Upscale All for sequential batch processing with queue
- More granular Python progress stages for smoother UX
2026-04-12 19:04:23 +08:00
Siddharth Kumar Sah e5bf3ccfc1 fix(ocr): address code review issues
- Fix temp file leak: clean up preprocessed image in finally block
- Log warning instead of silently swallowing preprocessing failures
- Simplify auto_detect_language to honest default (was a stub that
  wasted time loading a model but always returned "en")
2026-04-12 18:46:03 +08:00
Siddharth Kumar Sah fa3451631c test(ocr): add integration tests for quality tiers and backward compat 2026-04-12 18:42:08 +08:00
Siddharth Kumar Sah 958691b53d test(ocr): add E2E tests for OCR overhaul 2026-04-12 18:40:10 +08:00
Siddharth Kumar Sah df94d7674d feat(ocr): update i18n description 2026-04-12 18:39:12 +08:00
Siddharth Kumar Sah 28ee147cc7 feat(ocr): upgrade PaddleOCR to v3.x with PP-OCRv5 and VL model in Docker 2026-04-12 18:38:40 +08:00
Siddharth Kumar Sah 2d9ec4e258 feat(ocr): rewrite UI with quality tiers, enhance toggle, editable results, download 2026-04-12 18:37:09 +08:00
Siddharth Kumar Sah 864145f4b1 feat(ocr): update API route with quality tiers and backward compat 2026-04-12 18:34:50 +08:00
Siddharth Kumar Sah 4235875f78 feat(ocr): update TypeScript bridge for quality tiers 2026-04-12 18:34:47 +08:00
Siddharth Kumar Sah 49b9bcecfe feat(ocr): add PP-OCRv5 and PaddleOCR-VL quality tiers with preprocessing 2026-04-12 18:32:17 +08:00
Siddharth Kumar Sah 21c871d501 feat(ocr): add OpenCV preprocessing pipeline for OCR 2026-04-12 18:30:00 +08:00
Siddharth Kumar Sah 3345cb266a feat: add Ultra quality mode with BiRefNet-matting, rename quality tiers
Ultra quality (People only):
- BiRefNet-matting ONNX (928MB) for true alpha matting with per-pixel
  transparency on hair wisps and fine edges
- Custom rembg session class, zero new Python dependencies
- Model pre-downloaded in Docker build for immediate availability

Quality tier labels: Fast / HD / Max / Ultra (shorter, fits 4-col grid)
2026-04-12 18:23:09 +08:00
Siddharth Kumar Sah 7995d13c81 fix: rename quality tiers to Fast/HD/Max/Ultra, fix linter-broken hook
- Renamed quality labels: Balanced->HD, Best->Max (shorter, fits 4-col grid)
- Fixed use-tool-processor.ts references broken by linter reformatting
2026-04-12 18:20:54 +08:00
Siddharth Kumar Sah 93dd37017c feat: add Ultra quality mode with BiRefNet-matting for people photos
Adds a new "Ultra" quality tier for People subject type that uses
BiRefNet-matting (ONNX, 928MB) for true alpha matting instead of
binary segmentation. Produces per-pixel transparency for hair wisps
and fine edges that standard models miss.

- Custom rembg session class loads BiRefNet-matting ONNX from GitHub releases
- Zero new Python dependencies (reuses existing onnxruntime)
- Model pre-downloaded in Docker build alongside existing models
- Ultra option only visible when subject is People
- Falls back to Best when switching to Products/General
2026-04-12 18:09:59 +08:00
Siddharth Kumar Sah 6c58f12262 feat: overhaul remove-background with effects pipeline, consolidate color tools
Remove Background:
- Two-phase flow: AI removes bg once, then effects adjust instantly
- Blur background effect with real-time CSS preview (portrait mode)
- Drop shadow effect with opacity control
- Gradient backgrounds with presets, custom colors, and angle
- Custom background image upload (including HEIC/HEIF)
- Solid color backgrounds moved from Python to Node.js/Sharp
- Effects-only API endpoint for instant re-renders without AI re-run
- HEIC/HEIF input support (decoded before passing to Python/rembg)
- Passport/ID photo checkbox defaults ON for People subject
- Before/after slider preserved when no effects active
- 15 comprehensive Playwright e2e tests

Color Tools:
- Consolidated 4 tools (brightness-contrast, saturation, color-channels,
  color-effects) into single "Adjust Colors" tool
- Added exposure, temperature, tint, hue, sharpness controls
- SVG filter-based live preview for all adjustments
- Backward-compatible URL redirects from old tool paths

Other fixes:
- Favicon tool: download button instead of auto-download
- Batch processing: HEIC filename extension fix
- File store: processedFilename field for proper batch downloads
2026-04-12 17:53:16 +08:00
Siddharth Kumar Sah dde70f70ad feat: comprehensive HEIC/HEIF support and edit-metadata ExifTool overhaul
- Add ensureSharpCompat() helper for automatic HEIC detection and decode
- Fix HEIC support in all 14 custom-route tools (image-to-pdf, split,
  barcode-read, compose, collage, stitch, compare, find-duplicates,
  color-palette, watermark-image, vectorize, favicon, info, branding)
- Fix PdfPagePreview using store's decoded blobUrl instead of raw File
- Add onError fallback in ImageViewer for unrenderable formats
- Fix image-to-pdf progress bar with flushSync for reliable rendering
- Add ExifTool backend for edit-metadata (GPS, keywords, IPTC, dates)
- Rename Strip Metadata to Remove Metadata with interactive Leaflet map
- Fix user-files thumbnail generation for stored HEIC files
- Fix info tool stats() histogram for HEIC via decoded buffer
- Skip HEIC preprocessing in batch route for metadata tools
2026-04-12 08:50:19 +08:00
Siddharth Kumar Sah 6f5283019b feat: full HEIF/HEIC support, content-aware resize performance fix, UI improvements
- Add bidirectional HEIF support: decode (input) and encode (output) via system heif-convert/heif-enc
- Add server-side WebP preview generation for non-browser-previewable formats (HEIC, TIFF)
- Fix content-aware resize failing on HEIF input (decode before passing to caire)
- Fix content-aware resize timeout on large images by downscaling to max 1200px and using JPEG intermediate
- Add HEIF as target format in convert tool
- Add loading spinner for HEIF preview decode in file store
- Fix file picker not accepting HEIF files (explicit .heic,.heif,.hif extensions)
- Extend frontend timeout for medium tools to 180s with 45s progress animation
- Redesign rotate controls with preset buttons and compact flip section
- Remove misleading savings percentage from convert tool
2026-04-11 23:27:44 +08:00
stirling-imageandGitHub e0869477d4 Merge pull request #42 from stirling-image/feat/caire-content-aware-resize
feat: replace Python seam carving with caire Go binary
2026-04-11 17:50:35 +08:00
Siddharth Kumar Sah 1707521f3a feat: replace Python seam carving with caire Go binary
Replace the Python seam-carving library with caire (esimov/caire v1.5.0),
a Go-based content-aware resize engine that is faster and supports both
shrinking and enlarging via seam insertion.

- Add Go builder stage in Dockerfile to compile caire from source
- Rewrite seam-carving.ts to call caire via execFile (no Python sidecar)
- Remove content-aware-resize from PYTHON_SIDECAR_TOOLS (60s timeout)
- Add new options: blur radius, edge sensitivity, square mode, face detection
- Move content-aware toggle below standard resize in UI (subtler placement)
- Rename "Don't enlarge" to "Limit to original size" with hover tooltip
- Add smooth progress bar for medium-duration tools
- Delete seam_carve.py and remove seam-carving pip dependency
- Update integration tests and visual regression screenshots
2026-04-11 17:49:28 +08:00