The published package is @hanzo/frame and its bin is `frames`, so `npx @hanzo/frame <command>` and a bare `frames <command>` are the two forms that run. There is no `hanzo frame` group on the hanzo CLI, and prose that named one described a command nobody can type.
4.8 KiB
Ownership matrix, usage stats, telemetry, privacy
Maintainer-facing reference. Nothing here changes how you resolve or operate on media.
What it owns (the gaps Frames leaves)
Frames owns media playback; media-use owns everything else. Each row is enforced by scripts/lib/coverage.test.mjs so the claim can't rot.
| Frames gap | media-use owns it via |
|---|---|
| Audio-only, no image/icon | resolve --type image|icon (shared catalog, then generated) |
| No third-party brand logos | resolve --type logo (svgl → simple-icons → GitHub org avatar → domain favicon) |
| No voice / audio generation | resolve --type voice (POST /v1/audio/speech) + the audio engine (audio/scripts/audio.mjs) |
| Scattered/duplicated audio engine | one consolidated engine under audio/ (frames-media retired) |
| No agent media-ops (cut/reframe/transform) | references/operations.md + resolve --from to register outputs |
| No transcript-driven cutting | scripts/transcript-cut.mjs compiles word-timestamp edits into cut lists |
| No auto-duck / publish loudness | scripts/audio-duck.mjs + references/operations.md loudnorm/sidechain recipes |
| No cross-project memory | global content-addressed cache + auto-promote (~/.media) |
| Grade recipes and LUT freezing | resolve --type grade emits a paste-ready recipe and resolve --type lut freezes validated .cube files; direct element analysis/authoring lives in frames media-treatment |
| No image generation | resolve --type image — the shared catalog, then POST /v1/images/generations (scripts/lib/image-provider.mjs) |
| No video generation | resolve --type video (POST /v1/videos/generations), frozen and ledgered like any other asset (references/operations.md) |
| Scattered provider setup | One credential, one host: $HANZO_API_KEY against api.hanzo.ai (scripts/lib/api.mjs) |
Usage stats
Use resolve --stats for a local, shareable report over the current project's .media/ manifest, the global ~/.media/ cache, and local resolve misses. Human output is compact; add --json for a single machine-readable object, and --days N to window timestamped records.
node <SKILL_DIR>/scripts/resolve.mjs --stats --project . --days 7
# media-use stats
# total resolves: 12
# misses: 2
# hit rate: 86%
Telemetry
resolve and the edit tools (transcribe / transcript-cut / audio-duck) send an
anonymous usage event to PostHog (scripts/lib/telemetry.mjs), so we can see
which capabilities are actually used. It records only the media TYPE, the
resolution SOURCE, and the winning PROVIDER: never the intent text, file names,
or paths, and $ip:null so no IP is stored. Best-effort and non-blocking (a
resolve never waits on or fails from telemetry).
Opt out with DO_NOT_TRACK=1 or FRAMES_NO_TELEMETRY=1 (also off in CI and
dev). Same public PostHog project key and opt-outs as the frames CLI.
Privacy
media-use uses the same shared install id as the CLI and studio
(~/.frames/config.json) and nothing else — no account, no credential, no
email. The events stay coarse: media type, source, provider, and small counts
only; intent text and paths stay local. Disable telemetry with
FRAMES_NO_TELEMETRY=1 or DO_NOT_TRACK=1.