Commit graph

611 commits

Author SHA1 Message Date
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
semantic-release-bot
b20039eddf chore(release): 1.12.0 [skip ci]
# [1.12.0](https://github.com/stirling-image/stirling-image/compare/v1.11.0...v1.12.0) (2026-04-10)

### Features

* unified Docker image with GPU auto-detection ([#37](https://github.com/stirling-image/stirling-image/issues/37)) ([b0083e2](b0083e2b08))
2026-04-10 05:45:42 +00:00
stirling-image
b0083e2b08 feat: unified Docker image with GPU auto-detection (#37)
Merge CPU, CUDA, and lite Docker images into a single unified image.
One tag (latest) works on all platforms: amd64 (NVIDIA CUDA) and arm64 (CPU).
GPU auto-detected at runtime. All ML models and packages baked in.

Key changes:
- Platform-conditional Dockerfile (nvidia/cuda on amd64, node on arm64)
- tini as PID 1 for proper signal handling
- Fix FILES_STORAGE_PATH data loss bug
- Fix RealESRGAN upscaler (was broken, always fell back to Lanczos)
- Fix PaddleOCR language codes and stdout corruption
- Simplified CI/CD (single build, single tag)
- Expanded model pre-download with verification
- Shutdown timeout, improved health endpoint
- Remove unused lama-cleaner
2026-04-10 13:21:06 +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
semantic-release-bot
7bc979f677 chore(release): 1.11.0 [skip ci]
# [1.11.0](https://github.com/stirling-image/stirling-image/compare/v1.10.0...v1.11.0) (2026-04-07)

### Features

* **docs:** auto-generate llms.txt via vitepress-plugin-llms ([6a362d6](6a362d6443))
2026-04-07 16:53:54 +00: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
semantic-release-bot
d4d421d3ff chore(release): 1.10.0 [skip ci]
# [1.10.0](https://github.com/stirling-image/stirling-image/compare/v1.9.0...v1.10.0) (2026-04-07)

### Features

* add content-aware resize API route and registration ([d464942](d464942cd9))
* add content-aware resize toggle to resize settings UI ([aace4ca](aace4caf0c))
* add seam carving AI bridge module ([d3b6462](d3b646207d))
* add seam carving Python script with face protection ([1460ab7](1460ab7a4a))
2026-04-07 16:11:15 +00:00
stirling-image
28d0dfb45d Merge pull request #28 from stirling-image/feat/content-aware-resize
feat: add content-aware resize (seam carving) to resize tool
2026-04-08 00:10:50 +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
semantic-release-bot
14deda12b8 chore(release): 1.9.0 [skip ci]
# [1.9.0](https://github.com/stirling-image/stirling-image/compare/v1.8.1...v1.9.0) (2026-04-07)

### Features

* add stitch API route handler ([1716468](171646886f))
* add stitch settings UI component ([330bfcf](330bfcf162))
* register stitch component in web tool registry ([7ec5d86](7ec5d86d91))
* register stitch route in API tool registry ([66520cd](66520cdd0e))
* register stitch tool in shared constants and i18n ([fbbbe70](fbbbe70a35))
2026-04-07 14:21:16 +00:00
stirling-image
8b251df518 Merge pull request #27 from stirling-image/feat/stitch-tool
feat: add Stitch tool for joining images
2026-04-07 22:20:52 +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