Create long-exposure light paintings from selected video ranges. The repository contains two supported applications:
apps/web: an installable, offline-capable PWA using WebCodecs and WebGPU.apps/native: the original C++23 and OpenCV prototype.
The PWA processes local files entirely on the device. Video frames are decoded sequentially and accumulated into an rgba8unorm WebGPU render target using per-channel max blending.
Requirements:
- Bun 1.3 or newer.
- Current desktop Chrome or Edge.
- WebGPU and hardware acceleration enabled.
bun install
bun run devProduction checks:
bun run lint
bun run test
bun run build
bun run e2eThe production build is written to apps/web/dist. Pushes to master deploy that directory to GitHub Pages.
Input support depends on the browser's WebCodecs decoders and includes common MP4, MOV, WebM, and MKV files. The application checks the exact codec and profile before processing.
Still exports support PNG and JPEG. Progressive animation exports are capability-driven:
- H.264 in MP4 for compatibility.
- AV1 in WebM when the browser exposes an encoder.
- VP9 in WebM as an open fallback.
AV2 is not exposed by WebCodecs and is not currently supported.
The first release processes SDR 8-bit video. HDR sources are decoded through the browser's SDR conversion path and display a warning.
Requirements:
- CMake 3.28 or newer.
- C++23 compiler.
- OpenCV.
cmake -S . -B build -DOpenCV_DIR=/path/to/opencv
cmake --build build --config ReleaseRun lightpainting with an optional video path as its first argument.
Videos are never uploaded. The service worker caches only the application shell, and IndexedDB stores export preferences rather than source media.