Skip to content
Lumina JS

Image editing, entirely
in the browser

A TypeScript SDK on a C++ engine. Non-destructive adjustments, RAW decoding, and 32-bit HDR — all via WebAssembly, all on-device.

Enhanced imageOriginal image
OriginalEnhanced
AdjustmentsLive
Exposure+0.8
Contrast+12
Highlights-25
Shadows+15
Temperature+8
preview · 1200×900

Quick start

Only a few lines to a live preview

$ npm install @luminaphoto/lumina-js
typescript
import { createEditor } from '@luminaphoto/lumina-js';

const editor = createEditor({ licenseKey: '...' });
await editor.initialize();

// Load any image: JPEG, PNG, WebP, RAW
const meta = await editor.loadImage(buffer, 'raw');

// Stream a live preview — main thread stays free
const preview = await editor.previewExposure(1.2);
imageEl.src = URL.createObjectURL(new Blob([preview.imageData]));

RAW decoding

Load raw sensor files directly. White balance metadata extracted automatically.

32-bit linear HDR

All processing in linear light. Perceptual conversion applied once, at export.

No upload. No server.

Images processed entirely on-device. Nothing transmitted. Zero cloud dependency.

One key. No gotchas.

Single license key, time-boxed browser tokens, no per-seat or per-image metering.

Flexible architecture

Two APIs, one engine

Both share the same adjustment model, operation semantics, and undo/redo behavior.

ClientRecommended

Async, Web Worker

Off the main thread. All methods return Promises. The default for interactive browser UIs.

const preview = await editor.previewExposure(1.2);
await editor.applyTemperature(-20, 5);
CoreAdvanced

Sync, direct WASM

Zero async overhead. For pipelines, custom workers, or environments you control.

const preview = editor.previewExposure(1.2);
editor.applyTemperature(-20, 5);
const result = editor.exportImage('jpeg', 95);

Ready to ship?

Start building today

Need a license? sales@luminaphoto.io

Proprietary. All rights reserved.