Replaces the gPhoto2 demo UI (live view beside the raw config tree) with a
timelapse intervalometer. The home screen carries only what changes between
runs - interval, frame count, start delay, start/stop, countdown, progress
and a log - while every camera setting moves into a settings drawer.
- intervalometer.js: schedules frames on an absolute grid (start + n *
interval) so transfer time doesn't accumulate as drift over a long run. An
overrun logs and fires as soon as the camera is free rather than dropping a
frame; three consecutive failures abort.
- storage.js: frames stream into a folder via the File System Access API,
named for capture time (20260801-172713_00001.JPG) so sorting by name is
sorting by time. Falls back to downloads. Also holds the screen wake lock,
since background tabs get their timers throttled.
- config-utils.js: config tree lookups, shutter speed parsing, and bulb
capability detection (bulb toggle or Canon eosremoterelease).
- home.js: sequence controls plus a read-only exposure readout and pre-flight
warnings when the interval can't fit the exposure and transfer.
- settings.js / index.js: app prefs and the full config tree behind a drawer.
Config polling now only runs while that drawer is open, leaving the USB link
to the captures during a sequence.
Live view stays up between frames and steps aside only while the shutter
fires, which is what the EOS driver requires; it recovers afterwards with
backoff instead of hammering a busy camera.
Deployed as an assets-only Cloudflare Worker. The WASM is built with pthreads
and allocates a shared WebAssembly.Memory, so _headers reproduces the COOP/COEP
pair from serve.json - without cross-origin isolation the app fails to start.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QK7PKpRVoy69Fpa32R8abb
Previously this didn't work because Docker still creates missing target folders as root instead of as mapped user.
Manually creating the folder seems to fix that.
- Upgraded to 3.1.47.
- EM_CACHE override leads to some new issues with package search in sysroot, probably because sysroot is hardcoded in PKG_CONFIG* variables. Use Docker's path mapping mechanism instead.
- Added temporary workaround for new issue from https://github.com/emscripten-core/emscripten/issues/16836.