Scout answers searches that text search cannot. Type part of a file name you half remember, and the file comes back. Ask in plain English — “where request retries are limited” — and Scout finds the code even when it uses none of those words. Describe the shape of the code you want, and Scout matches the shape rather than the characters, so a comment that happens to say the same thing is not a hit.
It also does ordinary text search, and the tables below show how that compares with ripgrep and GNU grep on two real repositories.
| Search type | What you ask | Scout |
|---|---|---|
| dotnet/runtime · Fuzzy file discovery Finds the file even when you only remember part of its name. | httpclientfactory | 14.3 ms |
dotnet/runtime · Code shape Matches how the code is written, not just the text. $$$ stands for “any arguments”, so this one finds every throw of that exception however it was constructed — and skips the same words inside a comment or a string. | throw new ArgumentNullException($$$) | 13.5 s |
| dotnet/runtime · Symbol outline Lists declarations: names, kinds, and where they live. | HttpClient | 2.2 s |
| dotnet/runtime · Semantic Ask in plain English; finds code that says it in different words. | “where request retries are limited” | 628 ms |
| dotnet/runtime · Semantic Ask in plain English; finds code that says it in different words. | “cancellation token propagation through async streams” | 622 ms |
| Private monorepo · Fuzzy file discovery Finds the file even when you only remember part of its name. | httpclientfactory | 16.4 ms |
Private monorepo · Code shape Matches how the code is written, not just the text. $$$ stands for “any arguments”, so this one finds every throw of that exception however it was constructed — and skips the same words inside a comment or a string. | throw new ArgumentNullException($$$) | 4.2 s |
| Private monorepo · Symbol outline Lists declarations: names, kinds, and where they live. | HttpClient | 1.3 s |
| Private monorepo · Semantic Ask in plain English; finds code that says it in different words. | “where request retries are limited” | 437 ms |
| Private monorepo · Semantic Ask in plain English; finds code that says it in different words. | “cancellation token propagation through async streams” | 418 ms |
--semantic); the cost is in the table below.limits.find-budget-ms and limits.structural-parse-cap raised above the shipped default. Out of the box the same search stops earlier and reports how far it got. The other rows in this table ran on the shipped limits: neither limit bounds a fuzzy or a semantic search.59,319 files, 30,172 of them C#. All three tools read every file. Each number is the median of 10 runs.
| Search | Scout | ripgrep | GNU grep | Matching lines |
|---|---|---|---|---|
Literal, commonpublic static | 372 ms | 788 ms | 17.2 s | 165,310 |
Literal, rareConfiguredCancelableAsyncEnumerable | 347 ms | 764 ms | 17.0 s | 33 |
Regexasync Task<\w+> | 407 ms | 778 ms | 17.0 s | 774 |
Word boundaryDispose | 354 ms | 778 ms | 17.5 s | 10,965 |
Case-insensitive literalhttpclient | 342 ms | 752 ms | 17.3 s | 3,181 |
46,466 files, 22,381 of them C#. All three tools read every file. Each number is the median of 10 runs.
| Search | Scout | ripgrep | GNU grep | Matching lines |
|---|---|---|---|---|
Literal, commonpublic static | 257 ms | 692 ms | 12.9 s | 13,390 |
Literal, rareTaskCompletionSource | 250 ms | 636 ms | 12.9 s | 8 |
Regexasync Task<\w+> | 279 ms | 643 ms | 12.9 s | 543 |
Word boundaryDispose | 260 ms | 653 ms | 13.2 s | 553 |
Case-insensitive literalhttpclient | 380 ms | 945 ms | 22.8 s | 377 |
Scout pays these once per repository. ripgrep and grep pay nothing up front, but pay the full search cost on every single call.
| Repository | Index ready in | Semantic setup | First-ever search | Memory |
|---|---|---|---|---|
| dotnet/runtime | 2.2 s | 9.9 h | 2.6 s | 175 MB (6241 MB with semantic on) |
| Private monorepo This repository already had its index built, so the one-time costs were not measured again. | — | — | — | 114 MB (1416 MB with semantic on) |
Build the index once, and every later search is cheaper. This is how many searches it takes until that one-time cost has paid off against ripgrep.
| Query | Break-even | Scout per query | ripgrep per query |
|---|---|---|---|
| dotnet/runtime · Literal, common | 6 searches | 372 ms | 788 ms |
| dotnet/runtime · Literal, rare | 6 searches | 347 ms | 764 ms |
| dotnet/runtime · Regex | 6 searches | 407 ms | 778 ms |
| dotnet/runtime · Word boundary | 6 searches | 354 ms | 778 ms |
| dotnet/runtime · Case-insensitive literal | 6 searches | 342 ms | 752 ms |
A speed comparison is worth nothing if the two tools return different results. Before timing anything, every shared search was run through both and the matching lines compared.
| Search | Result |
|---|---|
| dotnet/runtime · Literal, common | Same total — 165,315 matches counted by both, on 165,310 lines |
| dotnet/runtime · Literal, rare | Identical — 33 matching lines in both |
| dotnet/runtime · Regex | Identical — 774 matching lines in both |
| dotnet/runtime · Word boundary | Same total — 11,073 matches counted by both, on 10,965 lines |
| dotnet/runtime · Case-insensitive literal | Identical — 3,181 matching lines in both |
| Private monorepo · Literal, common | Same total — 13,390 matches counted by both, on 13,390 lines |
| Private monorepo · Literal, rare | Identical — 8 matching lines in both |
| Private monorepo · Regex | Identical — 543 matching lines in both |
| Private monorepo · Word boundary | Identical — 553 matching lines in both |
| Private monorepo · Case-insensitive literal | Identical — 377 matching lines in both |
.gitignore case-sensitively, git itself usually does not, and Scout follows git. On one repository here that difference was 1,753 files (restored NuGet packages nobody tracks) that ripgrep would have searched and Scout correctly skips. We removed them from ripgrep's side too, so both tools searched exactly the same files.--no-semantic --no-telemetry for the comparison battery, --semantic --no-telemetry for the semantic rows. Find budget 120000 ms, page size 200.