Cursor Codebase Indexing: How to Make It Work Better
Cursor's codebase indexing is what makes it feel "smart" about your project. When it works, you get relevant suggestions, accurate @-mentions, and answers that actually understand your architecture. When it doesn't, Cursor feels blind.
This guide explains how indexing works and how to optimize it.
How Cursor Understands Your Codebase
Cursor builds two things in the background:
-
Embeddings - Vector representations of your code files. When you ask a question or use
@, Cursor searches these vectors to find the most semantically relevant files. -
AST (Abstract Syntax Tree) analysis - Cursor parses your code to understand imports, function definitions, class hierarchies, and relationships between files.
These two systems work together. Embeddings find "what looks relevant," and AST analysis figures out "what is actually connected."
Indexing happens automatically when you open a project. For large codebases, the initial scan can take a few minutes. You'll see a progress indicator in the status bar.
@-Symbols: The Right Way to Use Them
The @ symbol is your direct line to Cursor's indexing. Use it to pull specific context into chat or inline edits.
@file - Reference a specific file
@src/utils/auth.ts how does the token validation work?
This is the most reliable way to ensure Cursor sees the exact file you care about. It bypasses embedding search and attaches the full file content (up to context limits).
@folder - Reference an entire directory
@src/components explain the component hierarchy here
Useful for architecture questions, but be careful - large folders can eat up your context window fast.
@code - Reference a specific symbol
@code:validateUser what edge cases does this handle?
This uses the AST index to find the exact function, class, or variable definition. It's precise and context-efficient.
Prefer @code: over @file when you only need one function. It saves context space and reduces noise.
Optimizing for Large Projects
If your project has thousands of files, default indexing might miss things or feel slow.
Check what's actually indexed
Open Cursor Settings > General > Codebase Indexing. You'll see:
- Total files indexed
- Last indexed time
- Any files that failed to parse
Increase context relevance
For monorepos, Cursor sometimes picks up irrelevant files. Be explicit in your prompts:
Look only at @packages/api/src for this question. Ignore the frontend code.
Split giant files
Files over a few thousand lines can cause issues. Cursor may only index the beginning or struggle with embeddings. If you have a 5000-line utility file, consider splitting it.
Ignoring Files with .cursorignore
Not everything should be indexed. Generated files, build output, and third-party code waste context space and pollute search results.
Create a .cursorignore file in your project root:
# Build output
dist/
build/
.out/
# Dependencies
node_modules/
vendor/
# Generated files
*.generated.ts
*.min.js
coverage/
# Large data files
*.csv
*.json
.cursorignore uses the same syntax as .gitignore, but it's a separate file. Don't assume your .gitignore is enough - Cursor doesn't automatically respect it.
After editing .cursorignore, restart Cursor or wait a minute for re-indexing.
When Indexing Breaks: Troubleshooting
Sometimes Cursor clearly doesn't "see" your code. Here's the checklist:
1. Check if the file is indexed
Open the file, then ask:
What file am I currently looking at?
If Cursor can't answer, the file might not be in the index.
2. Force a re-index
Command Palette (Ctrl+Shift+P) → "Cursor: Reindex Codebase"
This rebuilds the entire index from scratch. It takes time but fixes most corruption issues.
3. Look for parse errors
In Settings > General > Codebase Indexing, check for files with red error indicators. These files aren't being analyzed for AST relationships.
Common causes:
- Syntax errors in the file
- Unsupported language (Cursor supports ~20 languages well)
- Binary or minified files misidentified as source code
4. Verify .cursorignore isn't too aggressive
If you ignored *.config.* and your vite.config.ts contains important path aliases, Cursor won't understand your imports.
Improving Context Quality
Getting the right files into context is only half the battle. How you use that context matters too.
Be specific in your questions
Bad:
How does auth work?
Good:
In @src/auth/middleware.ts, how does the JWT verification handle expired tokens?
Chain your context
If Cursor gives a partial answer, follow up with more specific @ references rather than repeating the whole question.
You mentioned rate limiting. @src/middleware/rateLimit.ts - how is the limit calculated?
Use recent files
Cursor weights recently opened files higher in embeddings search. If you just opened a file, @ references to related files are more likely to work without explicit mentions.
For complex refactors, open all the files you plan to change first. This "primes" the index to treat them as relevant.
Summary
- Cursor uses embeddings + AST to understand your code
- Use
@file,@folder, and@code:to control context explicitly - Create a
.cursorignoreto exclude noise - Reindex when things feel broken
- Be specific in prompts - the index finds files, but you guide how they're used

The codebase indexing settings panel shows your project's indexing status and any errors.