Tori: Security and data handling
Version 20261028 · Octo Fintech Holdings LLC · This page is the reference for what Tori receives, how it moves, what it keeps, who else handles it, and how it is protected. The Privacy Policy and any signed data processing addendum point here for the specifics.
1. What Tori receives
Tori receives data when you sign in, when an agent session starts, and when a check runs, which happens when your coding agent finishes a task or when you run a Tori command yourself.
| Data | When | Purpose |
|---|---|---|
Contents of the code files the check selects: every code file git reports as modified or untracked in the repository when the check runs (not only the files the agent changed), or the files you name when you run tori check yourself; never any path on your project's ignore list | each check | the check itself |
| The list of file paths in the repository (names only, no contents), minus ignored paths | each check | the check |
Contents of .env.example (the template file, no real values) | each check | the check |
| GitHub username and email | sign-in | your account |
| A one-time GitHub access token | sign-in | exchanged for your Tori session; used once to read your GitHub identity, not stored |
A machine identifier (a hash of hostname, user, OS and architecture); a label only if you set TORI_AGENT_LABEL | start of each agent session | identifies which machine the agent ran on, in the record |
The project identifier: the repository's git remote URL (normalized, credentials removed), or, when the repository has no remote, local: followed by a 12-character hash of the directory's absolute path, a stable per-machine, per-directory identifier | install and each check | identifies the project |
The Tori client's package name and version (the HTTP User-Agent, e.g. @earntori/mcp/0.1.11) | each request | diagnostics; tells which client version made a request |
The check selects files by git status, so untracked work in progress in the same repository is included unless you exclude it. Paths you list in .tori/project.json under ignore (tori ignore add fixtures/, seeds/**, scratch) are never sent for checking, never appear in the file-path list, and never leave your machine; re-running tori init preserves the list.
Tori does not receive any other file, your application's runtime data, your customers' data, or credentials. It never reads the repository as a whole and runs no background process.
2. What Tori does with it
The files are checked against rules on Tori's servers. The checks are deterministic rules. No AI model or model provider is in the data path. The data is not used for any other purpose, not used for training, and not shared with or sold to anyone.
3. How the data moves
- Your agent finishes a task
- The Tori command-line tool runs on your machine and reads the code files git reports as modified or untracked, minus ignored paths
- It sends them over HTTPS (TLS) to Tori's API, hosted on Vercel
- The check runs in memory on Vercel; the files are not written to storage
- The results (findings and the signed record) are written to Tori's database, hosted on Neon
Processing and storage are in the United States (AWS us-west-2, Oregon).
4. What is kept, and for how long
| Kept | Retention |
|---|---|
| Findings: file path, line number, rule, message | life of the account |
| The signed record: hashes, timestamps, receipts | life of the account |
| Account details: GitHub identity, project identifiers | life of the account |
| Machine identifier, and the label if you set one | life of the account; the record's first entry for that machine is permanent |
| Not kept | |
|---|---|
| File contents | processed in memory and discarded after the check |
| Request bodies in logs | Tori's application logs do not include file contents or request bodies |
| GitHub access token | used during sign-in and discarded |
Vercel runtime logs (request metadata, application messages) are retained for 1 day. Neon's restore window is 1 day, meaning deleted data can be recovered for up to 1 day after deletion and not after.
On request, or when the account is closed, findings, records and account details are deleted within 30 days.
5. Subprocessors
| Provider | Role | Data it handles | Retention | Attestation |
|---|---|---|---|---|
| Vercel | Hosts Tori's API | File contents in memory during the check; request metadata in logs | Files: not retained. Logs: 1 day | SOC 2 Type II |
| Neon | Hosts Tori's database | Findings, the record, account details | Life of the account; 1-day restore window | SOC 2 Type II |
| GitHub | Sign-in (OAuth) | GitHub identity only | Per GitHub | SOC 2 Type II |
No other third party is in the data path. Tori will give 30 days' notice before adding a subprocessor.
6. Security
- All traffic between your machine and Tori is encrypted with TLS
- Data at rest in the database is encrypted by Neon
- The key that signs the record is stored as a protected secret on Tori's servers and never leaves them. Any receipt can be verified on your own machine with no network connection and no Tori software; a changed record fails verification.
- Production access is held by the founder, with MFA on both consoles and separate production credentials. That access reaches findings, the signed record and account details; it never reaches file contents or any end-user data, which Tori does not hold
7. Commitments
- Breach notification: within 72 hours of Tori becoming aware of a security incident affecting your data
- Deletion on request or termination: within 30 days
- Notice before any new subprocessor: 30 days
- Notice before granting production access to an additional operator: 30 days
8. Contact
Ben Quaye · security@usetori.dev