Main thread stays free
Processing runs in a dedicated Web Worker. Sliders, redraws, and user input are never blocked by image math.
A TypeScript SDK built on a C++ engine. All processing runs locally via WebAssembly — images never leave the device. RAW decoding, non-destructive adjustments, and precision color science.
Install the package and start editing images in minutes.
npm install @luminaphoto/lumina-jsCreate an editor, load an image, stream a live preview, then apply:
import { createEditor } from '@luminaphoto/lumina-js';
const editor = createEditor({ licenseKey: 'YOUR_KEY' });
await editor.initialize();
const { width, height } = await editor.loadImage(buffer, 'jpeg');
// Preview without committing — the main thread stays free
const preview = await editor.previewExposure(1.2);
imageEl.src = URL.createObjectURL(new Blob([preview.imageData]));
// Apply when the user confirms
await editor.applyExposure(1.2);
await editor.dispose();Choose based on your context. Both tiers share the same adjustment model, operation semantics, and undo/redo behavior.
Client API — async, Web Worker-based. The default choice for interactive UIs where the main thread must stay responsive.
Core API — synchronous, direct WASM access. For pipeline processing, custom workers, or environments where you control the thread model.
// Client API — all operations return Promises
const preview = await editor.previewExposure(1.2);
await editor.applyTemperature(-20, 5);
// Core API — synchronous, zero async overhead
const preview = editor.previewExposure(1.2);
editor.applyTemperature(-20, 5);
const result = editor.exportImage('jpeg', 95);