Security model
From the README and mirrored in both codebases:
- The endpoint is publicly reachable (Cloud Run allows unauthenticated invocation), but authenticity comes from an HMAC-SHA256 signature computed over the raw request body using a shared secret, compared with
hmac.compare_digeston the server. The secret never crosses the wire, only the digest does, and a valid signature cannot be forged without it. Rotating means changing theSKELLYPINGS_SECRETenvironment variable on Cloud Run, baking the new value into clients, and recomputing the static signature header on the Cloud Scheduler backup job, which signs the literal stringbackup. - The secret is stored as a Cloud Run environment variable, not in any repository.
- Consumers inject their copy at CI build time, but only FreeMoCap does it effectively: its installer workflow writes the
SKELLYPINGS_SECRETGitHub secret intofreemocap/build_info.py, the module its telemetry wrapper actually imports. SkellyCam's workflow instead writes the secret toskellycam/build_info.pywhile its wrapper readsskellycam/system/telemetry/build_info.py, so shipped SkellyCam installers still sign with the committed placeholder and their events arrive as unverified regardless of how the secret is configured. Local development uses the placeholder ("not-configured"), which fails verification, so dev events simply land in the unverified collection rather than being rejected.