# Privacy and network

An inventory, not a reassurance. There is no telemetry and no Terum account, and there is still traffic. This page lists where it goes, what it carries, and how to avoid each item.

## An inventory

Nothing goes to Terum. Your machine does talk to four places: your team's git host, GitHub's API through `gh`, Anthropic through your own Claude Code login, and the repository terum-skills is released from.

The desktop app adds no destinations: it has no HTTP client, and every request below happens inside the CLI process it spawns.

## What leaves your machine

### Your team's git host

| When | What is sent | To avoid it |
| --- | --- | --- |
| Any verb that writes to the team repo, such as `publish` or `install` | A `git fetch`, then a `git push` of one commit holding what the verb owns | Do not run the verb. There is no local-only write. |
| `team create`, `team join`, `team move` | Create pushes a scaffold commit; join clones the whole repository and pushes your people file; move joins the new remote | None: joining a team means reaching its remote |
| `sync`, and the app's background refresh | A `git fetch` only | Do not run `sync` or the app |
| The session hook, if installed | A `git fetch` at session start, at most once an hour per team | Decline the hook, or remove its `SessionStart` entry |
| `eval` with a team configured | A fetch before the run, then a push of the receipt when the bytes are a published version | `eval --no-commit` stops the push |

Git also sends your credentials for that remote.

### GitHub's API, through `gh`

| When | What is sent | To avoid it |
| --- | --- | --- |
| `invite <login>` | The repository slug and each login you typed | Add collaborators on GitHub yourself |
| `team remove <handle>` | An admin check, the collaborator and invitation lists, and a removal | `team remove --archive-only` |
| `status --permissions` | A lookup of the repository's admins | Plain `status` |
| `team join`, `setup <org>/<repo>` | A search of your invitations, acceptance of the match, an access check | Accept the invitation in the browser first |
| Setup's handle suggestion | `gh api user -q .login` | Answer the handle question yourself |
| `team create` on GitHub | `gh repo create <owner>/<repo> --private` | `team create <name> --remote <url>` on a repository you made |
| `sync`, when a GitHub team's repository answers "not found" | Your invitations and repositories, and `team.json` from up to eight of that owner's repositories | Runs only then, and never from the session hook |

Run without `gh` installed and every GitHub-only operation refuses and says it needs `gh`.

### Anthropic, through your Claude Code login

| When | What is sent | To avoid it |
| --- | --- | --- |
| `eval` execution arms | One `claude -p` session per arm in a sandbox: the task, the staged skill folder, and the case's staged files | Do not run `eval`. There is no offline arm. |
| `eval` trigger cases | Each trigger prompt, plus the name and description of every skill folder in the same Library root | `eval --execution-only` |
| `eval` generating missing assets | The full `SKILL.md` and the names, not contents, of the other files. Trigger generation also sends the Library root's catalog. | `eval --no-gen`, and write the cases and triggers yourself |
| `eval` judge calls | The task, the rubric, and the last 6,000 characters of each of the two transcripts | A case with no `judge` rubric makes no judge call |
| `misses` | Harvested prompts with trimmed context, and the names and descriptions of your placed skills, to `sonnet` | Do not run `misses`. Nothing else runs it. |
| `publish` choosing a category | The first 2,000 characters of `SKILL.md` and the team's category list, to `haiku` | Declare `metadata.terum-category`, or pass `--category <name>` |

### The release repository

- **Release check.** `update` and `app-update` (which the app runs at launch and on window focus) run `git ls-remote --tags` against `github.com/ryanliu-terum/terum-skills`, at most once a day, and only when a team on this machine has a GitHub remote. It sends no version of yours, no identity and no query.
- **App downloads.** Installing or updating the desktop app runs `gh release download` and `gh attestation verify`, which send the release tag, the asset name, the repository slug and the SHA-256 of the downloaded bytes. The CLI works without the app.

## What the team repo records about you

Joining writes `people/<handle>.json`, and every teammate can read it: your handle, display name and email (defaulted from your global git config), GitHub login, what you have installed (skill, version and scope, never a filesystem path), what you endorse, anything you set with `profile`, and a count of the skill folders on your machine, not their names.

Receipts you commit carry your handle as `runner_handle`, the scores, the models you asked for, `k`, your Claude Code version, and the skill names each arm's session resolved. `efficiency` records each arm's turns, duration and `cost_usd`, so teammates can see what a run cost you, and `environment_skips` names the host tools a case asked for and did not find. Free text in a receipt is scrubbed for credential-shaped strings before it is written.

Every commit carries your git `user.name` and `user.email`, and history is permanent unless someone force-pushes.

## What stays local

- **Full eval runs**: transcripts, sandboxes, `run.jsonl` and generated files, under `~/.terum/skills/evals/local/<digest>/<runId>/`. Only the receipt is ever shared.
- **Usage events**: `~/.terum/skills/run/usage-events.jsonl`, four fields per line (skill name, timestamp, kind of firing, entrypoint), read only by `usage`.
- **Your config**: `~/.terum/skills/config.json`, mode 0600.
- **Quarantine and backups**: under `~/.terum/skills/quarantine/` and `~/.terum/skills/backups/`.

One exception: generated eval assets are also written into the skill folder, and `publish` shares a skill's eval assets with the team.

## What is never collected

No telemetry. No analytics SDK in the CLI or the app. No crash reporting. No Terum account, no Terum login, and no Terum service your machine talks to. Nothing reports which skills you have, which you ran, or that you exist.

## Silencing the update notice

After a verb, when stderr is a terminal, the CLI may print one line saying a newer release exists. Any of these environment variables suppresses it:

| Variable | Effect |
| --- | --- |
| `CI` | Any non-empty value |
| `NO_UPDATE_NOTIFIER` | The conventional variable |
| `TERUM_SKILLS_NO_UPDATE_NOTIFIER` | This tool's own |

Running with `--frames` suppresses it too, so the app never sees it. These silence that one line and nothing else. The release check, the app's update check, and every `git`, `gh` and `claude` call still run.
