1. You choose the image
The browser receives the file through the picker or drop area. The page validates its type and attempts to decode its pixels.
( Architecture explained )
This map separates the pixel path inside the browser from technical, measurement, or advertising connections the page may make.
The arrows below represent the functional sequence observed in the editor. Each card describes a different responsibility.
The browser receives the file through the picker or drop area. The page validates its type and attempts to decode its pixels.
Studio files and adjustments may remain in IndexedDB; preferences and temporary flow data use browser storage.
Adjustments, thumbnails, and exports are calculated locally. Canvas displays the preview; it is not proof of final-output resolution.
Individual results are bundled by a ZIP library packaged with the project, without fetching ZIP code from a CDN during export.
A temporary in-memory address is created for the image or ZIP. The new copy is saved through the browser download mechanism.
Local processing does not mean the entire page works without a network. This distinction avoids an absolute privacy promise.
IndexedDB lets the studio recover files and adjustments across operational routes. localStorage holds preferences such as consent and theme; sessionStorage carries temporary export data. The browser and its storage policies determine when this data may be removed.
The complete legal description, categories, and available choices remain on the Privacy and Cookies pages.
PhotoEditor.sbs separates interface rendering from image manipulation using dedicated Web Workers. When an image is opened, the main browser thread decodes the file into an ImageBitmap, extracts its ImageData, and transmits the underlying ArrayBuffer across thread boundaries. This architecture ensures that sliders for exposure, contrast, temperature, and curves remain responsive even when computing transformations across millions of pixels.
Color transformations operate directly on 8-bit clamped typed arrays (Uint8ClampedArray). For example, tone curve lookups and color channel mixers iterate across flat memory layouts with hardware-level integer clamping, preventing pixel overflow artifacts without costly floating-point conversion overhead. Previews are drawn to high-density HTML5 Canvas surfaces, matching the physical display aspect ratio while retaining full source resolution for the final export pass.
Memory reclamation is carefully managed during long editing sessions. When switching photos or completing a batch export, intermediate object URLs are immediately released using URL.revokeObjectURL(), and stale buffers are garbage-collected. This local lifecycle prevents common browser tab crashes caused by memory accumulation.