TeireDocs
ChangesScanDashboardTry Teire
GuideEcosystems & APIsNemotron on Token FactoryBuild
ChangesScanDashboard
Try Teire
ArchitectureHow Teire updates dependency filesVerificationToken Factory SandboxesSecurity and trustContributing to the catalog

Tools

CLIMCP serverAgent Skill
Build

Security and trust

Your code runs only in an isolated sandbox with the network off for checks. No secret enters it. Only Nemotron on Token Factory reads code, and nothing reaches your default branch without your merge.

How Teire runs on teire.vercel.app: the worker's heartbeat and commit, model credits available, Nemotron 3 Ultra answering, missed deliveries; the week's model spend and run outcomes as one bar; then where your code goes as two flows, public on Token Factory Sandboxes and private on Cloudflare, with the network cut before your checks.
The live trust page in production: the worker's heartbeat and version, credits, model routing and missed deliveries, then spend, permissions and where code goes.

The sandbox

A private repository's installs and checks run on Cloudflare Containers: one Durable Object drives one container, and each side of a run gets its own. A public repository's, and every dry run's, run on Token Factory Sandboxes, a microVM per command, with no network interface during the checks.

On Cloudflare Containers:

RuleHow
No direct internetContainers start with enableInternet: false. All HTTP and HTTPS goes through Teire's egress handler
Install: registries onlyGET and HEAD over HTTPS to 25 hosts: npm and Yarn, PyPI, Maven Central and Google's mirror, Gradle, the Go proxy, crates.io and the Rust toolchain, RubyGems, Adoptium, and GitHub with its release assets
Checks: nothingEvery request is answered 403 and recorded with its host, method and path. Denied hosts appear in the PR
No secrets insideThe repository arrives as a tarball the egress handler fetches outside the container, adding the GitHub token itself. The token is dropped after the fetch. Model keys never enter
No install scriptsnpm, pnpm, Yarn v1 and Bun install with --ignore-scripts, Yarn Berry with --mode=skip-build
One token per sandboxEach sandbox needs its own signed token (HMAC-SHA256). The worker signs it for 15 minutes; the service refuses anything valid for over 2 hours
BoundedEach job has a 60-minute ceiling, each command's output is capped, and an idle container stops after 15 minutes
Nothing left behindTearing a sandbox down deletes its container and all its stored state

The worker never runs your repository's code. It reads packages with static tools: TypeScript declarations, griffe, apidiff, Prism, japicmp on jars, and ast-grep. Tarballs are integrity-checked and unpacked by Teire's own extractor, which refuses links and .. paths.

The package cache

On Cloudflare Containers, a repository can keep its package manager's download cache between runs, saved to R2 after the baseline installs and restored before the next run's installs. It is keyed by the repository, never by a lockfile: the worker looks up every restore by the run's own repository, so one repository's cache can never reach another's checks. Only the download directory is saved (npm's _cacache, pip's and uv's caches, Go's module download cache, Cargo's registry cache, Maven's repository, Gradle's files cache), never built output or your code. The sandbox Worker seals each record it saves and restores only records it sealed itself, under the name the worker gave it, so a record handed in from anywhere else is refused. A root that installs from its own registry (an .npmrc or .yarnrc.yml registry or token, a pip index, a Cargo registry, a Gemfile source, a Maven settings.xml or repository) is never cached, so a private registry's packages never reach the bucket. A root keeps its two newest caches; uninstalling the app, or removing a repository from it, deletes its records, and the bucket expires objects after 30 days. The receipt says whether a run restored a cache, how long it took, and which lockfile it was saved from, and a restore that fails says so instead of reading as "no cache". It is off until R2 is enabled for the deployment.

The dependency updater

Manifest and lockfile changes are moving to dependabot-core's updater (How Teire updates dependency files). It runs on Teire's own server, not in the verification sandbox:

  • in a separate Docker daemon whose containers run under gVisor;
  • on a network with no route out, behind Dependabot's proxy and a host firewall that blocks Teire's apps, its database, cloud metadata and every host port;
  • with a token that can only read the one repository, held by the proxy, never by the updater;
  • with images pinned by digest, whose build attestations are checked before use;
  • one job at a time.

The threat model lists each control and the probe that proves it.

The agent

The model is handed file contents, documentation, check output and provider pages as data, never as instructions. Code limits what it can do:

  • It edits only the files the change reaches and the files your check output names.
  • It never edits manifests, lockfiles, tsconfig, build config, CI, .env files or credentials.
  • It can't read .env*, .git/, node_modules/ or key files.
  • It must not delete, skip or weaken tests, or add new casts, any or type-ignore comments. The review checks the final diff for exactly these.

Provider data

A provider's change is acted on only when its quote is found word for word in the page Teire fetched from the provider's own domain. See the quote gate. Items whose quote fails are dropped; records that fail the final checks are kept as unconfirmed and never applied.

On GitHub

PermissionAccessWhy
ContentswriteRead the code and dependency files; push one branch per fix (teire/…). Never the default branch
Pull requestswriteOpen and update fix PRs, and the Configure Teire onboarding PR
IssueswriteKeep the Teire Dashboard issue, open needs-a-human issues, and answer @teire commands
CheckswritePublish the Teire check run with an annotation on every line a change reaches
ActionsreadRead your CI's logs when it fails on a Teire PR, for one repair attempt
MetadatareadRepository names and default branches; GitHub requires it for every app
Email addressesreadYour account's email when you sign in with GitHub, to name your account; never emailed

Teire never merges and never pushes to your default branch. Commands and dashboard actions need write access to the repository.

Where your code goes

  • Models. Only NVIDIA Nemotron on Nebius Token Factory reads code.
  • Search. Tavily receives search queries that name a provider, such as "Groq API deprecations…", never code.
  • Storage. A scan downloads the repository at one commit and deletes it when the scan ends. Teire keeps the findings (file, line and the matching line), the diffs it proposes, run logs, receipts, and the tail of each sandbox command's output.

Token Factory Sandboxes

Public repositories and dry runs are verified on Nebius Token Factory Sandboxes, microVMs Teire builds its own images in. Private repositories stay on Cloudflare Containers.

Contributing to the catalog

Add a provider Teire can read, or a change it missed, through a pull request. CI checks it against the same schema Teire uses, and a merged record is live on the next deploy.

On this page

The sandboxThe package cacheThe dependency updaterThe agentProvider dataOn GitHubWhere your code goes