Searching the estate
This page is for people using searchcode enterprise in a browser: the search box, the results, the file view and code navigation. Agents use the same API through MCP, and Check the estate before you build is their version of this page.
Every page here shows only repositories you are allowed to see. A repository you cannot see does not appear in a count, a facet or an error, so two people can run the same query and get different answers. Who sees what is set by your administrator; Who sees what explains how.
The search box
Type a term and press return. Searches run across every repository you can see unless you narrow them.
Terms are ANDed. retry backoff finds files containing both words. Each extra
term returns less, so when a search is too broad, add a filter rather than
another word.
| You type | It matches |
|---|---|
retry backoff |
files containing both terms |
retry OR backoff |
files containing either |
retry NOT test |
files containing retry and not test |
(retry OR backoff) http |
grouping, as you would expect |
"exponential backoff" |
the exact phrase |
/[Rr]etry[A-Z]\w+/ |
a regular expression, between slashes |
backof~1 |
fuzzy: within one edit of the term |
Matching is case-insensitive.
As you type, a line under the box explains what the query will do: that a regular expression or a fuzzy term was recognised, or that three ANDed terms will match very little. It never changes or submits your query. With JavaScript turned off the box works the same; only the explanation is missing.
Filters inside the query
| Filter | Narrows to | Example |
|---|---|---|
lang: |
one language, as the line counter names it | lang:Go |
repo: |
one repository, by name or unique short name | repo:payments |
tech: |
files using a detected technology | tech:Django |
path: |
files whose path contains the value | path:internal |
file: |
files whose name contains the value | file:retry |
ext: |
one file extension, without the dot | ext:ts |
Filters accept = and != as well as :, and comma-separated values mean "any
of these": lang=Go,Python, ext!=md. path and file treat a value containing
*, ? or [ as a glob.
A value with a space or punctuation needs the operator form or quotes. Write
lang="Visual Basic" rather than lang:Visual Basic, which searches for the word
Basic. For technologies, quote after the colon: tech:"AWS SDK (Boto3)".
A filter typed into the query binds to the term next to it, not to the whole
query. a OR b path:src means a OR (b AND path:src), so matches for a come
from anywhere. To filter the whole query, use the facets on the results page
instead.
A filter on its own, with no term, is a listing: lang:Go lists the Go files in
scope. That is also what clicking a facet does.
Examples that run
The home page lists example queries built from your own estate: real repository names, your largest language and your most-used technology. Each one is a link that runs exactly the query printed on it, so they are a quick way to check the syntax against code you know. The same list appears when a search finds nothing.
Results
The header gives two numbers: how many matches and how many files. One file with forty matches is one row. The pager counts files.
Each row names its repository and path, shows the matching lines with a little context, and links to the file view at the matching line.
Facets
The side panel counts what the whole match set contains, not just the page you are on:
- Languages
- Repositories
- Repository groups
- Technologies, from the analysis pass
Click a value to narrow to it. Applied filters appear as chips above the results, each with a control to remove it. A long facet has its own filter box, so you can find one repository among hundreds without scrolling.
A repository that is still cloning, or that failed to clone, is still listed in the repository facet and marked as such, rather than disappearing.
When something could not answer
Search is honest about what it could not read. When a repository could not contribute to an answer, an amber coverage banner above the results says which and why: it is still cloning, its analysis has not finished, or it is a directory source with no commit history.
An empty result with no banner means nothing in scope matched. An empty result with a banner means some of the estate could not be asked. Those are different statements, and the page never shows one as the other.
When nothing matched
A search with no results says which of three causes applies:
- The repository was never ingested. It is not configured, or it failed.
- It is still cloning or being analysed. Try again shortly.
- Nothing in scope matched. The page says which of your terms or filters reduced the answer to zero, and offers the example queries.
If you narrowed to one repository and that repository cannot answer, that is stated first, because it is the question you asked.
The file view
Open any result to see the file with syntax highlighting. The header shows the language, the line count and the short commit the file was read at, and has these controls:
- Copy permalink. The link pins the commit, never a branch, so it shows
the same lines next year. Select a range by clicking a line number, then
shift-clicking another; the link carries the range, for example
#L12-L20. - Blame, when the repository has history. Each line shows who last changed it and when.
- History. The commits that touched this file, newest first, with paging.
- Browse. The directory tree at the same commit.
- Wrap long lines, a toggle.
- View raw (downloads). The raw file always downloads as plain text. It is never rendered in the browser, whatever the file contains.
When you open a permalink to an older commit, a banner says you are looking at a past revision.
Very large files are capped for display, and the page says so and links to the raw file. A single extremely long line, such as minified code, is cut for display and marked as cut.
Findings and outline
Beside the code are two panels:
- Findings: security and code quality findings on this file, with their lines marked in the gutter. Security findings come first, and style findings are collapsed.
- Outline: the declarations in the file. The arrow beside each one opens code navigation for that name.
Hover and click
Hover an identifier to see a short preview of what it is and where it is declared. Click it to open code navigation. The preview needs no JavaScript.
Code navigation
Code navigation answers two questions about a name: where it is defined, and where it is used. Switch between them with the link at the top of the page.
Exact and probable
Every result is labelled:
- exact: a language grammar parsed that file and found this declaration. It says what the declaration is. It does not say it is the one your cursor was on, because two declarations can share a name.
- probable: a match on the name, without a grammar's confirmation. Every reference is probable.
Show exact results only hides the probable ones, and the page says how many it hid. Languages with no grammar in this build still get answers, all probable.
This repository or the whole estate
Navigation starts in the repository you came from. Whole estate widens it to every repository you can see, with results grouped by repository. Widening finds more places the name appears; it does not resolve anything more precisely.
Across the estate, navigation stays within the language of the file you started from. Search every language instead removes that limit.
A very common name can appear in more files than navigation will sort through.
When that happens, the page says the name appears in that many files and states
the limit, rather than showing a misleading partial list. Narrow back to one
repository, or search for the name with a filter. Your administrator can change
the limit with search.symbols.crossRepoCeiling.
An empty answer is never presented as proof that a name is declared nowhere. The page says what was searched, because a symbol table covers what its grammars cover and no more.
Other pages for everyone
| Page | What it answers |
|---|---|
Dependencies (/dependencies) |
Which files use a technology, across everything you can see, with the line and the keyword that attributed it, so you can check the attribution rather than trust it |
Findings (/findings) |
Security and code quality findings across the estate. Security only by default; choose all to include quality. Filter by severity, category, repository and whether to include test files |
Hotspots (/repo/REPOSITORY/hotspots) |
Files ranked by complexity multiplied by how often they changed, in a window you choose. Both inputs are shown |
Complexity trend (/trend) |
Whether complexity is falling in the files that change most |
Repository trends (/trend/repositories) |
Which repositories are getting less complex and which more, side by side, with churn shown so you can judge how much to trust each line |
Hotspots, history, blame and trends need commit history. A directory source has none, and those pages say so rather than showing an empty ranking.
Keyboard
| Key | Does |
|---|---|
/ |
Focus the search box |
Escape |
Leave the search box |
j / k |
Move to the next or previous result |
Enter |
Open the selected result |
Every shortcut is a convenience: each page works fully without JavaScript.
Your account
/account shows who the instance thinks you are:
- your identity and the identity groups you arrived with;
- the repository groups those reach and any instance roles you hold;
- how many repositories you can reach, and how many can answer a query right now. These differ while repositories are cloning or failing.
It is also where you create and revoke API keys for agents and scripts, and where your instance's MCP connection details are shown for every common client. Most agents should sign in with OAuth instead of a key; Which credential do I use? explains which to use, and Connect an agent client has the snippets.
For the same search from a script, see API and MCP tool reference.