Grep for agents, over every repository you host.
Index each repository, branch or customer as a namespace. Your agent finds every call site by regex, counts them exactly, and adds vectors when meaning matters, with no checkout. Repos nobody is working on cost only their bytes.
From recorded runs, with how each was measured, on the benchmarks page.
Regex, answered from an index
RE2 patterns are planned against a trigram index, so the agent greps a large repo without reading every file. Character classes the index can look up (G-[A-Z0-9]{10}) narrow the search too.
Exact, then semantic
Coding agents need every call site of a symbol, not the five nearest embeddings. Exact and regex search with exact counts come first; add vectors per file or chunk when “code that does X” matters.
A namespace per repo, branch or customer
Made by its first write. Repos nobody is working on cost only their bytes in S3, so an agent platform can keep every customer’s code indexed, not just this week’s.
Push files, then grep them
A file is a document: its path as the id, its contents as text, language and directory in metadata. Writing a path again replaces the file.
R=https://api.skimmerdb.com/v1/namespaces/repo-acme-api # one per repo (or branch) # your indexer pushes files: path as the id, language and dir to filter on curl $R/docs -H "Authorization: Bearer $ADMIN" -d '{ "docs": [{"id": "src/billing/invoice.ts", "text": "export function applyProration(sub: Subscription, ...", "meta": {"lang": "ts", "dir": "src/billing", "commit": "9f3c2e1"}}]}' # a file changed: write it again; a file deleted: delete its id curl $R/delete -H "Authorization: Bearer $ADMIN" -d '{"ids": ["src/old/legacy.ts"]}'
# every call site, not "similar code" curl $R/search -H "Authorization: Bearer $AGENT" -d '{ "q": "applyProration\\(", "regex": true, "filter": {"lang": "ts"}}' # TODOs with a ticket number, outside tests curl $R/search -H "Authorization: Bearer $AGENT" -d '{ "q": "TODO\\(?[A-Z]+-[0-9]+", "regex": true, "filter": {"dir": {"ne": "test"}}, "limit": 50}' # how many files still import the old client? counted exactly curl $R/count -H "Authorization: Bearer $AGENT" -d '{"q": "from \"legacy-http\""}'
Agents connect themselves
SkimmerDB is a remote MCP server with OAuth. Claude Code, Cursor and Codex get tools to search, count, run SQL and, with a write key, push documents. For a platform, your backend makes one read key per customer.
- Scoped. A key can reach
repo-acme-*and nothing else. - Bounded. Every query has a time limit; past it, a search answers what it found and says so.
- Metered. Every answer reports its latency, object-store reads and CPU.
# Claude Code, Cursor, Codex: the agent gets search, count, write_documents... claude mcp add --transport http skimmerdb https://api.skimmerdb.com/mcp # or a read key for one customer's repos curl https://api.skimmerdb.com/v1/keys -H "Authorization: Bearer $ADMIN" -d '{ "name": "acme agent", "scope": "read", "namespaces": ["repo-acme-*"]}'
Patterns
| Agent platforms | A namespace per customer repository (repo-acme-api). The agent serving a customer gets a read key for repo-acme-* and nothing else. |
| Branches and PRs | A namespace per branch, written as the agent works and deleted when the PR merges. Nothing runs for it while it waits for review. |
| Logs and stack traces | CI logs and error reports in a namespace beside the code: regex for the exception, filters for service and day, counts for how often. |
| Docs and issues | Issues, ADRs and internal docs with labels in metadata, searched in the same call as the code that mentions them. |
| Code analytics | SQL over file metadata: GROUP BY language or directory, with grep() and contains() predicates on the text. |
StackGrep searches the HTML of 38 million websites by regex to find which ones use a technology. Its whole index is served by SkimmerDB as one namespace, read from S3 through the same cache every namespace uses.
Questions
Why not just let the agent run grep?
On a laptop, grep is great. A hosted agent needs the code somewhere it can reach: cloning every repository for every task is slow, and keeping thousands of customers’ repositories checked out on disk is expensive. SkimmerDB keeps each repository as a namespace in object storage and answers regex from an index, so the agent searches without a checkout.
What regex syntax is supported?
RE2: linear time, no backreferences. Patterns are case-sensitive unless they start with (?i); plain text queries are literal and case-insensitive. A pattern with no literal of three or more characters and nothing the index can look up has to check every document, so past 100,000 documents it runs only when the query says scan: true.
Can it do semantic code search too?
Yes. Send an embedding with each file or chunk and search by vector, alone or narrowed by text and metadata filters in the same query. The embedding model is yours to choose.
How big can a repository be?
A document’s text can be up to 2 MB and a write up to 10,000 documents; a namespace has no document limit we’ve hit. The largest index served today is StackGrep’s: the HTML of 38 million websites as one namespace, searched by regex.
How do I keep one customer’s code away from another’s agent?
One namespace per repository (or per customer, with a prefix), and a read key limited to it. Other namespaces answer exactly like names nobody has, over the REST API and MCP.
What does an idle repository cost?
Only its storage: $0.10 per GB-month on pro, and the free plan includes 1 GB. Its first query after a long sleep reads from object storage in a round trip or two, then it’s warm.
Give your agents grep at scale
Free up to 1 GB stored and 100k queries a month. No card to start.