EffectSoup is a browser-based, non-AI image transformation engine. Upload a photo, choose an effect, adjust controls, and export — every pixel is processed in a Web Worker on your device. No uploads to a server, no AI generation.
Every effect is a deterministic, mathematical image pipeline. The same photo with the same settings always produces the same pixel output.
How Rendering Works
- Decode — Image is decoded into a
PixelBuffervia Canvas 2D API. - Viewport — Crop, zoom, and offset are applied non-destructively via
applyViewportTransform. - Resolve — The preset's
intensityMapperconverts the 0–100 slider and advanced overrides into resolved parameters. - Pipeline — The preset's
createPipelinebuilds a render function that runs the effect chain. - Render — If using
EffectsWorkerClient, steps 2–4 run off the main thread and the result is transferred back viapostMessagewith zero-copyArrayBuffertransfer. - Export — The final buffer is drawn to an offscreen canvas and exported as PNG, JPEG, or WebP via the Canvas
toBlobAPI.
Packages
The engine is split into four npm packages under the @effectsoup scope (113 exported symbols total):
| Package | Description | Key exports |
|---|---|---|
@effectsoup/core | Pure TS image primitives | PixelBuffer, createPixelBuffer, toGrayscale, dithering, ASCII, glow, distortion, halftone, stipple, and more (39 functions, 22 types) |
@effectsoup/presets | Effect presets with intensity mapping | EffectPreset, allPresets (25 presets), getPresetById, intensityMapper, createPipeline |
@effectsoup/worker | Web Worker client | EffectsWorkerClient class for off-thread rendering with job versioning |
@effectsoup/effectsoup | All-in-one meta-package | Re-exports core + presets + worker |
Quick Links
- Get started in 5 minutes — open the playground, apply an effect, export
- Install the packages — npm/pnpm setup with a minimal example
- Browse all effects — 25 presets across 7 categories
- Create a custom effect — EffectPreset anatomy and registration
See Also
- Architecture — monorepo layout and render flow
- FAQ — common questions