Effective date: September 10, 2026
What GateTest does with your code, what it never does, and the controls that make each statement true — written against the code, not the roadmap.
You are about to point a tool at every file in your repository. This page is the complete account of what happens to those files — where they go, how long they exist, who can see them and which controls stand between them and anyone else. It is written by the people who run the system and every statement on it is checked against the code.
| Layer | Provider | Location | Notes |
|---|---|---|---|
| Application servers | Vultr | United States | Dedicated virtual servers we administer. Scans run here; the temporary workspace for each scan lives on this disk for the duration of the scan only. |
| Database | Neon (managed PostgreSQL) | United States | Accounts, scan findings, payment identifiers, API keys and the audit log. Encrypted at rest by the provider. |
| Registrar and DNS | Cloudflare | United States | Domain registration and DNS only. Traffic is not proxied through the DNS provider; requests terminate at our own edge. |
| TLS | Let's Encrypt | — | Certificates are issued by Let's Encrypt and terminated at our edge, renewed automatically. |
GateTest does not run on Vercel or any other serverless platform. The full list of third parties that touch customer data, with what each receives, is the Sub-processors page.
Every hosted scan follows the same path. Nothing is skipped and nothing is added for particular customers.
Source code does not persist. Not in the database, not in logs, not in error reports, and not in the AI provider beyond its fixed retention window. If you ask us for a copy of your code after a scan, we cannot provide one, because we do not have it.
The hosted engine is a static analyser. It reads your files; it does not execute them. The following modules would have to execute code from the repository being scanned, so the hosted engine refuses them outright — they are unavailable on our infrastructure regardless of tier or configuration:
mutation — runs your own test suite repeatedly against mutated copies of your code.chaos — drives a headless browser against your application and fuzzes its inputs.unitTests — executes your unit-test runner and whatever it loads.integrationTests — executes your integration-test runner, which typically starts your services.e2e — executes your end-to-end test runner and a browser.lint — runs your project's linter, which loads plugins from your dependency tree.These modules run only where your code already runs: in your own CI through the GitHub Action, or on your own machine through the CLI. In both places the code executes under your account, with your credentials and your network, and nothing about the run reaches us except the findings if you choose to upload them.
There is no sandbox. We do not isolate customer code in a container or virtual machine, because we do not execute it. The control is refusal, not containment, and it is enforced in code rather than by policy. This is also why a hosted scan cannot be tricked into running a build script, a post-install hook or a test that happens to be in the repository.
The App requests exactly the scopes the shipped code needs. The table is generated from the same declaration the engine and the Marketplace listing use, and a test fails the build if the code ever calls a GitHub endpoint outside it.
| Permission | Access | Why we need it |
|---|---|---|
| Contents | Read & write | Read your code to scan it, and push the auto-fix branch — code is never stored |
| Pull requests | Read & write | Open the auto-fix PR and leave inline review comments |
| Commit statuses | Read & write | Green ✅ or red ❌ on each commit |
| Issues | Read & write | Post the scan summary as a PR comment |
| Metadata | Read | Know which repos to watch |
For readers who want to verify rather than trust, these are the endpoints that force each scope:
| Permission | Endpoints that require it |
|---|---|
| Contents | GET /repos/{owner}/{repo}/tarball/{ref}, POST /repos/{owner}/{repo}/git/refs, POST /repos/{owner}/{repo}/git/commits, DELETE /repos/{owner}/{repo}/git/refs/heads/{branch} |
| Pull requests | POST /repos/{owner}/{repo}/pulls, PATCH /repos/{owner}/{repo}/pulls/{number}, POST /repos/{owner}/{repo}/pulls/{number}/comments |
| Commit statuses | POST /repos/{owner}/{repo}/statuses/{sha} |
| Issues | POST /repos/{owner}/{repo}/issues/{number}/comments, PATCH /repos/{owner}/{repo}/issues/comments/{id} |
| Metadata | GET /repos/{owner}/{repo} |
The App subscribes to 4 webhook events: push, pull_request, workflow_run, issue_comment. No other event reaches us.
The App is published as gatetest-hq; the permission prompt GitHub shows at install time is the list above.
Signing in with GitHub uses the OAuth scopes read:user and user:email — your login and e-mail address only; sign-in never grants repository access.
Gluecron repositories are connected through a push contract: Gluecron sends push events to our endpoint authenticated with a shared secret (bearer token or HMAC signature), and the engine fetches the commit with a token you issue for scanning. We hold no standing credential to your Gluecron account beyond that token.
includeSubDomains and preload.X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN, a strict-origin-when-cross-origin referrer policy and a Permissions-Policy that disables camera, microphone and geolocation.Your session cookie is encrypted with AES-256-GCM and authenticated with an HMAC, so it can be neither read nor forged without the server key. It is HttpOnly, SameSite=Lax and Secure, and expires after 30 days. The full cookie inventory is in the Cookie Policy.
The deterministic scan uses no AI. Every module in the standard suite is rule-based and runs entirely on our server; nothing leaves it. AI is used only on the paths that say so — AI review, auto-fix and the Forensic diagnosis — and only when your tier or request includes them.
Payments, subscriptions and the billing portal are handled by Stripe (Stripe, Inc.). Card details are entered on pages Stripe hosts and never pass through, or are stored on, our servers; what we receive is the outcome of the payment and the identifiers needed to link it to your account and scan. PCI DSS obligations for card data are met by Stripe as a certified Level 1 service provider. We make no PCI attestation of our own and do not need one, because card data never touches us.
GATETEST_NO_TELEMETRY=1 or with "telemetry": false in .gatetest.json.We hold no third-party certification today. There is no SOC 2 report, no ISO 27001 certificate and no independent penetration-test report for GateTest. If a vendor questionnaire asks for one, the honest answer is that it does not exist yet. SOC 2 readiness work exists internally; we will publish the report on this page when there is one, and not before.
What we can offer now:
Please tell us. E-mail support@gatetest.io with steps to reproduce, the impact as you understand it, and the affected URL, endpoint or package version. We aim to acknowledge every report within 5 business days, keep you informed as we investigate and fix, and credit you if you would like us to.
We will not pursue legal action against, or report to law enforcement, security research conducted in good faith that: avoids privacy violations, data destruction and any degradation of the service (including denial-of-service testing); does not access, modify or retain data belonging to other customers; stops and reports immediately on encountering such data; and gives us reasonable time to fix an issue before it is disclosed publicly. If you are unsure whether something is in scope, ask first.
A machine-readable version of this policy is published at https://gatetest.io/.well-known/security.txt in the RFC 9116 format.
A finding that fires on code it should not have is a defect in the scanner, not a fact about your code. Every one we retract ships with a control-pair test — the exact line that fired it, pinned as a regression test so the same shape cannot fire again without the test failing first.
97 reported · 97 retracted · median 6.2 hours from report to fix, over the 4 reports whose report time is on record (23 rules retracted; a report that retracted several counts once). 2 of those are timed from the first commit that records the issue as filed, which can be later than the filing itself, so the real median may be longer, never shorter. The other 74 we found ourselves, in triage and in scans of our own code, or their report time is not on record — they are dated from the first commit of the fix, so they are counted but left out of the median rather than flattering it. Counted from docs/precision/retractions.json and regenerated at every build from the timestamps on each entry — not typed by hand.
Report one by e-mail to support@gatetest.io with the module, the rule and the line it fired on.
A security page that lists only strengths is marketing. These are the gaps we know about and have not yet closed:
When one of these changes, this page changes in the same release. If a limitation you care about is not listed, e-mail us and we will either add it or explain why it is not one.