What you'll learn
By the end of this you'll know whether Cursor is worth switching to from VS Code — and whether the Pro subscription is worth paying for. You'll see what a real first week looks like, where the tool earns its price, and the specific spots where it falls short. I've been using Cursor on production TypeScript projects for several months and the opinion here is based on that, not a two-hour demo.
If you want the short answer without reading the whole thing: it's good. For solo developers who spend most of their day in an editor, it's probably the best AI-native IDE available right now. The caveats are real though — read the Common mistakes and Troubleshooting sections before you assume your experience will match the highlight reel.
Who this is for
- Developers evaluating whether to switch from VS Code (with or without Copilot) to a dedicated AI IDE
- Solo developers considering the Pro plan and trying to figure out if the cost is justified
- Cursor users a few weeks in who aren't sure they're getting full value from the tool
Skip this if you've already used Cursor for three or more months on a real project and have a clear opinion. Jump to Troubleshooting if you're already on Cursor and something specific isn't working right.
What is Cursor?
Cursor is a code editor built by Anysphere. It started as a VS Code fork in 2023 and has grown into one of the most talked-about developer tools in the AI coding space. It adds AI capabilities — chat, inline completions, multi-file editing, and an agentic mode — at the editor level rather than as a plugin layered on top of VS Code.
Plain English: it's VS Code with AI built in from the start, not VS Code with an AI extension installed afterward. The difference matters more than it sounds at first.
Simple idea: imagine if the editor already knew your entire codebase, remembered your preferences, and could make changes across multiple files at once while you reviewed the diffs. That's the core pitch. The execution is mostly good.
Prerequisites
- VS Code experience — Cursor's interaction model assumes you're comfortable in that environment
- Familiarity with a basic AI chat interface — if you've used ChatGPT or Claude, the Cursor chat panel will feel familiar immediately
- At least one real project to test with — the first week will be hard to evaluate fairly on a toy app
Optional but useful: some experience with a rules file or system prompt configuration. If you've used Custom Instructions in ChatGPT, the Cursor rules file works on similar principles.
Setup from zero
Step 1 — Install and import your VS Code settings
Download Cursor from cursor.com. The installer handles most of the VS Code migration automatically. On first launch, Cursor offers to import your VS Code extensions, themes, keybindings, and settings. Accept all of it. The import takes a couple of minutes and eliminates most of the setup friction.
One thing to check after the import: if you had VS Code extensions that depend on the exact VS Code release version, confirm they still work. Most do. A few that hook into VS Code internals can behave unexpectedly on a fork — check your most-used ones within the first day.
Step 2 — Choose your model
Cursor lets you route different tasks to different models: Claude 3.5 Sonnet, GPT-4o, Claude 3 Opus, and others depending on your plan tier. The default for most tasks is Claude 3.5 Sonnet. For most developers on most tasks, that default is fine. The model routing settings are in the Cursor settings panel under "Models."
Don't overthink model selection at the start. Prompt quality and the rules file configuration matter more than which model you pick for a given request.
Step 3 — Set up your rules file
Before you do anything else with the AI features, create a .cursorrules file in your project root. This is the highest-leverage 15 minutes of your Cursor setup.
A minimal rules file for a TypeScript project:
You are helping build a TypeScript project.
Return types must be explicit. Avoid any.
Server Components by default. Add "use client" only when I explicitly ask.
Tailwind for styles. No CSS-in-JS.
When modifying code, only touch files I reference unless I say otherwise.
Adjust the specifics to your stack. The last line — "only touch files I reference" — is important. Without it, the agent mode will cheerfully modify files you didn't mention.
Step 4 — Run your first real task
Don't start with completions. Start with a bug you already know the answer to. Describe it in the chat panel, paste the relevant code, and see how the tool reasons through it. This gives you a calibration point for what good output looks like from Cursor on your specific codebase.
After that, try a small refactor that touches two files. Trigger the agent mode. Review the diff it produces. This is the workflow you'll use most days — and running it on a known task first means you can judge the output quality fairly.
The mental model
Cursor operates on three levels: completions (fast, line-by-line suggestions as you type), chat (a conversation where you ask questions or give instructions), and agent mode (autonomous multi-file editing that produces a diff for you to review).
The levels aren't mutually exclusive. Most experienced Cursor users treat completions as background noise they accept or ignore, use chat for questions and context, and reserve agent mode for tasks that span more than one file.
The thing that makes Cursor different from Copilot-in-VS-Code isn't any single feature. It's that the editor knows about your whole project by default. Open file context, project-wide symbol indexing, and the rules file all feed into every interaction. You're not fighting context limits every time you start a new conversation.
Key terms
Rules file — a .cursorrules file (or the newer rules/ directory) at your project root. Persistent instructions that shape AI behavior for that specific project. The single most important configuration lever in Cursor.
Agent mode — autonomous multi-file editing. You describe a task, Cursor reasons across your codebase, and proposes a diff. You review and accept or reject. The scope of the task directly affects how clean the diff is.
Codebase indexing — Cursor indexes your project files so the AI has search access to your whole codebase, not just the open file. This is what makes questions like "where is this function used" work reliably.
Context pills — the @ mention system in the chat panel. @file, @symbol, @docs, @web — these pin specific context into the conversation. More precise than hoping the AI finds the right files on its own.
Tab completions — inline suggestions as you type. Cursor's completions are context-aware (they consider surrounding code and the rules file) rather than pure autocomplete based only on what's immediately before the cursor.
Step-by-step
Using chat for code questions
Open the chat panel with Cmd+L (Mac) or Ctrl+L (Windows). Ask a question about a file you have open. Cursor automatically uses your open file as context. For more targeted context, use the @ mention system:
@auth.ts why is the token validation function returning undefined on expired tokens?
That pins the specific file and asks a specific question. You'll get a more useful answer than a vague "my auth isn't working."
Using agent mode for a multi-file refactor
Open a new chat, click the Agent button, and describe your task with explicit constraints:
Refactor the user authentication flow to use JWTs instead of session cookies.
Only modify files in src/auth/ and the relevant test files.
Do not change the API contract — existing callers should not need to update.
Cursor runs the agent, reads the relevant files, proposes changes, and shows you a diff. Review every file in the diff before accepting. The agent is useful but it sometimes touches more than you asked — the explicit "only modify" constraint helps, though it doesn't eliminate this entirely.
Setting up context pills for a focused session
For work on a specific feature, add context pills at the start of the chat session:
@src/components/UserProfile.tsx @src/hooks/useUserData.ts
I'm adding an avatar upload feature. The image should be stored in S3 and the URL saved to the user record.
This tells Cursor exactly which files are relevant and frames the conversation around that scope. You'll get fewer suggestions that drag in unrelated parts of the codebase.
Working examples
Before and after: a refactor without and with a rules file
Without a rules file, a request to "add error handling to this fetch function" might return a catch block using console.log. With a rules file that specifies "use structured logging with the logger module at src/lib/logger", the same request returns code that integrates with your actual logging setup.
This is the difference between a tool that produces plausible code and a tool that produces code you can actually merge.
A realistic debugging session
You have an error:
TypeError: Cannot read properties of undefined (reading 'userId')
at getUserPermissions (src/auth/permissions.ts:23:15)
In the Cursor chat panel:
@src/auth/permissions.ts
Getting this error on line 23: "Cannot read properties of undefined (reading 'userId')"
The function runs after login — so the user object should exist. What's causing it?
Cursor reads the file, traces the call, and usually surfaces either a race condition, a missing null check, or an issue with the data shape coming in. On this kind of specific debugging question, it's consistently faster than reading the stack trace alone.
Little tip: paste the full error message, not just the message text. The stack trace is context. A precise error with a file reference gives the AI much more to work with than "it's throwing a TypeError."
When agent mode helps vs when it doesn't
Agent mode is worth using when the task is: refactor a function across related files, update a pattern that appears in multiple places, add a new feature that touches an existing service and its tests.
It's not worth using when the task is: add a comment, rename a variable, fix a single obvious typo. Use completions or inline edit (Cmd+K) for those. Agent mode has overhead — the reasoning and diffing take time. Spend that time on tasks where the payoff is real.
Little tip: if you're using agent mode and the first diff is clearly off-scope, don't accept and try to fix it — reject and rephrase with tighter constraints. Starting from a bad diff is slower than re-running from a better prompt.
Inline edit with Cmd+K for small targeted changes
For changes that are too specific to need the full chat panel, inline edit (Cmd+K on Mac, Ctrl+K on Windows) lets you trigger a focused rewrite of a selection without opening the chat panel. Select the lines you want to change, press the shortcut, describe the change in a few words, and accept or reject the result in place.
This is useful for: renaming a variable consistently within a function, changing a loop to a map, adding a type annotation to a specific parameter. It skips the back-and-forth of the chat panel and keeps your focus on the code rather than the conversation.
Reviewing what the agent actually did
After any agent run, Cursor shows a diff in the side panel before you commit to accepting it. The habit worth building early: read the diff by file, not just the summary. Agent mode sometimes touches an import at the top of a file you didn't expect, or adds a helper it created to serve the change. Neither is necessarily wrong, but you want to know about both before you accept.
If the diff has more files than you expected, check each one. If the additional changes are sensible and within your task's spirit, accept. If they're not, reject the whole run and add a tighter scope to the next prompt. One clean diff is worth more than a fast diff you're unsure about.
Patterns / when to use
- Daily completions: leave them on for normal coding. Accept the good ones, ignore the rest. Don't let them slow you down by over-reviewing every suggestion.
- Chat for questions: anything where you need context explained, a decision thought through, or an error diagnosed. Use
@to pin the relevant code. - Agent mode for refactors: tasks that touch 2–6 files. Scope them tightly. Always review the full diff before accepting.
- Rules file updates: any time you catch the AI suggesting something that violates your conventions, add a constraint to the rules file. This is ongoing maintenance, not a one-time setup.
Common mistakes
Using agent mode for tasks that are too large — "improve the error handling across the app" is not a scoped task. The agent will touch things you didn't want touched, the diff will be enormous, and you'll spend more time reviewing and reverting than if you'd done it yourself. Break it down: "add error handling to the three functions in src/api/users.ts" is a task the agent can handle cleanly.
Not setting up the rules file — this is the most common reason developers try Cursor and think it's not much better than Copilot. Without persistent context, every conversation starts cold. The AI suggests generic code that ignores your stack preferences. Fifteen minutes of rules file setup pays back on every interaction after.
Accepting completions without reading them — completions are fast and they feel right. Some of them aren't. The AI is generating a plausible continuation of your code, not necessarily the correct one. The review habit matters as much as using the tool.
Conflating "the AI knows my codebase" with "the AI understands my codebase" — the indexing gives Cursor access to your file structure and symbols. It can find where a function is defined. It doesn't understand architectural decisions, performance constraints, or the three months of context behind a confusing file. Complex architectural questions still need you to explain that context explicitly.
Letting the free tier limit teach you the wrong lesson — the free tier is tight. If you're on the free plan and running out of fast requests after a day, that doesn't mean Cursor isn't worth it. It means the pricing model is designed to push you to Pro. Evaluate it on Pro pricing, not free tier behavior.
Troubleshooting
The agent is touching files you didn't ask about — add "Only modify [specific files]" to both your rules file (as a general constraint) and your current task prompt (as a specific one). The agent respects explicit scope boundaries better than vague task descriptions.
Completions are slow or not appearing — check your network connection and the Cursor status page. Also check how many tabs you have open — Cursor uses open tabs as context signals, and too many open files from different contexts can slow the completion cycle.
The AI keeps ignoring your conventions — two possible causes: your rules file isn't being picked up (confirm the file is at the project root, named .cursorrules), or the instruction isn't specific enough. "Follow best practices" is too vague. "Return types must be explicit, never use any, use the logger module at src/lib/logger for all error logging" is specific enough to work.
Context pills aren't helping with a multi-file task — you may have too many files pinned, diluting the context. Pick the three most relevant files rather than every possibly related one. More context isn't always better — focused context gets more relevant output.
Agent mode produces a diff with too many changes — the task is too broad. Find the most important single change, rephrase as a scoped task, and run the agent again. You'll reach the same end state in two smaller steps faster than you'll fix a diff that touched 15 files.
Checklist
- [ ] Cursor installed and VS Code settings, extensions imported
- [ ] Model selection reviewed — default Claude 3.5 Sonnet is fine for most tasks
- [ ] Rules file created with stack-specific constraints at the project root
- [ ] First real task run — a bug you know the answer to, as a calibration
- [ ] Agent mode tested on a small multi-file refactor
- [ ] Context pills practiced with
@mention for a focused session - [ ] Review habit established — reading every diff before accepting
- [ ] Rules file updated at least once after catching an unwanted suggestion
Practice task
Take a function in your current project that does two things that should be separate — fetching data and transforming it, for example. Open the Cursor chat, paste the function, and ask: "This function is doing two jobs. Split it into two focused functions with explicit TypeScript return types. Only modify this file." Review the diff. Did it match what you asked? Did it stay within scope? Adjust the rules file if the output ignored one of your conventions, and run it again. That feedback loop — task, diff, rules update — is the core skill to build in the first week.
FAQ
Is Cursor free?
There's a free tier with a limited number of fast model requests per month (currently around 50 fast requests and 2000 completions). It's enough to see the interface but not enough for a full work week. Most developers who take Cursor seriously end up on the Pro plan ($20/month) within a few days of hitting the free tier ceiling on a real project.
Does Cursor have my code?
Cursor sends code context to AI model providers (Anthropic, OpenAI, etc.) when you use the AI features. The privacy policy describes what's retained and how. There's a "Privacy Mode" setting that disables code storage on Cursor's own servers. For sensitive commercial code, read the current privacy policy directly — policies change, and a summary in a review post is not a substitute.
Can I use Cursor and keep VS Code?
Yes. They're separate applications. Many developers run both — Cursor for AI-heavy work, VS Code for contexts where they want standard VS Code behavior. There's no conflict, just the overhead of keeping settings current in two places.
Which models can I use?
On the Pro plan: Claude 3.5 Sonnet, Claude 3 Opus, GPT-4o, and others, with usage limits per model tier. You can also bring your own API keys to route requests directly to the model provider — useful if you have high usage and want more control over costs.
How is Cursor different from VS Code plus Copilot?
Copilot is an extension that adds AI capabilities to a standard VS Code installation. Cursor is an AI-native fork where the integration is deeper: the rules file persists project context across sessions, the agent mode understands your full file tree by default, and codebase indexing lets the AI answer cross-file questions without extra configuration. For agentic features specifically, the gap is meaningful.
What to learn next
- Cursor AI complete guide — the full setup walkthrough including rules file patterns, agent mode best practices, and the keyboard shortcuts worth memorizing
- Cursor vs Windsurf — if you want to compare Cursor's granular checkpoint model against Windsurf's longer autonomous Cascade runs
- Prompt engineering for code — the constraint and verify loop patterns that improve agent output specifically
Related on Baseline
- [Cursor AI complete guide](/ai/tutorials/cursor-ai-complete-guide)
- [Cursor vs Windsurf](/ai/comparisons/cursor-vs-windsurf)
- [Best AI coding assistants in 2026](/ai/lists/best-ai-coding-assistants)
Takeaways
Cursor earns its reputation for solo developers who spend most of their day in an editor. The rules file system, codebase indexing, and agent mode for multi-file refactors are genuinely useful — not just impressive in a demo. The free tier is limiting and the agent mode takes practice to scope correctly, but neither is a dealbreaker.
The main risk is using Cursor like Copilot — as a passive completion engine — and missing the parts that actually justify switching. The rules file and agent mode are where the value is. If you're not using those, you're paying for an expensive completion extension.
If you remember only one thing: set up the rules file before you evaluate the tool. Without it, you're not testing Cursor — you're testing generic AI coding assistance, and any decent tool looks the same.