Commit Graph
100 Commits
Author SHA1 Message Date
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 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
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
Siddharth Kumar Sah b8227c45b9 feat(crop): improve UI and fix batch crop for multi-file
- Replace Rule of Thirds button with checkbox for clearer toggle
- Show side-by-side comparison after crop instead of overlay slider
- Add custom aspect ratio option with W:H number inputs
- Fix batch crop failing on files with different dimensions by
  sending percentage-based coordinates instead of absolute pixels
- Add failed-file error state display in tool page
2026-04-11 14:47:46 +08:00
Siddharth Kumar Sah 6c1a347f1c feat: add LOG_LEVEL env var and improve error messages
Add configurable LOG_LEVEL (fatal/error/warn/info/debug/trace) for
Fastify logger. Always return error details in tool processing
responses and combine error + details in frontend display.
2026-04-11 14:47:30 +08:00
Siddharth Kumar Sah f2696443dc Merge branch 'main' of https://github.com/stirling-image/stirling-image 2026-04-10 23:02:47 +08:00
Siddharth Kumar Sah bbae319333 Merge branch 'refactor/remove-lite-variant' 2026-04-10 22:36:39 +08:00
Siddharth Kumar Sah 9ae15e43d2 Merge branch 'main' of https://github.com/stirling-image/stirling-image 2026-04-10 22:13:02 +08:00
Siddharth Kumar Sah e1dec040f4 Merge branch 'feat/unified-docker-image' 2026-04-10 21:58:23 +08:00
Siddharth Kumar Sah cc8a27239b fix: complete RBAC implementation lost during merge
Several RBAC features from feat/rbac-permissions were silently lost
during the merge into main. This restores and completes them:

- Add permissions and teamName to login/session API responses
- Export Permission and Role types from shared package
- Filter settings tabs by user permissions in frontend
- Extend useAuth hook with role, permissions, and hasPermission
- Restrict teams listing to admin only
- Add admin override for API keys, files, and pipelines listing
- Add ownership scoping to file access, download, and delete routes
- Register userFileRoutes in integration test server
- Mock auth import in unit permissions test to avoid SQLite lock
2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 6c6fb113fa test: add e2e tests for role-based settings tab visibility and API access 2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah bcbd24a239 feat: filter settings tabs by user permissions, remove admin fallback 2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah e0ba8be7b3 feat: extend useAuth hook with role and permissions from session 2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 59f40dbfd4 feat: add permission checks and admin override to pipeline routes
Replace requireAuth with requirePermission("pipelines:own") on pipeline
save/list/delete routes. Admin users with pipelines:all can see and
delete all pipelines. Unauthorized delete returns 404 to avoid leaking
resource existence.
2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 86ba69825a feat: add permission checks and ownership scoping to user-files routes
Replace getAuthUser (optional auth) with requirePermission("files:own") on all
user-files routes, enforcing mandatory authentication and ownership checks.
Admin users with files:all permission bypass ownership restrictions. Returns 404
(not 403) for ownership failures to avoid leaking resource existence.
2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah d776680f2d feat: add permission checks and admin override to API key routes
Replace requireAuth with requirePermission(apikeys:own). Admin users
with apikeys:all can see and delete any user's keys.
2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah af7f57d52f feat: replace requireAdmin with requirePermission on all routes
Migrate settings, teams, branding, and user management routes to use
the new permission-based authorization system. Remove requireAdmin
function entirely.
2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 885ace54f0 feat: add tools:use permission check to tool, batch, pipeline, and upload routes 2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 49431772ec feat: include permissions and teamName in login/session responses 2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 1a99571153 feat: add backend permission map and requirePermission middleware
Create the RBAC permission module that maps roles to permissions and
provides a requirePermission middleware to replace requireAdmin. Update
the test server to use requirePermission for the admin health check.
2026-04-10 21:25:30 +08:00
Siddharth Kumar Sah 2f594e9605 feat: add shared Permission and Role types 2026-04-10 21:25:29 +08:00
Siddharth Kumar Sah 1778f7266b fix(a11y): add keyboard support to pdf-to-image upload dropzone 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah b2a2c890a1 fix: use specific selector in pdf-to-image e2e test
The getByText("3 pages") matched multiple elements including the
convert button. Scope the selector to the file info area.
2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah cab6772dab test: add e2e test for pdf-to-image tool 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 5fd294c994 feat: register pdf-to-image in frontend tool registry 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 48cf919fb7 test: add integration tests for pdf-to-image endpoints 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 44bbfba80d feat: add pdf-to-image frontend settings component 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 30155c1c70 feat: add pdf-to-image backend route with info and processing endpoints 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 6b03cdb6d8 test: add unit tests for pdf-to-image page range parser 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 43324c1f23 feat: register pdf-to-image tool in shared constants and i18n 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah d650f301ca chore: add mupdf dependency for PDF-to-image tool 2026-04-10 20:56:13 +08:00
Siddharth Kumar Sah 958b10cb45 refactor: remove lite variant, fix release workflow
- Remove all lite/full variant logic from frontend, API, shared constants,
  docs, and tests (single unified Docker image only)
- Replace single QEMU multi-arch Docker build with per-architecture native
  builds (amd64 + arm64) and manifest merge to fix disk space exhaustion
- Add disk cleanup step and per-platform build cache scopes
- Switch release trigger from push to workflow_dispatch
- Add GitHub issue templates and PR template
2026-04-10 17:38:54 +08:00
Siddharth Kumar Sah 3481663960 fix: simplify smoke test to CPU-only imports for build-time compat
GPU-dependent libraries (paddlepaddle-gpu, torch CUDA, realesrgan)
cannot be imported at Docker build time because the CUDA driver is
only available at runtime. Smoke test now verifies CPU-only imports
(rembg, cv2, numpy, mediapipe, seam_carving) and checks that model
files exist on disk. GPU imports are verified at runtime.
2026-04-10 12:35:11 +08:00
Siddharth Kumar Sah 0083a741a9 fix: handle paddlepaddle-gpu CUDA import at build time gracefully
paddlepaddle-gpu requires libcuda.so.1 at import time, but no CUDA
driver exists during Docker build. The download script now catches
this ImportError and skips PaddleOCR model pre-download on amd64.
Models will download on first use at runtime when the CUDA driver
is available via nvidia-container-toolkit.

On arm64 (CPU paddlepaddle), models are still pre-downloaded at build
time as before.

Also reverted CI to amd64-only Docker build test for speed. Multi-arch
build is tested on release via the release workflow.
2026-04-10 12:22:11 +08:00
Siddharth Kumar Sah d31d66556e fix: install cuda-compat stubs for build-time PaddlePaddle import
paddlepaddle-gpu needs libcuda.so.1 at import time, but the real NVIDIA
driver is only injected at runtime by the container toolkit. Install
cuda-compat-12-6 which provides forward-compat stubs that satisfy the
dlopen without a real GPU. Also force CPU mode via env vars in the
download script.
2026-04-10 11:35:50 +08:00
Siddharth Kumar Sah b4b59a7500 fix: force CPU mode in download_models.py for build-time compatibility
paddlepaddle-gpu tries to load libcuda.so.1 on import, but no GPU
driver exists during Docker build. Set PADDLE_DEVICE=cpu, FLAGS_use_cuda=0,
and CUDA_VISIBLE_DEVICES="" before any ML imports to force CPU mode.
2026-04-10 11:22:56 +08:00
Siddharth Kumar Sah 74183e8dc1 fix: split paddlepaddle-gpu and paddleocr installs, use --extra-index-url
-i replaces the entire package index so paddleocr couldn't be found.
Use --extra-index-url to add PaddlePaddle's index alongside PyPI, and
install paddleocr separately so it resolves from PyPI.
2026-04-10 11:01:58 +08:00
Siddharth Kumar Sah dd9528f53c fix: use PaddlePaddle GPU package index for CUDA wheels
paddlepaddle-gpu==3.0.0 is not on PyPI, it is hosted on PaddlePaddle's
own package index. Added -i flag pointing to the cu126 stable index
for the amd64 GPU build.
2026-04-10 10:44:47 +08:00
Siddharth Kumar Sah caf65bc469 fix: address code review findings before merge
- Warn on startup if deprecated STIRLING_VARIANT env var is set
- Broaden upscale.py exception handling to catch RuntimeError/OSError
  for Lanczos fallback (not just ImportError)
- Add QEMU + multi-arch (amd64+arm64) to CI Docker build test
- Use .get() instead of .all() for single-row health check query
- Restore container_name in docker-compose.yml for backwards compat
2026-04-10 10:35:13 +08:00
Siddharth Kumar Sah c0b419de21 fix: suppress ML library stdout noise in ocr.py and upscale.py
PaddleOCR prints download/init messages to stdout which corrupts the
JSON result that the bridge expects. Same risk with basicsr/realesrgan.
Applied the same fd-level stdout redirect pattern already used in
remove_bg.py: redirect fd 1 to stderr during ML work, restore for
the JSON result. Also added show_log=False to PaddleOCR constructor.
2026-04-10 01:22:53 +08:00
Siddharth Kumar Sah e55253dee0 fix: revert to npx tsx in CMD for pnpm compatibility
node --import tsx requires tsx to be directly in node_modules/, but
pnpm hoists it differently. npx tsx works because it resolves through
pnpm's bin links. tini as PID 1 handles signal forwarding regardless.
2026-04-10 00:54:03 +08:00
Siddharth Kumar Sah 1e2ef52846 fix: skip RealESRGAN import check on arm64 in smoke test
basicsr has a known torchvision.transforms.functional_tensor compat
issue on arm64 with newer torchvision. On arm64, upscale.py falls back
to Lanczos via ImportError anyway. Smoke test still verifies the model
weights file exists on all platforms.
2026-04-10 00:46:57 +08:00
Siddharth Kumar Sah e1ee57103c fix: correct PaddleOCR language codes for model download and OCR
PaddleOCR uses its own language codes (ch, japan, korean, latin) not
ISO codes (zh, ja, ko, de, fr, es). The download script and ocr.py
now map API language codes to PaddleOCR codes correctly. German,
French, and Spanish all use the "latin" script model.
2026-04-10 00:40:45 +08:00
Siddharth Kumar Sah 7face19238 fix: use platform-specific mediapipe version for arm64 compatibility
mediapipe==0.10.21 only has amd64 wheels. arm64 maxes out at 0.10.18.
Split into platform-conditional install to fix build failure on arm64.
2026-04-10 00:33:34 +08:00
Siddharth Kumar Sah ff37bb769a docs: update for unified Docker image
Rewrite docker-tags.md for single image with GPU auto-detection.
Update deployment.md to remove variant table and lite/cuda references.
Replace LaMa Cleaner references with OpenCV in architecture and AI docs.
Add migration notes for users on :lite and :cuda tags.
2026-04-10 00:25:28 +08:00
Siddharth Kumar Sah b385a2eabb feat: simplify CI to single unified Docker build
Remove 3-variant matrix (full/lite/cuda). Single build produces
a multi-arch manifest (amd64 + arm64) pushed to Docker Hub and GHCR.
Tags: latest, X.Y.Z, X.Y, X. CI builds native platform only (amd64)
for speed. Multi-arch only on release.
2026-04-10 00:24:43 +08:00
Siddharth Kumar Sah 986ad37bb5 fix: add shutdown timeout and improve health endpoint
- Add 8s shutdown timeout to prevent indefinite hang when app.close()
  stalls. Stays under Docker's default 10s stop_grace_period.
- Health endpoint now checks database connectivity, returns 503 when
  DB is unreachable so Docker marks container unhealthy.
- Removed variant field from health response (single image now).
2026-04-10 00:22:57 +08:00
Siddharth Kumar Sah 84f7057a49 feat: simplify compose to single file, add log rotation
GPU is activated at runtime via --gpus all, not a separate compose file.
Added log rotation (10MB x 3 files) to prevent disk fill on long-running
instances. Removed docker-compose.gpu.yml.
2026-04-10 00:22:49 +08:00
Siddharth Kumar Sah 6c3eb3b876 feat: unified Docker image with GPU auto-detection
- Remove VARIANT/GPU build args, single image for all platforms
- amd64: nvidia/cuda base with GPU Python packages
- arm64: node base with CPU Python packages
- Add tini as PID 1 for proper signal handling
- Replace npx tsx with node --import tsx
- Split pip install into base + tool layers for better caching
- Add NVIDIA_VISIBLE_DEVICES env vars for container toolkit
- Suppress Python ML library log noise
- Increase healthcheck start-period to 60s
- Remove STIRLING_VARIANT env var
- Remove lama-cleaner from pip installs
2026-04-10 00:21:41 +08:00
Siddharth Kumar Sah a9e3b96887 feat: expand model pre-download with verification and smoke test
Downloads all rembg models (6), RealESRGAN_x4plus.pth weights,
PaddleOCR models for all 7 supported languages, verifies MediaPipe
bundles its face detection models. Runs a final smoke test importing
every ML library. Any failure exits non-zero, failing the Docker build.
2026-04-10 00:19:42 +08:00
Siddharth Kumar Sah 592a9cbf08 chore: remove unused lama-cleaner, add seam-carving to GPU requirements
lama-cleaner is pip-installed but never imported in any Python script.
inpaint.py uses OpenCV TELEA. Removing saves ~100+ MB of image size.
Also added seam-carving to requirements-gpu.txt where it was missing.
2026-04-10 00:18:14 +08:00
Siddharth Kumar Sah fa9569c920 fix: load RealESRGAN pretrained weights for actual AI upscaling
model_path was None, so the model had random weights and always fell back
to Lanczos. Now loads RealESRGAN_x4plus.pth from /opt/models/realesrgan/
(configurable via REALESRGAN_MODEL_PATH env var). Only falls back to
Lanczos on ImportError, not blanket Exception.
2026-04-10 00:18:13 +08:00
Siddharth Kumar Sah b575243e9a fix: add FILES_STORAGE_PATH to Dockerfile ENV to prevent data loss
User-uploaded files were stored in /app/data/files (container writable layer)
instead of /data/files (persistent volume) because the env var was not set in
the Dockerfile. Files were lost on container recreation.
2026-04-10 00:17:42 +08:00
Siddharth Kumar Sah 6a362d6443 feat(docs): auto-generate llms.txt via vitepress-plugin-llms
Replace static llms.txt and llms-full.txt with auto-generated versions
that stay in sync with docs on every build. The plugin also generates
per-page .md files for individual page fetching by LLMs.
2026-04-08 00:53:26 +08:00
Siddharth Kumar Sah e8c6a26cb9 chore: add __pycache__ and .pyc to gitignore 2026-04-08 00:19:58 +08:00
Siddharth Kumar Sah 4435559d5f chore: add seam-carving to Docker Python dependencies 2026-04-07 23:37:55 +08:00
Siddharth Kumar Sah fc7d355d08 test: add integration tests for content-aware resize endpoint 2026-04-07 23:36:51 +08:00
Siddharth Kumar Sah aace4caf0c feat: add content-aware resize toggle to resize settings UI 2026-04-07 23:33:34 +08:00
Siddharth Kumar Sah d464942cd9 feat: add content-aware resize API route and registration 2026-04-07 23:29:21 +08:00
Siddharth Kumar Sah d3b646207d feat: add seam carving AI bridge module 2026-04-07 23:26:47 +08:00
Siddharth Kumar Sah 18119166f0 refactor: align seam_carve.py with sidecar script conventions 2026-04-07 23:25:40 +08:00
Siddharth Kumar Sah 1460ab7a4a feat: add seam carving Python script with face protection 2026-04-07 23:21:14 +08:00
Siddharth Kumar Sah 7ec5d86d91 feat: register stitch component in web tool registry 2026-04-07 21:55:49 +08:00
Siddharth Kumar Sah 330bfcf162 feat: add stitch settings UI component 2026-04-07 21:54:55 +08:00
Siddharth Kumar Sah eda151faf3 test: add integration tests for stitch API endpoint 2026-04-07 21:53:42 +08:00
Siddharth Kumar Sah 66520cdd0e feat: register stitch route in API tool registry 2026-04-07 21:52:28 +08:00
Siddharth Kumar Sah 171646886f feat: add stitch API route handler 2026-04-07 21:51:24 +08:00
Siddharth Kumar Sah fbbbe70a35 feat: register stitch tool in shared constants and i18n 2026-04-07 21:49:46 +08:00
Siddharth Kumar Sah 625e16c7b6 chore: remove all docs/superpowers from git tracking
These are local planning artifacts that should not be in the
repository. The directory is already gitignored.
2026-04-07 21:48:20 +08:00
Siddharth Kumar Sah 44dd66283f chore: remove docs/superpowers spec from git tracking 2026-04-07 21:48:20 +08:00
Siddharth Kumar Sah 3c42d6625a docs: add stitch tool design spec
New tool for joining images horizontally or vertically,
distinct from the grid-based collage tool. Preserves aspect
ratios with fit/original resize modes, optional gap, and
multi-format output.
2026-04-07 21:48:20 +08:00
Siddharth Kumar Sah 3be388e12f fix: add variant diagnostics to health endpoint and lite mode banner
Users running lite mode had no way to tell why AI tools were greyed out.
Now the public health endpoint reports the variant, and a visible banner
appears in the tool panel when running in lite mode.
2026-04-07 18:34:00 +08:00
Siddharth Kumar Sah a430e91324 fix: filter unsafe round-trip keys server-side in editMetadata
Prevent silent data corruption when the API is called directly
(bypassing UI guards). Binary/complex EXIF fields like MakerNote
are now filtered from fieldsToRemove in the image-engine operation.
2026-04-06 19:40:15 +08:00
Siddharth Kumar Sah 7962887387 test: add e2e tests for edit-metadata tool 2026-04-06 19:35:25 +08:00
Siddharth Kumar Sah 492eeb0f96 feat: add edit-metadata UI component with granular strip support 2026-04-06 19:34:00 +08:00
Siddharth Kumar Sah d8bb2f1d61 refactor: extract shared metadata UI components from strip-metadata 2026-04-06 19:30:47 +08:00
Siddharth Kumar Sah 5284d5ece5 feat: add edit-metadata API route with inspect and edit endpoints 2026-04-06 19:27:33 +08:00
Siddharth Kumar Sah 1312858cf1 refactor: use shared metadata parsing in strip-metadata route 2026-04-06 19:24:05 +08:00
Siddharth Kumar Sah 6ac366b155 feat: register edit-metadata in shared constants and i18n 2026-04-06 19:23:18 +08:00
Siddharth Kumar Sah 939bb04941 feat: implement editMetadata operation in image-engine 2026-04-06 19:21:15 +08:00
Siddharth Kumar Sah 7fba05e1dc feat: extract shared metadata parsing utilities into image-engine
Move sanitizeValue, parseExif, parseGps, parseXmp into the shared
image-engine package so both strip-metadata and edit-metadata can
reuse them. Includes 13 unit tests covering all four functions.
2026-04-06 19:12:56 +08:00
Siddharth Kumar Sah 723c79491e feat: add EditMetadataOptions type and exif-reader dep to image-engine 2026-04-06 19:09:18 +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 9afea7b985 docs: add implementation plan for edit metadata tool
12-task plan covering: test fixture, image-engine types + parsing + operation,
strip-metadata refactor, API route, shared constants/i18n, shared UI
extraction, edit-metadata component, e2e tests, and Docker verification.
2026-04-06 19:05:13 +08:00
Siddharth Kumar Sah b133a713a7 docs: add design spec for edit metadata tool
Design spec for new edit-metadata tool (issue #15). Covers common EXIF
field editing, GPS clearing, granular per-field stripping, and shared
metadata infrastructure extracted from strip-metadata.
2026-04-06 18:55:25 +08:00
Siddharth Kumar Sah fe80287cb4 docs: replace localhost links with generic path references in API docs
Clickable localhost:1349 links are misleading on the GitHub Pages site
since users may not have Stirling Image running locally. Use plain path
references instead so it is clear these live on their own instance.
2026-04-06 11:33:50 +08:00
Siddharth Kumar Sah b46d2504e1 fix(docs): correct broken llms.txt links on REST API page
The links used /Stirling-Image/ (wrong casing) which VitePress then
prefixed with the base /stirling-image/, producing a double-prefixed
404 path. Remove the manual base so VitePress prepends it automatically.
2026-04-06 11:27:17 +08:00
Siddharth Kumar Sah b3fec73e61 docs: restore code blocks in collapsible variants for copy button 2026-04-06 00:31:36 +08:00
Siddharth Kumar Sah 700575adc8 docs: improve collapsible variants section in README
Use a table for cleaner layout. Add image sizes and CUDA prereq note.
2026-04-06 00:28:54 +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 8d2f401512 fix: use torch.cuda for GPU detection instead of onnxruntime providers
onnxruntime-gpu reports CUDAExecutionProvider as "available" just
because the library was compiled with CUDA support, even on machines
with no GPU. This made gpu_available() return True incorrectly,
causing upscale.py to try torch.device("cuda") and fall back to
Lanczos instead of running Real-ESRGAN on CPU.

torch.cuda.is_available() actually probes the hardware. Use it as
the single source of truth for GPU detection.

Verified: CUDA image on Apple Silicon (no GPU) now correctly reports
gpu: false and all AI tools run on CPU without crashes.
2026-04-05 22:24:16 +08:00
Siddharth Kumar Sah a291d1fe0b fix: prevent false GPU detection when CUDA image runs without GPU
The STIRLING_GPU=true env var was baked into the :cuda Dockerfile,
which made gpu_available() return True without checking actual
hardware. On machines without a GPU, this would crash upscale.py
(torch.device("cuda") fails) and ocr.py (PaddleOCR use_gpu=True).

Fix: the env var can only disable GPU (set to false/0), never
force-enable it. Hardware detection always runs. Removed the
baked env var from the Dockerfile since it adds no value now.
2026-04-05 22:03:57 +08:00
Siddharth Kumar Sah f1ae974de9 docs: add CUDA tag to README, getting-started, deployment, benchmarks
- README: add CUDA docker run example alongside full and lite
- Getting started: add GPU acceleration tip with speedup numbers
- Deployment: add CUDA row to variants table
- Docker tags: expand benchmarks with warm + cold start tables
2026-04-05 20:35:24 +08:00