# Camera prototype dependencies — November 4, 2026

This is a local browser prototype on existing equipment, not a selected TV
compute stack. No conversation model, remote inference, microphone, identity
recognition, calendar or TV service is involved in this camera page.

## Pinned components and license evidence

| Component | Source / artifact | Published terms / use |
| --- | --- | --- |
| MediaPipe Tasks Vision 0.10.35, JS and WASM runtime | [Published package metadata](https://registry.npmjs.org/@mediapipe/tasks-vision/0.10.35), [source tag](https://github.com/google-ai-edge/mediapipe/tree/v0.10.35) | Apache-2.0 in exact package metadata; no declared npm dependencies. Unmodified JS, SIMD and non-SIMD WASM assets copied from the integrity-verified npm tarball. |
| Pose Landmarker Full, float16, version 1 | [Exact weights](https://storage.googleapis.com/mediapipe-models/pose_landmarker/pose_landmarker_full/float16/1/pose_landmarker_full.task), [implementation source](https://github.com/google-ai-edge/mediapipe/tree/v0.10.35/mediapipe/tasks/cc/vision/pose_landmarker) | Maintainer explicitly identifies this exact Full model as Apache-2.0 in [upstream issue 6306](https://github.com/google-ai-edge/mediapipe/issues/6306). Do not extrapolate that statement to other models. |
| Browser speech synthesis | Installed browser/OS voice, prefer an English voice marked local | Existing platform service, not redistributed here. Selected voice may use online processing; consent text says so. Listening is required to establish audible output. |

The [upstream Apache license](https://github.com/google-ai-edge/mediapipe/blob/v0.10.35/LICENSE)
is copied into `vendor/LICENSE`; local attribution is in `vendor/NOTICE`.
Apache-2.0 permits commercial use and redistribution subject to its conditions.
`vendor/SHA256SUMS` records the actual copied bytes. The npm tarball's SHA-512 was
checked against registry metadata before extraction; expected integrity:
`sha512-HOvadwVRE6JC+45nyYhmnywnr5h/J8KZvOeUNVOG9q/0875pZgItznFB9bRTvLc264YSJqiZ1NsIpCStJw/egg==`.

## Scope of the dependency check

The package includes compiled code rather than a complete source-to-binary
dependency inventory. Its upstream source declares dependencies including
TensorFlow/LiteRT, Abseil, Protobuf, XNNPACK, CPUinfo, pthreadpool and Eigen;
they use Apache, BSD, or MPL terms. The package does not ship a consolidated
third-party NOTICE. Exact embedded dependency/version-to-notice mapping is
**unverified**; do not treat this prototype as a commercially cleared complete
TV stack. Complete that mapping and carry the applicable notices before product
redistribution or selecting a TV local stack. No such selection is made here.

## Runtime data flow

All detector JS, WASM and weights load from the loopback VANE server. Frames
stay in browser memory and are passed to a worker. The worker returns only
shoulder coordinates/confidence to the page, then closes each frame bitmap.
Stop terminates the worker, stops camera tracks and clears the preview.
The server does not receive frames; no application storage or frame export is
implemented. A same-origin CSP blocks vendor telemetry/network destinations.
The upstream maintainer's June statement about no telemetry describes the
then-current SDK; the CSP is used rather than assuming future SDK behavior.

The browser's speech voice is separate: its own processing depends on the
installed voice. No camera image is sent to a voice service by this code.

## Running and checking

Run `npm run start:local` in the demo repository and open
`http://localhost:8000/camera` directly. No Ollama process is needed; the camera
page makes no `/api/ready` or `/api/reply` request. The existing voice root page
still uses its prior model readiness behavior.

For a bounded camera-only local check, run `npm run start:camera-only` and open
`http://localhost:8000/camera`. This mode serves only `/camera` and its listed
assets; the voice root page and model API routes return 404. It accepts at most
500 HTTP requests in a 20-minute server window. The camera page itself stops
capture and speech after 15 minutes of an active session. The server stays on
loopback by default. These limits and local checks do not establish outside
tester access; no tunnel is started by this command.

For a USB phone, use an authorized ADB reverse to the loopback port, then open
the same localhost URL in Chrome. This camera page has not been published to
the existing private Site. No tunnel or paid provider is needed for local use.

Both shoulders must be inside the frame with visibility >= 0.70. Arrival needs
1,000 ms of consecutive positive samples, departure needs 2,000 ms of negative
samples, and any gap > 750 ms restarts those confirmation timers. Detection,
pose presence and tracking thresholds are 0.50 with one pose maximum. Inference
runs serially in a worker, with 150 ms between completed results and the next
frame; this is not an FPS or whole-device performance claim.

The first arrival requests one authored greeting. A new arrival may greet only
30,000 ms after the last greeting request. An arrival suppressed during cooldown
never greets later during the same occupied interval. No person identification:
one person replacing another without a confirmed gap is continued presence.
New Start sessions reset all state. The page is foreground-only; Stop, hidden
tab, page exit, withdrawn consent, camera disconnect or startup/inference/voice
failure cancels the page's speech and releases tracks. A late permission result
after Stop is immediately released without starting the detector.

Real-camera pass (still pending): record browser/device and actual timings;
arrive and hear one greeting; remain for >30 s with no repeats; leave >2 s;
return during cooldown (silent); depart again and return after cooldown (one
new greeting); Stop during a greeting and verify sound/camera indicators cease.
Also check denied permission, disconnect, hidden tab and consent withdrawal.
Browser synthesis events and synthetic-camera tests cannot prove audible output
or real-world detection quality. This slice cannot pass full B4 or B2/Phase 3.
