semantic-release-bot
6aacb4f3a9
chore(release): 2.2.0 [skip ci]
...
# [2.2.0](https://github.com/snapotter-hq/snapotter/compare/v2.1.0...v2.2.0 ) (2026-07-29)
### Bug Fixes
* **a11y:** focus indicators meet the 3:1 non-text contrast bar ([#574 ](https://github.com/snapotter-hq/snapotter/issues/574 )) ([6339370 ](https://github.com/snapotter-hq/snapotter/commit/63393700939e34ad3d847043b03728e3c2907445 )), closes [#A85518](https://github.com/snapotter-hq/snapotter/issues/A85518 ) [#F0A766](https://github.com/snapotter-hq/snapotter/issues/F0A766 )
* **a11y:** WCAG AA contrast retune for the Otter Orange palette ([#567 ](https://github.com/snapotter-hq/snapotter/issues/567 )) ([5102262 ](https://github.com/snapotter-hq/snapotter/commit/51022628dc19d8a03525bab98473f3c23b1a2709 )), closes [#E07832](https://github.com/snapotter-hq/snapotter/issues/E07832 ) [#1A1814](https://github.com/snapotter-hq/snapotter/issues/1A1814 )
* **ai-bridge:** surface sidecar exit reasons in Sentry via SafeError ([#538 ](https://github.com/snapotter-hq/snapotter/issues/538 )) ([55e1e95 ](https://github.com/snapotter-hq/snapotter/commit/55e1e95f20792cae4f1f2257bafe839b83332c93 ))
* **ai-bundles:** stop CPU onnxruntime from clobbering onnxruntime-gpu ([#544 ](https://github.com/snapotter-hq/snapotter/issues/544 )) ([c8629c9 ](https://github.com/snapotter-hq/snapotter/commit/c8629c9d22b455b6deac206e3816ae0f730f06c6 )), closes [#490 ](https://github.com/snapotter-hq/snapotter/issues/490 )
* **ai:** advance the progress bar during upscale and background removal ([#608 ](https://github.com/snapotter-hq/snapotter/issues/608 )) ([e56edc6 ](https://github.com/snapotter-hq/snapotter/commit/e56edc659f742430798104b52a08806a8d8fbff2 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **ai:** warn that upscale and background removal are slow without a GPU ([#605 ](https://github.com/snapotter-hq/snapotter/issues/605 )) ([d43208b ](https://github.com/snapotter-hq/snapotter/commit/d43208b85e1ba1f0ac687970b8fb52ca1738ae15 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **api:** contain library stored-name path traversal ([#600 ](https://github.com/snapotter-hq/snapotter/issues/600 )) ([4333432 ](https://github.com/snapotter-hq/snapotter/commit/43334324c446c53eb1dc2f8ef14cbecca4e2a676 ))
* **api:** enforce job ownership on cancel endpoint ([#599 ](https://github.com/snapotter-hq/snapotter/issues/599 )) ([577d74b ](https://github.com/snapotter-hq/snapotter/commit/577d74bdb134d9a7d02c27ba976731839d071e63 ))
* **api:** gate every tool endpoint and stop ZIP streams failing quietly ([#646 ](https://github.com/snapotter-hq/snapotter/issues/646 )) ([2d8b57c ](https://github.com/snapotter-hq/snapotter/commit/2d8b57c57fad4e1d98ab7eb327198809aa64bd09 )), closes [#645 ](https://github.com/snapotter-hq/snapotter/issues/645 ) [#643 ](https://github.com/snapotter-hq/snapotter/issues/643 ) [#645 ](https://github.com/snapotter-hq/snapotter/issues/645 )
* **api:** wait for Postgres and Redis at startup instead of crash-looping ([#537 ](https://github.com/snapotter-hq/snapotter/issues/537 )) ([4ac89fe ](https://github.com/snapotter-hq/snapotter/commit/4ac89fe6505e50645174e8de5fcdc40c46420cc4 ))
* **audio:** expose sample rate setting in Convert Audio ([#561 ](https://github.com/snapotter-hq/snapotter/issues/561 )) ([d4eaa65 ](https://github.com/snapotter-hq/snapotter/commit/d4eaa655b24236da5633006871415afbf0c92d08 )), closes [#558 ](https://github.com/snapotter-hq/snapotter/issues/558 )
* **auth:** close the MFA policy lockout and add self-service enrollment ([#531 ](https://github.com/snapotter-hq/snapotter/issues/531 )) ([190d4c2 ](https://github.com/snapotter-hq/snapotter/commit/190d4c2a002c6d3d240ff18480e37217fcbeae12 )), closes [#529 ](https://github.com/snapotter-hq/snapotter/issues/529 ) [#515 ](https://github.com/snapotter-hq/snapotter/issues/515 )
* **auth:** give OIDC/SAML logins a real MFA challenge instead of a hard block ([#536 ](https://github.com/snapotter-hq/snapotter/issues/536 )) ([bbfcbe9 ](https://github.com/snapotter-hq/snapotter/commit/bbfcbe9c8212afb244bb2738a6e3643d06dcee68 )), closes [#533 ](https://github.com/snapotter-hq/snapotter/issues/533 )
* **background-removal:** surface failures with a diagnosable SafeError ([#535 ](https://github.com/snapotter-hq/snapotter/issues/535 )) ([43ddf96 ](https://github.com/snapotter-hq/snapotter/commit/43ddf96ccf7baf94416050ec6229efca68124679 ))
* **ci:** repair the chronically-failing nightly workflow ([#624 ](https://github.com/snapotter-hq/snapotter/issues/624 )) ([44f5aea ](https://github.com/snapotter-hq/snapotter/commit/44f5aea3268f022641832af4b8c60cbd2d5e2c7e ))
* **compress-pdf:** land close to the target size, honestly ([#522 ](https://github.com/snapotter-hq/snapotter/issues/522 )) ([7d938af ](https://github.com/snapotter-hq/snapotter/commit/7d938af1f9e601238fd49af4c2cd157d16616266 ))
* **deps:** patch 4 HIGH/CRITICAL transitive CVEs (fast-uri, svgo, sharp, tar) ([#619 ](https://github.com/snapotter-hq/snapotter/issues/619 )) ([10a2aab ](https://github.com/snapotter-hq/snapotter/commit/10a2aabe589b5afd470f6c47ccdb1bf8bca15c02 ))
* **doc-engine:** guard sidecar JSON parsing against non-JSON stdout ([#532 ](https://github.com/snapotter-hq/snapotter/issues/532 )) ([a2cb1a8 ](https://github.com/snapotter-hq/snapotter/commit/a2cb1a8261b2669ae7e656a418999b70a37f6b4f ))
* **docker:** harden Postgres readiness checks in compose and startup ([#595 ](https://github.com/snapotter-hq/snapotter/issues/595 )) ([4ba7503 ](https://github.com/snapotter-hq/snapotter/commit/4ba7503f15a4444c4937576dbcadafdb19a8848d )), closes [#592 ](https://github.com/snapotter-hq/snapotter/issues/592 )
* **docs:** keep the nav within the viewport on tablets and laptops ([#570 ](https://github.com/snapotter-hq/snapotter/issues/570 )) ([69f72a6 ](https://github.com/snapotter-hq/snapotter/commit/69f72a6c712512e8489b23bcf78a233d872d897c )), closes [#556 ](https://github.com/snapotter-hq/snapotter/issues/556 )
* **docs:** keep the translated locale trees out of the search index ([#662 ](https://github.com/snapotter-hq/snapotter/issues/662 )) ([42e1dc9 ](https://github.com/snapotter-hq/snapotter/commit/42e1dc9799f60c7dde46b9485e5f37a5a29630ae ))
* **docs:** localize the docs homepage, nav, and sidebar chrome across 20 languages ([#547 ](https://github.com/snapotter-hq/snapotter/issues/547 )) ([9247947 ](https://github.com/snapotter-hq/snapotter/commit/92479477042740d7026de9b9bb3c71eeb0668231 ))
* **download:** ask reverse proxies not to buffer file downloads ([#604 ](https://github.com/snapotter-hq/snapotter/issues/604 )) ([89d7585 ](https://github.com/snapotter-hq/snapotter/commit/89d75853f45c98d6e9cae661dbda02bc8285009b )), closes [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 )
* **download:** reset the socket when a stream is shorter than Content-Length ([#617 ](https://github.com/snapotter-hq/snapotter/issues/617 )) ([0467e87 ](https://github.com/snapotter-hq/snapotter/commit/0467e87bfe410b313fa21d9758f8c162b12113a6 )), closes [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 ) [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 ) [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 )
* **editor:** repair rotate/flip/resize, levels/curves, filters, and layer lock ([#597 ](https://github.com/snapotter-hq/snapotter/issues/597 )) ([a6bce68 ](https://github.com/snapotter-hq/snapotter/commit/a6bce6825ae27890951becf7c858d4626c513714 ))
* enforce role authority for user management ([#616 ](https://github.com/snapotter-hq/snapotter/issues/616 )) ([1f8a42e ](https://github.com/snapotter-hq/snapotter/commit/1f8a42e54822142132270df1aefa768f4626613f ))
* enforce settings authority boundaries ([#618 ](https://github.com/snapotter-hq/snapotter/issues/618 )) ([44d8109 ](https://github.com/snapotter-hq/snapotter/commit/44d8109486aa6efd9383e573f0a36deb4ffda460 ))
* **erase-object:** crop-based HD inpainting to remove ghosting and blur ([#501 ](https://github.com/snapotter-hq/snapotter/issues/501 )) ([380419d ](https://github.com/snapotter-hq/snapotter/commit/380419dd0603693ad542082bd6197e6505f9b1e9 )), closes [#491 ](https://github.com/snapotter-hq/snapotter/issues/491 ) [hi#res](https://github.com/hi/issues/res ) [#141 ](https://github.com/snapotter-hq/snapotter/issues/141 )
* **files:** decode CLI-decoded formats before URL-import preview generation ([#637 ](https://github.com/snapotter-hq/snapotter/issues/637 )) ([841f47f ](https://github.com/snapotter-hq/snapotter/commit/841f47f6ca25e79dc56dc1e735afa37f02023f99 )), closes [#634 ](https://github.com/snapotter-hq/snapotter/issues/634 )
* **files:** store null instead of 0x0 for undecoded upload dimensions ([#636 ](https://github.com/snapotter-hq/snapotter/issues/636 )) ([511633f ](https://github.com/snapotter-hq/snapotter/commit/511633fa1c76f00fe9c4e2a0935a02b5601cae6a )), closes [#635 ](https://github.com/snapotter-hq/snapotter/issues/635 )
* give remove-background job timeouts an actionable failure message ([#518 ](https://github.com/snapotter-hq/snapotter/issues/518 )) ([58121f2 ](https://github.com/snapotter-hq/snapotter/commit/58121f205f7ae2b34b3d789c80db37c8bf0950bf )), closes [#494 ](https://github.com/snapotter-hq/snapotter/issues/494 )
* **help:** render the help dialog from i18n instead of hardcoded English ([#647 ](https://github.com/snapotter-hq/snapotter/issues/647 )) ([2848dd0 ](https://github.com/snapotter-hq/snapotter/commit/2848dd0e53d8a7c1e19ee82c1a1f2d485380d356 )), closes [#644 ](https://github.com/snapotter-hq/snapotter/issues/644 )
* honor unlimited processing timeout ([#638 ](https://github.com/snapotter-hq/snapotter/issues/638 )) ([025851b ](https://github.com/snapotter-hq/snapotter/commit/025851beefaac6f8d12c1dbcdb69276965072ac9 ))
* **image-tools:** surface Sharp encode failures instead of "Error: Error" ([#534 ](https://github.com/snapotter-hq/snapotter/issues/534 )) ([9cccbc9 ](https://github.com/snapotter-hq/snapotter/commit/9cccbc957681f8d12547e87be0e335f98e789cb7 ))
* **image:** decode real iPhone HEIC files instead of rejecting them at validation ([#631 ](https://github.com/snapotter-hq/snapotter/issues/631 )) ([098ed50 ](https://github.com/snapotter-hq/snapotter/commit/098ed50d0693ba181fae6f934bf427079e1f8e9f )), closes [#622 ](https://github.com/snapotter-hq/snapotter/issues/622 )
* **image:** image-to-pdf presets no longer 404 on 2+ files ([#633 ](https://github.com/snapotter-hq/snapotter/issues/633 )) ([330cf55 ](https://github.com/snapotter-hq/snapotter/commit/330cf559e00b6e5f1ca8df199cabee4c0fa650d0 )), closes [#627 ](https://github.com/snapotter-hq/snapotter/issues/627 )
* **jobs:** classify BullMQ stall (UnrecoverableError) as operational ([#610 ](https://github.com/snapotter-hq/snapotter/issues/610 )) ([e537cb0 ](https://github.com/snapotter-hq/snapotter/commit/e537cb04013d7bf4fd0fb125fb72f42f5a51917f ))
* **jobs:** make timeout messages tool-agnostic and CPU-aware ([#596 ](https://github.com/snapotter-hq/snapotter/issues/596 )) ([37c915c ](https://github.com/snapotter-hq/snapotter/commit/37c915c3da6b2183b0befe1521a643bb36edcce6 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **landing-i18n:** commit missed landing-seo re-translation (remove.bg comparison) ([b8c3700 ](https://github.com/snapotter-hq/snapotter/commit/b8c3700c15333b2eb328cab0979f8d943c15d7ab ))
* **landing,docs:** use build-time GitHub star count, drop per-page api.github.com fetch ([#560 ](https://github.com/snapotter-hq/snapotter/issues/560 )) ([54073a7 ](https://github.com/snapotter-hq/snapotter/commit/54073a7c501788dea49f77f6e94bdebb9b8f0f65 ))
* **landing:** derive conversion-preset copy from real format differences ([#663 ](https://github.com/snapotter-hq/snapotter/issues/663 )) ([a75a22d ](https://github.com/snapotter-hq/snapotter/commit/a75a22dd3ff8e675002a13da0ec12d00f91136c8 ))
* **landing:** keep mixed-case locale casing in emitted URLs ([#562 ](https://github.com/snapotter-hq/snapotter/issues/562 )) ([67f5434 ](https://github.com/snapotter-hq/snapotter/commit/67f54347b2ca711f40495fa7fcb05e132ea8f3da )), closes [#554 ](https://github.com/snapotter-hq/snapotter/issues/554 )
* **landing:** link English-only tool-detail and self-hosted pages to un-prefixed URLs ([#553 ](https://github.com/snapotter-hq/snapotter/issues/553 )) ([6ecc598 ](https://github.com/snapotter-hq/snapotter/commit/6ecc598fc4fc8fa6da5db9d9d0c66e53d2f2376d ))
* **landing:** open Product dropdown below the navbar bottom line ([#571 ](https://github.com/snapotter-hq/snapotter/issues/571 )) ([e3a01b6 ](https://github.com/snapotter-hq/snapotter/commit/e3a01b6be6fa077fa00c6c7245be7ba18b6e913c ))
* **landing:** rework footer badge/switcher layout ([#514 ](https://github.com/snapotter-hq/snapotter/issues/514 )) ([74e7d23 ](https://github.com/snapotter-hq/snapotter/commit/74e7d23abad924f04b348f00edf34e67188c4f2e ))
* **landing:** stop mangling #hash fragments in localized links ([#516 ](https://github.com/snapotter-hq/snapotter/issues/516 )) ([5bd0522 ](https://github.com/snapotter-hq/snapotter/commit/5bd052286c5a7920161b21cb791cc122fe3a1616 )), closes [#hash](https://github.com/snapotter-hq/snapotter/issues/hash )
* make OCR portable and reliable across AMD64 and ARM64 ([#519 ](https://github.com/snapotter-hq/snapotter/issues/519 )) ([991c981 ](https://github.com/snapotter-hq/snapotter/commit/991c981529c81ebb719199aba084db4c2d9a7c6f ))
* **ocr:** unblock and harden accurate-OCR install ([#552 ](https://github.com/snapotter-hq/snapotter/issues/552 )) ([bda4db3 ](https://github.com/snapotter-hq/snapotter/commit/bda4db3f358eebd659a1f8b7892112061a82b000 ))
* **pdf:** flag scanned PDFs in pdf-to-text and serve text as UTF-8 ([#603 ](https://github.com/snapotter-hq/snapotter/issues/603 )) ([7d37f6e ](https://github.com/snapotter-hq/snapotter/commit/7d37f6e6f5aa68aa5954182d76bb6ccf1c6b0649 )), closes [#589 ](https://github.com/snapotter-hq/snapotter/issues/589 )
* **pdf:** pdf-to-image presets no longer 404 on 2+ files ([#643 ](https://github.com/snapotter-hq/snapotter/issues/643 )) ([a713795 ](https://github.com/snapotter-hq/snapotter/commit/a7137958a158309ff8128490de96313e517ae554 )), closes [#627 ](https://github.com/snapotter-hq/snapotter/issues/627 ) [#633 ](https://github.com/snapotter-hq/snapotter/issues/633 ) [#632 ](https://github.com/snapotter-hq/snapotter/issues/632 )
* **pdf:** restore downloads on PDF conversion preset pages ([#629 ](https://github.com/snapotter-hq/snapotter/issues/629 )) ([e0a7aec ](https://github.com/snapotter-hq/snapotter/commit/e0a7aecde8f194b6375747a5a5f8ea4c57053813 )), closes [#623 ](https://github.com/snapotter-hq/snapotter/issues/623 )
* **pdf:** stop page tools failing on short and encrypted PDFs ([#594 ](https://github.com/snapotter-hq/snapotter/issues/594 )) ([73df107 ](https://github.com/snapotter-hq/snapotter/commit/73df1077580904c37d159dafe51a294b250bb074 ))
* preserve colored blocks in PDF-to-Word ([#500 ](https://github.com/snapotter-hq/snapotter/issues/500 )) ([e7cfc00 ](https://github.com/snapotter-hq/snapotter/commit/e7cfc00fe1d294256a0a4663797b8a8cdf58d8c0 ))
* **readme:** self-host the star history chart ([#625 ](https://github.com/snapotter-hq/snapotter/issues/625 )) ([90483c9 ](https://github.com/snapotter-hq/snapotter/commit/90483c944a4d4c912d3c5e2c09b2ee61bed3d150 ))
* release QA hardening across processing, media, security, and CI gates ([#649 ](https://github.com/snapotter-hq/snapotter/issues/649 )) ([d10d0f5 ](https://github.com/snapotter-hq/snapotter/commit/d10d0f544f2a093d2adb13cbd69d54a31c0cbf7a ))
* **release:** resolve the release by id, and make the vulnerability gate cover HIGH ([#661 ](https://github.com/snapotter-hq/snapotter/issues/661 )) ([935861b ](https://github.com/snapotter-hq/snapotter/commit/935861bced95cd778ea77d5a3741ff1da1a2ffed )), closes [#649 ](https://github.com/snapotter-hq/snapotter/issues/649 )
* **security:** bump Pillow to 12.3.0, fixes 5 disclosed CVEs ([#517 ](https://github.com/snapotter-hq/snapotter/issues/517 )) ([30d36d7 ](https://github.com/snapotter-hq/snapotter/commit/30d36d7949817751b869916775138dc4fa7a34d2 ))
* **security:** close the gaps a full 2.0 re-audit left open ([#620 ](https://github.com/snapotter-hq/snapotter/issues/620 )) ([079fcd2 ](https://github.com/snapotter-hq/snapotter/commit/079fcd2631216147db4b68acbcaca58ac4f93fb4 ))
* **seo:** emit clean docs URLs and de-index the demo ([#598 ](https://github.com/snapotter-hq/snapotter/issues/598 )) ([e6718ad ](https://github.com/snapotter-hq/snapotter/commit/e6718ada719e8931f643e1184aee354d4698c1da ))
* **settings:** let admins relax the minimum password length to 1 ([#543 ](https://github.com/snapotter-hq/snapotter/issues/543 )) ([846044a ](https://github.com/snapotter-hq/snapotter/commit/846044a463f18f490f7752b0cb6b4b225b107367 )), closes [#136 ](https://github.com/snapotter-hq/snapotter/issues/136 )
* **sign-pdf:** surface PDF load failures instead of a blank canvas ([#545 ](https://github.com/snapotter-hq/snapotter/issues/545 )) ([1f4878a ](https://github.com/snapotter-hq/snapotter/commit/1f4878ac4df417331a8cff9b8d5ab4da2edc788a ))
* **telemetry:** classify environmental database errors as operational ([#540 ](https://github.com/snapotter-hq/snapotter/issues/540 )) ([631d82e ](https://github.com/snapotter-hq/snapotter/commit/631d82eaae36a15d401c7408182d52a0754b1e36 ))
* **telemetry:** data-quality pass (opt-in noise, onboarding split, file_count, OIDC) ([#614 ](https://github.com/snapotter-hq/snapotter/issues/614 )) ([b20bca3 ](https://github.com/snapotter-hq/snapotter/commit/b20bca3c3c4ef3a63aca6ba420986d49bbeb905b )), closes [hi#level](https://github.com/hi/issues/level )
* **telemetry:** fingerprint stackless uncaught errors so they stop collapsing ([#611 ](https://github.com/snapotter-hq/snapotter/issues/611 )) ([82f5708 ](https://github.com/snapotter-hq/snapotter/commit/82f5708193984e863b95319e0e0ec8be47e46075 ))
* **telemetry:** sharpen Sentry signal for v2.1.0 residual defects ([#498 ](https://github.com/snapotter-hq/snapotter/issues/498 )) ([b457596 ](https://github.com/snapotter-hq/snapotter/commit/b4575966495c1a022154149832aedcd727d411e2 ))
* **telemetry:** surface AI sidecar and DOMException failure reasons in Sentry ([#612 ](https://github.com/snapotter-hq/snapotter/issues/612 )) ([6a0768b ](https://github.com/snapotter-hq/snapotter/commit/6a0768b39da648d3b62b39f2370b97f9ce876da0 )), closes [#535 ](https://github.com/snapotter-hq/snapotter/issues/535 )
* **tools:** classify expected input and timeout errors, not bugs ([#539 ](https://github.com/snapotter-hq/snapotter/issues/539 )) ([39b89b9 ](https://github.com/snapotter-hq/snapotter/commit/39b89b9fbd4f67012b55ecdef35ddf369a3fb874 ))
* **video:** write faststart mp4/mov output from stabilize-video ([#593 ](https://github.com/snapotter-hq/snapotter/issues/593 )) ([df92f7e ](https://github.com/snapotter-hq/snapotter/commit/df92f7ee42b22b5b6cb3434a6b972851388c67ad )), closes [#588 ](https://github.com/snapotter-hq/snapotter/issues/588 )
* **web:** use h-dvh for app shells so mobile tool controls stay reachable ([#559 ](https://github.com/snapotter-hq/snapotter/issues/559 )) ([3f7214b ](https://github.com/snapotter-hq/snapotter/commit/3f7214bac22fe392eb7d179752e9c4583e4dbe0e ))
### Features
* add landing testimonial wall, unblock the onboarding survey ([#639 ](https://github.com/snapotter-hq/snapotter/issues/639 )) ([5cc0a85 ](https://github.com/snapotter-hq/snapotter/commit/5cc0a850c68e0af7a427b8442c24c55f6157416e ))
* **analytics:** instance census, full capture, richer error context ([#511 ](https://github.com/snapotter-hq/snapotter/issues/511 )) ([e1b8c24 ](https://github.com/snapotter-hq/snapotter/commit/e1b8c24e5d78153a62629972932a65cd1491ee77 ))
* clearer, disambiguated tool names across all surfaces ([#520 ](https://github.com/snapotter-hq/snapotter/issues/520 )) ([f858c4c ](https://github.com/snapotter-hq/snapotter/commit/f858c4cea00ae7165718509c8a78881fe6fc24fc ))
* **docs-i18n:** translate all documentation into 20 languages ([4963ab3 ](https://github.com/snapotter-hq/snapotter/commit/4963ab3bbd36fe86b856a3be791f192af4582142 ))
* **erase-object:** add freeform lasso selection mode ([#503 ](https://github.com/snapotter-hq/snapotter/issues/503 )) ([601557e ](https://github.com/snapotter-hq/snapotter/commit/601557edaed32f331b5271334923f1c010098d91 ))
* **erase-object:** optional high-quality diffusion inpainting bundle ([#566 ](https://github.com/snapotter-hq/snapotter/issues/566 )) ([1bac663 ](https://github.com/snapotter-hq/snapotter/commit/1bac663a2e76c98313a7a56c97231c2bbc1b36f2 )), closes [hi#quality](https://github.com/hi/issues/quality ) [#141 ](https://github.com/snapotter-hq/snapotter/issues/141 )
* **feedback:** gate onboarding survey on first processing, add prompt lifecycle events ([#615 ](https://github.com/snapotter-hq/snapotter/issues/615 )) ([129e42b ](https://github.com/snapotter-hq/snapotter/commit/129e42b95cd9c078eebcb3c52be10e8661dd7903 ))
* **files:** add save-as-new vs overwrite choice for library file edits ([#564 ](https://github.com/snapotter-hq/snapotter/issues/564 )) ([a23158d ](https://github.com/snapotter-hq/snapotter/commit/a23158d968c32e8cdf319225d73bf51120f20cbf )), closes [#495 ](https://github.com/snapotter-hq/snapotter/issues/495 )
* **i18n:** 21-language pipeline, landing/docs/API wiring, landing+API translations ([00b651c ](https://github.com/snapotter-hq/snapotter/commit/00b651c9f851a8754cac755f6929ba2eeac8602b ))
* **image:** add rounded-square and squircle crop tool ([#602 ](https://github.com/snapotter-hq/snapotter/issues/602 )) ([e7ffb37 ](https://github.com/snapotter-hq/snapotter/commit/e7ffb37e981c553cf17db88155ac12667f104062 )), closes [#601 ](https://github.com/snapotter-hq/snapotter/issues/601 )
* **landing-i18n:** recall a returning visitor's chosen language ([1bc9fe9 ](https://github.com/snapotter-hq/snapotter/commit/1bc9fe93ec4ca82295e77f2c8068bc700ef94367 ))
* **landing:** add a live system status indicator to the footer ([#641 ](https://github.com/snapotter-hq/snapotter/issues/641 )) ([d690a6e ](https://github.com/snapotter-hq/snapotter/commit/d690a6e26d82f9783cac154faa11f19481902a0e ))
* **landing:** add Twelve Tools and Wired Business footer badges ([#512 ](https://github.com/snapotter-hq/snapotter/issues/512 )) ([ce54d06 ](https://github.com/snapotter-hq/snapotter/commit/ce54d06e797c8f3fe25ed8c00ef42047ddf63882 ))
* **landing:** move language switcher from navbar to footer ([#513 ](https://github.com/snapotter-hq/snapotter/issues/513 )) ([2dee9ea ](https://github.com/snapotter-hq/snapotter/commit/2dee9ead0b1c84c02831c5e92082cd4598b7b8f5 ))
* **library:** wire save-mode into the five custom-client tool submitters ([#577 ](https://github.com/snapotter-hq/snapotter/issues/577 )) ([1113c76 ](https://github.com/snapotter-hq/snapotter/commit/1113c761ead67664e4a7120b8bdf1b8e9da52c43 ))
* **onboarding:** collect install method and friction area in the usage survey ([#499 ](https://github.com/snapotter-hq/snapotter/issues/499 )) ([430b87e ](https://github.com/snapotter-hq/snapotter/commit/430b87eda0078c9afe31aa49da1f2293c928a147 ))
* **resize:** add aspect-ratio proportion presets ([#530 ](https://github.com/snapotter-hq/snapotter/issues/530 )) ([d88999e ](https://github.com/snapotter-hq/snapotter/commit/d88999e7a91d65adb37ea4cb3f9f7fe5650ad6c5 ))
* **search:** start typing anywhere to fill the search box ([#644 ](https://github.com/snapotter-hq/snapotter/issues/644 )) ([0058fc6 ](https://github.com/snapotter-hq/snapotter/commit/0058fc610f4b88ddf0660889b2ea78bf33a527d1 ))
* **telemetry:** add a safe input_format tag to worker error reports ([#541 ](https://github.com/snapotter-hq/snapotter/issues/541 )) ([281b4a0 ](https://github.com/snapotter-hq/snapotter/commit/281b4a06e39756a3a2b981e93d033454eb494c8c ))
* **telemetry:** Sentry + PostHog quality pass ([#546 ](https://github.com/snapotter-hq/snapotter/issues/546 )) ([8625143 ](https://github.com/snapotter-hq/snapotter/commit/86251434b5858c63049c50dda44acb8e281a4cdf ))
* **tools:** remove background from animated GIFs (WebP, APNG) ([#502 ](https://github.com/snapotter-hq/snapotter/issues/502 )) ([cb5db59 ](https://github.com/snapotter-hq/snapotter/commit/cb5db59f77e6b77fd9a575996b8514d6760aaf5b ))
2026-07-29 13:08:27 +00:00
SnapOtter
b6373b864c
chore: reset the partial 2.2.0 release artifacts for a clean re-run
...
Second failed dispatch (verify-ocr, now fixed in #666 ) again left a
chore(release): 2.2.0 commit. Undo its artifacts so the re-dispatch regenerates
them once: restore .release-notes.md to root, drop the 2.2.0 entries from
CHANGELOG.md and the docs changelog. Tag and draft deleted, so the fresh run
re-tags on this commit, which includes the #666 fix the previous tag lacked.
Non-releasable type so the re-run stays 2.2.0.
2026-07-29 20:21:55 +08:00
semantic-release-bot
c2903872bb
chore(release): 2.2.0 [skip ci]
...
# [2.2.0](https://github.com/snapotter-hq/snapotter/compare/v2.1.0...v2.2.0 ) (2026-07-29)
### Bug Fixes
* **a11y:** focus indicators meet the 3:1 non-text contrast bar ([#574 ](https://github.com/snapotter-hq/snapotter/issues/574 )) ([6339370 ](https://github.com/snapotter-hq/snapotter/commit/63393700939e34ad3d847043b03728e3c2907445 )), closes [#A85518](https://github.com/snapotter-hq/snapotter/issues/A85518 ) [#F0A766](https://github.com/snapotter-hq/snapotter/issues/F0A766 )
* **a11y:** WCAG AA contrast retune for the Otter Orange palette ([#567 ](https://github.com/snapotter-hq/snapotter/issues/567 )) ([5102262 ](https://github.com/snapotter-hq/snapotter/commit/51022628dc19d8a03525bab98473f3c23b1a2709 )), closes [#E07832](https://github.com/snapotter-hq/snapotter/issues/E07832 ) [#1A1814](https://github.com/snapotter-hq/snapotter/issues/1A1814 )
* **ai-bridge:** surface sidecar exit reasons in Sentry via SafeError ([#538 ](https://github.com/snapotter-hq/snapotter/issues/538 )) ([55e1e95 ](https://github.com/snapotter-hq/snapotter/commit/55e1e95f20792cae4f1f2257bafe839b83332c93 ))
* **ai-bundles:** stop CPU onnxruntime from clobbering onnxruntime-gpu ([#544 ](https://github.com/snapotter-hq/snapotter/issues/544 )) ([c8629c9 ](https://github.com/snapotter-hq/snapotter/commit/c8629c9d22b455b6deac206e3816ae0f730f06c6 )), closes [#490 ](https://github.com/snapotter-hq/snapotter/issues/490 )
* **ai:** advance the progress bar during upscale and background removal ([#608 ](https://github.com/snapotter-hq/snapotter/issues/608 )) ([e56edc6 ](https://github.com/snapotter-hq/snapotter/commit/e56edc659f742430798104b52a08806a8d8fbff2 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **ai:** warn that upscale and background removal are slow without a GPU ([#605 ](https://github.com/snapotter-hq/snapotter/issues/605 )) ([d43208b ](https://github.com/snapotter-hq/snapotter/commit/d43208b85e1ba1f0ac687970b8fb52ca1738ae15 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **api:** contain library stored-name path traversal ([#600 ](https://github.com/snapotter-hq/snapotter/issues/600 )) ([4333432 ](https://github.com/snapotter-hq/snapotter/commit/43334324c446c53eb1dc2f8ef14cbecca4e2a676 ))
* **api:** enforce job ownership on cancel endpoint ([#599 ](https://github.com/snapotter-hq/snapotter/issues/599 )) ([577d74b ](https://github.com/snapotter-hq/snapotter/commit/577d74bdb134d9a7d02c27ba976731839d071e63 ))
* **api:** gate every tool endpoint and stop ZIP streams failing quietly ([#646 ](https://github.com/snapotter-hq/snapotter/issues/646 )) ([2d8b57c ](https://github.com/snapotter-hq/snapotter/commit/2d8b57c57fad4e1d98ab7eb327198809aa64bd09 )), closes [#645 ](https://github.com/snapotter-hq/snapotter/issues/645 ) [#643 ](https://github.com/snapotter-hq/snapotter/issues/643 ) [#645 ](https://github.com/snapotter-hq/snapotter/issues/645 )
* **api:** wait for Postgres and Redis at startup instead of crash-looping ([#537 ](https://github.com/snapotter-hq/snapotter/issues/537 )) ([4ac89fe ](https://github.com/snapotter-hq/snapotter/commit/4ac89fe6505e50645174e8de5fcdc40c46420cc4 ))
* **audio:** expose sample rate setting in Convert Audio ([#561 ](https://github.com/snapotter-hq/snapotter/issues/561 )) ([d4eaa65 ](https://github.com/snapotter-hq/snapotter/commit/d4eaa655b24236da5633006871415afbf0c92d08 )), closes [#558 ](https://github.com/snapotter-hq/snapotter/issues/558 )
* **auth:** close the MFA policy lockout and add self-service enrollment ([#531 ](https://github.com/snapotter-hq/snapotter/issues/531 )) ([190d4c2 ](https://github.com/snapotter-hq/snapotter/commit/190d4c2a002c6d3d240ff18480e37217fcbeae12 )), closes [#529 ](https://github.com/snapotter-hq/snapotter/issues/529 ) [#515 ](https://github.com/snapotter-hq/snapotter/issues/515 )
* **auth:** give OIDC/SAML logins a real MFA challenge instead of a hard block ([#536 ](https://github.com/snapotter-hq/snapotter/issues/536 )) ([bbfcbe9 ](https://github.com/snapotter-hq/snapotter/commit/bbfcbe9c8212afb244bb2738a6e3643d06dcee68 )), closes [#533 ](https://github.com/snapotter-hq/snapotter/issues/533 )
* **background-removal:** surface failures with a diagnosable SafeError ([#535 ](https://github.com/snapotter-hq/snapotter/issues/535 )) ([43ddf96 ](https://github.com/snapotter-hq/snapotter/commit/43ddf96ccf7baf94416050ec6229efca68124679 ))
* **ci:** repair the chronically-failing nightly workflow ([#624 ](https://github.com/snapotter-hq/snapotter/issues/624 )) ([44f5aea ](https://github.com/snapotter-hq/snapotter/commit/44f5aea3268f022641832af4b8c60cbd2d5e2c7e ))
* **compress-pdf:** land close to the target size, honestly ([#522 ](https://github.com/snapotter-hq/snapotter/issues/522 )) ([7d938af ](https://github.com/snapotter-hq/snapotter/commit/7d938af1f9e601238fd49af4c2cd157d16616266 ))
* **deps:** patch 4 HIGH/CRITICAL transitive CVEs (fast-uri, svgo, sharp, tar) ([#619 ](https://github.com/snapotter-hq/snapotter/issues/619 )) ([10a2aab ](https://github.com/snapotter-hq/snapotter/commit/10a2aabe589b5afd470f6c47ccdb1bf8bca15c02 ))
* **doc-engine:** guard sidecar JSON parsing against non-JSON stdout ([#532 ](https://github.com/snapotter-hq/snapotter/issues/532 )) ([a2cb1a8 ](https://github.com/snapotter-hq/snapotter/commit/a2cb1a8261b2669ae7e656a418999b70a37f6b4f ))
* **docker:** harden Postgres readiness checks in compose and startup ([#595 ](https://github.com/snapotter-hq/snapotter/issues/595 )) ([4ba7503 ](https://github.com/snapotter-hq/snapotter/commit/4ba7503f15a4444c4937576dbcadafdb19a8848d )), closes [#592 ](https://github.com/snapotter-hq/snapotter/issues/592 )
* **docs:** keep the nav within the viewport on tablets and laptops ([#570 ](https://github.com/snapotter-hq/snapotter/issues/570 )) ([69f72a6 ](https://github.com/snapotter-hq/snapotter/commit/69f72a6c712512e8489b23bcf78a233d872d897c )), closes [#556 ](https://github.com/snapotter-hq/snapotter/issues/556 )
* **docs:** keep the translated locale trees out of the search index ([#662 ](https://github.com/snapotter-hq/snapotter/issues/662 )) ([42e1dc9 ](https://github.com/snapotter-hq/snapotter/commit/42e1dc9799f60c7dde46b9485e5f37a5a29630ae ))
* **docs:** localize the docs homepage, nav, and sidebar chrome across 20 languages ([#547 ](https://github.com/snapotter-hq/snapotter/issues/547 )) ([9247947 ](https://github.com/snapotter-hq/snapotter/commit/92479477042740d7026de9b9bb3c71eeb0668231 ))
* **download:** ask reverse proxies not to buffer file downloads ([#604 ](https://github.com/snapotter-hq/snapotter/issues/604 )) ([89d7585 ](https://github.com/snapotter-hq/snapotter/commit/89d75853f45c98d6e9cae661dbda02bc8285009b )), closes [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 )
* **download:** reset the socket when a stream is shorter than Content-Length ([#617 ](https://github.com/snapotter-hq/snapotter/issues/617 )) ([0467e87 ](https://github.com/snapotter-hq/snapotter/commit/0467e87bfe410b313fa21d9758f8c162b12113a6 )), closes [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 ) [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 ) [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 )
* **editor:** repair rotate/flip/resize, levels/curves, filters, and layer lock ([#597 ](https://github.com/snapotter-hq/snapotter/issues/597 )) ([a6bce68 ](https://github.com/snapotter-hq/snapotter/commit/a6bce6825ae27890951becf7c858d4626c513714 ))
* enforce role authority for user management ([#616 ](https://github.com/snapotter-hq/snapotter/issues/616 )) ([1f8a42e ](https://github.com/snapotter-hq/snapotter/commit/1f8a42e54822142132270df1aefa768f4626613f ))
* enforce settings authority boundaries ([#618 ](https://github.com/snapotter-hq/snapotter/issues/618 )) ([44d8109 ](https://github.com/snapotter-hq/snapotter/commit/44d8109486aa6efd9383e573f0a36deb4ffda460 ))
* **erase-object:** crop-based HD inpainting to remove ghosting and blur ([#501 ](https://github.com/snapotter-hq/snapotter/issues/501 )) ([380419d ](https://github.com/snapotter-hq/snapotter/commit/380419dd0603693ad542082bd6197e6505f9b1e9 )), closes [#491 ](https://github.com/snapotter-hq/snapotter/issues/491 ) [hi#res](https://github.com/hi/issues/res ) [#141 ](https://github.com/snapotter-hq/snapotter/issues/141 )
* **files:** decode CLI-decoded formats before URL-import preview generation ([#637 ](https://github.com/snapotter-hq/snapotter/issues/637 )) ([841f47f ](https://github.com/snapotter-hq/snapotter/commit/841f47f6ca25e79dc56dc1e735afa37f02023f99 )), closes [#634 ](https://github.com/snapotter-hq/snapotter/issues/634 )
* **files:** store null instead of 0x0 for undecoded upload dimensions ([#636 ](https://github.com/snapotter-hq/snapotter/issues/636 )) ([511633f ](https://github.com/snapotter-hq/snapotter/commit/511633fa1c76f00fe9c4e2a0935a02b5601cae6a )), closes [#635 ](https://github.com/snapotter-hq/snapotter/issues/635 )
* give remove-background job timeouts an actionable failure message ([#518 ](https://github.com/snapotter-hq/snapotter/issues/518 )) ([58121f2 ](https://github.com/snapotter-hq/snapotter/commit/58121f205f7ae2b34b3d789c80db37c8bf0950bf )), closes [#494 ](https://github.com/snapotter-hq/snapotter/issues/494 )
* **help:** render the help dialog from i18n instead of hardcoded English ([#647 ](https://github.com/snapotter-hq/snapotter/issues/647 )) ([2848dd0 ](https://github.com/snapotter-hq/snapotter/commit/2848dd0e53d8a7c1e19ee82c1a1f2d485380d356 )), closes [#644 ](https://github.com/snapotter-hq/snapotter/issues/644 )
* honor unlimited processing timeout ([#638 ](https://github.com/snapotter-hq/snapotter/issues/638 )) ([025851b ](https://github.com/snapotter-hq/snapotter/commit/025851beefaac6f8d12c1dbcdb69276965072ac9 ))
* **image-tools:** surface Sharp encode failures instead of "Error: Error" ([#534 ](https://github.com/snapotter-hq/snapotter/issues/534 )) ([9cccbc9 ](https://github.com/snapotter-hq/snapotter/commit/9cccbc957681f8d12547e87be0e335f98e789cb7 ))
* **image:** decode real iPhone HEIC files instead of rejecting them at validation ([#631 ](https://github.com/snapotter-hq/snapotter/issues/631 )) ([098ed50 ](https://github.com/snapotter-hq/snapotter/commit/098ed50d0693ba181fae6f934bf427079e1f8e9f )), closes [#622 ](https://github.com/snapotter-hq/snapotter/issues/622 )
* **image:** image-to-pdf presets no longer 404 on 2+ files ([#633 ](https://github.com/snapotter-hq/snapotter/issues/633 )) ([330cf55 ](https://github.com/snapotter-hq/snapotter/commit/330cf559e00b6e5f1ca8df199cabee4c0fa650d0 )), closes [#627 ](https://github.com/snapotter-hq/snapotter/issues/627 )
* **jobs:** classify BullMQ stall (UnrecoverableError) as operational ([#610 ](https://github.com/snapotter-hq/snapotter/issues/610 )) ([e537cb0 ](https://github.com/snapotter-hq/snapotter/commit/e537cb04013d7bf4fd0fb125fb72f42f5a51917f ))
* **jobs:** make timeout messages tool-agnostic and CPU-aware ([#596 ](https://github.com/snapotter-hq/snapotter/issues/596 )) ([37c915c ](https://github.com/snapotter-hq/snapotter/commit/37c915c3da6b2183b0befe1521a643bb36edcce6 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **landing-i18n:** commit missed landing-seo re-translation (remove.bg comparison) ([b8c3700 ](https://github.com/snapotter-hq/snapotter/commit/b8c3700c15333b2eb328cab0979f8d943c15d7ab ))
* **landing,docs:** use build-time GitHub star count, drop per-page api.github.com fetch ([#560 ](https://github.com/snapotter-hq/snapotter/issues/560 )) ([54073a7 ](https://github.com/snapotter-hq/snapotter/commit/54073a7c501788dea49f77f6e94bdebb9b8f0f65 ))
* **landing:** derive conversion-preset copy from real format differences ([#663 ](https://github.com/snapotter-hq/snapotter/issues/663 )) ([a75a22d ](https://github.com/snapotter-hq/snapotter/commit/a75a22dd3ff8e675002a13da0ec12d00f91136c8 ))
* **landing:** keep mixed-case locale casing in emitted URLs ([#562 ](https://github.com/snapotter-hq/snapotter/issues/562 )) ([67f5434 ](https://github.com/snapotter-hq/snapotter/commit/67f54347b2ca711f40495fa7fcb05e132ea8f3da )), closes [#554 ](https://github.com/snapotter-hq/snapotter/issues/554 )
* **landing:** link English-only tool-detail and self-hosted pages to un-prefixed URLs ([#553 ](https://github.com/snapotter-hq/snapotter/issues/553 )) ([6ecc598 ](https://github.com/snapotter-hq/snapotter/commit/6ecc598fc4fc8fa6da5db9d9d0c66e53d2f2376d ))
* **landing:** open Product dropdown below the navbar bottom line ([#571 ](https://github.com/snapotter-hq/snapotter/issues/571 )) ([e3a01b6 ](https://github.com/snapotter-hq/snapotter/commit/e3a01b6be6fa077fa00c6c7245be7ba18b6e913c ))
* **landing:** rework footer badge/switcher layout ([#514 ](https://github.com/snapotter-hq/snapotter/issues/514 )) ([74e7d23 ](https://github.com/snapotter-hq/snapotter/commit/74e7d23abad924f04b348f00edf34e67188c4f2e ))
* **landing:** stop mangling #hash fragments in localized links ([#516 ](https://github.com/snapotter-hq/snapotter/issues/516 )) ([5bd0522 ](https://github.com/snapotter-hq/snapotter/commit/5bd052286c5a7920161b21cb791cc122fe3a1616 )), closes [#hash](https://github.com/snapotter-hq/snapotter/issues/hash )
* make OCR portable and reliable across AMD64 and ARM64 ([#519 ](https://github.com/snapotter-hq/snapotter/issues/519 )) ([991c981 ](https://github.com/snapotter-hq/snapotter/commit/991c981529c81ebb719199aba084db4c2d9a7c6f ))
* **ocr:** unblock and harden accurate-OCR install ([#552 ](https://github.com/snapotter-hq/snapotter/issues/552 )) ([bda4db3 ](https://github.com/snapotter-hq/snapotter/commit/bda4db3f358eebd659a1f8b7892112061a82b000 ))
* **pdf:** flag scanned PDFs in pdf-to-text and serve text as UTF-8 ([#603 ](https://github.com/snapotter-hq/snapotter/issues/603 )) ([7d37f6e ](https://github.com/snapotter-hq/snapotter/commit/7d37f6e6f5aa68aa5954182d76bb6ccf1c6b0649 )), closes [#589 ](https://github.com/snapotter-hq/snapotter/issues/589 )
* **pdf:** pdf-to-image presets no longer 404 on 2+ files ([#643 ](https://github.com/snapotter-hq/snapotter/issues/643 )) ([a713795 ](https://github.com/snapotter-hq/snapotter/commit/a7137958a158309ff8128490de96313e517ae554 )), closes [#627 ](https://github.com/snapotter-hq/snapotter/issues/627 ) [#633 ](https://github.com/snapotter-hq/snapotter/issues/633 ) [#632 ](https://github.com/snapotter-hq/snapotter/issues/632 )
* **pdf:** restore downloads on PDF conversion preset pages ([#629 ](https://github.com/snapotter-hq/snapotter/issues/629 )) ([e0a7aec ](https://github.com/snapotter-hq/snapotter/commit/e0a7aecde8f194b6375747a5a5f8ea4c57053813 )), closes [#623 ](https://github.com/snapotter-hq/snapotter/issues/623 )
* **pdf:** stop page tools failing on short and encrypted PDFs ([#594 ](https://github.com/snapotter-hq/snapotter/issues/594 )) ([73df107 ](https://github.com/snapotter-hq/snapotter/commit/73df1077580904c37d159dafe51a294b250bb074 ))
* preserve colored blocks in PDF-to-Word ([#500 ](https://github.com/snapotter-hq/snapotter/issues/500 )) ([e7cfc00 ](https://github.com/snapotter-hq/snapotter/commit/e7cfc00fe1d294256a0a4663797b8a8cdf58d8c0 ))
* **readme:** self-host the star history chart ([#625 ](https://github.com/snapotter-hq/snapotter/issues/625 )) ([90483c9 ](https://github.com/snapotter-hq/snapotter/commit/90483c944a4d4c912d3c5e2c09b2ee61bed3d150 ))
* release QA hardening across processing, media, security, and CI gates ([#649 ](https://github.com/snapotter-hq/snapotter/issues/649 )) ([d10d0f5 ](https://github.com/snapotter-hq/snapotter/commit/d10d0f544f2a093d2adb13cbd69d54a31c0cbf7a ))
* **release:** resolve the release by id, and make the vulnerability gate cover HIGH ([#661 ](https://github.com/snapotter-hq/snapotter/issues/661 )) ([935861b ](https://github.com/snapotter-hq/snapotter/commit/935861bced95cd778ea77d5a3741ff1da1a2ffed )), closes [#649 ](https://github.com/snapotter-hq/snapotter/issues/649 )
* **security:** bump Pillow to 12.3.0, fixes 5 disclosed CVEs ([#517 ](https://github.com/snapotter-hq/snapotter/issues/517 )) ([30d36d7 ](https://github.com/snapotter-hq/snapotter/commit/30d36d7949817751b869916775138dc4fa7a34d2 ))
* **security:** close the gaps a full 2.0 re-audit left open ([#620 ](https://github.com/snapotter-hq/snapotter/issues/620 )) ([079fcd2 ](https://github.com/snapotter-hq/snapotter/commit/079fcd2631216147db4b68acbcaca58ac4f93fb4 ))
* **seo:** emit clean docs URLs and de-index the demo ([#598 ](https://github.com/snapotter-hq/snapotter/issues/598 )) ([e6718ad ](https://github.com/snapotter-hq/snapotter/commit/e6718ada719e8931f643e1184aee354d4698c1da ))
* **settings:** let admins relax the minimum password length to 1 ([#543 ](https://github.com/snapotter-hq/snapotter/issues/543 )) ([846044a ](https://github.com/snapotter-hq/snapotter/commit/846044a463f18f490f7752b0cb6b4b225b107367 )), closes [#136 ](https://github.com/snapotter-hq/snapotter/issues/136 )
* **sign-pdf:** surface PDF load failures instead of a blank canvas ([#545 ](https://github.com/snapotter-hq/snapotter/issues/545 )) ([1f4878a ](https://github.com/snapotter-hq/snapotter/commit/1f4878ac4df417331a8cff9b8d5ab4da2edc788a ))
* **telemetry:** classify environmental database errors as operational ([#540 ](https://github.com/snapotter-hq/snapotter/issues/540 )) ([631d82e ](https://github.com/snapotter-hq/snapotter/commit/631d82eaae36a15d401c7408182d52a0754b1e36 ))
* **telemetry:** data-quality pass (opt-in noise, onboarding split, file_count, OIDC) ([#614 ](https://github.com/snapotter-hq/snapotter/issues/614 )) ([b20bca3 ](https://github.com/snapotter-hq/snapotter/commit/b20bca3c3c4ef3a63aca6ba420986d49bbeb905b )), closes [hi#level](https://github.com/hi/issues/level )
* **telemetry:** fingerprint stackless uncaught errors so they stop collapsing ([#611 ](https://github.com/snapotter-hq/snapotter/issues/611 )) ([82f5708 ](https://github.com/snapotter-hq/snapotter/commit/82f5708193984e863b95319e0e0ec8be47e46075 ))
* **telemetry:** sharpen Sentry signal for v2.1.0 residual defects ([#498 ](https://github.com/snapotter-hq/snapotter/issues/498 )) ([b457596 ](https://github.com/snapotter-hq/snapotter/commit/b4575966495c1a022154149832aedcd727d411e2 ))
* **telemetry:** surface AI sidecar and DOMException failure reasons in Sentry ([#612 ](https://github.com/snapotter-hq/snapotter/issues/612 )) ([6a0768b ](https://github.com/snapotter-hq/snapotter/commit/6a0768b39da648d3b62b39f2370b97f9ce876da0 )), closes [#535 ](https://github.com/snapotter-hq/snapotter/issues/535 )
* **tools:** classify expected input and timeout errors, not bugs ([#539 ](https://github.com/snapotter-hq/snapotter/issues/539 )) ([39b89b9 ](https://github.com/snapotter-hq/snapotter/commit/39b89b9fbd4f67012b55ecdef35ddf369a3fb874 ))
* **video:** write faststart mp4/mov output from stabilize-video ([#593 ](https://github.com/snapotter-hq/snapotter/issues/593 )) ([df92f7e ](https://github.com/snapotter-hq/snapotter/commit/df92f7ee42b22b5b6cb3434a6b972851388c67ad )), closes [#588 ](https://github.com/snapotter-hq/snapotter/issues/588 )
* **web:** use h-dvh for app shells so mobile tool controls stay reachable ([#559 ](https://github.com/snapotter-hq/snapotter/issues/559 )) ([3f7214b ](https://github.com/snapotter-hq/snapotter/commit/3f7214bac22fe392eb7d179752e9c4583e4dbe0e ))
### Features
* add landing testimonial wall, unblock the onboarding survey ([#639 ](https://github.com/snapotter-hq/snapotter/issues/639 )) ([5cc0a85 ](https://github.com/snapotter-hq/snapotter/commit/5cc0a850c68e0af7a427b8442c24c55f6157416e ))
* **analytics:** instance census, full capture, richer error context ([#511 ](https://github.com/snapotter-hq/snapotter/issues/511 )) ([e1b8c24 ](https://github.com/snapotter-hq/snapotter/commit/e1b8c24e5d78153a62629972932a65cd1491ee77 ))
* clearer, disambiguated tool names across all surfaces ([#520 ](https://github.com/snapotter-hq/snapotter/issues/520 )) ([f858c4c ](https://github.com/snapotter-hq/snapotter/commit/f858c4cea00ae7165718509c8a78881fe6fc24fc ))
* **docs-i18n:** translate all documentation into 20 languages ([4963ab3 ](https://github.com/snapotter-hq/snapotter/commit/4963ab3bbd36fe86b856a3be791f192af4582142 ))
* **erase-object:** add freeform lasso selection mode ([#503 ](https://github.com/snapotter-hq/snapotter/issues/503 )) ([601557e ](https://github.com/snapotter-hq/snapotter/commit/601557edaed32f331b5271334923f1c010098d91 ))
* **erase-object:** optional high-quality diffusion inpainting bundle ([#566 ](https://github.com/snapotter-hq/snapotter/issues/566 )) ([1bac663 ](https://github.com/snapotter-hq/snapotter/commit/1bac663a2e76c98313a7a56c97231c2bbc1b36f2 )), closes [hi#quality](https://github.com/hi/issues/quality ) [#141 ](https://github.com/snapotter-hq/snapotter/issues/141 )
* **feedback:** gate onboarding survey on first processing, add prompt lifecycle events ([#615 ](https://github.com/snapotter-hq/snapotter/issues/615 )) ([129e42b ](https://github.com/snapotter-hq/snapotter/commit/129e42b95cd9c078eebcb3c52be10e8661dd7903 ))
* **files:** add save-as-new vs overwrite choice for library file edits ([#564 ](https://github.com/snapotter-hq/snapotter/issues/564 )) ([a23158d ](https://github.com/snapotter-hq/snapotter/commit/a23158d968c32e8cdf319225d73bf51120f20cbf )), closes [#495 ](https://github.com/snapotter-hq/snapotter/issues/495 )
* **i18n:** 21-language pipeline, landing/docs/API wiring, landing+API translations ([00b651c ](https://github.com/snapotter-hq/snapotter/commit/00b651c9f851a8754cac755f6929ba2eeac8602b ))
* **image:** add rounded-square and squircle crop tool ([#602 ](https://github.com/snapotter-hq/snapotter/issues/602 )) ([e7ffb37 ](https://github.com/snapotter-hq/snapotter/commit/e7ffb37e981c553cf17db88155ac12667f104062 )), closes [#601 ](https://github.com/snapotter-hq/snapotter/issues/601 )
* **landing-i18n:** recall a returning visitor's chosen language ([1bc9fe9 ](https://github.com/snapotter-hq/snapotter/commit/1bc9fe93ec4ca82295e77f2c8068bc700ef94367 ))
* **landing:** add a live system status indicator to the footer ([#641 ](https://github.com/snapotter-hq/snapotter/issues/641 )) ([d690a6e ](https://github.com/snapotter-hq/snapotter/commit/d690a6e26d82f9783cac154faa11f19481902a0e ))
* **landing:** add Twelve Tools and Wired Business footer badges ([#512 ](https://github.com/snapotter-hq/snapotter/issues/512 )) ([ce54d06 ](https://github.com/snapotter-hq/snapotter/commit/ce54d06e797c8f3fe25ed8c00ef42047ddf63882 ))
* **landing:** move language switcher from navbar to footer ([#513 ](https://github.com/snapotter-hq/snapotter/issues/513 )) ([2dee9ea ](https://github.com/snapotter-hq/snapotter/commit/2dee9ead0b1c84c02831c5e92082cd4598b7b8f5 ))
* **library:** wire save-mode into the five custom-client tool submitters ([#577 ](https://github.com/snapotter-hq/snapotter/issues/577 )) ([1113c76 ](https://github.com/snapotter-hq/snapotter/commit/1113c761ead67664e4a7120b8bdf1b8e9da52c43 ))
* **onboarding:** collect install method and friction area in the usage survey ([#499 ](https://github.com/snapotter-hq/snapotter/issues/499 )) ([430b87e ](https://github.com/snapotter-hq/snapotter/commit/430b87eda0078c9afe31aa49da1f2293c928a147 ))
* **resize:** add aspect-ratio proportion presets ([#530 ](https://github.com/snapotter-hq/snapotter/issues/530 )) ([d88999e ](https://github.com/snapotter-hq/snapotter/commit/d88999e7a91d65adb37ea4cb3f9f7fe5650ad6c5 ))
* **search:** start typing anywhere to fill the search box ([#644 ](https://github.com/snapotter-hq/snapotter/issues/644 )) ([0058fc6 ](https://github.com/snapotter-hq/snapotter/commit/0058fc610f4b88ddf0660889b2ea78bf33a527d1 ))
* **telemetry:** add a safe input_format tag to worker error reports ([#541 ](https://github.com/snapotter-hq/snapotter/issues/541 )) ([281b4a0 ](https://github.com/snapotter-hq/snapotter/commit/281b4a06e39756a3a2b981e93d033454eb494c8c ))
* **telemetry:** Sentry + PostHog quality pass ([#546 ](https://github.com/snapotter-hq/snapotter/issues/546 )) ([8625143 ](https://github.com/snapotter-hq/snapotter/commit/86251434b5858c63049c50dda44acb8e281a4cdf ))
* **tools:** remove background from animated GIFs (WebP, APNG) ([#502 ](https://github.com/snapotter-hq/snapotter/issues/502 )) ([cb5db59 ](https://github.com/snapotter-hq/snapotter/commit/cb5db59f77e6b77fd9a575996b8514d6760aaf5b ))
2026-07-29 11:14:24 +00:00
SnapOtter
a76982da60
chore: reset the partial 2.2.0 release artifacts for a clean re-run
...
The first v2.2.0 dispatch failed at archive-security after semantic-release had
already committed its release artifacts (chore(release): 2.2.0). Undo those so
the re-dispatch regenerates them once instead of duplicating the CHANGELOG
section: restore .release-notes.md to the root, and drop the 2.2.0 entries from
CHANGELOG.md and the docs changelog. The tag and draft release were deleted, so
the fresh run re-tags on this commit, which includes the #665 fixes the previous
tag lacked. Non-releasable type so the re-run stays 2.2.0.
2026-07-29 19:08:52 +08:00
semantic-release-bot
4ae03b441b
chore(release): 2.2.0 [skip ci]
...
# [2.2.0](https://github.com/snapotter-hq/snapotter/compare/v2.1.0...v2.2.0 ) (2026-07-29)
### Bug Fixes
* **a11y:** focus indicators meet the 3:1 non-text contrast bar ([#574 ](https://github.com/snapotter-hq/snapotter/issues/574 )) ([6339370 ](https://github.com/snapotter-hq/snapotter/commit/63393700939e34ad3d847043b03728e3c2907445 )), closes [#A85518](https://github.com/snapotter-hq/snapotter/issues/A85518 ) [#F0A766](https://github.com/snapotter-hq/snapotter/issues/F0A766 )
* **a11y:** WCAG AA contrast retune for the Otter Orange palette ([#567 ](https://github.com/snapotter-hq/snapotter/issues/567 )) ([5102262 ](https://github.com/snapotter-hq/snapotter/commit/51022628dc19d8a03525bab98473f3c23b1a2709 )), closes [#E07832](https://github.com/snapotter-hq/snapotter/issues/E07832 ) [#1A1814](https://github.com/snapotter-hq/snapotter/issues/1A1814 )
* **ai-bridge:** surface sidecar exit reasons in Sentry via SafeError ([#538 ](https://github.com/snapotter-hq/snapotter/issues/538 )) ([55e1e95 ](https://github.com/snapotter-hq/snapotter/commit/55e1e95f20792cae4f1f2257bafe839b83332c93 ))
* **ai-bundles:** stop CPU onnxruntime from clobbering onnxruntime-gpu ([#544 ](https://github.com/snapotter-hq/snapotter/issues/544 )) ([c8629c9 ](https://github.com/snapotter-hq/snapotter/commit/c8629c9d22b455b6deac206e3816ae0f730f06c6 )), closes [#490 ](https://github.com/snapotter-hq/snapotter/issues/490 )
* **ai:** advance the progress bar during upscale and background removal ([#608 ](https://github.com/snapotter-hq/snapotter/issues/608 )) ([e56edc6 ](https://github.com/snapotter-hq/snapotter/commit/e56edc659f742430798104b52a08806a8d8fbff2 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **ai:** warn that upscale and background removal are slow without a GPU ([#605 ](https://github.com/snapotter-hq/snapotter/issues/605 )) ([d43208b ](https://github.com/snapotter-hq/snapotter/commit/d43208b85e1ba1f0ac687970b8fb52ca1738ae15 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **api:** contain library stored-name path traversal ([#600 ](https://github.com/snapotter-hq/snapotter/issues/600 )) ([4333432 ](https://github.com/snapotter-hq/snapotter/commit/43334324c446c53eb1dc2f8ef14cbecca4e2a676 ))
* **api:** enforce job ownership on cancel endpoint ([#599 ](https://github.com/snapotter-hq/snapotter/issues/599 )) ([577d74b ](https://github.com/snapotter-hq/snapotter/commit/577d74bdb134d9a7d02c27ba976731839d071e63 ))
* **api:** gate every tool endpoint and stop ZIP streams failing quietly ([#646 ](https://github.com/snapotter-hq/snapotter/issues/646 )) ([2d8b57c ](https://github.com/snapotter-hq/snapotter/commit/2d8b57c57fad4e1d98ab7eb327198809aa64bd09 )), closes [#645 ](https://github.com/snapotter-hq/snapotter/issues/645 ) [#643 ](https://github.com/snapotter-hq/snapotter/issues/643 ) [#645 ](https://github.com/snapotter-hq/snapotter/issues/645 )
* **api:** wait for Postgres and Redis at startup instead of crash-looping ([#537 ](https://github.com/snapotter-hq/snapotter/issues/537 )) ([4ac89fe ](https://github.com/snapotter-hq/snapotter/commit/4ac89fe6505e50645174e8de5fcdc40c46420cc4 ))
* **audio:** expose sample rate setting in Convert Audio ([#561 ](https://github.com/snapotter-hq/snapotter/issues/561 )) ([d4eaa65 ](https://github.com/snapotter-hq/snapotter/commit/d4eaa655b24236da5633006871415afbf0c92d08 )), closes [#558 ](https://github.com/snapotter-hq/snapotter/issues/558 )
* **auth:** close the MFA policy lockout and add self-service enrollment ([#531 ](https://github.com/snapotter-hq/snapotter/issues/531 )) ([190d4c2 ](https://github.com/snapotter-hq/snapotter/commit/190d4c2a002c6d3d240ff18480e37217fcbeae12 )), closes [#529 ](https://github.com/snapotter-hq/snapotter/issues/529 ) [#515 ](https://github.com/snapotter-hq/snapotter/issues/515 )
* **auth:** give OIDC/SAML logins a real MFA challenge instead of a hard block ([#536 ](https://github.com/snapotter-hq/snapotter/issues/536 )) ([bbfcbe9 ](https://github.com/snapotter-hq/snapotter/commit/bbfcbe9c8212afb244bb2738a6e3643d06dcee68 )), closes [#533 ](https://github.com/snapotter-hq/snapotter/issues/533 )
* **background-removal:** surface failures with a diagnosable SafeError ([#535 ](https://github.com/snapotter-hq/snapotter/issues/535 )) ([43ddf96 ](https://github.com/snapotter-hq/snapotter/commit/43ddf96ccf7baf94416050ec6229efca68124679 ))
* **ci:** repair the chronically-failing nightly workflow ([#624 ](https://github.com/snapotter-hq/snapotter/issues/624 )) ([44f5aea ](https://github.com/snapotter-hq/snapotter/commit/44f5aea3268f022641832af4b8c60cbd2d5e2c7e ))
* **compress-pdf:** land close to the target size, honestly ([#522 ](https://github.com/snapotter-hq/snapotter/issues/522 )) ([7d938af ](https://github.com/snapotter-hq/snapotter/commit/7d938af1f9e601238fd49af4c2cd157d16616266 ))
* **deps:** patch 4 HIGH/CRITICAL transitive CVEs (fast-uri, svgo, sharp, tar) ([#619 ](https://github.com/snapotter-hq/snapotter/issues/619 )) ([10a2aab ](https://github.com/snapotter-hq/snapotter/commit/10a2aabe589b5afd470f6c47ccdb1bf8bca15c02 ))
* **doc-engine:** guard sidecar JSON parsing against non-JSON stdout ([#532 ](https://github.com/snapotter-hq/snapotter/issues/532 )) ([a2cb1a8 ](https://github.com/snapotter-hq/snapotter/commit/a2cb1a8261b2669ae7e656a418999b70a37f6b4f ))
* **docker:** harden Postgres readiness checks in compose and startup ([#595 ](https://github.com/snapotter-hq/snapotter/issues/595 )) ([4ba7503 ](https://github.com/snapotter-hq/snapotter/commit/4ba7503f15a4444c4937576dbcadafdb19a8848d )), closes [#592 ](https://github.com/snapotter-hq/snapotter/issues/592 )
* **docs:** keep the nav within the viewport on tablets and laptops ([#570 ](https://github.com/snapotter-hq/snapotter/issues/570 )) ([69f72a6 ](https://github.com/snapotter-hq/snapotter/commit/69f72a6c712512e8489b23bcf78a233d872d897c )), closes [#556 ](https://github.com/snapotter-hq/snapotter/issues/556 )
* **docs:** keep the translated locale trees out of the search index ([#662 ](https://github.com/snapotter-hq/snapotter/issues/662 )) ([42e1dc9 ](https://github.com/snapotter-hq/snapotter/commit/42e1dc9799f60c7dde46b9485e5f37a5a29630ae ))
* **docs:** localize the docs homepage, nav, and sidebar chrome across 20 languages ([#547 ](https://github.com/snapotter-hq/snapotter/issues/547 )) ([9247947 ](https://github.com/snapotter-hq/snapotter/commit/92479477042740d7026de9b9bb3c71eeb0668231 ))
* **download:** ask reverse proxies not to buffer file downloads ([#604 ](https://github.com/snapotter-hq/snapotter/issues/604 )) ([89d7585 ](https://github.com/snapotter-hq/snapotter/commit/89d75853f45c98d6e9cae661dbda02bc8285009b )), closes [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 )
* **download:** reset the socket when a stream is shorter than Content-Length ([#617 ](https://github.com/snapotter-hq/snapotter/issues/617 )) ([0467e87 ](https://github.com/snapotter-hq/snapotter/commit/0467e87bfe410b313fa21d9758f8c162b12113a6 )), closes [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 ) [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 ) [#590 ](https://github.com/snapotter-hq/snapotter/issues/590 )
* **editor:** repair rotate/flip/resize, levels/curves, filters, and layer lock ([#597 ](https://github.com/snapotter-hq/snapotter/issues/597 )) ([a6bce68 ](https://github.com/snapotter-hq/snapotter/commit/a6bce6825ae27890951becf7c858d4626c513714 ))
* enforce role authority for user management ([#616 ](https://github.com/snapotter-hq/snapotter/issues/616 )) ([1f8a42e ](https://github.com/snapotter-hq/snapotter/commit/1f8a42e54822142132270df1aefa768f4626613f ))
* enforce settings authority boundaries ([#618 ](https://github.com/snapotter-hq/snapotter/issues/618 )) ([44d8109 ](https://github.com/snapotter-hq/snapotter/commit/44d8109486aa6efd9383e573f0a36deb4ffda460 ))
* **erase-object:** crop-based HD inpainting to remove ghosting and blur ([#501 ](https://github.com/snapotter-hq/snapotter/issues/501 )) ([380419d ](https://github.com/snapotter-hq/snapotter/commit/380419dd0603693ad542082bd6197e6505f9b1e9 )), closes [#491 ](https://github.com/snapotter-hq/snapotter/issues/491 ) [hi#res](https://github.com/hi/issues/res ) [#141 ](https://github.com/snapotter-hq/snapotter/issues/141 )
* **files:** decode CLI-decoded formats before URL-import preview generation ([#637 ](https://github.com/snapotter-hq/snapotter/issues/637 )) ([841f47f ](https://github.com/snapotter-hq/snapotter/commit/841f47f6ca25e79dc56dc1e735afa37f02023f99 )), closes [#634 ](https://github.com/snapotter-hq/snapotter/issues/634 )
* **files:** store null instead of 0x0 for undecoded upload dimensions ([#636 ](https://github.com/snapotter-hq/snapotter/issues/636 )) ([511633f ](https://github.com/snapotter-hq/snapotter/commit/511633fa1c76f00fe9c4e2a0935a02b5601cae6a )), closes [#635 ](https://github.com/snapotter-hq/snapotter/issues/635 )
* give remove-background job timeouts an actionable failure message ([#518 ](https://github.com/snapotter-hq/snapotter/issues/518 )) ([58121f2 ](https://github.com/snapotter-hq/snapotter/commit/58121f205f7ae2b34b3d789c80db37c8bf0950bf )), closes [#494 ](https://github.com/snapotter-hq/snapotter/issues/494 )
* **help:** render the help dialog from i18n instead of hardcoded English ([#647 ](https://github.com/snapotter-hq/snapotter/issues/647 )) ([2848dd0 ](https://github.com/snapotter-hq/snapotter/commit/2848dd0e53d8a7c1e19ee82c1a1f2d485380d356 )), closes [#644 ](https://github.com/snapotter-hq/snapotter/issues/644 )
* honor unlimited processing timeout ([#638 ](https://github.com/snapotter-hq/snapotter/issues/638 )) ([025851b ](https://github.com/snapotter-hq/snapotter/commit/025851beefaac6f8d12c1dbcdb69276965072ac9 ))
* **image-tools:** surface Sharp encode failures instead of "Error: Error" ([#534 ](https://github.com/snapotter-hq/snapotter/issues/534 )) ([9cccbc9 ](https://github.com/snapotter-hq/snapotter/commit/9cccbc957681f8d12547e87be0e335f98e789cb7 ))
* **image:** decode real iPhone HEIC files instead of rejecting them at validation ([#631 ](https://github.com/snapotter-hq/snapotter/issues/631 )) ([098ed50 ](https://github.com/snapotter-hq/snapotter/commit/098ed50d0693ba181fae6f934bf427079e1f8e9f )), closes [#622 ](https://github.com/snapotter-hq/snapotter/issues/622 )
* **image:** image-to-pdf presets no longer 404 on 2+ files ([#633 ](https://github.com/snapotter-hq/snapotter/issues/633 )) ([330cf55 ](https://github.com/snapotter-hq/snapotter/commit/330cf559e00b6e5f1ca8df199cabee4c0fa650d0 )), closes [#627 ](https://github.com/snapotter-hq/snapotter/issues/627 )
* **jobs:** classify BullMQ stall (UnrecoverableError) as operational ([#610 ](https://github.com/snapotter-hq/snapotter/issues/610 )) ([e537cb0 ](https://github.com/snapotter-hq/snapotter/commit/e537cb04013d7bf4fd0fb125fb72f42f5a51917f ))
* **jobs:** make timeout messages tool-agnostic and CPU-aware ([#596 ](https://github.com/snapotter-hq/snapotter/issues/596 )) ([37c915c ](https://github.com/snapotter-hq/snapotter/commit/37c915c3da6b2183b0befe1521a643bb36edcce6 )), closes [#591 ](https://github.com/snapotter-hq/snapotter/issues/591 )
* **landing-i18n:** commit missed landing-seo re-translation (remove.bg comparison) ([b8c3700 ](https://github.com/snapotter-hq/snapotter/commit/b8c3700c15333b2eb328cab0979f8d943c15d7ab ))
* **landing,docs:** use build-time GitHub star count, drop per-page api.github.com fetch ([#560 ](https://github.com/snapotter-hq/snapotter/issues/560 )) ([54073a7 ](https://github.com/snapotter-hq/snapotter/commit/54073a7c501788dea49f77f6e94bdebb9b8f0f65 ))
* **landing:** derive conversion-preset copy from real format differences ([#663 ](https://github.com/snapotter-hq/snapotter/issues/663 )) ([a75a22d ](https://github.com/snapotter-hq/snapotter/commit/a75a22dd3ff8e675002a13da0ec12d00f91136c8 ))
* **landing:** keep mixed-case locale casing in emitted URLs ([#562 ](https://github.com/snapotter-hq/snapotter/issues/562 )) ([67f5434 ](https://github.com/snapotter-hq/snapotter/commit/67f54347b2ca711f40495fa7fcb05e132ea8f3da )), closes [#554 ](https://github.com/snapotter-hq/snapotter/issues/554 )
* **landing:** link English-only tool-detail and self-hosted pages to un-prefixed URLs ([#553 ](https://github.com/snapotter-hq/snapotter/issues/553 )) ([6ecc598 ](https://github.com/snapotter-hq/snapotter/commit/6ecc598fc4fc8fa6da5db9d9d0c66e53d2f2376d ))
* **landing:** open Product dropdown below the navbar bottom line ([#571 ](https://github.com/snapotter-hq/snapotter/issues/571 )) ([e3a01b6 ](https://github.com/snapotter-hq/snapotter/commit/e3a01b6be6fa077fa00c6c7245be7ba18b6e913c ))
* **landing:** rework footer badge/switcher layout ([#514 ](https://github.com/snapotter-hq/snapotter/issues/514 )) ([74e7d23 ](https://github.com/snapotter-hq/snapotter/commit/74e7d23abad924f04b348f00edf34e67188c4f2e ))
* **landing:** stop mangling #hash fragments in localized links ([#516 ](https://github.com/snapotter-hq/snapotter/issues/516 )) ([5bd0522 ](https://github.com/snapotter-hq/snapotter/commit/5bd052286c5a7920161b21cb791cc122fe3a1616 )), closes [#hash](https://github.com/snapotter-hq/snapotter/issues/hash )
* make OCR portable and reliable across AMD64 and ARM64 ([#519 ](https://github.com/snapotter-hq/snapotter/issues/519 )) ([991c981 ](https://github.com/snapotter-hq/snapotter/commit/991c981529c81ebb719199aba084db4c2d9a7c6f ))
* **ocr:** unblock and harden accurate-OCR install ([#552 ](https://github.com/snapotter-hq/snapotter/issues/552 )) ([bda4db3 ](https://github.com/snapotter-hq/snapotter/commit/bda4db3f358eebd659a1f8b7892112061a82b000 ))
* **pdf:** flag scanned PDFs in pdf-to-text and serve text as UTF-8 ([#603 ](https://github.com/snapotter-hq/snapotter/issues/603 )) ([7d37f6e ](https://github.com/snapotter-hq/snapotter/commit/7d37f6e6f5aa68aa5954182d76bb6ccf1c6b0649 )), closes [#589 ](https://github.com/snapotter-hq/snapotter/issues/589 )
* **pdf:** pdf-to-image presets no longer 404 on 2+ files ([#643 ](https://github.com/snapotter-hq/snapotter/issues/643 )) ([a713795 ](https://github.com/snapotter-hq/snapotter/commit/a7137958a158309ff8128490de96313e517ae554 )), closes [#627 ](https://github.com/snapotter-hq/snapotter/issues/627 ) [#633 ](https://github.com/snapotter-hq/snapotter/issues/633 ) [#632 ](https://github.com/snapotter-hq/snapotter/issues/632 )
* **pdf:** restore downloads on PDF conversion preset pages ([#629 ](https://github.com/snapotter-hq/snapotter/issues/629 )) ([e0a7aec ](https://github.com/snapotter-hq/snapotter/commit/e0a7aecde8f194b6375747a5a5f8ea4c57053813 )), closes [#623 ](https://github.com/snapotter-hq/snapotter/issues/623 )
* **pdf:** stop page tools failing on short and encrypted PDFs ([#594 ](https://github.com/snapotter-hq/snapotter/issues/594 )) ([73df107 ](https://github.com/snapotter-hq/snapotter/commit/73df1077580904c37d159dafe51a294b250bb074 ))
* preserve colored blocks in PDF-to-Word ([#500 ](https://github.com/snapotter-hq/snapotter/issues/500 )) ([e7cfc00 ](https://github.com/snapotter-hq/snapotter/commit/e7cfc00fe1d294256a0a4663797b8a8cdf58d8c0 ))
* **readme:** self-host the star history chart ([#625 ](https://github.com/snapotter-hq/snapotter/issues/625 )) ([90483c9 ](https://github.com/snapotter-hq/snapotter/commit/90483c944a4d4c912d3c5e2c09b2ee61bed3d150 ))
* release QA hardening across processing, media, security, and CI gates ([#649 ](https://github.com/snapotter-hq/snapotter/issues/649 )) ([d10d0f5 ](https://github.com/snapotter-hq/snapotter/commit/d10d0f544f2a093d2adb13cbd69d54a31c0cbf7a ))
* **release:** resolve the release by id, and make the vulnerability gate cover HIGH ([#661 ](https://github.com/snapotter-hq/snapotter/issues/661 )) ([935861b ](https://github.com/snapotter-hq/snapotter/commit/935861bced95cd778ea77d5a3741ff1da1a2ffed )), closes [#649 ](https://github.com/snapotter-hq/snapotter/issues/649 )
* **security:** bump Pillow to 12.3.0, fixes 5 disclosed CVEs ([#517 ](https://github.com/snapotter-hq/snapotter/issues/517 )) ([30d36d7 ](https://github.com/snapotter-hq/snapotter/commit/30d36d7949817751b869916775138dc4fa7a34d2 ))
* **security:** close the gaps a full 2.0 re-audit left open ([#620 ](https://github.com/snapotter-hq/snapotter/issues/620 )) ([079fcd2 ](https://github.com/snapotter-hq/snapotter/commit/079fcd2631216147db4b68acbcaca58ac4f93fb4 ))
* **seo:** emit clean docs URLs and de-index the demo ([#598 ](https://github.com/snapotter-hq/snapotter/issues/598 )) ([e6718ad ](https://github.com/snapotter-hq/snapotter/commit/e6718ada719e8931f643e1184aee354d4698c1da ))
* **settings:** let admins relax the minimum password length to 1 ([#543 ](https://github.com/snapotter-hq/snapotter/issues/543 )) ([846044a ](https://github.com/snapotter-hq/snapotter/commit/846044a463f18f490f7752b0cb6b4b225b107367 )), closes [#136 ](https://github.com/snapotter-hq/snapotter/issues/136 )
* **sign-pdf:** surface PDF load failures instead of a blank canvas ([#545 ](https://github.com/snapotter-hq/snapotter/issues/545 )) ([1f4878a ](https://github.com/snapotter-hq/snapotter/commit/1f4878ac4df417331a8cff9b8d5ab4da2edc788a ))
* **telemetry:** classify environmental database errors as operational ([#540 ](https://github.com/snapotter-hq/snapotter/issues/540 )) ([631d82e ](https://github.com/snapotter-hq/snapotter/commit/631d82eaae36a15d401c7408182d52a0754b1e36 ))
* **telemetry:** data-quality pass (opt-in noise, onboarding split, file_count, OIDC) ([#614 ](https://github.com/snapotter-hq/snapotter/issues/614 )) ([b20bca3 ](https://github.com/snapotter-hq/snapotter/commit/b20bca3c3c4ef3a63aca6ba420986d49bbeb905b )), closes [hi#level](https://github.com/hi/issues/level )
* **telemetry:** fingerprint stackless uncaught errors so they stop collapsing ([#611 ](https://github.com/snapotter-hq/snapotter/issues/611 )) ([82f5708 ](https://github.com/snapotter-hq/snapotter/commit/82f5708193984e863b95319e0e0ec8be47e46075 ))
* **telemetry:** sharpen Sentry signal for v2.1.0 residual defects ([#498 ](https://github.com/snapotter-hq/snapotter/issues/498 )) ([b457596 ](https://github.com/snapotter-hq/snapotter/commit/b4575966495c1a022154149832aedcd727d411e2 ))
* **telemetry:** surface AI sidecar and DOMException failure reasons in Sentry ([#612 ](https://github.com/snapotter-hq/snapotter/issues/612 )) ([6a0768b ](https://github.com/snapotter-hq/snapotter/commit/6a0768b39da648d3b62b39f2370b97f9ce876da0 )), closes [#535 ](https://github.com/snapotter-hq/snapotter/issues/535 )
* **tools:** classify expected input and timeout errors, not bugs ([#539 ](https://github.com/snapotter-hq/snapotter/issues/539 )) ([39b89b9 ](https://github.com/snapotter-hq/snapotter/commit/39b89b9fbd4f67012b55ecdef35ddf369a3fb874 ))
* **video:** write faststart mp4/mov output from stabilize-video ([#593 ](https://github.com/snapotter-hq/snapotter/issues/593 )) ([df92f7e ](https://github.com/snapotter-hq/snapotter/commit/df92f7ee42b22b5b6cb3434a6b972851388c67ad )), closes [#588 ](https://github.com/snapotter-hq/snapotter/issues/588 )
* **web:** use h-dvh for app shells so mobile tool controls stay reachable ([#559 ](https://github.com/snapotter-hq/snapotter/issues/559 )) ([3f7214b ](https://github.com/snapotter-hq/snapotter/commit/3f7214bac22fe392eb7d179752e9c4583e4dbe0e ))
### Features
* add landing testimonial wall, unblock the onboarding survey ([#639 ](https://github.com/snapotter-hq/snapotter/issues/639 )) ([5cc0a85 ](https://github.com/snapotter-hq/snapotter/commit/5cc0a850c68e0af7a427b8442c24c55f6157416e ))
* **analytics:** instance census, full capture, richer error context ([#511 ](https://github.com/snapotter-hq/snapotter/issues/511 )) ([e1b8c24 ](https://github.com/snapotter-hq/snapotter/commit/e1b8c24e5d78153a62629972932a65cd1491ee77 ))
* clearer, disambiguated tool names across all surfaces ([#520 ](https://github.com/snapotter-hq/snapotter/issues/520 )) ([f858c4c ](https://github.com/snapotter-hq/snapotter/commit/f858c4cea00ae7165718509c8a78881fe6fc24fc ))
* **docs-i18n:** translate all documentation into 20 languages ([4963ab3 ](https://github.com/snapotter-hq/snapotter/commit/4963ab3bbd36fe86b856a3be791f192af4582142 ))
* **erase-object:** add freeform lasso selection mode ([#503 ](https://github.com/snapotter-hq/snapotter/issues/503 )) ([601557e ](https://github.com/snapotter-hq/snapotter/commit/601557edaed32f331b5271334923f1c010098d91 ))
* **erase-object:** optional high-quality diffusion inpainting bundle ([#566 ](https://github.com/snapotter-hq/snapotter/issues/566 )) ([1bac663 ](https://github.com/snapotter-hq/snapotter/commit/1bac663a2e76c98313a7a56c97231c2bbc1b36f2 )), closes [hi#quality](https://github.com/hi/issues/quality ) [#141 ](https://github.com/snapotter-hq/snapotter/issues/141 )
* **feedback:** gate onboarding survey on first processing, add prompt lifecycle events ([#615 ](https://github.com/snapotter-hq/snapotter/issues/615 )) ([129e42b ](https://github.com/snapotter-hq/snapotter/commit/129e42b95cd9c078eebcb3c52be10e8661dd7903 ))
* **files:** add save-as-new vs overwrite choice for library file edits ([#564 ](https://github.com/snapotter-hq/snapotter/issues/564 )) ([a23158d ](https://github.com/snapotter-hq/snapotter/commit/a23158d968c32e8cdf319225d73bf51120f20cbf )), closes [#495 ](https://github.com/snapotter-hq/snapotter/issues/495 )
* **i18n:** 21-language pipeline, landing/docs/API wiring, landing+API translations ([00b651c ](https://github.com/snapotter-hq/snapotter/commit/00b651c9f851a8754cac755f6929ba2eeac8602b ))
* **image:** add rounded-square and squircle crop tool ([#602 ](https://github.com/snapotter-hq/snapotter/issues/602 )) ([e7ffb37 ](https://github.com/snapotter-hq/snapotter/commit/e7ffb37e981c553cf17db88155ac12667f104062 )), closes [#601 ](https://github.com/snapotter-hq/snapotter/issues/601 )
* **landing-i18n:** recall a returning visitor's chosen language ([1bc9fe9 ](https://github.com/snapotter-hq/snapotter/commit/1bc9fe93ec4ca82295e77f2c8068bc700ef94367 ))
* **landing:** add a live system status indicator to the footer ([#641 ](https://github.com/snapotter-hq/snapotter/issues/641 )) ([d690a6e ](https://github.com/snapotter-hq/snapotter/commit/d690a6e26d82f9783cac154faa11f19481902a0e ))
* **landing:** add Twelve Tools and Wired Business footer badges ([#512 ](https://github.com/snapotter-hq/snapotter/issues/512 )) ([ce54d06 ](https://github.com/snapotter-hq/snapotter/commit/ce54d06e797c8f3fe25ed8c00ef42047ddf63882 ))
* **landing:** move language switcher from navbar to footer ([#513 ](https://github.com/snapotter-hq/snapotter/issues/513 )) ([2dee9ea ](https://github.com/snapotter-hq/snapotter/commit/2dee9ead0b1c84c02831c5e92082cd4598b7b8f5 ))
* **library:** wire save-mode into the five custom-client tool submitters ([#577 ](https://github.com/snapotter-hq/snapotter/issues/577 )) ([1113c76 ](https://github.com/snapotter-hq/snapotter/commit/1113c761ead67664e4a7120b8bdf1b8e9da52c43 ))
* **onboarding:** collect install method and friction area in the usage survey ([#499 ](https://github.com/snapotter-hq/snapotter/issues/499 )) ([430b87e ](https://github.com/snapotter-hq/snapotter/commit/430b87eda0078c9afe31aa49da1f2293c928a147 ))
* **resize:** add aspect-ratio proportion presets ([#530 ](https://github.com/snapotter-hq/snapotter/issues/530 )) ([d88999e ](https://github.com/snapotter-hq/snapotter/commit/d88999e7a91d65adb37ea4cb3f9f7fe5650ad6c5 ))
* **search:** start typing anywhere to fill the search box ([#644 ](https://github.com/snapotter-hq/snapotter/issues/644 )) ([0058fc6 ](https://github.com/snapotter-hq/snapotter/commit/0058fc610f4b88ddf0660889b2ea78bf33a527d1 ))
* **telemetry:** add a safe input_format tag to worker error reports ([#541 ](https://github.com/snapotter-hq/snapotter/issues/541 )) ([281b4a0 ](https://github.com/snapotter-hq/snapotter/commit/281b4a06e39756a3a2b981e93d033454eb494c8c ))
* **telemetry:** Sentry + PostHog quality pass ([#546 ](https://github.com/snapotter-hq/snapotter/issues/546 )) ([8625143 ](https://github.com/snapotter-hq/snapotter/commit/86251434b5858c63049c50dda44acb8e281a4cdf ))
* **tools:** remove background from animated GIFs (WebP, APNG) ([#502 ](https://github.com/snapotter-hq/snapotter/issues/502 )) ([cb5db59 ](https://github.com/snapotter-hq/snapotter/commit/cb5db59f77e6b77fd9a575996b8514d6760aaf5b ))
2026-07-29 09:50:41 +00:00
semantic-release-bot
c6baf6018d
chore(release): 2.1.0 [skip ci]
...
# [2.1.0](https://github.com/snapotter-hq/snapotter/compare/v2.0.0...v2.1.0 ) (2026-07-10)
### Bug Fixes
* **demo:** boot to dashboard, sample-data notice, robust mobile editor icon ([#464 ](https://github.com/snapotter-hq/snapotter/issues/464 )) ([a94b69b ](https://github.com/snapotter-hq/snapotter/commit/a94b69b14f783c07abfe757e21314f580fbda556 ))
* **demo:** point banner "Self-host SnapOtter" link at the docs guide ([#466 ](https://github.com/snapotter-hq/snapotter/issues/466 )) ([463ccff ](https://github.com/snapotter-hq/snapotter/commit/463ccff5cb91c4b2d0f2c7309ea77789544ad2c3 ))
* **demo:** populate admin data, fix settings crash and mobile editor icon ([#463 ](https://github.com/snapotter-hq/snapotter/issues/463 )) ([7329bc6 ](https://github.com/snapotter-hq/snapotter/commit/7329bc6a1334b925cf95384d6ddc172f04a86610 ))
* error-only Sentry telemetry, storm-proof capture, and crash fixes ([#476 ](https://github.com/snapotter-hq/snapotter/issues/476 )) ([ae6a4c8 ](https://github.com/snapotter-hq/snapotter/commit/ae6a4c8b7c9275ccd8930251d429181568f83453 ))
* **landing:** clarify OIDC is free, SAML is enterprise on pricing ([#461 ](https://github.com/snapotter-hq/snapotter/issues/461 )) ([c2c9a9e ](https://github.com/snapotter-hq/snapotter/commit/c2c9a9ed9bea9c66efec84b9e0b9b2ebbf863073 ))
* **landing:** fix top nav overflow and text overlap ([#473 ](https://github.com/snapotter-hq/snapotter/issues/473 )) ([ffeacd4 ](https://github.com/snapotter-hq/snapotter/commit/ffeacd4b3c7b5858d9048c2521569256e3569490 ))
* **landing:** green the landing e2e suite ([#470 ](https://github.com/snapotter-hq/snapotter/issues/470 )) ([10ae6d1 ](https://github.com/snapotter-hq/snapotter/commit/10ae6d1d3d6ce8a527937bfa31e76ba392bc09e0 ))
* **landing:** highlight Open Source as Most Popular tier ([#462 ](https://github.com/snapotter-hq/snapotter/issues/462 )) ([e468cef ](https://github.com/snapotter-hq/snapotter/commit/e468cef6c0e28b4736dee32d2cf8c2ab1968a59c ))
* **landing:** reposition residual meta framing and demote homepage tool count ([#471 ](https://github.com/snapotter-hq/snapotter/issues/471 )) ([958c3e8 ](https://github.com/snapotter-hq/snapotter/commit/958c3e8513eb3a4c3be7488894981fc8794b1c5f ))
* reliable, self-healing AI feature-bundle installs ([#472 ](https://github.com/snapotter-hq/snapotter/issues/472 )) ([a731c3d ](https://github.com/snapotter-hq/snapotter/commit/a731c3d1fe8303296e90cd138a01e903df871bb7 ))
* restyle sponsor button ([37a3cfc ](https://github.com/snapotter-hq/snapotter/commit/37a3cfc84477c10831f9ae61f183f4ab4ef45d50 ))
* reword sponsor button to "Support us" ([#468 ](https://github.com/snapotter-hq/snapotter/issues/468 )) ([331e3bf ](https://github.com/snapotter-hq/snapotter/commit/331e3bfde04035151612275d9ae269909fed87a8 ))
* update python protobuf dependency ([780624e ](https://github.com/snapotter-hq/snapotter/commit/780624e168cfda5abf3b2501455fe62674550fcf ))
### Features
* **demo:** populate the Files library with sample files ([#465 ](https://github.com/snapotter-hq/snapotter/issues/465 )) ([a6e8f75 ](https://github.com/snapotter-hq/snapotter/commit/a6e8f75074e38b8e5d856311d4423e8a936ae690 ))
* **landing:** add dismissible 2.0 launch banner ([ea7a671 ](https://github.com/snapotter-hq/snapotter/commit/ea7a671ccf29bcbab7a94c28efcbf6e1b9506b34 ))
* **landing:** add Product dropdown to nav ([#475 ](https://github.com/snapotter-hq/snapotter/issues/475 )) ([3d1744a ](https://github.com/snapotter-hq/snapotter/commit/3d1744aec84049f1f296f1cce8f6fb726cf7f835 ))
* **landing:** restore Developers nav link, swap out Features anchor ([#474 ](https://github.com/snapotter-hq/snapotter/issues/474 )) ([a08afbc ](https://github.com/snapotter-hq/snapotter/commit/a08afbc80afefb11cbc13e629d31225a6dceda2f ))
* reposition to self-hosted file-processing infrastructure ([#469 ](https://github.com/snapotter-hq/snapotter/issues/469 )) ([af011d5 ](https://github.com/snapotter-hq/snapotter/commit/af011d55381f8b57797984b1c5b2ca974a033d1c ))
2026-07-10 13:55:46 +00:00
semantic-release-bot
1d21184cfe
chore(release): 2.0.0 [skip ci]
...
# [2.0.0](https://github.com/snapotter-hq/snapotter/compare/v1.17.2...v2.0.0 ) (2026-07-07)
* feat!: SnapOtter 2.0.0 ([6205525 ](https://github.com/snapotter-hq/snapotter/commit/620552569e1b6b163df66ee824a480e6d5750abb )), closes [#254 ](https://github.com/snapotter-hq/snapotter/issues/254 ) [#261 ](https://github.com/snapotter-hq/snapotter/issues/261 )
* feat(db)!: SnapOtter 2.0 phase 1 foundation: postgres, migrator, compose stack ([#216 ](https://github.com/snapotter-hq/snapotter/issues/216 )) ([1c724d5 ](https://github.com/snapotter-hq/snapotter/commit/1c724d5d21659be24423a22c7d6737d59b3d6310 ))
### Bug Fixes
* adopt sharp 0.35.2+ by centralizing the FormatEnum key type ([#362 ](https://github.com/snapotter-hq/snapotter/issues/362 )) ([9052da2 ](https://github.com/snapotter-hq/snapotter/commit/9052da27f3a298f950a9949a0e0929e72b569b04 ))
* **ai-bundles:** lock the numpy-1.x ABI closure so the OCR bundle can't strand scipy ([67c5566 ](https://github.com/snapotter-hq/snapotter/commit/67c55669d610801e8cd07e4d65c5642a08fc0b07 ))
* **ai-bundles:** lock the numpy-1.x ABI closure so the OCR bundle can't strand scipy ([#437 ](https://github.com/snapotter-hq/snapotter/issues/437 )) ([fd39f66 ](https://github.com/snapotter-hq/snapotter/commit/fd39f66f464e21836e8cfd72ab38f3d5c6d3528f ))
* **ai-bundles:** repair bundle build + publish pipeline (deepsafe repo, CPU provider, manifest) ([3b50bcd ](https://github.com/snapotter-hq/snapotter/commit/3b50bcdc5ccb630998c60003d5eddd9803780013 ))
* **ai:** broaden SSRF pre-scan regex to cover srcset, poster, formaction, [@import](https://github.com/import ) ([5397f9b ](https://github.com/snapotter-hq/snapotter/commit/5397f9b21c5b8566fed355f13d62378035456981 ))
* **ai:** detect a paddle-only GPU so OCR uses PaddleOCR-GPU not Tesseract ([#439 ](https://github.com/snapotter-hq/snapotter/issues/439 )) ([7cd514d ](https://github.com/snapotter-hq/snapotter/commit/7cd514dd8cdee28b9f600722f43ba63bcdbe2928 ))
* **ai:** enforce the feature gate on the per-request fallback path ([#331 ](https://github.com/snapotter-hq/snapotter/issues/331 )) ([7a70aff ](https://github.com/snapotter-hq/snapotter/commit/7a70affac51153cf0bd6432a7d9bdc4e6c76bc4b )), closes [#327 ](https://github.com/snapotter-hq/snapotter/issues/327 )
* **ai:** gate AI tools on per-framework GPU detection, not a shared boolean ([#445 ](https://github.com/snapotter-hq/snapotter/issues/445 )) ([36dde9a ](https://github.com/snapotter-hq/snapotter/commit/36dde9ad8784867270bbfe766650b4c4515dbcb9 ))
* **ai:** pin protobuf<5 on arm64 so mediapipe face landmarks work ([#417 ](https://github.com/snapotter-hq/snapotter/issues/417 )) ([2c2fb65 ](https://github.com/snapotter-hq/snapotter/commit/2c2fb65fcaaa835ca589e59255366819cece5fdf ))
* **ai:** pin rembg to 2.0.69 to keep numpy<2 compatibility ([3726335 ](https://github.com/snapotter-hq/snapotter/commit/3726335063984bd572a14eea36c532bda74bc1d6 ))
* **ai:** surface actionable fix for libGL.so.1 missing on headless installs ([7c70c60 ](https://github.com/snapotter-hq/snapotter/commit/7c70c60b9e3e0912b1f8be6acf87f378f8b9c080 ))
* **ai:** update arm64 bundle sha256/size after protobuf<5 rebuild ([#421 ](https://github.com/snapotter-hq/snapotter/issues/421 )) ([2a36b3d ](https://github.com/snapotter-hq/snapotter/commit/2a36b3dfe0e4388f7bd1c2a8183f7d87e57dc144 )), closes [#417 ](https://github.com/snapotter-hq/snapotter/issues/417 )
* allow reinstall of AI bundles with broken model files ([#214 ](https://github.com/snapotter-hq/snapotter/issues/214 )) ([27a56c7 ](https://github.com/snapotter-hq/snapotter/commit/27a56c774bfd8f920355a1f5b70553639ad165df ))
* always show NonNativePreview for non-native formats, even after processing ([abaae18 ](https://github.com/snapotter-hq/snapotter/commit/abaae18669a281a03aeafebec764f9992659c862 ))
* **analytics:** harden analytics opt-out and feedback surfaces ([#423 ](https://github.com/snapotter-hq/snapotter/issues/423 )) ([23efce9 ](https://github.com/snapotter-hq/snapotter/commit/23efce9df0f8cedabd9aab033b896f7f3dffc768 ))
* **api:** batch user-files delete to eliminate N+1 queries ([e2c5714 ](https://github.com/snapotter-hq/snapotter/commit/e2c57144dd1f8f9a7de629228967725861cb50c7 ))
* **api:** decode RAW via LibRaw first so DNG processes at full resolution ([#289 ](https://github.com/snapotter-hq/snapotter/issues/289 )) ([#290 ](https://github.com/snapotter-hq/snapotter/issues/290 )) ([3d9ff1e ](https://github.com/snapotter-hq/snapotter/commit/3d9ff1e0d2c60a88fdba03c11f45e1422eacf84d ))
* **api:** drop app-logger import from media-input; update stale errors mock ([c483897 ](https://github.com/snapotter-hq/snapotter/commit/c483897452d0769a3a1fbca8758fdc7eaf1b3cc0 ))
* **api:** fix batch user-files delete recursive CTE query ([82991b6 ](https://github.com/snapotter-hq/snapotter/commit/82991b6a412f84dd2d1d7295379da3cb189d1440 ))
* **api:** isolate the factory validation scratch dir from the worker's ([7a205ee ](https://github.com/snapotter-hq/snapotter/commit/7a205eeb1239f6fa0d1e3c84c744325b9e953237 ))
* **api:** log only genuine processing faults at error level ([965501a ](https://github.com/snapotter-hq/snapotter/commit/965501aef95fff1f5924e030434ea2688c4f0e8c ))
* **api:** make OpenAPI spec ASCII-only so Schemathesis can load it ([#344 ](https://github.com/snapotter-hq/snapotter/issues/344 )) ([c2ae334 ](https://github.com/snapotter-hq/snapotter/commit/c2ae334c81e18561931247db8f8e68ab08c1ef74 ))
* **api:** narrow friendlyError matching to avoid collapsing valid messages ([6220885 ](https://github.com/snapotter-hq/snapotter/commit/6220885e0cfd61b57186136aba174f0042dc6457 ))
* **api:** propagate lenient structural-validation flag to batch + pipeline ([e52e0bb ](https://github.com/snapotter-hq/snapotter/commit/e52e0bb3d53bed90a58d0daca15c9aef633d7d02 )), closes [#244 ](https://github.com/snapotter-hq/snapotter/issues/244 )
* **api:** reject non-PDF inputs in pdf-to-image ([37b9c6d ](https://github.com/snapotter-hq/snapotter/commit/37b9c6d7bf0d38ffc48febc324e96288b5f59fd4 ))
* **api:** respect RATE_LIMIT_PER_MIN for tool routes ([#272 ](https://github.com/snapotter-hq/snapotter/issues/272 )) ([ce02ce1 ](https://github.com/snapotter-hq/snapotter/commit/ce02ce13486989d51314d2afabbdcaf8e0d2a9f9 )), closes [#280 ](https://github.com/snapotter-hq/snapotter/issues/280 )
* **api:** return user-safe processing errors, keep raw stderr in logs ([4af4bfa ](https://github.com/snapotter-hq/snapotter/commit/4af4bfa8eba5ba059e804af33581ada7250a7d1c ))
* **api:** section override for backwards-compat alias routes (adjust-colors) ([fc205c7 ](https://github.com/snapotter-hq/snapotter/commit/fc205c7428f3d27d542065a70c4a948e4e9742fd ))
* **api:** stop leaking raw ffprobe stderr in media validation errors ([3fc4149 ](https://github.com/snapotter-hq/snapotter/commit/3fc41491437a2968b2ebfd79447d59e68da7ec1d ))
* **api:** support sharp 0.35 types ([6f85b3d ](https://github.com/snapotter-hq/snapotter/commit/6f85b3d12acac73caf747313511c49c7bdc6c257 ))
* **api:** wrap role rename and delete in transactions ([b564932 ](https://github.com/snapotter-hq/snapotter/commit/b5649320833ad0c5d6c57c887ef8587d74564dcb ))
* apply processedFileName fallback everywhere processedFilename is used ([857aa75 ](https://github.com/snapotter-hq/snapotter/commit/857aa75562816dbcc0827eda93125605c495af7c ))
* **audio:** low-samplerate ogg encode + post-2.0 QA hygiene ([19d9ed1 ](https://github.com/snapotter-hq/snapotter/commit/19d9ed181ae0051e0df6a01585036628dd31700a ))
* **benchmark:** use section-prefixed tool URLs for 2.0 route scheme ([76fc695 ](https://github.com/snapotter-hq/snapotter/commit/76fc695233eae54c803ae1730cefb9acd161db45 ))
* build script venv handling and lint fixes ([b1e94bd ](https://github.com/snapotter-hq/snapotter/commit/b1e94bd98851d3cc6da57b343ac8d2528dfda890 ))
* cache useSyncExternalStore snapshot to prevent infinite re-render ([f68fcb8 ](https://github.com/snapotter-hq/snapotter/commit/f68fcb8ca6724be0ca83a42593192608cde1a784 ))
* **ci:** address spec review findings in verify-bundle.sh ([4b5b351 ](https://github.com/snapotter-hq/snapotter/commit/4b5b35186d925f95566b7d36c9d3994255fc95e2 ))
* **ci:** deploy landing from dist, not the stale Next.js out path ([#240 ](https://github.com/snapotter-hq/snapotter/issues/240 )) ([44bfca1 ](https://github.com/snapotter-hq/snapotter/commit/44bfca105fc4bfa1d5d2bfc0da861ed4e0a1e496 ))
* **ci:** grant ai-bundles reusable call its required token scopes ([03c1a5e ](https://github.com/snapotter-hq/snapotter/commit/03c1a5e36f9dd7f904882b7cb19fc27006a61f5d ))
* **ci:** harden smoke tests against set -e and fix parameter issues ([efac88c ](https://github.com/snapotter-hq/snapotter/commit/efac88c20517c22b3a18a9cb227350cd10bdd3c1 ))
* **ci:** resolve pre-existing failures making main red ([#250 ](https://github.com/snapotter-hq/snapotter/issues/250 )) ([622c9f9 ](https://github.com/snapotter-hq/snapotter/commit/622c9f98a5772eae05343407b8408cd7d7539ef9 )), closes [#249 ](https://github.com/snapotter-hq/snapotter/issues/249 ) [246/#248](https://github.com/snapotter-hq/snapotter/issues/248 )
* **ci:** revert rembg to 2.0.62 (2.0.75 requires numpy>=2.3) ([3b8d529 ](https://github.com/snapotter-hq/snapotter/commit/3b8d529b4422deb4d0782a5e4d536328563afd1e ))
* clean file info cards for non-native video/media formats on tool page ([511e941 ](https://github.com/snapotter-hq/snapotter/commit/511e941da0516e27237621be1eeaf6beb64b2d89 ))
* clear file store when navigating between tools ([f32b3bd ](https://github.com/snapotter-hq/snapotter/commit/f32b3bd51f2107040c081d0d9bee5ac5b0450157 ))
* correct SAML idpCert property name for @node-saml/node-saml v5 ([b9dac59 ](https://github.com/snapotter-hq/snapotter/commit/b9dac597362e2fbdd90447bfd7889f85dddfff90 ))
* critical first-login soft-lock in usage survey overlay ([#392 ](https://github.com/snapotter-hq/snapotter/issues/392 )) ([ca076f9 ](https://github.com/snapotter-hq/snapotter/commit/ca076f91fde252fd98d3014a260d8ae7534481f0 ))
* **deps:** close js-yaml DoS alert + document rembg non-reachability ([#286 ](https://github.com/snapotter-hq/snapotter/issues/286 )) ([5d5117a ](https://github.com/snapotter-hq/snapotter/commit/5d5117acf729d3b2c00119eede9ba20f0aa17a28 ))
* **deps:** drop undici override (broke jsdom@29) ([5662532 ](https://github.com/snapotter-hq/snapotter/commit/56625325013b6c8ac47e159a4d517f7eef29a056 ))
* **deps:** patch Dependabot security alerts ([8792080 ](https://github.com/snapotter-hq/snapotter/commit/87920809820cb0179c029ccb7234370431abff67 ))
* **doc-engine:** treat qpdf exit code 3 (warnings) as success, not failure ([2a2151d ](https://github.com/snapotter-hq/snapotter/commit/2a2151d7dd19faa1e4d43d49540729dab33a8eed ))
* **docker:** copy patches/ before pnpm install so cold builds succeed ([#300 ](https://github.com/snapotter-hq/snapotter/issues/300 )) ([f74f648 ](https://github.com/snapotter-hq/snapotter/commit/f74f648e47fb76a30b9fa34cd6dc84f4c0295972 ))
* **docker:** make storage writable under non-root/foreign UIDs (TrueNAS, OpenShift) ([#299 ](https://github.com/snapotter-hq/snapotter/issues/299 )) ([1fec971 ](https://github.com/snapotter-hq/snapotter/commit/1fec97111bf4cf4620131e38651b8e114c7b0566 )), closes [#230 ](https://github.com/snapotter-hq/snapotter/issues/230 )
* **docker:** make venv bootstrap upgrade-aware with pip-freeze stamp ([39543d6 ](https://github.com/snapotter-hq/snapotter/commit/39543d651219d4741868ec7ebe34186aa038a914 )), closes [#85 ](https://github.com/snapotter-hq/snapotter/issues/85 )
* **docker:** patch OS + pip image CVEs, document accepted Trivy residuals ([#288 ](https://github.com/snapotter-hq/snapotter/issues/288 )) ([c203267 ](https://github.com/snapotter-hq/snapotter/commit/c203267866aa87994de80d2214f70deff72b7b5f ))
* **docker:** repair copied AI venv paths ([#390 ](https://github.com/snapotter-hq/snapotter/issues/390 )) ([7e01d36 ](https://github.com/snapotter-hq/snapotter/commit/7e01d3637edec10c4b7c73cd6c9d54c6414972f6 )), closes [#127 ](https://github.com/snapotter-hq/snapotter/issues/127 ) [#127 ](https://github.com/snapotter-hq/snapotter/issues/127 )
* **docker:** restore Postgres/Redis in GPU compose stack + pause image publishing ([9b64a96 ](https://github.com/snapotter-hq/snapotter/commit/9b64a96bcd2e60ce8e3e051a9d2b57811e98a223 ))
* **e2e,landing:** robust path escaping (CodeQL) + unique file-tools card ([a6837b6 ](https://github.com/snapotter-hq/snapotter/commit/a6837b687a096b754367223b4472481071a450b7 ))
* **e2e:** disable Astro Dev Toolbar during landing e2e tests ([2927e0d ](https://github.com/snapotter-hq/snapotter/commit/2927e0d4be063353abb9d23494158849ac3a191a ))
* **e2e:** wait for post-login redirect before forcing navigation ([#341 ](https://github.com/snapotter-hq/snapotter/issues/341 )) ([5b75d81 ](https://github.com/snapotter-hq/snapotter/commit/5b75d813b8523fd378c731de76c429fe900d9d28 )), closes [#340 ](https://github.com/snapotter-hq/snapotter/issues/340 )
* **editor:** apply layer effects + object flip, add Beta badge, repair e2e specs ([3120e67 ](https://github.com/snapotter-hq/snapotter/commit/3120e6708dd4e0eb39c2d3af01623e8f1e9c4473 )), closes [#259 ](https://github.com/snapotter-hq/snapotter/issues/259 )
* **editor:** capture document pixels without the zoom/pan transform ([#259 ](https://github.com/snapotter-hq/snapotter/issues/259 )) ([81e16d7 ](https://github.com/snapotter-hq/snapotter/commit/81e16d7ce6648e3d7acace0b1915fd42774d1096 )), closes [#258 ](https://github.com/snapotter-hq/snapotter/issues/258 )
* **editor:** fill canvas viewport, fix black rulers, add resizable panel ([#258 ](https://github.com/snapotter-hq/snapotter/issues/258 )) ([063a2e4 ](https://github.com/snapotter-hq/snapotter/commit/063a2e47e298e41d1115f4e6e92a96922a607ce6 ))
* enforce file type filtering using tool's acceptedInputs ([adfa532 ](https://github.com/snapotter-hq/snapotter/commit/adfa53246ae228eebe2fdd071f23a83400f1296c ))
* **enterprise:** SCIM token generation, GDPR job cancellation, MFA replay, config redaction, encryption validation, SCIM rate limit ([29dd675 ](https://github.com/snapotter-hq/snapotter/commit/29dd675f4262ac0380df3113ae140b4fc7330d21 ))
* **enterprise:** ship enterprise package in prod image + S3, analytics, tracing, queue fixes ([#342 ](https://github.com/snapotter-hq/snapotter/issues/342 )) ([8f4235d ](https://github.com/snapotter-hq/snapotter/commit/8f4235d2c664337f3b970b1be5acc6f92474aeb6 )), closes [#82 ](https://github.com/snapotter-hq/snapotter/issues/82 )
* fetch settings on home page mount so tools are visible ([cf543f6 ](https://github.com/snapotter-hq/snapotter/commit/cf543f6976166b179deb1e5c0fa993bb9e037f0e ))
* file library upload accepts all file types, not just images ([6bcee1e ](https://github.com/snapotter-hq/snapotter/commit/6bcee1e0739daaad8c66abcc4a4e1bc00bb40735 ))
* **files:** record the source tool in toolChain on Save to Files ([#435 ](https://github.com/snapotter-hq/snapotter/issues/435 )) ([47a60e7 ](https://github.com/snapotter-hq/snapotter/commit/47a60e7fad229a9bb9c8e4f33f152cacb3f3dfb4 ))
* first-run QA sweep of the single-container image ([#413 ](https://github.com/snapotter-hq/snapotter/issues/413 )) ([bf417a5 ](https://github.com/snapotter-hq/snapotter/commit/bf417a509e529ee6b39d2d5a13a308172b4d08aa ))
* GPU deployment robustness (6 fixes from end-to-end testing on an RTX 4070) ([#334 ](https://github.com/snapotter-hq/snapotter/issues/334 )) ([35e18d8 ](https://github.com/snapotter-hq/snapotter/commit/35e18d8b79861b4aba46d4cb022be868d4d3e757 ))
* grey out incompatible files in library instead of hiding them ([3a5d55c ](https://github.com/snapotter-hq/snapotter/commit/3a5d55cf268301df158163acbeaeaf50c6625a10 ))
* handle non-image modalities across uploads, previews, and filenames ([#255 ](https://github.com/snapotter-hq/snapotter/issues/255 )) ([8eee17a ](https://github.com/snapotter-hq/snapotter/commit/8eee17aeea41577a55b30ead97ca36224b387c04 ))
* harden against three production Sentry crashes ([#328 ](https://github.com/snapotter-hq/snapotter/issues/328 )) ([8952e9b ](https://github.com/snapotter-hq/snapotter/commit/8952e9ba475000da9d2d8e0959c63f3cf2b4506e ))
* harden Docker image and async job responses ([f3342a1 ](https://github.com/snapotter-hq/snapotter/commit/f3342a1e571db5a12f5d8f659903ffe590fa2044 ))
* harden install queue/dispatcher lifecycle and repair review-sweep regressions ([#395 ](https://github.com/snapotter-hq/snapotter/issues/395 )) ([b4375e5 ](https://github.com/snapotter-hq/snapotter/commit/b4375e558dfc5ccf34ee6736b886e90f662b1688 )), closes [#388 ](https://github.com/snapotter-hq/snapotter/issues/388 ) [#390 ](https://github.com/snapotter-hq/snapotter/issues/390 ) [#391 ](https://github.com/snapotter-hq/snapotter/issues/391 ) [#392 ](https://github.com/snapotter-hq/snapotter/issues/392 ) [#393 ](https://github.com/snapotter-hq/snapotter/issues/393 ) [#394 ](https://github.com/snapotter-hq/snapotter/issues/394 ) [#392 ](https://github.com/snapotter-hq/snapotter/issues/392 )
* **i18n:** complete and correct Italian translation ([#231 ](https://github.com/snapotter-hq/snapotter/issues/231 )) ([#298 ](https://github.com/snapotter-hq/snapotter/issues/298 )) ([c0a8b36 ](https://github.com/snapotter-hq/snapotter/commit/c0a8b36dcbf56f49fa2e58c8d040171e9e6b63e3 ))
* **i18n:** complete the Italian feedback translations ([#426 ](https://github.com/snapotter-hq/snapotter/issues/426 )) ([3ae48cc ](https://github.com/snapotter-hq/snapotter/commit/3ae48cc76ad4021854a805fcea486f58b045f595 )), closes [#425 ](https://github.com/snapotter-hq/snapotter/issues/425 )
* **i18n:** complete the Italian translation update ([#438 ](https://github.com/snapotter-hq/snapotter/issues/438 )) ([#450 ](https://github.com/snapotter-hq/snapotter/issues/450 )) ([0fafeb2 ](https://github.com/snapotter-hq/snapotter/commit/0fafeb26766ed49014d13b649f9b43ffc2fffca5 ))
* **i18n:** restore accents in Italian loading-message arrays ([#322 ](https://github.com/snapotter-hq/snapotter/issues/322 )) ([29fcc87 ](https://github.com/snapotter-hq/snapotter/commit/29fcc8770887b981e73a17e43bea79a2f13da1e5 )), closes [#298 ](https://github.com/snapotter-hq/snapotter/issues/298 )
* **i18n:** translate Arabic (ar) UI strings ([#314 ](https://github.com/snapotter-hq/snapotter/issues/314 )) ([ab37505 ](https://github.com/snapotter-hq/snapotter/commit/ab37505e681602d67ad447e3ad49588e905d48d9 ))
* **i18n:** translate Brazilian Portuguese (pt-BR) UI strings ([#307 ](https://github.com/snapotter-hq/snapotter/issues/307 )) ([3900350 ](https://github.com/snapotter-hq/snapotter/commit/3900350ad56d63e9b8ed119539c94c54faf971e0 ))
* **i18n:** translate Dutch (nl) UI strings ([#309 ](https://github.com/snapotter-hq/snapotter/issues/309 )) ([d036ff6 ](https://github.com/snapotter-hq/snapotter/commit/d036ff6d44fa9fd8025d3c38b382127066b248c3 ))
* **i18n:** translate French (fr) UI strings ([#306 ](https://github.com/snapotter-hq/snapotter/issues/306 )) ([fe5c7c8 ](https://github.com/snapotter-hq/snapotter/commit/fe5c7c8c8667a24cebcd0af8b68f031ddc01ef15 ))
* **i18n:** translate German (de) UI strings ([#308 ](https://github.com/snapotter-hq/snapotter/issues/308 )) ([4de24b8 ](https://github.com/snapotter-hq/snapotter/commit/4de24b8c9e4e703b4fd51965ccb9387e1e09fa59 ))
* **i18n:** translate Hindi (hi) UI strings ([#316 ](https://github.com/snapotter-hq/snapotter/issues/316 )) ([00c89e4 ](https://github.com/snapotter-hq/snapotter/commit/00c89e4ae9060c1cc4100340f5db223bfd768e0f ))
* **i18n:** translate Indonesian (id) UI strings ([#318 ](https://github.com/snapotter-hq/snapotter/issues/318 )) ([8a8a4f9 ](https://github.com/snapotter-hq/snapotter/commit/8a8a4f99a431ec10ccfdbb472672e976b5b86db2 ))
* **i18n:** translate Japanese (ja) UI strings ([#304 ](https://github.com/snapotter-hq/snapotter/issues/304 )) ([d8b037c ](https://github.com/snapotter-hq/snapotter/commit/d8b037c8c6e8c6cde9c4c6900c1d5689143f5d5d ))
* **i18n:** translate Korean (ko) UI strings ([#305 ](https://github.com/snapotter-hq/snapotter/issues/305 )) ([e7b412f ](https://github.com/snapotter-hq/snapotter/commit/e7b412fc097d6c745037781e7478414a33d6db25 ))
* **i18n:** translate Polish (pl) UI strings ([#312 ](https://github.com/snapotter-hq/snapotter/issues/312 )) ([7ce9c64 ](https://github.com/snapotter-hq/snapotter/commit/7ce9c64b50c5b1fa1eb153c8635384eb5ae0e03b ))
* **i18n:** translate Russian (ru) UI strings ([#311 ](https://github.com/snapotter-hq/snapotter/issues/311 )) ([eb9a14a ](https://github.com/snapotter-hq/snapotter/commit/eb9a14a226824047cdf00ac94ef647e2bfdcf23a ))
* **i18n:** translate Simplified Chinese (zh-CN) UI strings ([#302 ](https://github.com/snapotter-hq/snapotter/issues/302 )) ([26d8a06 ](https://github.com/snapotter-hq/snapotter/commit/26d8a0685c6b2a216fd72b9431d18543abfa89ee ))
* **i18n:** translate Spanish (es) UI strings ([#301 ](https://github.com/snapotter-hq/snapotter/issues/301 )) ([b3ff8ac ](https://github.com/snapotter-hq/snapotter/commit/b3ff8accec5494d2fe97a27355257b3c5fa2f91d ))
* **i18n:** translate Swedish (sv) UI strings ([#310 ](https://github.com/snapotter-hq/snapotter/issues/310 )) ([c4ce5f9 ](https://github.com/snapotter-hq/snapotter/commit/c4ce5f96dfe6daf8e560de34cd748b1795ed12ff ))
* **i18n:** translate Thai (th) UI strings ([#319 ](https://github.com/snapotter-hq/snapotter/issues/319 )) ([5a6368d ](https://github.com/snapotter-hq/snapotter/commit/5a6368db89df5419885b3f8dc568eeaa16cd8206 ))
* **i18n:** translate Traditional Chinese (zh-TW) UI strings ([#303 ](https://github.com/snapotter-hq/snapotter/issues/303 )) ([de4d2ed ](https://github.com/snapotter-hq/snapotter/commit/de4d2ed166d858530dcbbb0634ddcb9c7536ab07 ))
* **i18n:** translate Turkish (tr) UI strings ([#315 ](https://github.com/snapotter-hq/snapotter/issues/315 )) ([8c1c2c3 ](https://github.com/snapotter-hq/snapotter/commit/8c1c2c310eac95d5a75fcfd563b9026dba9a4fae ))
* **i18n:** translate Ukrainian (uk) UI strings ([#313 ](https://github.com/snapotter-hq/snapotter/issues/313 )) ([6ee1b0f ](https://github.com/snapotter-hq/snapotter/commit/6ee1b0f7a1b58dd7ae113fc4268067e0ac1e0b3c ))
* **i18n:** translate Vietnamese (vi) UI strings ([#317 ](https://github.com/snapotter-hq/snapotter/issues/317 )) ([4702721 ](https://github.com/snapotter-hq/snapotter/commit/470272169d947e27ff826e2c0e24e1553eda0543 ))
* **image-engine:** support sharp 0.35 types ([2137be4 ](https://github.com/snapotter-hq/snapotter/commit/2137be479e1a23e163587acd1609e77058e9e134 ))
* **jobs:** pre-warm QueueEvents to kill first-sync-wait flake ([#285 ](https://github.com/snapotter-hq/snapotter/issues/285 )) ([dba8a85 ](https://github.com/snapotter-hq/snapotter/commit/dba8a85a8013231945741a8fabd09ed86db0d963 ))
* **jobs:** strip internal paths from all worker SSE error frames ([fc718c1 ](https://github.com/snapotter-hq/snapotter/commit/fc718c168487de1213c978797c3fc84288f26513 ))
* **landing:** add www redirect, noindex JS chunks, and website badge ([47b6984 ](https://github.com/snapotter-hq/snapotter/commit/47b6984be0c8d8de07e0770a34d61a9795b71eaf ))
* **lint:** biome-format tool-factory and json-xml to green apps/api lint ([#252 ](https://github.com/snapotter-hq/snapotter/issues/252 )) ([7865339 ](https://github.com/snapotter-hq/snapotter/commit/7865339fc8c3b8696af5919212ddba4120c07f23 )), closes [#251 ](https://github.com/snapotter-hq/snapotter/issues/251 )
* **lint:** clear remaining biome errors (unused code, optional chains, non-null assertions, effect deps) ([19dc6ba ](https://github.com/snapotter-hq/snapotter/commit/19dc6ba554a05f531db01f23ce3e71297f651f81 ))
* **lint:** make husky hook executable; rename backend useS3 to isS3Enabled (clears 17 false-positive useHookAtTopLevel) ([7561f2a ](https://github.com/snapotter-hq/snapotter/commit/7561f2a8c3a92c412f0d38b9f1323aa8bcfcf4a4 ))
* **lint:** resolve [#280 ](https://github.com/snapotter-hq/snapotter/issues/280 ) Lint failures (route formatting + landing import sort) ([6e1b9cd ](https://github.com/snapotter-hq/snapotter/commit/6e1b9cd3cc3b33b18724eb071f3ad4023ab1ee80 ))
* make search bar full-width to align with tabs and grid ([207c1c3 ](https://github.com/snapotter-hq/snapotter/commit/207c1c348be5af23c793a96bf07b9f7b7c26ce31 ))
* **media:** encode gif-to-video WebM as yuv420p ([e96c314 ](https://github.com/snapotter-hq/snapotter/commit/e96c314ab9b049c3b01d49ff2622d2a351962cd9 ))
* **migrator:** correct and harden the 1.x to 2.0 SQLite import ([#434 ](https://github.com/snapotter-hq/snapotter/issues/434 )) ([dadf766 ](https://github.com/snapotter-hq/snapotter/commit/dadf76689933faa8208de9730525409e2497518f ))
* **nightly:** de-flake matrix timeouts, exclude browser tool from fuzz ([#349 ](https://github.com/snapotter-hq/snapotter/issues/349 )) ([bbad953 ](https://github.com/snapotter-hq/snapotter/commit/bbad953e79a132007490c17dab2b774c4b8ae697 )), closes [#347 ](https://github.com/snapotter-hq/snapotter/issues/347 )
* **nightly:** qpdf in test image, NUL-byte settings, AI sub-path fuzz exclude ([#348 ](https://github.com/snapotter-hq/snapotter/issues/348 )) ([078743d ](https://github.com/snapotter-hq/snapotter/commit/078743d6b28aa4078f213cae4c39a3b99e515d8d )), closes [#346 ](https://github.com/snapotter-hq/snapotter/issues/346 ) [#346 ](https://github.com/snapotter-hq/snapotter/issues/346 )
* **normalize-audio:** preserve source sample rate after loudnorm ([#248 ](https://github.com/snapotter-hq/snapotter/issues/248 )) ([1548d47 ](https://github.com/snapotter-hq/snapotter/commit/1548d475ca3d1ace0f14d24ecc5e9a13ca5770a2 ))
* offline CodeFormer face-enhance (ship RealESRGAN_x2plus in upscale-enhance bundle) ([#433 ](https://github.com/snapotter-hq/snapotter/issues/433 )) ([cf884b5 ](https://github.com/snapotter-hq/snapotter/commit/cf884b52cdf4e8852e0cd24215b22ed2220230da ))
* **passport-photo:** require the face-detection bundle, not just background-removal ([#329 ](https://github.com/snapotter-hq/snapotter/issues/329 )) ([32c1192 ](https://github.com/snapotter-hq/snapotter/commit/32c1192d635898012af2ff14cdbd68c0acd6a3e1 )), closes [#327 ](https://github.com/snapotter-hq/snapotter/issues/327 ) [#327 ](https://github.com/snapotter-hq/snapotter/issues/327 )
* PDF tool QA sweep - library auto-save versioning, AI fileId threading, modality polish ([#251 ](https://github.com/snapotter-hq/snapotter/issues/251 )) ([08961fc ](https://github.com/snapotter-hq/snapotter/commit/08961fcc8941bada2608e386bfa6d6b12e996f35 ))
* post-2.0 audit bug fixes (404 route, worker logging, outpaint gate, pandoc path) ([2bd3e23 ](https://github.com/snapotter-hq/snapotter/commit/2bd3e2302ad11b306971d0f651f8ad1ee1e9b785 ))
* prevent double scrollbar by locking html/body overflow ([914ff1b ](https://github.com/snapotter-hq/snapotter/commit/914ff1b1aab345237f325cd152bd3ebc693bab52 ))
* preview generation works for processed results too ([b93dc95 ](https://github.com/snapotter-hq/snapotter/commit/b93dc95bcaa197cfd4b29c030a04decaa7babcf8 ))
* QA sweep - tool routes, security, i18n, a11y, + AI bundle install hardening ([#393 ](https://github.com/snapotter-hq/snapotter/issues/393 )) ([b37faed ](https://github.com/snapotter-hq/snapotter/commit/b37faed95fc3d2f51c78f40954fdbb5c7b94779d )), closes [hi#resolution](https://github.com/hi/issues/resolution ) [hi#severity](https://github.com/hi/issues/severity )
* reassign 4 tools to correct display modes ([619f61b ](https://github.com/snapotter-hq/snapotter/commit/619f61b4700c9fd3b21f90b7c9512672fae57dab ))
* release-acceptance QA follow-ups (upload crash, scipy ABI conflict, rate limit, OCR fallback) ([#458 ](https://github.com/snapotter-hq/snapotter/issues/458 )) ([60d01ab ](https://github.com/snapotter-hq/snapotter/commit/60d01ab2ddfad4bf837d30369c2f39e9734cb571 )), closes [#413 ](https://github.com/snapotter-hq/snapotter/issues/413 ) [#437 ](https://github.com/snapotter-hq/snapotter/issues/437 )
* remove all legacy redirects from routes ([fd26fa3 ](https://github.com/snapotter-hq/snapotter/commit/fd26fa35868b75ca7fd352115396ec9b23dd4280 ))
* remove automatic third-party egress of user data + optional strict offline mode (OSM tiles, Scalar fonts, editor fonts, AI model downloads) ([#422 ](https://github.com/snapotter-hq/snapotter/issues/422 )) ([6e3a14e ](https://github.com/snapotter-hq/snapotter/commit/6e3a14ec6bfc15f18aef3c7aa20cde6d4823dc29 ))
* remove double scrollbar on home page ([ae95976 ](https://github.com/snapotter-hq/snapotter/commit/ae959760e3fec115021e2ada7af579ecd13f181c ))
* remove duplicated 1.x migration callout in README ([#456 ](https://github.com/snapotter-hq/snapotter/issues/456 )) ([2a899ef ](https://github.com/snapotter-hq/snapotter/commit/2a899ef9041c3c637380a91e532273a3581a19d1 )), closes [#448 ](https://github.com/snapotter-hq/snapotter/issues/448 ) [#454 ](https://github.com/snapotter-hq/snapotter/issues/454 )
* remove redundant Getting Started section from home page ([287f6f1 ](https://github.com/snapotter-hq/snapotter/commit/287f6f15ded4b84e9d0f019522915ccac822d083 ))
* repair docker validation QA tooling, dispatcher crash-accounting, and image-enhancement RAW hang ([#391 ](https://github.com/snapotter-hq/snapotter/issues/391 )) ([bd1838e ](https://github.com/snapotter-hq/snapotter/commit/bd1838e40b0d11715eaf9eff6b4152a707a29b5b ))
* repair URL import (DNS-pinned fetch on Node 22 + non-image modalities) ([#246 ](https://github.com/snapotter-hq/snapotter/issues/246 )) ([8f6312c ](https://github.com/snapotter-hq/snapotter/commit/8f6312c521246215ef1a27c65475aa2005e409e0 ))
* resolve 18 QA-discovered bugs across tools, previews, and the AI pipeline ([#242 ](https://github.com/snapotter-hq/snapotter/issues/242 )) ([d8cf979 ](https://github.com/snapotter-hq/snapotter/commit/d8cf979d4ba31b802c254f7eeb5ef50b424a56b7 ))
* resolve 6 bugs from enterprise audit (SIEM cursor, legal hold join, SCIM role, GDPR self-purge, export OOM, quota check) ([7f62b1b ](https://github.com/snapotter-hq/snapotter/commit/7f62b1bf12d2cf1baaf5586b201458eab100a111 ))
* resolve hardcoded /app paths and loosen mediapipe pin for native installs ([60e3ac2 ](https://github.com/snapotter-hq/snapotter/commit/60e3ac2210f93a350729246cf2b4bb303ab2ebc7 )), closes [community-scripts/ProxmoxVE#14720 ](https://github.com/community-scripts/ProxmoxVE/issues/14720 )
* resolve Sharp 0.35.1 and BullMQ type incompatibilities after dep bumps ([b76dc68 ](https://github.com/snapotter-hq/snapotter/commit/b76dc68682c664d4c6a22cf921e786d4c010b757 ))
* Save to Files shows green success state with checkmark after saving ([f4061fe ](https://github.com/snapotter-hq/snapotter/commit/f4061fe4b0417ba896de138a791cfc869d3b33f3 ))
* **security:** basename-sanitize file-preview paths (CodeQL js/path-injection) ([7a3b4e6 ](https://github.com/snapotter-hq/snapotter/commit/7a3b4e6b3bbdee7c382bd4ad739485b37bb45f46 ))
* **security:** close file-preview path-injection + tighten subtitle detection ([c1cd871 ](https://github.com/snapotter-hq/snapotter/commit/c1cd8712f45d9defd5321f2d683cf207ee9d3740 ))
* **security:** close remaining high-severity CodeQL alerts ([bdadb84 ](https://github.com/snapotter-hq/snapotter/commit/bdadb843d8238d738e9f849f1754765f5de82411 )), closes [hi#severity](https://github.com/hi/issues/severity )
* **security:** explicit per-route rate limits (CodeQL js/missing-rate-limiting) ([ae4fc1d ](https://github.com/snapotter-hq/snapotter/commit/ae4fc1decf006b15a2f747cde07d4c1e35c5de13 ))
* **security:** harden auth and outbound fetches ([c6319cf ](https://github.com/snapotter-hq/snapotter/commit/c6319cf8a9efe8745a29339613002c22f82e5393 ))
* **security:** harden rate limits, Redis auth, resource caps, and error sanitization ([d612264 ](https://github.com/snapotter-hq/snapotter/commit/d61226496b5745ff7f57ee8138009d4f81826095 ))
* **security:** numeric CIDR matching for IPv6 SSRF allow/deny ([f75cc32 ](https://github.com/snapotter-hq/snapotter/commit/f75cc328acd18b4714291400ac348058db6d28d8 ))
* send auth token with preview generation request ([6090688 ](https://github.com/snapotter-hq/snapotter/commit/609068870842629e085a77d9d5144c5102beae19 ))
* set a writable HOME for the app user so PaddleOCR works in non-root deployments ([#430 ](https://github.com/snapotter-hq/snapotter/issues/430 )) ([e0dbf2a ](https://github.com/snapotter-hq/snapotter/commit/e0dbf2a5c3cc9622218d31698452697957936e00 ))
* settings dialog and settings API correctness bugs ([8e9452e ](https://github.com/snapotter-hq/snapotter/commit/8e9452e65073c500098fde040ce021e3b1c39639 ))
* show all tools on All tab, remove Popular and Browse sections ([b166f47 ](https://github.com/snapotter-hq/snapotter/commit/b166f47de515739d87a14ae408a351f81dd37c00 ))
* show image viewer for video-to-gif/webp results instead of broken video player ([90acd5b ](https://github.com/snapotter-hq/snapotter/commit/90acd5bcd905f461f28a5b511c619d896d4a6724 ))
* show modality starting points in landing command center ([#387 ](https://github.com/snapotter-hq/snapotter/issues/387 )) ([852f6ce ](https://github.com/snapotter-hq/snapotter/commit/852f6cecba106eb9d000f95fc1ae9863157a5d3b ))
* show tool-specific accepted formats in dropzone, remove privacy note ([5241ccd ](https://github.com/snapotter-hq/snapotter/commit/5241ccd1247bda2d9e634576354f3b14a4077c63 ))
* sort enterprise exports for Biome lint compliance ([3b7f44e ](https://github.com/snapotter-hq/snapotter/commit/3b7f44e50e450bff62560b9f21cb12330b0b2b82 ))
* stamp SnapOtter as Producer on generated PDFs ([#416 ](https://github.com/snapotter-hq/snapotter/issues/416 )) ([8b3f1e6 ](https://github.com/snapotter-hq/snapotter/commit/8b3f1e6884361ef080c0165059bd8fdb4a14fd79 ))
* sync demo theme with app ([f6f7b5a ](https://github.com/snapotter-hq/snapotter/commit/f6f7b5a4bc2867f680441a91a9af9e1bd148edf4 ))
* test server registration gaps, Redis subscriber cleanup, atomic settings upsert ([954cfb0 ](https://github.com/snapotter-hq/snapotter/commit/954cfb01a657ec49293a4e10e72e23eb69e4d9b2 ))
* **test:** align analytics-env test with ANALYTICS_ENABLED=true default ([96764ec ](https://github.com/snapotter-hq/snapotter/commit/96764ec375189ebec396d0397b116407bfd75e05 ))
* **test:** mock db/index.js in unit tests that import API modules ([5b3b3c7 ](https://github.com/snapotter-hq/snapotter/commit/5b3b3c76329d62636c886dfa798b9e14acd7cc90 ))
* **test:** repair integration suite after analytics column/endpoint removal ([#340 ](https://github.com/snapotter-hq/snapotter/issues/340 )) ([6917a8b ](https://github.com/snapotter-hq/snapotter/commit/6917a8b0c7864fc9b244ecda23dcdbcbf02f9733 )), closes [#336 ](https://github.com/snapotter-hq/snapotter/issues/336 )
* **test:** resolve CI failures from the overhaul ([34b006d ](https://github.com/snapotter-hq/snapotter/commit/34b006ded772b96d7b4336e5ffcc67e1039253c3 ))
* **tests:** section-prefix tool API URLs across overhauled suite ([d4dc2ea ](https://github.com/snapotter-hq/snapotter/commit/d4dc2eae5db66b098d8a4e735ab61053ddb50635 )), closes [#280 ](https://github.com/snapotter-hq/snapotter/issues/280 )
* **test:** update import paths for cleanup.test.ts after move to integration ([78679c5 ](https://github.com/snapotter-hq/snapotter/commit/78679c57f46d11d89dcb384373a63e28e1a75635 ))
* **tools:** honest content-type for edit-metadata pass-through ([#350 ](https://github.com/snapotter-hq/snapotter/issues/350 )) ([88af8d4 ](https://github.com/snapotter-hq/snapotter/commit/88af8d46fb001dd019de54e48dd7c73c5feaea73 ))
* **tools:** surface chars count in pdf-to-text result payload ([3c44335 ](https://github.com/snapotter-hq/snapotter/commit/3c4433583b836e53ee2a35b79c8d9be07760992e ))
* top nav respects dark mode theme ([43b1901 ](https://github.com/snapotter-hq/snapotter/commit/43b190134e8858301fa3bffd1882260d6928c441 ))
* **ui:** constrain preview dropzone height in pipeline builder ([931e15a ](https://github.com/snapotter-hq/snapotter/commit/931e15a6bd04fc84d236b41dbbd7df0feefe29a9 ))
* **ui:** show repair UI when AI bundle models are broken ([#214 ](https://github.com/snapotter-hq/snapotter/issues/214 )) ([edea82b ](https://github.com/snapotter-hq/snapotter/commit/edea82ba27cd92aa5188144e525f9889b6ba1b9d ))
* update privacy policy to reference PostgreSQL instead of SQLite ([5af1ac4 ](https://github.com/snapotter-hq/snapotter/commit/5af1ac4dcf0c8ff17bdcc0efc6c179afc8543168 ))
* use media-player for all video/audio tools that had no-comparison or side-by-side ([69300b5 ](https://github.com/snapotter-hq/snapotter/commit/69300b5c83f43ebde213473f66d9f255e33cf9dc ))
* use processedFileName fallback for non-native format detection after processing ([14ded6f ](https://github.com/snapotter-hq/snapotter/commit/14ded6fbd0babb43de8a544527bb2293b9d83b2d ))
* validate non-image inputs by modality (batch + pipeline) ([#244 ](https://github.com/snapotter-hq/snapotter/issues/244 )) ([03e7123 ](https://github.com/snapotter-hq/snapotter/commit/03e71236f93853e28d7ad8428fe8a9b918849773 ))
* **web:** add modality to fuse search keys, merge docs+files in fullscreen grid ([3114323 ](https://github.com/snapotter-hq/snapotter/commit/3114323d07a941cfcb261bc245250a8f3f6e8222 ))
* **web:** point tool keyboard shortcuts at section routes ([0689ae5 ](https://github.com/snapotter-hq/snapotter/commit/0689ae554fa353a231f01e4dffd3ac362afcb3ba ))
* **web:** resolve feature install status sync and mutual exclusivity ([#214 ](https://github.com/snapotter-hq/snapotter/issues/214 )) ([492da82 ](https://github.com/snapotter-hq/snapotter/commit/492da820f8ce298addd3038dad2f55e91cdb12bd ))
* **web:** restore preview panel rendering for all file types ([1181b1f ](https://github.com/snapotter-hq/snapotter/commit/1181b1fe22c7f5a998f8954f9e02a184a3513cf8 ))
* **web:** show modality thumbnails for non-image files in the strip ([#245 ](https://github.com/snapotter-hq/snapotter/issues/245 )) ([aa3ae6e ](https://github.com/snapotter-hq/snapotter/commit/aa3ae6ec915821d664cef0c1537e2b64d9a6fcee ))
* **web:** update dropzone to accept all file types, not just images ([b8b6b0a ](https://github.com/snapotter-hq/snapotter/commit/b8b6b0a44ada1670e4e41bcf6cd22f713d14c512 ))
* **web:** wrap modality tabs to prevent overflow in narrow sidebar ([dab31d6 ](https://github.com/snapotter-hq/snapotter/commit/dab31d6e32c7eee95199d7a686d507a98d58138f ))
### Features
* add a Keep it free sponsor button to the top nav ([#427 ](https://github.com/snapotter-hq/snapotter/issues/427 )) ([7b04317 ](https://github.com/snapotter-hq/snapotter/commit/7b04317ed20e062c273fe60a19cdcaac2b50e651 ))
* add AES-256-GCM encryption at rest for sensitive settings ([2520cdd ](https://github.com/snapotter-hq/snapotter/commit/2520cdd556c8a5946b4eb6426aebc8811944e8d9 ))
* add audio waveform visualization with wavesurfer.js ([d8a8e05 ](https://github.com/snapotter-hq/snapotter/commit/d8a8e055906eeab9d1f9a048c4f8d5517cff8f80 ))
* add backup status tracking endpoints ([2aea351 ](https://github.com/snapotter-hq/snapotter/commit/2aea351f70cfd171befad164bc553e7feb998884 ))
* add bundle build script for CI ([52b9405 ](https://github.com/snapotter-hq/snapotter/commit/52b940585afa1788119dc50f6d44e98f32192ad3 ))
* add CI workflow for building and publishing AI bundles ([7dabfe2 ](https://github.com/snapotter-hq/snapotter/commit/7dabfe293dd171bb7b7ec6909ced85b178e67961 ))
* add Cmd+Enter (process) and Cmd+S (download) keyboard shortcuts ([7c9ca85 ](https://github.com/snapotter-hq/snapotter/commit/7c9ca85952bc155580becc8f95125482875a3ed5 ))
* add enterprise Phase 1-4 feature flags and new permissions ([86d6f50 ](https://github.com/snapotter-hq/snapotter/commit/86d6f50ea6696032bed8f24ba0fd58fe54af5887 ))
* add full-width dropzone state and tool branding to tool page ([f2ac057 ](https://github.com/snapotter-hq/snapotter/commit/f2ac05747e1f3ffde4f2e3b3bf321237ef699e85 ))
* add GET /api/v1/tools/popular endpoint ([1107005 ](https://github.com/snapotter-hq/snapotter/commit/110700520cfaf4c70e54ff11e7cdee7f7cf50f66 ))
* add landing tool command center ([#386 ](https://github.com/snapotter-hq/snapotter/issues/386 )) ([3b1d484 ](https://github.com/snapotter-hq/snapotter/commit/3b1d484b4d4cc9e9da843ceeb442c6dbf7c8066c ))
* add OpenTelemetry distributed tracing (enterprise) ([#232 ](https://github.com/snapotter-hq/snapotter/issues/232 )) ([3fb8164 ](https://github.com/snapotter-hq/snapotter/commit/3fb8164fa539ef952fddcef89bcec01097db991e ))
* add page-level drop overlay and paste handler on tool page ([6ea515c ](https://github.com/snapotter-hq/snapotter/commit/6ea515ccdd7cd35f3727d0cf4137b81e9bdea050 ))
* add per-tool permission model with category and per-tool modes ([9fa23f4 ](https://github.com/snapotter-hq/snapotter/commit/9fa23f454322808d8c791b9d26b6bdbd1a5e9e73 ))
* add per-user rate limiting and concurrent job limits ([239f85f ](https://github.com/snapotter-hq/snapotter/commit/239f85f098c5c6d3576531e915f57f6128bec357 ))
* add PostHog customer feedback ([649e65b ](https://github.com/snapotter-hq/snapotter/commit/649e65b035c6efbfbe32e4b1db040aa0f9f6ac81 ))
* add recent tools tracking via localStorage ([6c61ae4 ](https://github.com/snapotter-hq/snapotter/commit/6c61ae47f496b1aaf937228fe7c55058b0b0756f ))
* add request correlation IDs to audit logs and response headers ([1cf1f47 ](https://github.com/snapotter-hq/snapotter/commit/1cf1f47d6f0554853a501ae1220dbdc0678820cb ))
* add session idle timeout and concurrent session limit ([3cc4ef6 ](https://github.com/snapotter-hq/snapotter/commit/3cc4ef6895ddfc904252e4e99c48d5df41b4c17e ))
* add settings slide-in, review panel with size delta, start-over preserving settings ([45121c1 ](https://github.com/snapotter-hq/snapotter/commit/45121c1a1e8f8f4ab8cbf9601c50faf4a2237803 ))
* add Sign PDF tool (draw/type/upload signatures, place on a PDF) ([#370 ](https://github.com/snapotter-hq/snapotter/issues/370 )) ([0cdd560 ](https://github.com/snapotter-hq/snapotter/commit/0cdd560ac46827f7e103e9f1921aec58d226a7db ))
* add storage usage tracking with DB counters and reconciliation ([aaa8a37 ](https://github.com/snapotter-hq/snapotter/commit/aaa8a37c9b3b490a8455311be89a0bd4b858a897 ))
* add team-level storage quotas with enforcement on upload and save ([d064286 ](https://github.com/snapotter-hq/snapotter/commit/d0642865590a56769adbc2d7bc6741a12800af52 ))
* add TopNav and AvatarDropdown components ([f79958a ](https://github.com/snapotter-hq/snapotter/commit/f79958a6229015ad64149dadc1fe27909f314a57 ))
* add usage onboarding survey overlay ([#388 ](https://github.com/snapotter-hq/snapotter/issues/388 )) ([a0d1c70 ](https://github.com/snapotter-hq/snapotter/commit/a0d1c70172f24af0d4656b6256fc1bfcb9256e69 ))
* add webhook delivery module with retry and backoff ([ab88b9a ](https://github.com/snapotter-hq/snapotter/commit/ab88b9ad0d9104ae69862309f9d2b35c0251d6bc ))
* **ai:** add a Reset AI Environment admin feature for the upgrade gap ([#459 ](https://github.com/snapotter-hq/snapotter/issues/459 )) ([fb96cf8 ](https://github.com/snapotter-hq/snapotter/commit/fb96cf874364b331f152d414b69f8831d0004d07 ))
* All tab groups tools by modality with collapsible sections ([e7126f9 ](https://github.com/snapotter-hq/snapotter/commit/e7126f92931e1c0277aca6c56ef06276d961ef64 ))
* all-in-one embedded single-container mode ([#377 ](https://github.com/snapotter-hq/snapotter/issues/377 )) ([084a9c9 ](https://github.com/snapotter-hq/snapotter/commit/084a9c9faa48a0b090b1d74be97297a3d5d6f727 ))
* **analytics:** build-time bake + telemetry depth ([#336 ](https://github.com/snapotter-hq/snapotter/issues/336 )) ([5d36ac0 ](https://github.com/snapotter-hq/snapotter/commit/5d36ac06d88fc4ca3dbf48294c132249921207d9 ))
* **analytics:** inject Sentry DSN + PostHog key from build env ([#367 ](https://github.com/snapotter-hq/snapotter/issues/367 )) ([9819c58 ](https://github.com/snapotter-hq/snapotter/commit/9819c5885eab3ea9857dc3b4ca4465fb4b0994f9 )), closes [#336 ](https://github.com/snapotter-hq/snapotter/issues/336 )
* **analytics:** upload web source maps to Sentry + tie release to build ([#369 ](https://github.com/snapotter-hq/snapotter/issues/369 )) ([1c202c6 ](https://github.com/snapotter-hq/snapotter/commit/1c202c6ef08943f05d31fd4d83dff817e1c1503b ))
* **api:** section-prefix all custom tool route literals ([10bb73f ](https://github.com/snapotter-hq/snapotter/commit/10bb73ffc116814f4dc6ba9c33ed32d8d32d912d ))
* **api:** section-prefix factory + batch routes via apiToolPath (+section validation) ([68dd7da ](https://github.com/snapotter-hq/snapotter/commit/68dd7dabaa7a9e6d87017b257b5c8cb0f34ae90e ))
* arrow key navigation in Files list ([52693fc ](https://github.com/snapotter-hq/snapotter/commit/52693fc843143b9ac2d788fb9b5321ee3a52409f ))
* **audit:** add TOOL_EXECUTED logging with opt-in setting ([36f083b ](https://github.com/snapotter-hq/snapotter/commit/36f083ba64bfa2063c724223c3d59ffadb626cb5 ))
* **audit:** capture IP address, make TRUST_PROXY configurable ([5d2f520 ](https://github.com/snapotter-hq/snapotter/commit/5d2f520d7823969578945acfd3e6799bfd6ff3f7 ))
* **audit:** extensible event type system with shared constants ([37b2b9c ](https://github.com/snapotter-hq/snapotter/commit/37b2b9c2eef0e2926dbee03f6b24f16eb53f544e ))
* **automate:** make the pipeline builder fully multi-modal ([#335 ](https://github.com/snapotter-hq/snapotter/issues/335 )) ([a53038e ](https://github.com/snapotter-hq/snapotter/commit/a53038ed9610a964090a98f6973a25449a1e4a9f ))
* bump feature manifest to v2 with archive metadata ([a4ac7cf ](https://github.com/snapotter-hq/snapotter/commit/a4ac7cf7d66240f64fc7c394711a4ab5b5036056 ))
* **ci:** add verify job to ai-bundles workflow ([7d09927 ](https://github.com/snapotter-hq/snapotter/commit/7d099274c120c28845ab40fa8b00754015552901 ))
* **ci:** add verify-bundle.sh for AI bundle smoke testing ([5ee948d ](https://github.com/snapotter-hq/snapotter/commit/5ee948d36a998f8a39b92d31cc9e3def331535e8 ))
* clean preview button with progress bar, add document preview support ([3decfaa ](https://github.com/snapotter-hq/snapotter/commit/3decfaae3ea0180415851cacfc88674b50418c01 ))
* clean tool page nav, add Import from Files on dropzone ([b5eef64 ](https://github.com/snapotter-hq/snapotter/commit/b5eef644e3c932b18884141055b65a7904d57665 ))
* copy-primary for data tools, download-all label for multi-output, batch failure display ([bc3ad2b ](https://github.com/snapotter-hq/snapotter/commit/bc3ad2b008e789b92597688923690f28d5cf54ed ))
* **db:** add audit integrity/requestId columns, user_preferences table, audit indexes ([cafd2d8 ](https://github.com/snapotter-hq/snapotter/commit/cafd2d8b6547eccdb9735acf344207534c13aeae ))
* **db:** add data lifecycle columns (deleteAfter, legalHold, quotas, retention) ([7e5843c ](https://github.com/snapotter-hq/snapotter/commit/7e5843cd403b2d59d844d5a1d8d3a9ccb0618899 ))
* **db:** add identity columns (lastActivity, toolPermissions, TOTP) ([7ed043e ](https://github.com/snapotter-hq/snapotter/commit/7ed043ec5301106ad64ec0accc7ce411d818a469 ))
* disable auto-save, add Save to Files button, accept all file types in library ([d0795b6 ](https://github.com/snapotter-hq/snapotter/commit/d0795b69eaecf61cdb65377ee5561fca64c1de26 ))
* **docs:** Two-Doors home, otter-orange brand, Pagefind search, and enterprise SSO/SCIM/roles guides ([91ac583 ](https://github.com/snapotter-hq/snapotter/commit/91ac583e873d70fed01ecdb337c60a0234ebdc1d ))
* **enterprise:** add audit log archival with crash-safe state machine ([c1dc27f ](https://github.com/snapotter-hq/snapotter/commit/c1dc27f2484120f7f4571c8472fccd292e43f259 ))
* **enterprise:** add audit log export endpoint (CSV/JSON) ([913dd6b ](https://github.com/snapotter-hq/snapotter/commit/913dd6bbe1518e7b709dd002329417789e103f49 ))
* **enterprise:** add configuration export/import with dry-run and dependency validation ([0f883fe ](https://github.com/snapotter-hq/snapotter/commit/0f883fe853fb818275bcdb44248f99e24ca33083 ))
* **enterprise:** add GDPR user data export (async) ([b6a8226 ](https://github.com/snapotter-hq/snapotter/commit/b6a82268377bc331e38e65dcf80fe60aec6a2ff2 ))
* **enterprise:** add GDPR user/team data purge with audit redaction ([dd2a507 ](https://github.com/snapotter-hq/snapotter/commit/dd2a50799a255a05e732de5943a7481b91b2c86d ))
* **enterprise:** add IP allowlisting with CIDR matching and Redis cache ([db6f7bf ](https://github.com/snapotter-hq/snapotter/commit/db6f7bf38af677f896a69ea75c2cd68ec05bffb7 ))
* **enterprise:** add legal hold with cleanup bypass ([fa7da7c ](https://github.com/snapotter-hq/snapotter/commit/fa7da7ce0c3bf480a59b429c1ad39ab23fe7cf18 ))
* **enterprise:** add per-team retention overrides with deleteAfter ([b60f550 ](https://github.com/snapotter-hq/snapotter/commit/b60f550b3fa54c4b10681e6281e989678b6c955a ))
* **enterprise:** add SAML 2.0 SSO with SP-initiated login ([54132d1 ](https://github.com/snapotter-hq/snapotter/commit/54132d1833439425825954c4c55fba7975e24d0a ))
* **enterprise:** add SCIM 2.0 provisioning (Users + Groups) ([a1b5c6d ](https://github.com/snapotter-hq/snapotter/commit/a1b5c6d2c30c8a195a17b534a18c5fb93733135a ))
* **enterprise:** add SIEM webhook forwarding with circuit breaker ([d3f30a2 ](https://github.com/snapotter-hq/snapotter/commit/d3f30a2f5d1d846bb4d56a3d2f0c208065258ba8 ))
* **enterprise:** add SSO enforcement mode with break-glass admin ([0c4468a ](https://github.com/snapotter-hq/snapotter/commit/0c4468a004c228e860912dd8e3e662d270d3d113 ))
* **enterprise:** add tamper-resistant audit mode with HMAC integrity ([895e29e ](https://github.com/snapotter-hq/snapotter/commit/895e29e93fb141a279dcd090ad0199f248faed2f ))
* **enterprise:** add TOTP MFA with enrollment, verification, and recovery codes ([1787be3 ](https://github.com/snapotter-hq/snapotter/commit/1787be35fe4b6d3b1f313511cc36c2277df64034 ))
* **enterprise:** add unified webhook system with admin alerts ([d86e458 ](https://github.com/snapotter-hq/snapotter/commit/d86e4585e4e1069fa95aa49de951827fbdccf8f3 ))
* **enterprise:** add upgrade management endpoints (version, migrations, readiness) ([03e12e6 ](https://github.com/snapotter-hq/snapotter/commit/03e12e6f0b92308dc311a33a848cf09cd7e74bfd ))
* expand alternatives comparisons ([#384 ](https://github.com/snapotter-hq/snapotter/issues/384 )) ([174001d ](https://github.com/snapotter-hq/snapotter/commit/174001d3844172fbc8d7dad8282ef1d83a8e4d7f ))
* expand Prometheus metrics with request duration, storage, and auth counters ([fb14f41 ](https://github.com/snapotter-hq/snapotter/commit/fb14f41512e8d65417b6a7dee129d48f05285459 ))
* extend crash recovery for pre-built bundle artifacts ([d1e9536 ](https://github.com/snapotter-hq/snapotter/commit/d1e9536cffb7a53a291627bd36d173d850082a41 ))
* extend health endpoints with disk space, S3, storage, and backup checks ([6237684 ](https://github.com/snapotter-hq/snapotter/commit/6237684ec86289fdfab5ed982dd2af6a9a5e37d1 ))
* extend importBundleArchive for site-packages and fixups ([5d5240e ](https://github.com/snapotter-hq/snapotter/commit/5d5240e48131653e3a64917fae312a044326992c ))
* **feedback:** always-on nav button with GitHub/email handoff when analytics is off ([#428 ](https://github.com/snapotter-hq/snapotter/issues/428 )) ([5dcc06a ](https://github.com/snapotter-hq/snapotter/commit/5dcc06a99ea18a6b5448b3a7a1e54b40158c8b07 ))
* **feedback:** route failed-run Report issue through the offline handoff ([#429 ](https://github.com/snapotter-hq/snapotter/issues/429 )) ([8cdd85a ](https://github.com/snapotter-hq/snapotter/commit/8cdd85a49339c2cce3c916b756e4c6da1fe2abfc ))
* filter files by modality when importing from tool page ([826f1ef ](https://github.com/snapotter-hq/snapotter/commit/826f1efc087d1708ee1171b145f710e57a9d7ed2 ))
* **i18n:** add repair UI strings for broken AI bundles ([8e15fe7 ](https://github.com/snapotter-hq/snapotter/commit/8e15fe7a3f633771ba05e1b4cb2f3eae15b5bed0 ))
* **i18n:** raise translation coverage across all 20 locales ([#332 ](https://github.com/snapotter-hq/snapotter/issues/332 )) ([ffbf4f9 ](https://github.com/snapotter-hq/snapotter/commit/ffbf4f9e10f5e8f4fde9be286e0e7a024dde7a15 ))
* **i18n:** raise translation coverage across all 20 locales (round 2) ([#453 ](https://github.com/snapotter-hq/snapotter/issues/453 )) ([44e1f90 ](https://github.com/snapotter-hq/snapotter/commit/44e1f90e4a847b7059869cd5750280f472ef3a05 )), closes [#428 ](https://github.com/snapotter-hq/snapotter/issues/428 ) [425/#426](https://github.com/snapotter-hq/snapotter/issues/426 )
* Import from Files works, remove pipeline button from files page ([b8a6b20 ](https://github.com/snapotter-hq/snapotter/commit/b8a6b2018ed1736ab4f9f234b435bce666c10d90 ))
* inline error messages with recovery actions ([56cd843 ](https://github.com/snapotter-hq/snapotter/commit/56cd843482ab93d59f26fc360fa48d11f161c815 ))
* **landing,docs:** SEO fixes and query-matched tool pages ([#383 ](https://github.com/snapotter-hq/snapotter/issues/383 )) ([ec98dfd ](https://github.com/snapotter-hq/snapotter/commit/ec98dfde9a63590f513c1448a18a57f836ad1515 ))
* **landing:** add animated shadergradient hero background ([#411 ](https://github.com/snapotter-hq/snapotter/issues/411 )) ([5500fac ](https://github.com/snapotter-hq/snapotter/commit/5500facc5d8d38437bd976663a10b41ba71bee10 ))
* **landing:** auto-refresh live GitHub stars and image-pull stats ([#292 ](https://github.com/snapotter-hq/snapotter/issues/292 )) ([33671d2 ](https://github.com/snapotter-hq/snapotter/commit/33671d2d9227ffbb3580e8b7d40fd260c06d7853 ))
* **landing:** enterprise-focused hero redesign and section polish ([#239 ](https://github.com/snapotter-hq/snapotter/issues/239 )) ([f622a4f ](https://github.com/snapotter-hq/snapotter/commit/f622a4f691dce066adcc31bd8838b1f4014b92e0 ))
* **landing:** generate 301 redirects for old tool URLs; fix robots sitemap reference ([0051655 ](https://github.com/snapotter-hq/snapotter/commit/0051655bbf0201642f97436adf5c3130af8131c0 ))
* **landing:** migrate from Next.js to Astro 5 ([8403222 ](https://github.com/snapotter-hq/snapotter/commit/8403222d08034362382a902feec509665cb32bcb ))
* **landing:** one-command Docker quickstart + live-demo CTA in hero ([#455 ](https://github.com/snapotter-hq/snapotter/issues/455 )) ([aaf39a1 ](https://github.com/snapotter-hq/snapotter/commit/aaf39a1b7221e6581b681e776513063aed39eed3 ))
* **landing:** refocus hero on privacy-sensitive teams ([#431 ](https://github.com/snapotter-hq/snapotter/issues/431 )) ([8451f9b ](https://github.com/snapotter-hq/snapotter/commit/8451f9be0883dc58ac4413bc00c6e6edd082a896 ))
* **landing:** section-nested tool routes, section index pages, and section-prefixed links ([f158be6 ](https://github.com/snapotter-hq/snapotter/commit/f158be6aaa1e4ce907e0abe93a20f6791168b310 ))
* **landing:** swap Try Demo for Get Started Free CTA in top nav ([#418 ](https://github.com/snapotter-hq/snapotter/issues/418 )) ([ea004a3 ](https://github.com/snapotter-hq/snapotter/commit/ea004a3308de489efa45fa77585ec4da9da82180 ))
* **landing:** warm up the contact CTAs ([#412 ](https://github.com/snapotter-hq/snapotter/issues/412 )) ([3d4a84d ](https://github.com/snapotter-hq/snapotter/commit/3d4a84d06865f0d790d39fee50809633cc6892c8 ))
* make password policy configurable via admin settings ([8b349b0 ](https://github.com/snapotter-hq/snapotter/commit/8b349b0341b8cde518558c8ef83523263a95abae ))
* merge PostHog customer feedback ([1d99acf ](https://github.com/snapotter-hq/snapotter/commit/1d99acf9ee30e0fe9528b02761a3eed5e808f0b8 ))
* mobile layout for tool-first flow ([896acda ](https://github.com/snapotter-hq/snapotter/commit/896acda7ed033a13817d3556c50cea35ec884c3c ))
* modality-aware file preview in Files library ([a70b13a ](https://github.com/snapotter-hq/snapotter/commit/a70b13ad3207617c794fd90bf5c5dcd85c4a90ec ))
* modality-based URLs (/image/resize, /video/compress-video) ([ea83e1c ](https://github.com/snapotter-hq/snapotter/commit/ea83e1c8b4af7e613b4a5184b7b3e816ba1f1376 ))
* **modality:** rename "file" modality label "Data" -> "Files" ([71fefc0 ](https://github.com/snapotter-hq/snapotter/commit/71fefc05b08bdfc344de6beb16963b7cc632fac2 ))
* move theme toggle and language selector to top nav bar ([aff9159 ](https://github.com/snapotter-hq/snapotter/commit/aff9159ae0ef251a5be46bbae5a8a20ede2c419a ))
* on-demand preview generation with progress messages for non-native formats ([d3cd4e4 ](https://github.com/snapotter-hq/snapotter/commit/d3cd4e41b5c8fab1732c16243c0a6c5c46b0b63e ))
* pin frequently-used tools to the top of the dashboard ([#440 ](https://github.com/snapotter-hq/snapotter/issues/440 )) ([3aaaacc ](https://github.com/snapotter-hq/snapotter/commit/3aaaacc7a1830d748a3f6602cc6a81efbc9a9f32 ))
* pipeline templates, analytics opt-out, 83 conversion presets, positioning + e2e modernization ([63a03d2 ](https://github.com/snapotter-hq/snapotter/commit/63a03d26f2f627578420dc4b7011e1078635651a )), closes [#355 ](https://github.com/snapotter-hq/snapotter/issues/355 ) [#354 ](https://github.com/snapotter-hq/snapotter/issues/354 ) [#356 ](https://github.com/snapotter-hq/snapotter/issues/356 ) [#353 ](https://github.com/snapotter-hq/snapotter/issues/353 ) [#351 ](https://github.com/snapotter-hq/snapotter/issues/351 )
* polish home page UI -- card borders, colored icons, 3-col grid, Cmd+K hint ([ade79c5 ](https://github.com/snapotter-hq/snapotter/commit/ade79c53a59cd3a991224f5e82b9a6e3861457bf ))
* redesign review panel action hierarchy ([ed458d4 ](https://github.com/snapotter-hq/snapotter/commit/ed458d4bbdfaeb7054fa15c1fbaf2616ed19f45f ))
* remove /fullscreen route, add dynamic page titles ([f9ebb30 ](https://github.com/snapotter-hq/snapotter/commit/f9ebb304db1b71ad0e6149d094dd7f6cac8777db ))
* replace sidebar with top nav bar across all pages ([71fef43 ](https://github.com/snapotter-hq/snapotter/commit/71fef439a0d41bce34890d637c40a670fb2ce443 ))
* request a tool when home search finds nothing ([#385 ](https://github.com/snapotter-hq/snapotter/issues/385 )) ([c68297d ](https://github.com/snapotter-hq/snapotter/commit/c68297d5a49e659645b510da245241aa26a40cb6 ))
* rewrite home page as tool-first browser with search and modality tabs ([0d751b7 ](https://github.com/snapotter-hq/snapotter/commit/0d751b7d143a9102b3fe24e94c4e49ce616ee310 ))
* rewrite install_feature.py for pre-built tar bundles ([a4fa3ce ](https://github.com/snapotter-hq/snapotter/commit/a4fa3ce2a71930a8b57fd3f17181c51f703a2081 ))
* **scripts:** add segment-anchored tool-path rewrite transform ([c17a4a4 ](https://github.com/snapotter-hq/snapotter/commit/c17a4a422582594c6e2127429a7373c2e0ade11c ))
* **scripts:** add tool-path codemod CLI ([0691457 ](https://github.com/snapotter-hq/snapotter/commit/0691457f94dd63a53285107ab56d9ba73c1b3b47 ))
* server-side preview generation for non-native video/audio formats ([412a21e ](https://github.com/snapotter-hq/snapotter/commit/412a21ee4d9a68baadef817509a5cc1a675a5143 ))
* **shared:** add apiToolPath() and section-prefixed routes; drop MODALITY_URL_SLUG ([9ca901f ](https://github.com/snapotter-hq/snapotter/commit/9ca901f8d5b23b0a03060b3384af58c60cfbbaa0 ))
* **shared:** add Section concept and toolSection() partition ([7907471 ](https://github.com/snapotter-hq/snapotter/commit/790747188afe4fa0347579d6ce2db80d68bcfd2b ))
* tiered processing feedback and upload progress indicator ([433d59c ](https://github.com/snapotter-hq/snapotter/commit/433d59c726d196c7b51ea2cc29b0e2d44fa11feb ))
* tool-first workflow polish -- fix tests, lint cleanup ([f387e98 ](https://github.com/snapotter-hq/snapotter/commit/f387e98fff6049a4869cebd4e4d7a717e7c1f28e ))
* **tools:** 2.0 phase 5 wave 2 - pdf depth (21 tools) ([#220 ](https://github.com/snapotter-hq/snapotter/issues/220 )) ([2f39e38 ](https://github.com/snapotter-hq/snapotter/commit/2f39e3816209fe81fac4620dd1233921e5de90d4 ))
* **tools:** 2.0 phase 5 wave 3a - video depth (22 tools) ([#221 ](https://github.com/snapotter-hq/snapotter/issues/221 )) ([5f98b48 ](https://github.com/snapotter-hq/snapotter/commit/5f98b485935f07e40c0a6e57548892b2e17fc03b ))
* **tools:** 2.0 phase 5 wave 3b - audio depth (14 tools) ([#222 ](https://github.com/snapotter-hq/snapotter/issues/222 )) ([638288e ](https://github.com/snapotter-hq/snapotter/commit/638288e196f05d889b5d818c0c8a11b0697ec49c ))
* **tools:** 2.0 phase 5 wave 4 - office, ebooks, data, archives (14 tools) ([#224 ](https://github.com/snapotter-hq/snapotter/issues/224 )) ([fc7c1f8 ](https://github.com/snapotter-hq/snapotter/commit/fc7c1f850e36fd01db9f08caf574f6f48d606b93 ))
* **tools:** 2.0 phase 5 wave 5a - image gap-fill (11 tools) ([#225 ](https://github.com/snapotter-hq/snapotter/issues/225 )) ([6e1b986 ](https://github.com/snapotter-hq/snapotter/commit/6e1b9865f10c50badddb693a09ec20557379fe63 ))
* **tools:** 2.0 phase 5 wave 5b - ai pool: ocr-pdf, transcription, background composites (5 tools) ([#226 ](https://github.com/snapotter-hq/snapotter/issues/226 )) ([51666cd ](https://github.com/snapotter-hq/snapotter/commit/51666cdd5fd207ceee4da38b63d998af9a044809 ))
* **web:** add data retention settings to admin UI ([3016571 ](https://github.com/snapotter-hq/snapotter/commit/3016571c2b2925e8fc7677d9d2daae2bd8191db1 ))
* **web:** add MFA login prompt and security settings UI ([d397f57 ](https://github.com/snapotter-hq/snapotter/commit/d397f576676d127ee23c49a2948b041a6a6a777e ))
* **web:** add storage dashboard and team retention settings ([c7e9b1d ](https://github.com/snapotter-hq/snapotter/commit/c7e9b1ddc6189f847633399a982ce88cb6ae4a85 ))
* **web:** apply Otter Orange design system and UI improvements ([bcd59c2 ](https://github.com/snapotter-hq/snapotter/commit/bcd59c20c7da6208e937cac0a9b9f02ecf73b4f1 )), closes [#E07832](https://github.com/snapotter-hq/snapotter/issues/E07832 ) [#2563eb](https://github.com/snapotter-hq/snapotter/issues/2563eb )
* **web:** complete audit log viewer with IP column and all event types ([c6f9a29 ](https://github.com/snapotter-hq/snapotter/commit/c6f9a29687562c929d708a110eb0b7145c4dab11 ))
* **web:** fuzzy search with fuse.js for typo-tolerant tool discovery ([22cccd4 ](https://github.com/snapotter-hq/snapotter/commit/22cccd46c44c386aed5303efbd608105ddc1b30f ))
* **web:** group home grid, tabs, and breadcrumb by section ([8301676 ](https://github.com/snapotter-hq/snapotter/commit/8301676e139fa0ed1d2423e133b11e0214bfe4cd ))
* **web:** icon-only modality tabs, merge documents and files ([cc06c80 ](https://github.com/snapotter-hq/snapotter/commit/cc06c802c13b4d229fa2a97c3493aef4a555b1e6 ))
* **web:** in-canvas zoom & pan for the object eraser and split tools ([#320 ](https://github.com/snapotter-hq/snapotter/issues/320 )) ([95d100c ](https://github.com/snapotter-hq/snapotter/commit/95d100c20bd9b41cca3190a7791807516d2a17e4 ))
* **web:** modality filter tabs in sidebar tool panel ([8adceaf ](https://github.com/snapotter-hq/snapotter/commit/8adceaf92d3effd8b4a2f15d6f8ecfc0f6c1ab8d ))
* **web:** modality tabs on fullscreen grid page ([82fb798 ](https://github.com/snapotter-hq/snapotter/commit/82fb798142663b22d23bda69bf66d0d8cb56def9 ))
* **web:** section-prefix all tool API calls ([22b4b5c ](https://github.com/snapotter-hq/snapotter/commit/22b4b5c3c17ea28712e2e9bf06ca35b6c5a23bd3 ))
* **web:** show icon + text labels on modality filter tabs ([888d243 ](https://github.com/snapotter-hq/snapotter/commit/888d243a653b7ecfab20830be2ea8baa961f8e71 ))
* **web:** stronger modality section visual hierarchy in tool catalog ([3db1b3b ](https://github.com/snapotter-hq/snapotter/commit/3db1b3bafd9bfcde86c9d74037a30114437e4f71 ))
* wire AI bundle build into release pipeline ([d0732d4 ](https://github.com/snapotter-hq/snapotter/commit/d0732d4a586be25231be93e51e94db7ae05ae8ca ))
### Reverts
* **deps:** keep rembg at 2.0.69 (2.0.75 conflicts with pinned numpy==1.26.4) ([4fdd10f ](https://github.com/snapotter-hq/snapotter/commit/4fdd10f488642eabe671aa111796d343d0e2d358 ))
### BREAKING CHANGES
* SnapOtter 2.0 - the platform re-architecture (Postgres 17 +
Redis 8 + BullMQ durable jobs, 157 tools across five modalities) is the 2.0
release line, replacing the 1.x SQLite single-container architecture.
* SQLite is no longer the runtime database. Deployments now
require Postgres (and Redis, used from phase 2). Existing installs migrate
with SQLITE_MIGRATE_PATH or 'pnpm --filter @snapotter/api migrate:sqlite'.
* fix(ci): postgres service + fresh e2e database per run; ignore unfixable torch CVE-2025-3000
2026-07-07 07:36:51 +00:00
SnapOtter
0309e0f680
chore: deploy to Cloudflare Pages and update branding
...
- Add Cloudflare Pages deployment for landing page (snapotter.com) and
docs (docs.snapotter.com)
- Create deploy-landing.yml and update deploy-docs.yml workflows
- Update CI to ignore apps/landing/** paths
- Fix logo transparency (remove white background) across all apps
- Recreate social-preview.png with SnapOtter branding
- Update all docs URLs from GitHub Pages to docs.snapotter.com
- Update VitePress config: light theme default, fix llms.txt paths
- Add .vitepress/cache/ and .env.* to gitignore
2026-04-24 18:06:29 +08:00
semantic-release-bot
95af281584
chore(release): 1.15.8 [skip ci]
...
## [1.15.8](https://github.com/ashim-hq/ashim/compare/v1.15.7...v1.15.8 ) (2026-04-17)
### Bug Fixes
* copy Node.js from official image instead of apt-get install ([536125e ](https://github.com/ashim-hq/ashim/commit/536125ec9fbc5758bdd3e8f0f4c44253de2231c7 ))
2026-04-17 07:36:40 +00:00
semantic-release-bot
caa2160ef8
chore(release): 1.15.7 [skip ci]
...
## [1.15.7](https://github.com/ashim-hq/ashim/compare/v1.15.6...v1.15.7 ) (2026-04-17)
### Bug Fixes
* add retry with backoff for apt-get update on CUDA base image ([3d6db5a ](https://github.com/ashim-hq/ashim/commit/3d6db5a32d3f9292d5476e9bd80c1f06624fa316 ))
2026-04-17 07:04:40 +00:00
semantic-release-bot
23dae8d152
chore(release): 1.15.6 [skip ci]
...
## [1.15.6](https://github.com/ashim-hq/ashim/compare/v1.15.5...v1.15.6 ) (2026-04-17)
### Performance Improvements
* parallelize model downloads and switch to registry cache ([79c4ed6 ](https://github.com/ashim-hq/ashim/commit/79c4ed6a359b008dedeb154a55e2764ee0e3d9fa ))
2026-04-17 06:55:08 +00:00
semantic-release-bot
2fd0c00564
chore(release): 1.15.5 [skip ci]
...
## [1.15.5](https://github.com/ashim-hq/ashim/compare/v1.15.4...v1.15.5 ) (2026-04-17)
### Bug Fixes
* exclude e2e-docker tests from Vitest runner ([8df18c5 ](https://github.com/ashim-hq/ashim/commit/8df18c56a6c69e2a188cf0e7c97e692cd4c0e7ec ))
2026-04-17 06:41:05 +00:00
semantic-release-bot
3dc98374e2
chore(release): 1.15.4 [skip ci]
...
## [1.15.4](https://github.com/ashim-hq/ashim/compare/v1.15.3...v1.15.4 ) (2026-04-17)
### Bug Fixes
* verbose error handling, batch processing, and multi-file support ([3223960 ](https://github.com/ashim-hq/ashim/commit/32239600ae6ce30628e77e61a805ca0a167b5068 ))
* verbose errors, batch processing, multi-file support ([#1 ](https://github.com/ashim-hq/ashim/issues/1 )) ([8b87cf8 ](https://github.com/ashim-hq/ashim/commit/8b87cf888c6194e2af427a180607d7c53a1d15b9 ))
2026-04-17 06:21:10 +00:00
semantic-release-bot
b76b9a1878
chore(release): 1.15.3 [skip ci]
...
## [1.15.3](https://github.com/ashim-hq/ashim/compare/v1.15.2...v1.15.3 ) (2026-04-16)
### Bug Fixes
* retry apt-get update on transient mirror sync errors (Acquire::Retries=3) ([cec7163 ](https://github.com/ashim-hq/ashim/commit/cec71632d0c868c3a413b813ff15baccc8fa8cdd ))
2026-04-16 19:46:27 +00:00
semantic-release-bot
59e6f2f28c
chore(release): 1.15.2 [skip ci]
...
## [1.15.2](https://github.com/ashim-hq/ashim/compare/v1.15.1...v1.15.2 ) (2026-04-16)
### Bug Fixes
* use GHCR_TOKEN with write:packages scope for GHCR login ([e14414f ](https://github.com/ashim-hq/ashim/commit/e14414f3061981b1454dc7d4504c64ec01db945e ))
2026-04-16 18:13:08 +00:00
semantic-release-bot
fd1eb9c781
chore(release): 1.15.1 [skip ci]
...
## [1.15.1](https://github.com/ashim-hq/ashim/compare/v1.15.0...v1.15.1 ) (2026-04-16)
### Bug Fixes
* **docker:** create /opt/models unconditionally so chown works in CI ([93ce289 ](https://github.com/ashim-hq/ashim/commit/93ce2891cc26afc93f01168d008927d3d356c1a9 ))
* **docker:** run frontend builder on BUILDPLATFORM to fix esbuild crash under QEMU ([6a3ad0d ](https://github.com/ashim-hq/ashim/commit/6a3ad0d496e291b30a3f719ca079c43ce7aab705 ))
* resolve runtime model path mismatch for non-root Docker user ([f28792a ](https://github.com/ashim-hq/ashim/commit/f28792a5ed78221f38cf2f3c80cae9f24cd7f5e3 ))
2026-04-16 15:46:06 +00:00
Siddharth Kumar Sah
85b1cfc10a
chore: rename Stirling-Image to ashim across entire codebase
...
Complete rebrand from Stirling-Image to ashim following the project
move to https://github.com/ashim-hq/ashim .
Changes across 117 files:
- Package scope: @stirling-image/* → @ashim/*
- GitHub URLs: stirling-image/stirling-image → ashim-hq/ashim
- Docker Hub: stirlingimage/stirling-image → ashimhq/ashim
- GitHub Pages: stirling-image.github.io → ashim-hq.github.io
- All branding text: "Stirling Image" → "ashim"
- Docker service/volumes/user: stirling → ashim
- Database: stirling.db → ashim.db
- localStorage keys: stirling-token → ashim-token
- Environment variables: STIRLING_GPU → ASHIM_GPU
- Python cache dirs: .cache/stirling-image → .cache/ashim
- SVG filter IDs, test prefixes, and all other references
2026-04-14 20:55:42 +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
semantic-release-bot
2ac7b6875b
chore(release): 1.14.0 [skip ci]
...
# [1.14.0](https://github.com/stirling-image/stirling-image/compare/v1.13.0...v1.14.0 ) (2026-04-10)
### Bug Fixes
* add FILES_STORAGE_PATH to Dockerfile ENV to prevent data loss ([b575243 ](https://github.com/stirling-image/stirling-image/commit/b575243e9a0cb2ac4567d785a74e57dea912e9e2 ))
* add shutdown timeout and improve health endpoint ([986ad37 ](https://github.com/stirling-image/stirling-image/commit/986ad37bb5e6644dd93521018a1bcd2d6243f502 ))
* address code review findings before merge ([caf65bc ](https://github.com/stirling-image/stirling-image/commit/caf65bc4697ddfea27674b56fd2e8de847edc734 ))
* correct PaddleOCR language codes for model download and OCR ([e1ee571 ](https://github.com/stirling-image/stirling-image/commit/e1ee57103c201f104b737c2719d0014d4912d4b2 ))
* force CPU mode in download_models.py for build-time compatibility ([b4b59a7 ](https://github.com/stirling-image/stirling-image/commit/b4b59a7500375bc2e65cb0050e5308b07610d2cf ))
* handle paddlepaddle-gpu CUDA import at build time gracefully ([0083a74 ](https://github.com/stirling-image/stirling-image/commit/0083a741a9a3924ccc37c4e622c2980a8a41f1a3 ))
* install cuda-compat stubs for build-time PaddlePaddle import ([d31d665 ](https://github.com/stirling-image/stirling-image/commit/d31d66556ef0aa7c20a73a94f5d95b54b99fbb8a ))
* load RealESRGAN pretrained weights for actual AI upscaling ([fa9569c ](https://github.com/stirling-image/stirling-image/commit/fa9569c920d6bdac094dcd661fc5cf3b4be3f17a ))
* revert to npx tsx in CMD for pnpm compatibility ([e55253d ](https://github.com/stirling-image/stirling-image/commit/e55253dee03f9e93187d50e0ffb66b423a1230c0 ))
* simplify smoke test to CPU-only imports for build-time compat ([3481663 ](https://github.com/stirling-image/stirling-image/commit/34816639609cbccab91a5cad5760fea769c4b565 ))
* skip RealESRGAN import check on arm64 in smoke test ([1e2ef52 ](https://github.com/stirling-image/stirling-image/commit/1e2ef5284686253ae33e05411a515369b7f41a3e ))
* split paddlepaddle-gpu and paddleocr installs, use --extra-index-url ([74183e8 ](https://github.com/stirling-image/stirling-image/commit/74183e8dc1e3d8f90cff4484f5526c3c3dfba9a6 ))
* suppress ML library stdout noise in ocr.py and upscale.py ([c0b419d ](https://github.com/stirling-image/stirling-image/commit/c0b419de21acb92b243ef78191dff6a2153c5961 ))
* use PaddlePaddle GPU package index for CUDA wheels ([dd9528f ](https://github.com/stirling-image/stirling-image/commit/dd9528f53c9bcf148842ab94f14a4ebd5ae223ec ))
* use platform-specific mediapipe version for arm64 compatibility ([7face19 ](https://github.com/stirling-image/stirling-image/commit/7face19238f54cfea02d453b697e34b50ccd9d21 ))
### Features
* expand model pre-download with verification and smoke test ([a9e3b96 ](https://github.com/stirling-image/stirling-image/commit/a9e3b9688776a51efd2f42cae810de425cf1d9cf ))
* simplify CI to single unified Docker build ([b385a2e ](https://github.com/stirling-image/stirling-image/commit/b385a2eabb255f7a8fe2d3720a358ff5bf254310 ))
* simplify compose to single file, add log rotation ([84f7057 ](https://github.com/stirling-image/stirling-image/commit/84f7057a49850b7a47440099ec2caad8d3b87efe ))
* unified Docker image with GPU auto-detection ([6c3eb3b ](https://github.com/stirling-image/stirling-image/commit/6c3eb3b876cee0301d5fb3ed8324a3c8e92b1307 ))
2026-04-10 14:13:37 +00:00
semantic-release-bot
aa4e5cac8d
chore(release): 1.13.0 [skip ci]
...
# [1.13.0](https://github.com/stirling-image/stirling-image/compare/v1.12.0...v1.13.0 ) (2026-04-10)
### Bug Fixes
* complete RBAC implementation lost during merge ([cc8a272 ](https://github.com/stirling-image/stirling-image/commit/cc8a27239b02a63ca88abc3e363c8a46f89674e8 ))
### Features
* add backend permission map and requirePermission middleware ([1a99571 ](https://github.com/stirling-image/stirling-image/commit/1a995711535a1525e709cdd7bff75361f457e942 ))
* add permission checks and admin override to API key routes ([d776680 ](https://github.com/stirling-image/stirling-image/commit/d776680f2d2342e35b84821792d6c24ae7e0ffbc ))
* add permission checks and admin override to pipeline routes ([59f40db ](https://github.com/stirling-image/stirling-image/commit/59f40dbfd4a97f8691b5fbbf6d338063c389987b ))
* add permission checks and ownership scoping to user-files routes ([86ba698 ](https://github.com/stirling-image/stirling-image/commit/86ba69825a1dd87c9f868d79cd806b7d594cce1b ))
* add shared Permission and Role types ([2f594e9 ](https://github.com/stirling-image/stirling-image/commit/2f594e96057c72bf107f3012426e87af5f97eb94 ))
* add tools:use permission check to tool, batch, pipeline, and upload routes ([885ace5 ](https://github.com/stirling-image/stirling-image/commit/885ace54f09b3301989f8aa404c15f60e19c054d ))
* extend useAuth hook with role and permissions from session ([e0ba8be ](https://github.com/stirling-image/stirling-image/commit/e0ba8be7b3211299c8cde90b2d22e7796eee2206 ))
* filter settings tabs by user permissions, remove admin fallback ([bcbd24a ](https://github.com/stirling-image/stirling-image/commit/bcbd24a2395b93b64dbbf638ba0138f9ec9ba9da ))
* include permissions and teamName in login/session responses ([4943177 ](https://github.com/stirling-image/stirling-image/commit/49431772ec6a02eae8aced48da92ef87a6c89afb ))
* replace requireAdmin with requirePermission on all routes ([af7f57d ](https://github.com/stirling-image/stirling-image/commit/af7f57d52f49c8f8412876639076084c96eba284 ))
2026-04-10 13:26:01 +00:00
semantic-release-bot
e8bad0e67b
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)
### Bug Fixes
* **a11y:** add keyboard support to pdf-to-image upload dropzone ([1778f72 ](https://github.com/stirling-image/stirling-image/commit/1778f7266b9837a07b20f167e82e1e9b163086b7 ))
* use specific selector in pdf-to-image e2e test ([b2a2c89 ](https://github.com/stirling-image/stirling-image/commit/b2a2c890a1d25f60e392e6a2df23e1600cc3ad8d ))
### Features
* add pdf-to-image backend route with info and processing endpoints ([30155c1 ](https://github.com/stirling-image/stirling-image/commit/30155c1c7073c55290d4f662f7f93779cc4512b7 ))
* add pdf-to-image frontend settings component ([44bbfba ](https://github.com/stirling-image/stirling-image/commit/44bbfba80dfb3eb069c563e5ca691a0f8dce1eea ))
* register pdf-to-image in frontend tool registry ([5fd294c ](https://github.com/stirling-image/stirling-image/commit/5fd294c994e7df076c4de0016f62d952a161345b ))
* register pdf-to-image tool in shared constants and i18n ([43324c1 ](https://github.com/stirling-image/stirling-image/commit/43324c1f23e3f278c89fa301d5a0275b12f587e7 ))
* unified Docker image with GPU auto-detection ([#37 ](https://github.com/stirling-image/stirling-image/issues/37 )) ([b0083e2 ](https://github.com/stirling-image/stirling-image/commit/b0083e2b083d0bf52b6a576f7ef67fbff0cc8cbe ))
2026-04-10 12:56:42 +00: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 ](https://github.com/stirling-image/stirling-image/commit/b0083e2b083d0bf52b6a576f7ef67fbff0cc8cbe ))
2026-04-10 05:45:42 +00: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 ](https://github.com/stirling-image/stirling-image/commit/6a362d6443cd85ac58a46f5b5cf29f9b6ff3020c ))
2026-04-07 16:53:54 +00: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 ](https://github.com/stirling-image/stirling-image/commit/d464942cd9a7c1fecc837a14211e3fc5030d5cee ))
* add content-aware resize toggle to resize settings UI ([aace4ca ](https://github.com/stirling-image/stirling-image/commit/aace4caf0c5b10059a31e9dff5476d11b34b4323 ))
* add seam carving AI bridge module ([d3b6462 ](https://github.com/stirling-image/stirling-image/commit/d3b646207d3312aea9e12cc9435649b039bc4ac8 ))
* add seam carving Python script with face protection ([1460ab7 ](https://github.com/stirling-image/stirling-image/commit/1460ab7a4ad8235714ebd72ab1f8092baa456032 ))
2026-04-07 16:11:15 +00: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 ](https://github.com/stirling-image/stirling-image/commit/171646886f678b0f98140d378e675443bc7c737f ))
* add stitch settings UI component ([330bfcf ](https://github.com/stirling-image/stirling-image/commit/330bfcf162deeb30fb573702b554d304500eebde ))
* register stitch component in web tool registry ([7ec5d86 ](https://github.com/stirling-image/stirling-image/commit/7ec5d86d9123696e84ebeae603ec09ce4c1477d3 ))
* register stitch route in API tool registry ([66520cd ](https://github.com/stirling-image/stirling-image/commit/66520cdd0ee49bbecffdb3e248c03d2763aa5d08 ))
* register stitch tool in shared constants and i18n ([fbbbe70 ](https://github.com/stirling-image/stirling-image/commit/fbbbe70a35a6cd3cbc389503cff3333b85392871 ))
2026-04-07 14:21:16 +00:00
semantic-release-bot
c598230331
chore(release): 1.8.1 [skip ci]
...
## [1.8.1](https://github.com/stirling-image/stirling-image/compare/v1.8.0...v1.8.1 ) (2026-04-07)
### Bug Fixes
* add variant diagnostics to health endpoint and lite mode banner ([3be388e ](https://github.com/stirling-image/stirling-image/commit/3be388e12f8bc6a35d30b1b94e2772f9e005bccd ))
2026-04-07 10:35:05 +00:00
semantic-release-bot
cd2db4afdd
chore(release): 1.8.0 [skip ci]
...
# [1.8.0](https://github.com/stirling-image/stirling-image/compare/v1.7.7...v1.8.0 ) (2026-04-06)
### Bug Fixes
* filter unsafe round-trip keys server-side in editMetadata ([a430e91 ](https://github.com/stirling-image/stirling-image/commit/a430e913245f6c83194cc1e47c34a327d80840d5 ))
### Features
* add edit-metadata API route with inspect and edit endpoints ([5284d5e ](https://github.com/stirling-image/stirling-image/commit/5284d5ece5dd393bf346f29d4d95b506f0c87c94 ))
* add edit-metadata UI component with granular strip support ([492eeb0 ](https://github.com/stirling-image/stirling-image/commit/492eeb0f962b50db598b5ac50cc9c2ceea9ce605 ))
* add EditMetadataOptions type and exif-reader dep to image-engine ([723c794 ](https://github.com/stirling-image/stirling-image/commit/723c79491ecbfc9795ba6bbdacc8e47caa903719 ))
* extract shared metadata parsing utilities into image-engine ([7fba05e ](https://github.com/stirling-image/stirling-image/commit/7fba05e1dccb4fd370848bf6b20276a9edffbd86 ))
* implement editMetadata operation in image-engine ([939bb04 ](https://github.com/stirling-image/stirling-image/commit/939bb049413202a4df37d1affa3765cd9a41e9e2 ))
* register edit-metadata in shared constants and i18n ([6ac366b ](https://github.com/stirling-image/stirling-image/commit/6ac366b1556b285c6764927267fcb3b885b90fe9 ))
2026-04-06 14:09:07 +00:00
semantic-release-bot
b387d2d17a
chore(release): 1.7.7 [skip ci]
...
## [1.7.7](https://github.com/stirling-image/stirling-image/compare/v1.7.6...v1.7.7 ) (2026-04-06)
### Bug Fixes
* improve AI tool reliability for face detection and background removal ([#25 ](https://github.com/stirling-image/stirling-image/issues/25 )) ([2eb77fe ](https://github.com/stirling-image/stirling-image/commit/2eb77fe0f2a2340e69cb927ef7abd32eaa0400be ))
2026-04-06 14:01:20 +00:00
semantic-release-bot
3c4562c9ce
chore(release): 1.7.6 [skip ci]
...
## [1.7.6](https://github.com/stirling-image/stirling-image/compare/v1.7.5...v1.7.6 ) (2026-04-06)
### Bug Fixes
* batch SSE progress and non-AI processing UX ([#24 ](https://github.com/stirling-image/stirling-image/issues/24 )) ([dc70cdb ](https://github.com/stirling-image/stirling-image/commit/dc70cdbdd589601446c2794fe85019c5e8252714 ))
2026-04-06 13:25:24 +00:00
semantic-release-bot
3018137548
chore(release): 1.7.5 [skip ci]
...
## [1.7.5](https://github.com/stirling-image/stirling-image/compare/v1.7.4...v1.7.5 ) (2026-04-06)
### Bug Fixes
* add server-side logging to AI tool routes ([#23 ](https://github.com/stirling-image/stirling-image/issues/23 )) ([75c7f13 ](https://github.com/stirling-image/stirling-image/commit/75c7f135feda6af190f1dd1f92dcf27d17229c31 ))
2026-04-06 13:00:53 +00:00
semantic-release-bot
48c803acfa
chore(release): 1.7.4 [skip ci]
...
## [1.7.4](https://github.com/stirling-image/stirling-image/compare/v1.7.3...v1.7.4 ) (2026-04-06)
### Bug Fixes
* batch file ordering and format preservation for image tools ([#20 ](https://github.com/stirling-image/stirling-image/issues/20 )) ([5d85562 ](https://github.com/stirling-image/stirling-image/commit/5d8556254f0684de7c3a1a177a28f8d1e0818cd3 )), closes [#13 ](https://github.com/stirling-image/stirling-image/issues/13 ) [#14 ](https://github.com/stirling-image/stirling-image/issues/14 )
2026-04-06 04:54:19 +00:00
semantic-release-bot
2eb74f242e
chore(release): 1.7.3 [skip ci]
...
## [1.7.3](https://github.com/stirling-image/stirling-image/compare/v1.7.2...v1.7.3 ) (2026-04-06)
### Bug Fixes
* **docs:** correct broken llms.txt links on REST API page ([b46d250 ](https://github.com/stirling-image/stirling-image/commit/b46d2504e17d06b075964e063de19529a42bc363 ))
2026-04-06 03:30:11 +00:00
semantic-release-bot
42525db6dc
chore(release): 1.7.2 [skip ci]
...
## [1.7.2](https://github.com/stirling-image/stirling-image/compare/v1.7.1...v1.7.2 ) (2026-04-05)
### Bug Fixes
* use torch.cuda for GPU detection instead of onnxruntime providers ([8d2f401 ](https://github.com/stirling-image/stirling-image/commit/8d2f40151277c1e00a9ca20a6956e37d2c204d48 ))
2026-04-05 14:24:35 +00:00
semantic-release-bot
e8572358e9
chore(release): 1.7.1 [skip ci]
...
## [1.7.1](https://github.com/stirling-image/stirling-image/compare/v1.7.0...v1.7.1 ) (2026-04-05)
### Bug Fixes
* prevent false GPU detection when CUDA image runs without GPU ([a291d1f ](https://github.com/stirling-image/stirling-image/commit/a291d1fe0ba6100f717441f346a6df77df7e8fdd ))
2026-04-05 14:04:25 +00:00
semantic-release-bot
609fd57de8
chore(release): 1.7.0 [skip ci]
...
# [1.7.0](https://github.com/stirling-image/stirling-image/compare/v1.6.0...v1.7.0 ) (2026-04-05)
### Bug Fixes
* **web:** skip empty Authorization header for forward-auth proxy compatibility ([d0c69d6 ](https://github.com/stirling-image/stirling-image/commit/d0c69d6a4670ce6ffa397d8b4432687ed9b4d395 )), closes [#6 ](https://github.com/stirling-image/stirling-image/issues/6 )
### Features
* add GPU/CUDA acceleration support (:cuda Docker tag) ([29a382e ](https://github.com/stirling-image/stirling-image/commit/29a382e9e0eb1ce8a7d08e68c41443495a52d3f8 ))
2026-04-05 12:36:40 +00:00
semantic-release-bot
30f36e6a5c
chore(release): 1.6.0 [skip ci]
...
# [1.6.0](https://github.com/stirling-image/stirling-image/compare/v1.5.3...v1.6.0 ) (2026-04-04)
### Features
* lightweight Docker image without AI/ML tools (:lite tag) ([449a2fc ](https://github.com/stirling-image/stirling-image/commit/449a2fc319e97cddfa71c29556e2d433dde78d6d )), closes [#1 ](https://github.com/stirling-image/stirling-image/issues/1 )
2026-04-04 16:23:46 +00:00
semantic-release-bot
51f10abb35
chore(release): 1.5.3 [skip ci]
...
## [1.5.3](https://github.com/stirling-image/stirling-image/compare/v1.5.2...v1.5.3 ) (2026-04-04)
### Bug Fixes
* use heif-convert for HEIC decoding on Linux ([98553ed ](https://github.com/stirling-image/stirling-image/commit/98553ed6743e11ff9af8e6fc718ce550d33a7f54 ))
2026-04-04 13:55:46 +00:00
semantic-release-bot
d2381af9cd
chore(release): 1.5.2 [skip ci]
...
## [1.5.2](https://github.com/stirling-image/stirling-image/compare/v1.5.1...v1.5.2 ) (2026-04-04)
### Bug Fixes
* install HEVC codec plugins for CI HEIC tests ([8991cde ](https://github.com/stirling-image/stirling-image/commit/8991cde0aba91ee50383eaf14ca0a80fcf45da55 ))
2026-04-04 13:51:05 +00:00
semantic-release-bot
169fb41d57
chore(release): 1.5.1 [skip ci]
...
## [1.5.1](https://github.com/stirling-image/stirling-image/compare/v1.5.0...v1.5.1 ) (2026-04-04)
### Bug Fixes
* install libheif-examples in CI for HEIC tests ([f07454d ](https://github.com/stirling-image/stirling-image/commit/f07454d349cc5029636aa95bac7d67f505133424 ))
2026-04-04 13:41:45 +00:00
semantic-release-bot
cafe52d55d
chore(release): 1.5.0 [skip ci]
...
# [1.5.0](https://github.com/stirling-image/stirling-image/compare/v1.4.0...v1.5.0 ) (2026-04-04)
### Features
* add HEIC/HEIF format support for input and output ([6717c17 ](https://github.com/stirling-image/stirling-image/commit/6717c17a26262f1e45037b4cb454df9400c5930e ))
2026-04-04 13:34:28 +00:00
semantic-release-bot
84283c16bd
chore(release): 1.4.0 [skip ci]
...
# [1.4.0](https://github.com/stirling-image/stirling-image/compare/v1.3.1...v1.4.0 ) (2026-04-04)
### Features
* add "Crop to Content" mode to smart crop tool ([93ad7cd ](https://github.com/stirling-image/stirling-image/commit/93ad7cdfc170717a980ba12a2d90e8e3a9109989 )), closes [#7 ](https://github.com/stirling-image/stirling-image/issues/7 )
2026-04-04 11:50:22 +00:00
semantic-release-bot
dba3f65d8c
chore(release): 1.3.1 [skip ci]
...
## [1.3.1](https://github.com/stirling-image/stirling-image/compare/v1.3.0...v1.3.1 ) (2026-04-04)
### Bug Fixes
* default theme to light instead of following system preference ([30908ed ](https://github.com/stirling-image/stirling-image/commit/30908ed058439f0cc8cc70976091083c260d6b05 ))
2026-04-04 11:42:34 +00:00
semantic-release-bot
bc2d9bcea1
chore(release): 1.3.0 [skip ci]
...
# [1.3.0](https://github.com/stirling-image/stirling-image/compare/v1.2.1...v1.3.0 ) (2026-04-04)
### Bug Fixes
* add XHR timeout to prevent UI spinning forever ([dae27f4 ](https://github.com/stirling-image/stirling-image/commit/dae27f4d559d873af13b683a7b64e273d752e057 ))
* disable worker pool to prevent Docker processing hang ([5cd2b86 ](https://github.com/stirling-image/stirling-image/commit/5cd2b864bd878c80990d7ce47050b8e777f333a3 ))
* log volume permission errors instead of swallowing them ([3642b7d ](https://github.com/stirling-image/stirling-image/commit/3642b7d3b23649a2c65e8580cf760714fa725ff3 ))
* replace crypto.randomUUID with generateId in AI tool settings ([659081c ](https://github.com/stirling-image/stirling-image/commit/659081c5686bfdee8f3155714fcdba712ad154ab ))
* replace crypto.randomUUID with generateId in pipeline/automation ([b650dcd ](https://github.com/stirling-image/stirling-image/commit/b650dcd79128d95e66f2f1f172805e22ffa97f0d ))
* replace crypto.randomUUID with generateId in use-tool-processor ([7a5a753 ](https://github.com/stirling-image/stirling-image/commit/7a5a753a2d4e74a65b4852fdd2d8e96331706559 ))
* replace navigator.clipboard with copyToClipboard utility ([9f03543 ](https://github.com/stirling-image/stirling-image/commit/9f0354388f22a57e4562a76b9140d1dd604089f1 ))
* resolve multiple API and e2e test bugs ([9d62173 ](https://github.com/stirling-image/stirling-image/commit/9d621734c3a34d846a65210f43a7037c4fa4628a ))
* restore navigator.clipboard and execCommand mocks in tests ([6b03a8b ](https://github.com/stirling-image/stirling-image/commit/6b03a8b8bde9b36b2de2fe377703e45d40645868 ))
### Features
* add copyToClipboard() utility with execCommand fallback ([19ce303 ](https://github.com/stirling-image/stirling-image/commit/19ce303123a917595d670247afcfa0df2b64117a ))
* add generateId() utility for non-secure context compatibility ([f61ab9f ](https://github.com/stirling-image/stirling-image/commit/f61ab9f85cd5893742fe11cdd749f9c4330b13b3 ))
2026-04-04 09:58:22 +00:00
semantic-release-bot
9f2dc00ec8
chore(release): 1.2.1 [skip ci]
...
## [1.2.1](https://github.com/stirling-image/stirling-image/compare/v1.2.0...v1.2.1 ) (2026-04-03)
### Bug Fixes
* handle volume permission issues for bind-mounted /data directory ([39afb2a ](https://github.com/stirling-image/stirling-image/commit/39afb2a4032f64d49ef897da9b2616fe87668e0c ))
2026-04-03 16:17:11 +00:00
semantic-release-bot
7827a374b2
chore(release): 1.2.0 [skip ci]
...
# [1.2.0](https://github.com/stirling-image/stirling-image/compare/v1.1.0...v1.2.0 ) (2026-04-03)
### Features
* move theme toggle and GitHub button to top-right navbar ([47e53dc ](https://github.com/stirling-image/stirling-image/commit/47e53dc6cd173e5f8731e5bfa38dc12f586a16be ))
2026-04-03 15:20:53 +00:00
semantic-release-bot
c9f7cf27ec
chore(release): 1.1.0 [skip ci]
...
# [1.1.0](https://github.com/stirling-image/stirling-image/compare/v1.0.1...v1.1.0 ) (2026-04-03)
### Features
* add GitHub stars button to docs navbar and fix footer license ([47adfde ](https://github.com/stirling-image/stirling-image/commit/47adfde5cb450b00a5058354f70dcd633a60d219 ))
2026-04-03 15:15:03 +00:00
semantic-release-bot
acbe15def5
chore(release): 1.0.1 [skip ci]
...
## [1.0.1](https://github.com/stirling-image/stirling-image/compare/v1.0.0...v1.0.1 ) (2026-03-30)
### Bug Fixes
* allow SVG files in the convert tool ([4fa8dd0 ](https://github.com/stirling-image/stirling-image/commit/4fa8dd07804504d56aefb96856f47638dabffefb ))
2026-03-30 03:37:53 +00:00
semantic-release-bot
8d875fe6dc
chore(release): 1.0.0 [skip ci]
...
# 1.0.0 (2026-03-30)
### Bug Fixes
* **a11y:** add aria-hidden to decorative GemLogo SVG ([d47548a ](https://github.com/stirling-image/stirling-image/commit/d47548a1d7d2de995c881465b79a463de20354df ))
* add remove-background settings to pipeline step configurator ([017a715 ](https://github.com/stirling-image/stirling-image/commit/017a71562ad7b15d7d1abec6cee9f8ab73db2b34 ))
* add SSE progress endpoint to public paths ([b3f590c ](https://github.com/stirling-image/stirling-image/commit/b3f590c8b35fb396cf298187f241e45827ea1db8 ))
* **api:** allow Scalar docs through auth and CSP ([a46d500 ](https://github.com/stirling-image/stirling-image/commit/a46d500012e1f0724038c695a17e7dafd9be0c40 ))
* **api:** resolve team name lookup and show server error messages ([620b8ad ](https://github.com/stirling-image/stirling-image/commit/620b8ad038506a03633ab9baf738c6c316fa4336 ))
* **api:** use content instead of spec.content for Scalar v1.49 API ([05854fd ](https://github.com/stirling-image/stirling-image/commit/05854fd61f90a1096e1682ad021d744d178d9b9b ))
* apply continuous progress bar to erase-object and OCR ([8db84a7 ](https://github.com/stirling-image/stirling-image/commit/8db84a753cd8dbd522146aa25e85bb454b032490 ))
* **blur-faces:** switch from MediaPipe to OpenCV and auto-orient images ([f15102c ](https://github.com/stirling-image/stirling-image/commit/f15102c632d3fcbc5d33b33fd9cfdea5e4689eb6 ))
* bridge.ts ENOENT check for Python venv fallback ([977b5f5 ](https://github.com/stirling-image/stirling-image/commit/977b5f5ec0fdc6600e88b57734d8616a89b7c446 ))
* clear search when adding a step from the tool picker ([7b1b019 ](https://github.com/stirling-image/stirling-image/commit/7b1b019b772a9e36d51e2d696cd5e15312ddc704 ))
* continuous progress bar (no 100%→0% reset) ([28cd950 ](https://github.com/stirling-image/stirling-image/commit/28cd950ede6d0fc03e0d7cca0a013d883ea00238 ))
* **crop:** use percentCrop from onChange to fix inflated pixel values ([fbdbe09 ](https://github.com/stirling-image/stirling-image/commit/fbdbe0949a64d072e4e86d08c7b39372592eaf04 ))
* deduplicate react in Vite to prevent zustand hook errors in monorepo ([e8dfd2e ](https://github.com/stirling-image/stirling-image/commit/e8dfd2e628e80734a613b56c46830071e9dbeeac ))
* **docker:** add build layer caching for faster Docker rebuilds ([14c630f ](https://github.com/stirling-image/stirling-image/commit/14c630ff23d973aa9d512ed87ede049ebd4b600f ))
* **docker:** skip husky prepare script in production install ([200e7d1 ](https://github.com/stirling-image/stirling-image/commit/200e7d10c1cbffeeeae95434b4ae8f2d6b69b8a0 ))
* **docs:** clean up footer llms.txt links ([a4d4d36 ](https://github.com/stirling-image/stirling-image/commit/a4d4d368286a80decf73563ca6d7e7cae119099a ))
* **docs:** ignore localhost dead links in VitePress build ([5c4b2a5 ](https://github.com/stirling-image/stirling-image/commit/5c4b2a59d3a9f1fa2dd428fd626f2bbbb9e3fea6 ))
* **docs:** remove hero logo from home page ([d3f6bac ](https://github.com/stirling-image/stirling-image/commit/d3f6bac62b7e01e3a39371a1a52d865909412117 ))
* handle migration race condition in concurrent test workers ([ce51065 ](https://github.com/stirling-image/stirling-image/commit/ce5106524333b9bc7ee214b699d76e4b52371519 ))
* make port 1349 the UI port in all modes ([80bb0e2 ](https://github.com/stirling-image/stirling-image/commit/80bb0e29a064ad8b4787eb83b11333f67ffbdc8a ))
* move health diagnostics behind admin auth ([818e587 ](https://github.com/stirling-image/stirling-image/commit/818e5877a773e6af48f9530199c6fa52e207bd50 ))
* **ocr:** update PaddleOCR for v3 API and add Tesseract fallback ([f71c3c8 ](https://github.com/stirling-image/stirling-image/commit/f71c3c8c05bc7203d37a46743bebb62b79c8ac51 ))
* pipeline only shows compatible tools and displays errors ([0410bf3 ](https://github.com/stirling-image/stirling-image/commit/0410bf34610aa56391615ab3a95ea77a12668743 ))
* prevent pipeline step settings from resetting on collapse ([9acbedf ](https://github.com/stirling-image/stirling-image/commit/9acbedf4b75c6314f659e94f9d0721a40595201d ))
* prevent stale closure in pipeline step callbacks ([8b20fef ](https://github.com/stirling-image/stirling-image/commit/8b20fef2d8123411faa2c2379693136af6b0f9ba ))
* prevent useAuth infinite loop causing rate limit storms ([3b4f522 ](https://github.com/stirling-image/stirling-image/commit/3b4f522bf4d63109254edc22baca568fdfd7dd98 ))
* Python bridge fallback only on missing venv, not script errors ([818d2ac ](https://github.com/stirling-image/stirling-image/commit/818d2acd9471295408198a37b6d40bd63795fe17 ))
* reject HTML tags in settings API to prevent stored XSS ([8a62093 ](https://github.com/stirling-image/stirling-image/commit/8a6209313052371c123c5996cb41b9e431251874 ))
* remove explicit pnpm version from CI to avoid conflict with packageManager ([8aa4c35 ](https://github.com/stirling-image/stirling-image/commit/8aa4c35db0d8fc5900acd496116e72b768c2e568 ))
* remove Google Drive coming soon placeholder from files nav ([658954e ](https://github.com/stirling-image/stirling-image/commit/658954ea19e17d1af83d45229ec40397de376042 ))
* resolve 3 critical UX bugs - home upload, auth, and form submit ([de82900 ](https://github.com/stirling-image/stirling-image/commit/de829003add3758024962ca3cc9b7a111688ca1b ))
* resolve pipeline step race condition and infinite re-render loop ([aa1f87f ](https://github.com/stirling-image/stirling-image/commit/aa1f87fc91e0b5edd93c6720fcc54a839e51893a ))
* resolve test failures from shared DB race conditions ([b474480 ](https://github.com/stirling-image/stirling-image/commit/b474480698695cda2eaf2c9ae642ac3ffd15d007 ))
* resolve tsx not found in AI docs updater workflow ([b803b0e ](https://github.com/stirling-image/stirling-image/commit/b803b0e443b54bbca33cf88fe1ab38eeddd38baf ))
* resolve TypeScript Uint8Array type error with fflate ([1d35db9 ](https://github.com/stirling-image/stirling-image/commit/1d35db98bf359c07779522c30b00d8c7a9d3cb89 ))
* restore APP_VERSION import used by health endpoint ([7dfa7a2 ](https://github.com/stirling-image/stirling-image/commit/7dfa7a295de407f45832b68a2ef64acf2f21205f ))
* setError(null) was overriding setProcessing(true) ([b5cc452 ](https://github.com/stirling-image/stirling-image/commit/b5cc45207758c25867833fad961744a37df36fda ))
* show checkerboard behind transparent images in before/after slider ([2e29501 ](https://github.com/stirling-image/stirling-image/commit/2e29501ae6f1652cc3d0e9193863aeddb18513af ))
* simplify public health to static response, add 403 test ([4577d5c ](https://github.com/stirling-image/stirling-image/commit/4577d5c30ea53c72b02490b78b6765295e55213a ))
* streamline CI/CD — remove broken AI docs updater, fix Docker publish ([4f984c8 ](https://github.com/stirling-image/stirling-image/commit/4f984c83acc4bfaa5b9479d80e2bdda05f4a2ccc ))
* surface hidden errors and add batch rejection tests ([4a50428 ](https://github.com/stirling-image/stirling-image/commit/4a504281a34561b47b60d00edaf8914f5a8e0197 ))
* switch README Docker references from GHCR to Docker Hub ([fb84f5c ](https://github.com/stirling-image/stirling-image/commit/fb84f5ce8d175e568cce20caddcf79832d0bb973 ))
* sync stepsRef during render, not useEffect ([748ac60 ](https://github.com/stirling-image/stirling-image/commit/748ac607bc71892c588e6a1795d258d4fc7f3413 ))
* **test:** add missing PNG fixture files to repo ([8474b0e ](https://github.com/stirling-image/stirling-image/commit/8474b0ee52fe803c55247a082becc4334e83186f ))
* **test:** exclude e2e tests from vitest and fix CI test suite ([91acab9 ](https://github.com/stirling-image/stirling-image/commit/91acab9967e2b5dd7dbc7a98e667f785f3e7364e ))
* **tests:** remove temp DB cleanup that races with other test files ([b08e006 ](https://github.com/stirling-image/stirling-image/commit/b08e006512744f13b893e92e9ac20ee6299ab41c ))
* trigger browser password save prompt on password change ([565b480 ](https://github.com/stirling-image/stirling-image/commit/565b4805c7b32af66bb07543c6d3bae2865dbbdd ))
* **ui:** clean up settings, automate page, fullscreen logo, and README ([e3a8558 ](https://github.com/stirling-image/stirling-image/commit/e3a85581349b6a992939b08ede932705613d915f ))
* unify project on port 1349, improve strip-metadata and UI components ([0e7348a ](https://github.com/stirling-image/stirling-image/commit/0e7348a0bedb6c47a8025c47b377849169aa7472 ))
* **upscale:** auto-orient images before upscaling and improve UI ([8ee4d7b ](https://github.com/stirling-image/stirling-image/commit/8ee4d7b2fb3f88b2869ada8d6a6c5fb0df432e3b ))
* use BiRefNet-Lite as default model and fix JSON parsing ([2bdc367 ](https://github.com/stirling-image/stirling-image/commit/2bdc367767300e414c69636e8fef3013c9096c28 ))
* use two-pass validation in settings PUT to prevent partial writes ([813fa6b ](https://github.com/stirling-image/stirling-image/commit/813fa6b7e8d8e371959cff4d4a2a85ece4a636bb ))
* use U2-Net as default model (fast, 2s) with BiRefNet as opt-in ([fb1d366 ](https://github.com/stirling-image/stirling-image/commit/fb1d366d5fa5cb9c054deceb597a2e4a30229c8c ))
* white screen crash when uploading photos with null GPS EXIF data ([70c73d8 ](https://github.com/stirling-image/stirling-image/commit/70c73d85c992bc724c6b18a2d43789871b318e78 ))
### Features
* accept clientJobId in batch endpoint for SSE progress correlation ([2514078 ](https://github.com/stirling-image/stirling-image/commit/2514078ea1feb8e44296e226e37e8e379a20473a ))
* add authentication with default admin user ([3cb7123 ](https://github.com/stirling-image/stirling-image/commit/3cb712307011f0992783d421c5ffc8b4957bd6f5 ))
* add automatic workspace file cleanup cron ([8bda220 ](https://github.com/stirling-image/stirling-image/commit/8bda22033f511cef7304725e8887e10faf5e0e9d ))
* add CSS transform props to ImageViewer for live rotate/flip preview ([113bb75 ](https://github.com/stirling-image/stirling-image/commit/113bb757333e9ad809a401000f3b6b34fa1ef415 ))
* add CSS transform props to ImageViewer for live rotate/flip preview ([267da78 ](https://github.com/stirling-image/stirling-image/commit/267da7857743898e612ba5bb80e24985664bd311 ))
* add Fastify API server with health check and env config ([1e7fb11 ](https://github.com/stirling-image/stirling-image/commit/1e7fb11da0fac730ccd1dc6f8a1a99a3abeaf945 ))
* add forced password change page on first login ([01cd1d9 ](https://github.com/stirling-image/stirling-image/commit/01cd1d9f71427319284579b438ad08ede56517a6 ))
* add format tools (SVG-to-raster, vectorize, GIF) and optimization (rename, favicon, image-to-PDF) ([b88d0d0 ](https://github.com/stirling-image/stirling-image/commit/b88d0d0af8285ce6e802713897de7d262bcd8a8b ))
* add generic tool page template with settings panel and dropzone ([de3d544 ](https://github.com/stirling-image/stirling-image/commit/de3d544ab6e199b3452fb24ba9a987dc9abc3648 ))
* add image-engine and ai stub packages ([19e4820 ](https://github.com/stirling-image/stirling-image/commit/19e48203bb14e4061a677fc9e760a15b01ac366f ))
* add layout tools (collage, splitting, border/frame) ([b8aba17 ](https://github.com/stirling-image/stirling-image/commit/b8aba1719c4ca99fe4a26065dae796c1a4233155 ))
* add live preview callback to RotateSettings, rename button to Apply ([31a9439 ](https://github.com/stirling-image/stirling-image/commit/31a943962d46fab1eb1efd9f605fc5a0144ddd87 ))
* add live preview callback to RotateSettings, rename button to Apply ([ec192e3 ](https://github.com/stirling-image/stirling-image/commit/ec192e3d96d864e3ce47e991ba1c72d6a4ee7cea ))
* add login page with split layout matching Stirling-PDF style ([b7900ed ](https://github.com/stirling-image/stirling-image/commit/b7900ed4efb467a34dd3b71dc578416120f7746c ))
* add multi-stage Docker build with Python ML dependencies ([5c7d1e1 ](https://github.com/stirling-image/stirling-image/commit/5c7d1e1f3d7e32642c9ba3053610138d73cb22d7 ))
* add MultiImageViewer with arrow navigation and filmstrip ([815a8ed ](https://github.com/stirling-image/stirling-image/commit/815a8ed419b82aadec4e07ef4456e9e96b84b65f ))
* add password generator and browser save prompt on change-password page ([7c76c2a ](https://github.com/stirling-image/stirling-image/commit/7c76c2a2a0116de8418b0438a3859fc1add419e3 ))
* add Phase 4 AI tools with Python bridge and 6 new tools ([5524939 ](https://github.com/stirling-image/stirling-image/commit/5524939b6fae9471a615c2f689b2f3fa68190700 ))
* add privacy policy page and fix CSP blocking API docs ([7f17cb9 ](https://github.com/stirling-image/stirling-image/commit/7f17cb98ce4b6979f18c34e3a3a94b79fc462e82 ))
* add processAllFiles batch method to tool processor hook ([846a51a ](https://github.com/stirling-image/stirling-image/commit/846a51a9fdf4e8fc4c1b9673f13acde646ae0ca9 ))
* add replace-color tool and update tool page routing ([9c55dd3 ](https://github.com/stirling-image/stirling-image/commit/9c55dd32c42e0f8f2f129a2ceccc9b7f6e823de8 ))
* add semantic-release for automated versioning and help dialog ([4807bd2 ](https://github.com/stirling-image/stirling-image/commit/4807bd27260aab512d8c71d1b635b71d644b6221 ))
* add shared package with types, tool definitions, and constants ([f210de1 ](https://github.com/stirling-image/stirling-image/commit/f210de1a130a6307ff3639c8ccf573950ce0e460 ))
* add SideBySideComparison component for resize results ([28a8b10 ](https://github.com/stirling-image/stirling-image/commit/28a8b10fa15fa216d7f53256bea9461650358fb1 ))
* add SideBySideComparison component for resize results ([271cab6 ](https://github.com/stirling-image/stirling-image/commit/271cab647bb41872c5e205d6236e35eb7fad0810 ))
* add SQLite database with Drizzle ORM schema and migrations ([a24c6dd ](https://github.com/stirling-image/stirling-image/commit/a24c6dd014ebec2af1cf5d8f17c2b7a8a4e6715c ))
* add Stirling-PDF-style layout with sidebar, tool panel, dropzone, and theme toggle ([e920021 ](https://github.com/stirling-image/stirling-image/commit/e920021da1cc6e5fdb4e479205fe0861567621c7 ))
* add Swagger/OpenAPI documentation at /api/docs ([4069f4d ](https://github.com/stirling-image/stirling-image/commit/4069f4db42e6ed8700b705ff4da32c6dab8f0197 ))
* add theme system with dark/light/system support and persistence ([541e495 ](https://github.com/stirling-image/stirling-image/commit/541e49576ced03c8eafe5a8c2d6994da21606094 ))
* add ThumbnailStrip filmstrip component ([6521d70 ](https://github.com/stirling-image/stirling-image/commit/6521d702385f23a7cb9312c1661541943bfe2e03 ))
* add utility tools (image info, compare, duplicates, color palette, QR, barcode) ([0c3c64e ](https://github.com/stirling-image/stirling-image/commit/0c3c64eeace536684345e1c9822481e282577796 ))
* add Vite + React SPA with Tailwind CSS and routing ([5fa012e ](https://github.com/stirling-image/stirling-image/commit/5fa012e44b32984e9c163cafed04eb89d3dc6436 ))
* add watermark, text overlay, and image composition tools ([aeaf783 ](https://github.com/stirling-image/stirling-image/commit/aeaf783ee412acaa38c81b090445570769f4cec8 ))
* add worker threads, persistent Python sidecar, graceful shutdown, and architectural improvements ([1cbdfa1 ](https://github.com/stirling-image/stirling-image/commit/1cbdfa15900a58a5db23361167d3ed71d59bf189 ))
* **adjustments:** add real-time live preview for all color tools ([f357b18 ](https://github.com/stirling-image/stirling-image/commit/f357b18ced8757da0a6c34f18541bb8875c2199a ))
* **ai:** add emit_progress() calls to all Python AI scripts ([7238429 ](https://github.com/stirling-image/stirling-image/commit/723842988b39a8d9ea4f5b0cdd97569ff0c65f68 ))
* **ai:** add onProgress callback to all AI wrapper functions ([acb230c ](https://github.com/stirling-image/stirling-image/commit/acb230cc98193766fc978098c12dfedf08a0a339 ))
* **ai:** rewrite bridge.ts to stream stderr progress via spawn ([7d74ddd ](https://github.com/stirling-image/stirling-image/commit/7d74ddd3a6a466f1863412b36501c663fd642194 ))
* **api,web:** add batch processing with ZIP download and SSE progress ([ce64116 ](https://github.com/stirling-image/stirling-image/commit/ce641168c1db26b184480d588184205373a3e397 ))
* **api:** add all remaining endpoints to OpenAPI spec ([9ed1090 ](https://github.com/stirling-image/stirling-image/commit/9ed109065189f20545eb24893c2c0b9332e40249 ))
* **api:** add all tool endpoints to OpenAPI spec ([2bf8689 ](https://github.com/stirling-image/stirling-image/commit/2bf86894d0005ff4c273334699c30de1fcb38ee6 ))
* **api:** add generic tool route factory for all image tools ([d53f673 ](https://github.com/stirling-image/stirling-image/commit/d53f6733b8b5d44754c9525eae57aaba928590b7 ))
* **api:** add llms.txt and llms-full.txt endpoints ([cff1930 ](https://github.com/stirling-image/stirling-image/commit/cff1930920c488fc853eab5aa36128fac19b3bf5 ))
* **api:** add logo upload/serve/delete routes with tests ([6a13065 ](https://github.com/stirling-image/stirling-image/commit/6a1306570660d4962f89e741dfb684d2ed0e7f6c ))
* **api:** add multipart file upload, workspace management, and download routes ([ece341e ](https://github.com/stirling-image/stirling-image/commit/ece341e8c49be8d1def42834c01b5a7725b55d9c ))
* **api:** add OpenAPI 3.1 spec skeleton with common schemas ([9488201 ](https://github.com/stirling-image/stirling-image/commit/948820180663783d463a07f966dd4336c1a7c503 ))
* **api:** add persistent file management helpers to frontend api module ([8a3a731 ](https://github.com/stirling-image/stirling-image/commit/8a3a731267f4e3cd84a01a78d89975197ce2ebad ))
* **api:** add pipeline execution, save, and list endpoints ([263447a ](https://github.com/stirling-image/stirling-image/commit/263447a81e9db7ef3bc840e69b5c9b9ad0d88c86 ))
* **api:** add resize, crop, rotate, convert, compress, metadata, and color tool routes ([37112af ](https://github.com/stirling-image/stirling-image/commit/37112af779d491e8f8d585d6ade9e5a8d4fafba0 ))
* **api:** add Scalar docs route and install dependency ([abb2916 ](https://github.com/stirling-image/stirling-image/commit/abb2916233de85e62675e609b9d497dcc0a01882 ))
* **api:** add SingleFileProgress type and SSE update function ([7eddac5 ](https://github.com/stirling-image/stirling-image/commit/7eddac5119d1db3cbf831c735c5b78f0c92728ef ))
* **api:** add teams CRUD routes and update auth team references ([ab370a7 ](https://github.com/stirling-image/stirling-image/commit/ab370a74fefebc8735e337f9b42e48ab6625c5b4 ))
* **api:** add tool filtering and DB-backed cleanup settings ([acfff75 ](https://github.com/stirling-image/stirling-image/commit/acfff754b54b5f9be474c6db6eb39b3cbf91fc21 ))
* **api:** add user files CRUD routes at /api/v1/files/* ([4e2aa58 ](https://github.com/stirling-image/stirling-image/commit/4e2aa5876701ef56514957a30fe63c27c615cf05 ))
* **api:** register docs route in server and test helper ([849878e ](https://github.com/stirling-image/stirling-image/commit/849878e72fc0e5cb3e775afeea802dac933c4e13 ))
* **api:** wire AI route handlers to SSE progress via clientJobId ([27600a4 ](https://github.com/stirling-image/stirling-image/commit/27600a431805d54b32875dbe5a58f05cfcdbe2a1 ))
* **branding:** add faceted gem SVG logo assets ([0214ac1 ](https://github.com/stirling-image/stirling-image/commit/0214ac11b1ba4142349c09fd2465a425b4e8dd6b ))
* **branding:** add favicon and meta tags to index.html ([0364927 ](https://github.com/stirling-image/stirling-image/commit/036492725eea6cb6b4c0aff307edeee8516ec280 ))
* **branding:** add OG social preview image ([dcd926c ](https://github.com/stirling-image/stirling-image/commit/dcd926c57e9877c2b47e70c494b679f0c00d93d6 ))
* **branding:** add PWA manifest and PNG logo assets ([26cc183 ](https://github.com/stirling-image/stirling-image/commit/26cc18342fb6d4027f2130b198090469e27ef797 ))
* **branding:** show gem icon in app header as default logo ([39dfb93 ](https://github.com/stirling-image/stirling-image/commit/39dfb93679765366253115240adcbc573e83b8e7 ))
* conditional result views — side-by-side for resize, live preview for rotate ([989e8dc ](https://github.com/stirling-image/stirling-image/commit/989e8dc6e47fe123d6333dddf4431a01623e0437 ))
* conditional result views — side-by-side for resize, live preview for rotate ([59a57f3 ](https://github.com/stirling-image/stirling-image/commit/59a57f3a00bbd0c6331d1165594ad4266ce3b536 ))
* **crop:** add CropCanvas component with visual overlay, grid, and keyboard controls ([1a076be ](https://github.com/stirling-image/stirling-image/commit/1a076be9b2cc5f434296f2739a395321368c2177 ))
* **crop:** add react-image-crop dependency ([31d426f ](https://github.com/stirling-image/stirling-image/commit/31d426ff6f02965d20e75e85ff15a8cbc1d1df0b ))
* **crop:** redesign CropSettings with aspect presets, pixel inputs, and grid toggle ([c2c256a ](https://github.com/stirling-image/stirling-image/commit/c2c256a180640cf046bd1bc46b05065171a4c2dc ))
* **crop:** wire CropCanvas and CropSettings into tool-page with bidirectional state ([786a671 ](https://github.com/stirling-image/stirling-image/commit/786a671c39859ae0bf1f8732c2ff4efe210d2466 ))
* **db:** add teams table and migration ([926b52d ](https://github.com/stirling-image/stirling-image/commit/926b52d33045dc1f15192bb65d4f005f6c82ce00 ))
* **db:** add userFiles table and migration ([dda37e9 ](https://github.com/stirling-image/stirling-image/commit/dda37e90cc294140c236332563befae0a3b02852 ))
* **docs:** add gem favicon to VitePress site ([42ec0f2 ](https://github.com/stirling-image/stirling-image/commit/42ec0f2490267f2e3730764539bdd2920b7b3793 ))
* **docs:** add gem logo to GitHub Pages nav bar and home hero ([98478e2 ](https://github.com/stirling-image/stirling-image/commit/98478e271934c8b3deb1b3003d88fe1a165e75a0 ))
* **docs:** add llms.txt and llms-full.txt to GitHub Pages ([e6dc7b0 ](https://github.com/stirling-image/stirling-image/commit/e6dc7b0a18d3d022de4e2f0b971bf25678042b3a ))
* **docs:** add llms.txt links to GitHub Pages footer ([c59e4a0 ](https://github.com/stirling-image/stirling-image/commit/c59e4a06686db62ad8ec134ec1c97080673fbcb3 ))
* **env:** add FILES_STORAGE_PATH config variable ([4927f57 ](https://github.com/stirling-image/stirling-image/commit/4927f574badda883ad72ba05c30a8d9fae973ee6 ))
* **erase-object:** replace mask upload with in-browser brush painting ([40656a0 ](https://github.com/stirling-image/stirling-image/commit/40656a0452109c1d6ea2441b2735b0ffaf4f3867 ))
* extract auto-orient utility and expand test coverage ([e5086ad ](https://github.com/stirling-image/stirling-image/commit/e5086ada6e2f4402973f203b726578dd42da4a32 ))
* **files:** add Files page with nav, list, details, upload, and routing ([788b8c8 ](https://github.com/stirling-image/stirling-image/commit/788b8c8bad8cf6800137f4764f5a50ac80845f2f ))
* **files:** add mobile layout for Files page ([c99f43f ](https://github.com/stirling-image/stirling-image/commit/c99f43fe60aac2a7babeb7cea39e140281936009 ))
* **files:** wire serverFileId for version tracking ([20f153d ](https://github.com/stirling-image/stirling-image/commit/20f153d611c9dec478ab89cd050c6c65b0e41287 ))
* harden auth, security headers, SVG sanitization, and pipeline ownership ([432cc92 ](https://github.com/stirling-image/stirling-image/commit/432cc92471b73b73ab9d1be4a82a71d3ed3a88ad ))
* **i18n:** add translation keys for settings phase 1 ([ffb676d ](https://github.com/stirling-image/stirling-image/commit/ffb676d648027804e653b868139f349b5a3c6c96 ))
* **image-engine:** add Sharp wrapper with 14 image operations ([ccac5b8 ](https://github.com/stirling-image/stirling-image/commit/ccac5b885c327656eb76241a74be7e510ca32903 ))
* **image-to-pdf:** add live PDF page preview with margin visualization ([ddde152 ](https://github.com/stirling-image/stirling-image/commit/ddde152545456770ec4a97418968c2ad309a88e0 ))
* implement Files page with persistent storage and version tracking ([62fbb54 ](https://github.com/stirling-image/stirling-image/commit/62fbb5484c669b74132b4ecd23576bf0ba5b50b2 ))
* initialize Turborepo monorepo with pnpm workspaces ([58fbb38 ](https://github.com/stirling-image/stirling-image/commit/58fbb38fd88973522ac894dc6237aeabd7849b64 ))
* integrate MultiImageViewer and multi-file UX into tool page ([3796533 ](https://github.com/stirling-image/stirling-image/commit/37965338228a2fca3623718a7db2f8757a464651 ))
* make AI tools pipeline-compatible and add search to tool picker ([c48bfba ](https://github.com/stirling-image/stirling-image/commit/c48bfba879f55591e03a0918d9b8de9618cc8dc0 ))
* merge multi-image UX — batch processing, filmstrip navigation, resize/rotate redesign ([80756d1 ](https://github.com/stirling-image/stirling-image/commit/80756d15917a877b21a900d282bb6522ae76c2e2 ))
* multi-arch Docker support, security hardening, and test improvements ([6cfa3b0 ](https://github.com/stirling-image/stirling-image/commit/6cfa3b0c38d81a19b230e1bdbad750dce2783afb ))
* multi-file metadata display with per-file caching ([474b4a9 ](https://github.com/stirling-image/stirling-image/commit/474b4a941e1be43887beac8d2ec57eb703cba260 ))
* **pipeline:** add inline settings configuration for automation steps ([adc7e1c ](https://github.com/stirling-image/stirling-image/commit/adc7e1c0370df1687b0660bdff279c90ac9d0871 ))
* production Docker, Playwright tests, settings API, and bug fixes ([ce03aad ](https://github.com/stirling-image/stirling-image/commit/ce03aad10f00f173a3b82a478288626ee8f00e32 ))
* replace model dropdown with intuitive subject/quality selector in remove-bg ([9aa0371 ](https://github.com/stirling-image/stirling-image/commit/9aa0371a1452540557aca9f2195032c5c16ce3fb ))
* rewrite file-store with FileEntry model for multi-image support ([8844b44 ](https://github.com/stirling-image/stirling-image/commit/8844b44fff2abfbe3262a113dfc35d83367add05 ))
* rewrite resize settings with tab-based UI (presets, custom, scale) ([02ef3e6 ](https://github.com/stirling-image/stirling-image/commit/02ef3e6468b36303dfdbc61e18c14dc5eb68d957 ))
* rewrite resize settings with tab-based UI (presets, custom, scale) ([bc105fd ](https://github.com/stirling-image/stirling-image/commit/bc105fd261de3c11b279557dba98aaad65214f42 ))
* **rotate:** add editable angle input and fine-tune +/- buttons ([bf62820 ](https://github.com/stirling-image/stirling-image/commit/bf6282006489a4cadcd849b476e97239e3624673 ))
* serve React SPA from Fastify in production mode ([1d8761a ](https://github.com/stirling-image/stirling-image/commit/1d8761a976f2e1006526496e2fd67c27be757991 ))
* **storage:** add file storage helpers module ([fbca20d ](https://github.com/stirling-image/stirling-image/commit/fbca20d78c213e0b7f00f6c59eae4af32123a587 ))
* **stores:** add Zustand store for Files page state management ([24644c1 ](https://github.com/stirling-image/stirling-image/commit/24644c1c1052146a2b581ffc3a791a9276fab6a1 ))
* **tool-factory:** auto-save results to persistent file store when fileId provided ([bf6c30c ](https://github.com/stirling-image/stirling-image/commit/bf6c30c3c0d9beeaa24a7b7b998de9354ec7e353 ))
* **ui:** add teams, tools, feature flags, temp files, logo to settings dialog ([4b2621d ](https://github.com/stirling-image/stirling-image/commit/4b2621d9f2c5fcc930baf9ed1a6b555de77f0b93 ))
* upgrade to BiRefNet SOTA background removal model ([77ee846 ](https://github.com/stirling-image/stirling-image/commit/77ee8469d89fa29f29fbba1360e139b2a502d70f ))
* **web:** add before/after image comparison slider component ([1a22522 ](https://github.com/stirling-image/stirling-image/commit/1a22522349619b726630467b751f08775f16bd07 ))
* **web:** add fullscreen tool grid view ([6d67b10 ](https://github.com/stirling-image/stirling-image/commit/6d67b106ca5fd5a475c3d2cac4b6aecd23fc06cd ))
* **web:** add i18n architecture with English translations ([cd020c2 ](https://github.com/stirling-image/stirling-image/commit/cd020c2342d430480a43a7f6469034ca6f9ef1ed ))
* **web:** add keyboard shortcuts for tool navigation ([939bc2e ](https://github.com/stirling-image/stirling-image/commit/939bc2e001a509044f96f9557434c255abb47adc ))
* **web:** add mobile responsive layout with bottom navigation ([580208d ](https://github.com/stirling-image/stirling-image/commit/580208de83349362b27b3a8a6db3370fc2770d0e ))
* **web:** add pipeline builder UI with saved automations and templates ([60541c1 ](https://github.com/stirling-image/stirling-image/commit/60541c1765b3c31679d345dbde3c00a7085e8712 ))
* **web:** add ProgressCard component ([01d5d66 ](https://github.com/stirling-image/stirling-image/commit/01d5d66466a7bcf4a0c0f454f7b4d58f7e1e7801 ))
* **web:** add ProgressCard to non-AI tool settings (Group A) ([5c64b30 ](https://github.com/stirling-image/stirling-image/commit/5c64b306ead8b6214dee6d51e8dae25fb47ff7e8 ))
* **web:** add settings dialog with general, security, API keys, and about sections ([0cd3d71 ](https://github.com/stirling-image/stirling-image/commit/0cd3d71a631b3573cda24f4b0db5ff9d77b85abd ))
* **web:** add Stirling-PDF-style file preview, review panel, and tool chaining UX ([ab0b034 ](https://github.com/stirling-image/stirling-image/commit/ab0b0344b964eb7481af0d2df0420db99aea6428 ))
* **web:** add tool settings UI for all core image tools ([8964bc5 ](https://github.com/stirling-image/stirling-image/commit/8964bc5cd89d6e08ed6ba408b1c64b7bed9fb3cb ))
* **web:** migrate AI tool settings to ProgressCard ([dbd3bf7 ](https://github.com/stirling-image/stirling-image/commit/dbd3bf737e4692279ba5b7c3d860779193a21b5f ))
* **web:** redesign home page upload flow and add auth guard ([06c5ee5 ](https://github.com/stirling-image/stirling-image/commit/06c5ee59962fb6a2e520b72f487061f8d58e8648 ))
* **web:** rewrite useToolProcessor with XHR upload progress and SSE ([60945fd ](https://github.com/stirling-image/stirling-image/commit/60945fd3b3674d2026f3f717cd3d123951126933 ))
* wire up batch processing across tool settings components ([9e2c28f ](https://github.com/stirling-image/stirling-image/commit/9e2c28f19124fca4bc4f55c0997e2314170ae478 ))
2026-03-30 00:28:23 +00:00