what we store, and what we don't

Data & Trust

What nittim stores, how long, and how to delete it.

How little you can give us

Start at the top rung. Move down whenever you want — never to get started.

Your assistant, our rubric

Nothing reaches nittim

Run /selfcheck’s 13 categories with your own assistant — you give us nothing. It wrote the code, so it may repeat its own blind spots; an independent judge catches those, and that’s what we sell.

Our report library

Nothing of yours leaves your machine

Read real scans of well-known public code in /library before nittim sees a line of yours. Nothing to take on faith.

Your repo, free scan

Read in memory, never written down

No AI in the free scan. Two deterministic scanners read the files and build the report. A test fails the build if source text reaches the database — a property of the code, not a promise.

AI audit on your own key

The reasoning runs on your Anthropic account

BYOK Pro — API, MCP, or GitHub Action: the call runs on your key, under your vendor terms. nittim's model account never sees your code — check your own Anthropic bill.

AI audit, on our key

Your code, in memory, plus our model vendor

Held in memory for the audit, never trained on, discarded after. The one rung that asks you to take nittim's word for it — last on purpose.

Your own infrastructure

On request

Nothing leaves your cloud at all

Built, both halves ran end to end, and it runs in your account — no source, finding or repo name reaches nittim. Not self-serve: we set it up with you on request. Images aren’t signed yet — verify by published hash.

What we store — and what we don't

Audit report

Stored

Findings, scores, verdict, repository name. Persisted so you can retrieve it later via a shareable link or the API.

Source code

Not stored

Never stored. Fetched into server memory during analysis, discarded when the pipeline finishes. Two deliberate exceptions: a finding's evidence includes the offending lines it points at, and — where it concluded something was missing — names the places it looked for it; those excerpts and paths live in your report (access-gated for private repos), because a finding without evidence is an opinion; and the uploaded zip below, if you ask us to hold it while an audit runs. A multi-pass or batch audit also parks its own working state on the report row while it runs, and those same lines sit in it. That working state is cleared the moment the run finishes — done, failed, or refunded — and does not linger with the finished report.

Uploaded zip — only if you ask

Held briefly

Not held unless you tick the box. Tick it and nittim keeps the zip you uploaded so the audit can read past its first run: encrypted at rest, in a private bucket, no public URL, no download link, reachable only by the audit pipeline. It is erased the moment the audit finishes — at most 24 hours, and an hourly sweep clears anything left. Every deletion is recorded in nittim's audit log. Deleting the report, or your account, erases it right then. Anthropic already receives the digest during any deep audit; holding the zip changes how long nittim keeps your bytes, not who sees them.

GitHub tokens

Not stored

Never stored. A pasted token is used once to call the GitHub API, then discarded from memory. GitHub App installation tokens are minted per-audit and expire on their own within the hour; nittim records only the installation id.

Request logs containing code

Not stored

Application logs record request metadata only — never the source snapshot content.

Does an AI train on your code? No.

No model reads your code on a free scan. Checks run on nittim's own servers, and the only outside calls about your code go to GitHub, to fetch it, and OSV, to check package versions.

An AI audit sends a prioritized code digest to Anthropic's API. Commercial terms bar training on it — nittim has no data-sharing deal and keeps nothing after. See Anthropic's commercial terms for their side of that boundary.

Anthropic deletes API inputs and outputs within 30 days, unless a zero-data-retention deal exists — nittim doesn't have one, so that window is the vendor's own guarantee, not ours. See Anthropic's data-retention policy.

Read-only by construction

nittim can never modify your code. The nittim-audit GitHub App holds read-only permissions only, no events. Administration: read-only reads settings, never changes them — it is how nittim sees what your default branch requires before a merge. GitHub enforces it regardless of nittim's code; the exact list is at github.com/settings/installations. Using a token instead? Make it fine-grained, read-only, scoped to one repo, and revoke it after.

Retention schedule

Reports are kept until you choose to delete them. There is no automatic expiry for live reports.

When a report is deleted, it immediately disappears from all read paths — the report link returns not-found and the API returns 404. The underlying row is then permanently removed from the live database on the next hourly retention pass. Rows deleted more than 30 days prior are purged on that pass; a row deleted today will be purged on or after the corresponding date 30 days out.

That 30-day window governs the live database — everything a report link, the API, or nittim itself can query. A separate, nightly encrypted backup of the whole database also exists, for disaster recovery only, and a deleted report's data can remain inside that backup for up to 120 more days after the 30-day window closes. Backups are never queried for an individual record — they expire on a fixed schedule and are only ever restored to recover the entire system, never one report.

Deleting a report

You own every report you generate. To delete one:

via API (API key or session token)

DELETE /api/v1/audit/<id>
Authorization: Bearer <your-api-key>

200 means success. 403 means it's not yours. 404 means it's already gone or never existed.

When we get one wrong

Dispute any finding — on the report page, or via your agent over MCP with evidence from your code. A person reviews every dispute. An accepted one gets corrected on the record, and you're paid in credits — more for a pipeline flaw than a wrong finding. We pay to be proven wrong because it's worth more than the credits.

Shareable links

Public reports and scans are open to anyone with the link — that's the whole point. Delete one to stop it being reachable.

Private or posted source is locked to its owner or org member by default — everyone else gets 404. Only the owner or an org admin can create, see, or turn off a share link (the Share button always says what it hands over); an ordinary member can see one exists but never gets the link. A share link uses its token, never the report's id, so it can't widen what any other page shows. It works for anyone who has it, no account needed, until it's turned off — then it stops working immediately, for everyone.

Organization access

Everyone in an organization can read a report run inside it; an owner or admin can delete it. Reports stay scoped to their own organization.

Infrastructure

Reports live in Supabase (Postgres, us-east-1), encrypted in transit (TLS 1.2+) and at rest (AES-256). A Vercel-held service-role key reaches the database — never sent to your browser, never committed to source.

Where your bytes can live

Supabase Postgres (us-east-1)

Holds: the audit report (findings, scores, verdict, repository name), the evidence excerpts a finding points at and the paths it searched before reporting something missing; account identity; credit balances.

Guard: a test in the build fails if source text ever reaches the database; reports are access-gated for private repos.

Supabase Storage — upload-source bucket

Holds: an uploaded zip, only when the customer asked us to hold it while its audit runs; erased when the audit finishes.

Guard: private bucket with no access policies; an orphan sweep erases anything an audit left behind.

Vercel function logs

Holds: request metadata (route, status, timing, ids).

Guard: never the snapshot content — application logs record metadata only.

Anthropic API

AI audit only

Holds: the prioritized digest of the code sent for an AI audit call, on nittim's key (or on the customer's key under BYOK).

Guard: Anthropic deletes API inputs and outputs from its backend within 30 days of receipt unless a zero-data-retention agreement is in place; nittim does not have one at this stage, and says so. Not used for training under Anthropic's commercial terms.

OSV (the public vulnerability database)

Holds: package names and versions from the dependency manifest, never code.

Guard: that is the only thing the lookup sends.

GitHub

Holds: nothing new. nittim reads the repository and never writes. On a public repo, the free Scan also reads recent commit history.

Guard: pasted tokens are used once and discarded; GitHub App installation tokens are minted per audit and expire within the hour; only the installation id is recorded.

Over MCP, nittim pulls nothing: only the files your assistant posts arrive, and the server cannot ask for more. Where they land is the same server and the same 6 places as every other path — MCP changes the doorway, not the map.

This list narrows where a copy could be. It cannot prove our code never writes to one of these places — only an independent review of the code path, or running both halves inside your own cloud, can close that. We'd rather say so than let the table imply more than it shows.

What the audit digest contains

Only the AI tiers send to a model. This is what goes.

  • Source files in the languages we read — the repository's own code.
  • Dependency manifests and lockfiles — package.json, requirements.txt, go.mod, Cargo.lock and their peers.
  • Configuration and infrastructure — Dockerfiles, CI workflows, Terraform, .env files and their examples.
  • Documentation the repository ships — Markdown and plain text.
  • Executable scripts with no extension, admitted by their shebang line.
Audit · File count500
files fetched from the repository, at most.
Full Audit · File count2000
files fetched in ONE window — and a Full Audit fetches window after window until every eligible file has been read, so this is not a total.
Audit · Per-file size200 KB
per file — a bigger file is skipped, never partially guessed at.
Full Audit · Per-file size4 MB
per file on this tier — the lockfile cap, applied to every file. A big source file an Audit skips is fetched whole here.
Both · Lockfile size4 MB
for a lockfile, which is long by nature and is where the dependency truth lives.
Audit · Total size5 MB
of source in total, across everything fetched.
Full Audit · Total size20 MB
of source per window, not in total — see the sentence under this list for what a Full Audit adds up to.
Audit · Per-file characters16K characters
of any single file reach the model; past that the file is cut and marked as cut.
Full Audit · Per-file characters200K characters
of any single file reach the model on this tier; past that the file is cut and marked as cut.

A Full Audit is sold on reading every eligible file, so the numbers per window above are not a total: it fetches one window, then the next, until every eligible file in the repository has been read. What travels over a whole Full Audit is your repository's own eligible source — the file kinds listed above, at the per-file caps above — and nothing else.

Nothing is stripped. Comments, strings and secrets-looking text travel exactly as they are written in the file — the only changes are the cut at the per-file cap above, and the file markers around each body being escaped so a file cannot forge one. Images, fonts, binaries, vendored dependencies and generated bundles never travel at all.

Every column on a report row

A report is one row. Every column, by what it holds.

Can hold your code

report, resume_state, batch_finalize_state

Outcome

verdict, executive_score, full_scan

Identity

id, created_at, repo, user_id, repo_url, org_id, is_private, commit_sha, content_hash, resume_repo_url, batch_parent_report_id, upload_zip_content_hash

Operational

status, error, deleted_at, share_token, share_created_at, report_emailed_at, queued_notified_at, refund_review_at, draining_since, last_pass_at, passes_done, passes_total, resume_attempts, resume_lease_owner, resume_lease_until, batch_id, report_version, batch_charge_ent, batch_polled_at, batch_submitted_at, byok_run, byok_sealed_key, byok_sealed_key_expires_at, byok_sealed_key_sealed_at, upload_consent_at, upload_zip_expires_at, upload_zip_key

3 columns can hold text from your repository: the report itself, because every finding carries the lines it points at, and the two working-state columns a multi-pass or batch audit writes as it goes and clears the moment it finishes. Every other column is an id, a verdict, or machinery.

If your data is ever breached

A confirmed breach touching your data reaches you within 72 hours of confirmation — every account, every tier, paid or free. What we know, what it touched, what we're doing. Sent before we have every answer.

Found a security issue?

Found a vulnerability instead of a data question? See the disclosure policy — scope, safe harbor, and how to report it.

See the disclosure policy →

How accurate is nittim?

We publish our accuracy method and results — trust isn't assumed.

Full Audit: findings confirmed twice list first; seen-once findings follow.

See the benchmark →

Have questions?

Ask anything about what we keep, where it goes, or how to give us less. A person reads every message.

Sending this stores your name, email, phone, and message to reply to you — kept only as long as needed, never sold or shared. Delete your message anytime via this form.