Secrets and tokens

Every credential this repository needs, where it is configured, and what breaks without it. Nothing here is required to build or run the app — SenseBridge is serverless and on-device, so the shipped product holds no keys at all (see docs/PRIVACY.md). Everything below serves CI, deployment, or local developer tooling.

Ground rules. Secrets live in GitHub Actions secrets (CI), your account settings (personal credentials), or an untracked local .env (developer tooling). Never in the repository, a log, a built artifact, or a client bundle. Three independent scanners enforce this — gitleaks and tools/check-sensitive-files.mjs pre-commit, TruffleHog and GitGuardian in CI (see docs/TOOLING.md).


1. Repository secrets (GitHub Actions)

Set at Settings → Secrets and variables → Actions → New repository secret.

Secret Used by Required? Effect if unset
ANTHROPIC_API_KEY claude.yml, claude-code-review.yml Only to re-enable those workflows Nothing today — both workflows are intentionally paused (on: workflow_dispatch, disabled 2026-07-17 pending API budget)
RAILWAY_TOKEN railway-preview-deploy.yml For preview deploys The preview deploy job fails. Production is unaffected — it deploys via Railway’s own GitHub App watching main, with no Actions involvement
GITGUARDIAN_API_KEY security.ymlggshield job For the GitGuardian scan The job fails closed (exit_zero: false). This is the one unset secret that actively breaks a check
GITHUB_TOKEN dependabot-automerge.yml, github-models.yml, wiki-sync.yml, pages.yml Never set manually n/a — injected automatically by Actions per run

Notes per secret


2. Account-level settings (not repository secrets)

These live on your GitHub account or your machine, so they follow you across repositories and are invisible to anyone cloning this one.

Verified commits (signing key)

This repository’s commits are signed with a local signing key (confirmed by the owner, 2026-07-25). That is a key, not a token: there is nothing to add to repository secrets, CI never sees it, and no workflow depends on it. It is listed here because it is a credential the project relies on and it lives entirely in account and machine settings, where nothing in the repository would otherwise record it.

Note: not used here — a bot or fine-grained PAT with Contents: read and write also yields verified commits, but only for commits created through the GitHub API (which signs server-side). This project does not sign that way — the key above covers commits pushed from the machine.

Other account-scoped credentials

Credential Where Purpose Status
gh auth token gh auth login on your machine Reused by the user-global github MCP server Per-developer; unrelated to CI
PERPLEXITY_API_KEY user-global MCP config Optional research MCP — every query is egress Not installed
CONTEXT7_API_KEY user-global MCP config Optional; only raises a rate limit (server works unauthenticated) Installed unauthenticated
APIFY_API_TOKEN, GOOGLE_AI_API_KEY user-global Would activate two social-media skills Deliberately unset — leave inert

Never register any of these at project scope; see docs/TOOLING.md for the reasoning.


3. Local developer environment

Variable File Purpose
ELEVENLABS_API_KEY website/.env (untracked) Only for npm run generate:audio, which regenerates the narration audio. Scope it to text-to-speech only
ELEVENLABS_VOICE_ID website/.env Optional override (default: eLDc7xhWxG2FElT3kUTj, the owner-approved “Janet” voice)
ELEVENLABS_MODEL_ID website/.env Optional override (default: eleven_turbo_v2_5)

Copy website/.env.example to website/.env and fill it in — into .env, never into the tracked .env.example. This key is never needed by CI and never deployed: narration is generated locally and the resulting audio is committed. npm run check:audio runs in CI with no key and exits 0 when narration is absent.

Quota, cost per regeneration, the voice-ID pin, and the free-plan commercial-licensing constraint are documented in website/README.md → “Cost, quota, and licensing”.


4. Adding a new secret

  1. Prefer not to. A new credential is new attack surface and a new rotation obligation — confirm the work cannot be done without egress first.
  2. Add it to the correct scope (repository secret for CI; .env for local tooling), never to both.
  3. Document it in the right table above in the same change, including what breaks when it is missing.
  4. If it is consumed by a workflow, make the failure mode explicit — fail closed for anything security-relevant.
  5. If it involves data leaving the device, it also needs a docs/PRIVACY.md update and explicit, revocable user consent.

5. Rotation and exposure


Need help? See SUPPORT.md.