Plan — firewatch camera catalog manager (fork of santafe.live) (Firewatch Camera Grid)

**Artifact** from Bead: Firewatch Camera Grid · [canonical source](https://redfish.acequia.io/guerin/.agents/65783732-7907-4a36-983a-3b015e75e80b/2026-06-13/artifacts/plan-firewatch-manager.md) · session 2026-06-13 · discussion: Talk: Firewatch Camera Grid

**Bead:** 65783732 · **Date:** 2026-06-13 · **Method:** devops/epic-step (WORK-QUEUE-driven, build+CDP+deploy per step, journaled in `log.md`). **Locked decisions:** bead-served at `…/65783732…/app/` · git repo in bead `repo/` · 3D on TaosEngine · sidecars (santafe `imagePose`/`imageMeta`) source-of-truth, STAC derived · Sandy archive first · copy-and-adapt the santafe app · derived sidecars bead-local + offered.

## Goal A forked catalog manager where AlertWildfire camera frames (Sandy archive) live as posed, time-stamped items, browsable as a **grid that morphs into a geospatial layout** under spatial+temporal filter bounds, **scrubbable in time**, with **bound-selection → add-to-STAC** and room for other sources. Pose lives in per-image sidecars that map 1:1 to ArcGIS Oriented Imagery (note 01).

## Epic 1 — Fork + data layer (skeleton on real data) - **S1 — Fork + devops loop.** Copy `sites/santafe.live/` app files into `repo/`, `git init`, local build/serve, deploy a build to `…/65783732…/app/` (bearer PUT), CDP-verify it loads. *Establishes the bead-served deploy + CDP loop.* - **S2 — Telemetry → sidecar skill.** `skills/` Node tool: walk Sandy `ops-alertcalifornia/<cam>/telemetry-*.json` + `getCameraDataByLoc.json` → per-frame `imageMeta/<id>.json` (time, src url) + `imagePose/<id>.json` (lat/lon + heading/pitch/fov from `camAzimuth`/`camElevation`/`camViewWidth`). **Convention verify** (note 01 caveat): render one wedge, confirm it points where the image looks. Sidecars written bead-local. - **S3 — Data layer swap.** Point the manager at the derived sidecars: grid populated from Sandy frames, **timeline zoomed to the imagery date-time extent**, 2D map shows camera markers + azimuth wedges.

## Epic 2 — The interface (the interesting part) - **S4 — Temporal scrub of the grid.** Time-order the grid; playhead sweeps which frames are centered/lit; scrubbing re-populates. Zoom-to-extent + brushable time range. - **S5 — Grid ⇄ geospatial morph.** A spatial bound (map rectangle) filters the grid AND animates matching thumbnails from grid cells to their map positions (FLIP layout), and back. Spatial+temporal bound = view filter = selection. - **S6 — 3D map view (TaosEngine).** Posed billboards + wedges + terrain (reuse the incident-viewer camera glyph work); toggle/morph 2D↔3D.

## Epic 3 — Curation + sources - **S7 — Bound-select → STAC.** From a spatial+temporal selection, "add to collection" emits a STAC Collection/Items (sidecar→Item assets + oriented-imagery properties). Offered, not written into `incidents/**`. - **S8 — Multi-source intake.** santafe photos / MISB frames / `uploads/` dock images drop into the same grid+pose model.

## Order S1 → S2 → S3 (Epic 1 = working skeleton on Sandy) → S4 → S5 → S6 (the morph/scrub/3D interface) → S7 → S8. Each step: spec → build → CDP verify → deploy `…/app/` → one `log.md` line; git commit per step in `repo/`.