Help
speeDB reads a repository, finds every database query in it, and proposes rewrites that return the same results — then checks each suggestion back against the code it came from before showing it to you.
Getting started
- Open the side panel. Click the speeDB icon in the toolbar. Use the expand button in the top-right to open the same view in a full tab.
- Add credentials. Open Settings (the gear icon, top-right) and pick an AI provider. Cloud providers need an API key; Chrome built-in AI needs nothing.
- Add a forge token. Under GitHub & GitLab, paste a read-only token and press Test connection. This is optional for public repositories but strongly recommended — see the rate limits below.
- Paste a repository URL and press Scan. If you already have a GitHub or GitLab page open, the field is filled in for you — including the branch.
Reading a report
Findings are split into two groups that are never mixed:
| Group | What it means |
|---|---|
| Same output | The rewrite is asserted to return identical results. Each one carries an explicit equivalence argument covering rows, columns, ordering, NULLs and duplicates. |
| Changes behaviour | A real improvement or bug fix that does alter what the query returns. Often worth doing — but it is your decision, so it is kept separate. |
The Verified badge
Every citation a finding makes — file path, line range, quoted schema — is re-checked against the bytes actually fetched from your repository. A finding badged Verified passed every check. One badged Needs check is shown with the specific reasons listed at the top of its detail view. Suggestions that cited files which do not exist are dropped entirely, and the count of dropped suggestions is shown in the report header rather than hidden.
It is the claim the whole tool rests on. If it does not convince you, do not apply the change — that is the argument doing its job.
Databases and languages covered
speeDB detects queries across relational, non-relational and analytical stores:
| Family | Engines |
|---|---|
| Relational | PostgreSQL, MySQL, MariaDB, SQL Server, Oracle, SQLite, Db2 |
| Distributed SQL | CockroachDB, TiDB, YugabyteDB, Cloud Spanner, Vitess |
| Cloud warehouse | Snowflake, BigQuery, Redshift, Synapse, Databricks, Athena, ClickHouse |
| Big data / Hadoop | Hive, Spark SQL, Trino/Presto, Impala, HBase, MapReduce |
| Document | MongoDB, CouchDB, DynamoDB, Firestore, Cosmos DB |
| Wide column | Cassandra, ScyllaDB, Bigtable |
| Key-value / in-memory | Redis, Memcached, etcd, Hazelcast, Ignite |
| Graph | Neo4j (Cypher), Neptune (Gremlin/SPARQL), ArangoDB (AQL) |
| Search | Elasticsearch, OpenSearch, Solr |
| Vector | pgvector, Pinecone, Weaviate, Qdrant, Milvus, Chroma, FAISS |
| Time series | InfluxDB, TimescaleDB, Prometheus, Druid, QuestDB |
| Object / embedded | ObjectDB, Realm, DuckDB, RocksDB/LevelDB, TinyDB, shelve |
Query sites are detected in JavaScript, TypeScript, Python, Java, Kotlin, Scala, Groovy,
Clojure, Go, Rust, C, C++, C#, F#, Ruby, PHP, Perl, Swift, Objective-C, Elixir, Erlang,
Dart, Lua, R and Julia, plus standalone .sql, .hql,
.cql, .cypher and .prisma files.
Approximate nearest-neighbour search trades accuracy for speed. Changing
ef_search, nprobe or topK changes which
neighbours come back, so speeDB classifies every recall-affecting change as
behaviour-changing — never as a same-output optimisation.
Autodetect from your current tab
With the side panel open, speeDB reads the address of the tab you are on. If it is a repository page, the repository and branch are filled in automatically, and the field keeps up as you browse.
- A link to a single file is normalised back to the repository root.
- Forge pages that are not repositories — dashboards, settings, the marketplace, owner and group pages — are ignored.
- Anything you type yourself is never overwritten.
Caching and rescanning
A finished scan is cached for 60 minutes. The cache key is the commit SHA plus the AI provider and model, so:
- Scanning the same commit again is instant and costs no tokens.
- A new commit never reuses an older commit's results.
- Switching model or provider always produces a fresh analysis.
To bypass the cache deliberately:
- Scan fresh, ignoring cached results — under the Scan button.
- Rescan without cache — on a report that was served from cache.
- Clear cached scans — Settings → Appearance.
Cached reports are held in memory only, never written to disk, and disappear when Chrome closes.
AI providers
| Provider | Code leaves your device | Needs a key |
|---|---|---|
| Chrome built-in AI | No | No |
| Anthropic | Yes | Yes |
| OpenAI | Yes | Yes |
| Google Gemini | Yes | Yes |
The model dropdown is populated by asking the provider what your key can actually use, so new models appear without an extension update. If that request fails, speeDB falls back to a built-in list and tells you why.
Reasoning models fix their own temperature. OpenAI's o-series and GPT-5 family reject a custom temperature outright, so speeDB omits the parameter for them and disables the slider rather than letting every request fail. Your saved value is kept and still applies to models that honour it.
Rate limits
| Forge | Anonymous | With a token |
|---|---|---|
| GitHub | 60 requests/hour | 5,000 requests/hour |
| GitLab | Low, public projects only | Full read access within your plan's limits |
A medium repository can use several hundred requests. Test connection on the forge tab reports how much headroom the token has left, not just whether it works.
Keyboard
| Key | Action |
|---|---|
| ↓ / j | Next finding |
| ↑ / k | Previous finding |
| Home / End | First / last finding |
| Esc | Close the finding, or the export dialog |
Troubleshooting
“Repository not found”
Private repositories need a token with read access. On GitHub, a fine-grained token must grant Contents: read for that specific repository.
“Rate limited”
Add a forge token in Settings. Without one, GitHub allows only 60 requests an hour across all of your scanning.
“Repository is too large”
GitHub caps a single recursive tree listing at 100,000 entries. Scan a specific branch, or a smaller repository.
The scan appears stuck
It should not: every request times out after 30 seconds (90 for the initial file listing) and retries, and Stop scan cancels requests already in flight. A file that times out, is stored in Git LFS, or exceeds 512KB is skipped, and the count of skipped files is shown next to the files-read counter and in the report header.
The scan stopped early
It hit the token budget set in Settings. The report says how many passes did not run. Raise the budget or narrow the scan.
No findings at all
This is a real result, not a failure. The header shows how many files were read and how many query sites were found, so you can tell “nothing to fix” apart from “nothing was looked at”.