SnapOtter
da692e68b3
fix: wire up URL import to home page dropzone and prevent click-through
...
Pass onUrlImport handler through AppLayout to Dropzone so URL-imported
files are loaded on the home page. Add stopPropagation on the modal
overlay to prevent clicks from reaching elements underneath.
2026-05-11 23:35:26 +08:00
SnapOtter
23f24c10d1
chore: gitignore Remotion project dir and add test fixture photo
2026-05-08 21:49:22 +08:00
SnapOtter
44608733c6
feat: add PPM/PGM/PBM CLI decoder fallback, QOI fixture and format-matrix entry
...
- Add ppm/pgm/pbm to CLI_DECODED_FORMATS with Sharp-first, ImageMagick fallback
- Create sample.qoi test fixture (10x10 solid color)
- Add QOI to format-matrix test FORMAT_SAMPLES
- Mark PPM/PGM/PBM as needsCliDecoder in tests (Sharp doesn't support them natively)
2026-05-08 15:12:23 +08:00
SnapOtter
bd6f80ff3e
test: add format fixtures for SVGZ, JP2, EPS, PPM, PGM, PBM, DDS, CUR, DPX, FITS, APNG
2026-05-08 00:22:22 +08:00
SnapOtter
83fa0a39dc
test: add fake transparency PNG fixture for transparency-fixer tool
2026-05-05 21:50:43 +08:00
SnapOtter
a85f4db97c
test: add portrait fixture images and extreme-height regression test
...
Add test-portrait-tall.png (200x4000) and test-portrait-extreme.png
(100x6000) fixtures. Update crop overflow tests to use fixture files
instead of generating images at runtime, and add a second test case
for extremely tall images.
2026-05-05 20:53:02 +08:00
SnapOtter
e3259d163a
fix: PaddleOCR CPU crash, content-aware-resize limits, barcode fixtures
...
- Add enable_mkldnn=False to PaddleOCR constructor to bypass PaddlePaddle
3.3+ OneDNN/PIR crash on CPU-only systems
- Add 25MP and 75% max-reduction guard to seam carving with clear error
messages instead of silent timeout/crash
- Replace barcode/QR AVIF test fixtures with actual scannable codes
(old fixtures did not contain real barcodes)
2026-04-24 23:58:06 +08:00
SnapOtter
00f0af4c79
fix: update EXIF fixture and deploy workflows
...
- Fix test-with-exif.jpg Software field from "ashim Test" to
"SnapOtter Test" to match test expectations
- Replace cloudflare/wrangler-action with npx wrangler to avoid
pnpm workspace root install error
2026-04-24 18:08:42 +08:00
ashim-hq
babca4cf97
test: comprehensive test coverage expansion (+965 tests)
...
Add 42 new test files covering all untested tool routes, image engine
internals, AI sidecar bridge, Zustand stores, and cross-format
compatibility. Expand e2e-docker suite with 7 spec files covering all
48 tools against a real Docker container.
Unit tests:
- Image engine: format detection, MIME mapping, metadata parsing, pipeline
- AI bridge: sidecar lifecycle, all 11 tool functions (mocked)
- Web stores: 14 Zustand stores (collage, settings, features, analytics, etc.)
- API helpers: format decoders, page range, file validation
Integration tests:
- 25 tool routes that had zero dedicated tests
- Cross-format matrix: 17 input formats x 3 tools
- Edge cases: zero-byte files, corrupted headers, path traversal, XSS, SQL injection
- Concurrent request handling and pipeline edge cases
E2E-Docker (Playwright against real container):
- 7 spec files: essential, adjustment, conversion, creative, utility, AI, pipeline
- Custom buildMultipart helper for multi-file tool uploads
- AI tools gracefully skip when sidecar not installed
Fixtures:
- Organized test media: formats/ (18 formats) + content/ (17 content types)
- Reduced from 3.1 GB unorganized samples to 33 MB structured fixtures
Bug fix:
- color-adjustments: gamma exposure used invalid single-param gamma() for
positive values; fixed to use two-param gamma(gammaIn, gammaOut) form
2026-04-23 17:12:02 +08:00
Siddharth Kumar Sah
86ae18b153
fix(tests): update EXIF fixture Software tag to ashim after rename
...
The test-with-exif.jpg fixture still had "Stirling-Image Test" as its
Software EXIF field. Updated to "ashim Test" to match the assertions in
operations.test.ts that were already updated during the rebrand.
2026-04-14 22:23:46 +08:00
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
Siddharth Kumar Sah
958691b53d
test(ocr): add E2E tests for OCR overhaul
2026-04-12 18:40:10 +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
ec2010fa7b
test: add JPEG fixture with known EXIF data for edit-metadata tests
2026-04-06 19:08:18 +08:00
Siddharth Kumar Sah
acde7af08a
docs: collapse lite/cuda variants in README quick start
...
Keep the main docker run command front and center. Lite and CUDA
variants are in a collapsible details block so the quick start
section stays scannable.
2026-04-05 23:46:27 +08:00
Siddharth Kumar Sah
6717c17a26
feat: add HEIC/HEIF format support for input and output
...
Add bidirectional HEIC support using system libheif CLI tools (heif-enc/heif-dec)
for HEVC encoding/decoding, since Sharp's bundled libheif only supports AV1.
- HEIC input: all tools now accept iPhone HEIC photos via heif-dec pre-processing
- HEIC output: convert tool produces true HEIC (HEVC) via heif-enc
- Docker: adds libheif-examples package for heif-enc/heif-dec CLI tools
- Tests: full conversion matrix (7x7), unit tests, and Playwright e2e tests
- Docs: updated OpenAPI spec, image-engine docs, getting-started, llms-full.txt
2026-04-04 21:33:48 +08:00
Siddharth Kumar Sah
4fa8dd0780
fix: allow SVG files in the convert tool
...
SVG files were rejected by the convert endpoint because
validateImageBuffer only recognized raster magic bytes. This adds
text-based SVG detection, sanitization in the tool factory, and
proper Sharp density handling so SVG-to-raster conversion works
through the standard convert route.
2026-03-30 11:37:09 +08:00
Siddharth Kumar Sah
8474b0ee52
fix(test): add missing PNG fixture files to repo
...
test-200x150.png and test-1x1.png were present locally but never
committed, causing CI failures on clean checkouts. Also added a
gitignore exception for tests/fixtures/*.png.
2026-03-26 01:32:48 +08:00
Siddharth Kumar Sah
80e536bcf8
chore: remove dead code, add test infrastructure, update docs
...
- Delete 3 dead files: use-batch-processor.ts, use-i18n.ts, smart-crop.ts (AI package)
- Remove dead getJobProgress function and unused runPythonScript wrapper
- Remove 6 unused imports across API and web apps
- Remove unused shared types (ImageFormat, AppConfig, ApiError, HealthResponse, JobProgress)
and constants (SUPPORTED_INPUT_FORMATS/OUTPUT_FORMATS, DEFAULT_OUTPUT_FORMAT)
- Remove unused store method (setOriginalBlobUrl) and clean AI package re-exports
- Add test infrastructure: vitest config, unit/integration/e2e tests, fixtures, screenshots
- Add Docker test infrastructure: Dockerfile.test, docker-compose.test.yml
- Add download_models.py for pre-baking AI model weights in Docker
- Add filename sanitization utility (apps/api/src/lib/filename.ts)
- Update .gitignore to exclude coverage/, *.tsbuildinfo, .superpowers/, test artifacts
- Update .dockerignore to exclude test/coverage/IDE artifacts from builds
- Update docs: remove smart crop from AI docs (uses Sharp directly), update bridge docs
2026-03-23 11:46:45 +08:00