v2.0.1
Pre-releasev2.0.1 - Browser Processing Preflight
Development prerelease. This release is published from
dev, may receive
rapid follow-up changes, and is not selected by the defaultlatestimage.
Summary
v2.0.1 makes the V2 browser image pipeline fail closed before expensive image
decoding or upload-session creation. Processor selection now uses an actual
wasm-vips and WebP encoder probe instead of relying only on browser features,
and every upload is checked against the complete server recipe before image
processing begins.
There are no database migrations and no server upload-protocol changes in this
release.
Changes
Browser capability negotiation
- Added a shared, time-bounded wasm-vips worker probe that initializes the WASM
runtime, its HEIF/AVIF dynamic library, and the WebP encoder. - Reuses the successfully probed worker for the first image instead of paying a
second initialization cost. - Uses native pica/Canvas only when the decoded dimensions are within the
device-specific safe Canvas budget. - Rejects large images before upload when wasm-vips is unavailable. The client
never sends the original image to the backend as an implicit fallback. - Keeps low-memory devices out of the WASM path while allowing browsers without
navigator.deviceMemoryto prove support through the real worker probe.
Image preflight
- Added a single preflight plan that validates the real container format,
extension and MIME agreement, animation, dimensions, the 50 MP source cap,
the negotiated server pixel limit, and the WebP 16,383-pixel side limit. - Reuses the inspected metadata during processing so the source container is
not parsed twice. - Continues to support static JPEG, JPG, PNG, BMP, WebP, and AVIF inputs.
- Animated PNG, WebP, AVIF, and other animated inputs remain unsupported in V2.
Recipe contract
- Added strict Zod validation for numeric limits and the four required variants:
master,gallery,admin, andpublish_source. - Rejects changed dimensions, quality, fit mode, pipeline version, or recipe
version with a stable client error before processing. - Uses no-store API requests and invalidates failed recipe lookups instead of
retaining a rejected cache entry.
Upload feedback
- Added stable
ClientImageErrorcodes for invalid files, unsupported formats,
animation, dimension limits, processor availability, decode/encode failures,
timeouts, and unsupported recipes. - Added a visible
checkingstage and localized English, Simplified Chinese,
and Japanese row-level errors. - Invalid files are now retained as explicit rejected queue rows instead of
disappearing silently. - Non-retryable capability and input errors no longer display a misleading
retry action or produce a large toast burst during bulk selection.
Compatibility and Resource Behavior
- Images up to the negotiated 50 MP maximum use wasm-vips only after the worker
and WebP encoder pass a real probe. - Canvas fallback remains limited to the calculated 8-16 MP safety budget,
depending on reported device memory. - Image processing remains serial, and each worker is terminated after the
request so decoded pixels and WASM memory cannot accumulate across the queue. - The server still receives only the fixed WebP derivatives defined by recipe
2.0.0.
Verification
- Frontend Vitest: 15 test files, 110 tests passed.
- ESLint: passed.
- TypeScript project build: passed.
- Vite production build: passed.
- The existing wasm-vips dependency direct-eval warning remains unchanged and
does not fail the build.
Installation
Development images must be pulled explicitly:
docker pull jaykserks/summerain:dev-v2.0.1Equivalent exact development tag:
jaykserks/summerain:dev-2.0.1
The moving dev tag also points to the newest successful development build.
latest, main, and stable semantic-version aliases are not changed by this
release.
Known Limitations
- The browser upload queue is not yet persisted. Refreshing, closing, or
navigating away from the upload page interrupts the current queue. - Devices that cannot initialize wasm-vips cannot upload images above their
safe Canvas budget. - Animated image support remains planned for a later release.
- Real-device acceptance for the supported Chrome and iOS browser matrix is a
deployment validation step and is not represented by jsdom unit tests.