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.
updateandapp-update(which the app runs at launch and on window focus) rungit ls-remote --tagsagainstgithub.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 downloadandgh 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.jsonland 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 byusage. - 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.
Full reference on GitHub
- Privacy and networkdocs/concepts/privacy-and-network.md