Siddharth Kumar Sah aa1f87fc91 fix: resolve pipeline step race condition and infinite re-render loop
Two issues caused intermittent step addition failures in the automation
pipeline:

1. RemoveBgControls had onChange in its useEffect deps. Since onChange is
   a new function reference on every parent render, this created an
   infinite re-render loop (effect -> setState -> render -> effect).
   Fixed by using the onChangeRef pattern matching other settings
   components.

2. All step mutation callbacks read from stepsRef.current and passed
   values to setSteps. Concurrent callbacks (e.g. addStep + a settings
   effect) would overwrite each other. Fixed by switching to functional
   state updates (setSteps(prev => ...)) and removing stepsRef.

Also rewrites automate e2e tests to use manual step addition instead of
referencing templates that no longer exist in the UI.
2026-03-28 18:34:05 +08:00
2026-03-28 12:29:39 +08:00
2026-03-28 09:02:46 +00:00
2026-03-28 09:02:46 +00:00
2026-03-22 02:33:47 +08:00
2026-03-28 09:02:46 +00:00

Stirling Image logo

Stirling Image

Stirling-PDF but for images. 30+ tools and local AI in a single Docker container.

Docker CI License Stars

Stirling Image - Dashboard

Key Features

  • 30+ image tools - Resize, crop, compress, convert, watermark, color adjust, and more
  • Local AI - Remove backgrounds, upscale images, erase objects, blur faces, extract text (OCR). All running on your hardware with pre-downloaded models, no internet required
  • Pipelines - Chain tools into reusable workflows. Batch process up to 200 images at once
  • REST API - Every tool available via API. Interactive docs included at /api/docs
  • Single container - One docker run, no Redis, no Postgres, no external services
  • Multi-arch - Runs on AMD64 and ARM64 (Intel, Apple Silicon, Raspberry Pi)
  • Your data stays yours - No telemetry, no tracking, no external calls. Images never leave your machine

Quick Start

docker run -d -p 1349:1349 -v stirling-data:/data ghcr.io/siddharthksah/stirling-image:latest

Open http://localhost:1349 in your browser.

Default credentials:

Field Value
Username admin
Password admin

You will be asked to change your password on first login. This is enforced for all new accounts and cannot be skipped in production.

For Docker Compose, persistent storage, and other setup options, see the Getting Started Guide.

Documentation

Contributing

Contributions welcome. See CONTRIBUTING.md for guidelines, the Developer Guide for setup, and the Translation Guide for adding languages.

Support

Bug reports and feature requests: GitHub Issues

GitHub Sponsors Ko-fi

License

MIT

Languages
TypeScript 91%
Python 3.5%
JavaScript 2.4%
Shell 1.6%
Astro 1.1%
Other 0.3%