Privacy policy
speeDB has no backend. There is no speeDB server, no account, and no analytics. Everything the extension does happens in your browser, and the only network requests it makes go to services you have configured yourself.
We collect nothing. Your code goes to the AI provider you choose, and nowhere else. Choose Chrome built-in AI and it does not leave your device at all.
What speeDB sends, and where
| Destination | What is sent | When |
|---|---|---|
| GitHub / GitLab | Your access token, and requests for the file tree and file contents of the repository you named. | During a scan. |
| Your chosen AI provider (Anthropic, OpenAI or Google) |
Your API key, and excerpts of source code from the scanned repository — the detected query sites plus schema and migration files. | During a scan, if you selected a cloud provider. |
| Chrome built-in AI | Nothing leaves the device. The model runs locally. | During a scan, if you selected it. |
| Anyone else | Nothing. There is no telemetry, no error reporting, no analytics, and no speeDB-operated server of any kind. | Never. |
Which parts of your code are sent
speeDB does not upload whole repositories to the AI provider. A local, deterministic pass identifies candidate query sites first, and only those excerpts — plus schema and migration files needed to check index claims — are included in a request. Everything else is read into browser memory and discarded.
That said, the excerpts that are sent are real source code from your repository. If your organisation prohibits sending source to third-party AI services, use Chrome built-in AI, which sends nothing.
What is stored, and where
| Data | Storage | Lifetime |
|---|---|---|
| API keys and forge tokens | chrome.storage.session (memory-backed) by default |
Cleared when Chrome closes. Never written to disk unless you turn on “Remember keys after Chrome closes”. |
| Preferences (provider, model, temperature, theme, budgets) | chrome.storage.local |
Until you change or uninstall. |
| Recently scanned repository URLs | chrome.storage.local |
Last 8 entries, until you uninstall. |
| Scan reports (cache) | chrome.storage.session (memory-backed) |
Up to 6 reports, each expiring 60 minutes after the scan. Cleared when Chrome closes, or immediately via Settings → Appearance → Clear cached scans. |
| Runtime evidence you paste in (query plans, index catalogs, query logs) | chrome.storage.session (memory-backed) — no disk option |
Up to 40 captures. Cleared when Chrome closes, or immediately via Settings. Never sent anywhere, including to your AI provider. |
About the scan cache
A completed scan is kept for 60 minutes so that reopening a report, or scanning the same commit again, costs nothing. The cache key includes the commit SHA, so a new commit is never served a previous commit's results; the AI provider and model, so switching either produces a fresh analysis; and the analysis settings and prompt version, so a change to how speeDB analyses never reuses results produced by the previous version. Cached reports live in memory only and are never written to disk. Rescan without cache on the report, and Scan fresh on the start screen, both bypass it entirely.
About runtime evidence
If you paste EXPLAIN ANALYZE output, an index catalog or a query log into
speeDB to check a finding, understand what that text contains:
a query plan carries production values inside its Filter: and
Index Cond: lines; a query log carries bound parameters; a
pg_stats dump carries a sample of your rows.
So evidence is held to a stricter rule than your API keys, and the reason is that a leaked key is revocable and a leaked customer record is not. It is kept in memory-backed session storage, and there is no option to persist it to disk — deliberately, because offering one would mean most people take it. It is never transmitted: it is not sent to your AI provider, it is not included in an exported report, and speeDB has no server to send it to.
Where only the shape of a statement is needed — counting how many times one query shape ran, which is how an N+1 is confirmed — literals are stripped before anything is stored or displayed. If you export a contradicted finding to share with us, the export contains the finding and the measured numbers, never the raw capture that produced them.
About key storage
A browser extension cannot meaningfully encrypt secrets at rest — any key it can decrypt, code running in that extension can decrypt too. Rather than implement encryption that only looks secure, speeDB defaults to not persisting keys at all. The cost is re-pasting a key once per browser session. Turning on disk storage is a single, explicitly labelled toggle.
Keys are never written to logs, never included in exported reports, and are masked in the UI.
Permissions, and why each is needed
| Permission | Why |
|---|---|
storage | Save your preferences and hold credentials in session memory. |
sidePanel | The extension's primary interface. |
tabs | Open the full-tab view, and pre-fill the repository field from the tab you are on. |
api.github.com, gitlab.com/api | Read the repository you ask speeDB to scan. |
| AI provider hosts | Optional. Requested only when you select a cloud provider, and revocable at any time in Chrome's extension settings. If you only ever use Chrome built-in AI, speeDB never gains permission to contact any AI service. |
speeDB does not request <all_urls> and cannot read the content of the
pages you browse.
Third-party services
When you use a cloud AI provider or a forge, that service's own privacy policy and data retention rules apply to what speeDB sends on your behalf. speeDB does not control how long they retain requests, and does not receive any of that data back:
- Anthropic — anthropic.com/legal/privacy
- OpenAI — openai.com/policies/privacy-policy
- Google — policies.google.com/privacy
- GitHub — GitHub Privacy Statement
- GitLab — about.gitlab.com/privacy
Children
speeDB is a developer tool and is not directed at children under 13.
Deleting your data
Uninstalling the extension removes everything it has stored. To clear credentials without uninstalling, close Chrome (if key persistence is off), or clear the fields in Settings.
Changes to this policy
Material changes ship with a new extension version and are noted in the release notes. Because there is no server, no previously collected data can be repurposed by a policy change — there is none to repurpose.