Core concepts

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

WhenWhat is sentTo avoid it
Any verb that writes to the team repo, such as publish or installA git fetch, then a git push of one commit holding what the verb ownsDo not run the verb. There is no local-only write.
team create, team join, team moveCreate pushes a scaffold commit; join clones the whole repository and pushes your people file; move joins the new remoteNone: joining a team means reaching its remote
sync, and the app’s background refreshA git fetch onlyDo not run sync or the app
The session hook, if installedA git fetch at session start, at most once an hour per teamDecline the hook, or remove its SessionStart entry
eval with a team configuredA fetch before the run, then a push of the receipt when the bytes are a published versioneval --no-commit stops the push

Git also sends your credentials for that remote.

GitHub’s API, through gh

WhenWhat is sentTo avoid it
invite <login>The repository slug and each login you typedAdd collaborators on GitHub yourself
team remove <handle>An admin check, the collaborator and invitation lists, and a removalteam remove --archive-only
status --permissionsA lookup of the repository’s adminsPlain status
team join, setup <org>/<repo>A search of your invitations, acceptance of the match, an access checkAccept the invitation in the browser first
Setup’s handle suggestiongh api user -q .loginAnswer the handle question yourself
team create on GitHubgh repo create <owner>/<repo> --privateteam 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 repositoriesRuns 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

WhenWhat is sentTo avoid it
eval execution armsOne claude -p session per arm in a sandbox: the task, the staged skill folder, and the case’s staged filesDo not run eval. There is no offline arm.
eval trigger casesEach trigger prompt, plus the name and description of every skill folder in the same Library rooteval --execution-only
eval generating missing assetsThe 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 callsThe task, the rubric, and the last 6,000 characters of each of the two transcriptsA case with no judge rubric makes no judge call
missesHarvested prompts with trimmed context, and the names and descriptions of your placed skills, to sonnetDo not run misses. Nothing else runs it.
publish choosing a categoryThe first 2,000 characters of SKILL.md and the team’s category list, to haikuDeclare 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:

VariableEffect
CIAny non-empty value
NO_UPDATE_NOTIFIERThe conventional variable
TERUM_SKILLS_NO_UPDATE_NOTIFIERThis 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