Cursor is an AI-powered code editor built on
VS Code. It integrates the latest and best AI models—Claude, GPT-4, and others—with custom
tools the Cursor team has built to make operating your computer dramatically more efficient.
It's almost to the point where you can run your entire computer from a chat interface.
Truly an incredible tool for creating software, building automations, organizing your digital
life, and so much more. I love Cursor. Below are things I do to make it work even better—feel
free to use any of this however you like.
Honestly, Cursor has become a more true second brain than Notion. You can build faster and deeper—it's
not just about storing information, but actively creating and iterating on ideas, code, and systems
in real-time. The ability to have conversations with your codebase, generate solutions instantly,
and build complex tools through natural language makes it a more dynamic and powerful thinking partner.
Core Foundation
The essentials that make Cursor incredibly powerful from day one.
Tab Autocomplete — AI predicts what you'll type next. Accept with Tab. It learns your patterns and gets smarter over time.
Cmd+L Chat — Open the AI chat sidebar to ask questions, debug, or generate code with full context of your project.
Cmd+K Inline Edit — Select code and describe changes in natural language. The AI edits in-place.
@codebase — Reference your entire project in prompts. The AI searches semantically to find relevant code.
@file / @folder — Point the AI at specific files or folders for focused context.
Error Fixing — When you get an error, paste it in chat. Cursor explains and fixes it with full context.
Intermediate Workflow
Level up your productivity with these techniques.
Context Management — Be intentional about what you add to context. Too much noise hurts response quality. Use @file for precision.
Model Selection — Switch between Claude Sonnet for speed, Claude Opus for complex reasoning, GPT-4 for variety. Each has strengths.
Multi-file Edits — Ask for changes across multiple files at once. Cursor handles the coordination.
Plan Mode — For complex tasks, ask Cursor to create a plan first before implementing. Review, then execute.
Composer — Use Composer (Cmd+I) for larger multi-file changes with a dedicated interface.
.cursorrules — Create a .cursorrules file in your project root to give the AI persistent context about your codebase style and conventions.
Pro Advanced
Push Cursor to its limits with these advanced workflows.
Agent Mode — Let Cursor autonomously execute multi-step tasks: searching, editing, running commands, and iterating until done.
Custom Slash Commands — Create reusable command templates in ~/.cursor/commands/ for repetitive workflows.
MCP Integrations — Connect external tools via Model Context Protocol: databases, APIs, browser automation, Slack, GitHub.
Cursor + Xcode — Use Sweetpad to build, run, and debug Swift projects directly in Cursor while using Xcode for simulators.
Hot Reloading — For Swift development, integrate Inject for live code updates without recompiling.
Large Codebase Navigation — Use semantic search with @codebase, then drill into specific files. Let Cursor map the architecture.
MCP: Model Context Protocol
Think of it like USB for AI. MCP is an open standard developed by
Anthropic that lets AI assistants
connect to external tools and services in a standardized way.
Just like USB provides a universal way to plug in different devices to your computer,
MCP provides a universal way to plug in different capabilities to AI. In Cursor, this means
the AI can do more than just read and write code—it can interact with the real world.
Active MCP Connections
cursor-ide-browser — Control a browser directly from Cursor. Navigate pages, click elements, fill forms, take screenshots. Used for testing web apps and automating browser tasks.
github — Interact with GitHub repos, pull requests, issues, and commits. Create branches, review code, manage projects without leaving the editor.
slack — Read and send Slack messages. Stay in flow while keeping up with team communication.
browser — General web browsing for research and data gathering. Look up documentation, search for solutions, fetch information.
Why it matters: MCP transforms Cursor from a code editor into a true AI assistant that can take action across your entire digital workflow. Instead of just suggesting code, it can test it in a browser, commit it to GitHub, and notify your team on Slack.
Impressive Things Built with Cursor
Real examples of what's possible when you master this tool.
Full iOS Apps in 45 Minutes — Developers have built complete, production-ready iOS apps with SwiftUI in under an hour using Cursor + Xcode together.
Perplexity Clone in 8 Minutes — A functional AI search app built from scratch during a Cursor demo, showing the speed of AI-assisted development.
Zyohra — A Cursor extension that bridges Xcode builds, automatically capturing errors and sending them to the AI for intelligent fixes.
Swift Catalyst — A modern SwiftUI template designed specifically for AI coding tools, supporting hot reloading and VIPER architecture.
This Website — Nearly every feature of masonearl.com was built collaboratively with Cursor: the chat system, wiki pages, animations, tools, and more.
My Custom Commands 6▼
How to use: Create a folder at ~/.cursor/commands/ and save these as .md files. Cursor will automatically detect them as slash commands.
/addevent— Add events to Apple Calendar from natural language
addevent.md
# Add Calendar Event Command
This command will be available in chat with `/addevent`
**INSTRUCTION: When user invokes `/addevent` followed by event details, parse the natural language input to extract:**
- Event title (required)
- Date/time (required - parse from "tomorrow at 2pm", "Dec 15 at 3pm", etc.)
- Location (if mentioned with "at", "location:", "in")
- Notes/description (if provided)
- Duration (if specified, otherwise default to 1 hour)
**Then execute the add_event.py script with the parsed arguments to create the event in Apple Calendar.**
## Usage
```
/addevent Team Meeting tomorrow at 2pm
/addevent Lunch on Dec 15 at 12:30 PM - location: Restaurant
/addevent Conference Call - date: 2024-12-20 - time: 3:00 PM
```
## How it works
The script will:
- Parse date and time from your message (supports various formats)
- Create the event in your default Calendar
- Set duration to 1 hour by default
- Add location and notes if provided
## Supported formats
- **Dates**: "Dec 15, 2024", "tomorrow", "today", "next Monday"
- **Times**: "2:00 PM", "3pm", "14:00"
- **Combined**: "Dec 15 at 2pm", "tomorrow at 3pm"
/email— Draft and send emails via natural language
email.md
# Email Command
This command will be available in chat with `/email`
**INSTRUCTION: When user invokes `/email` followed by email details in natural language, parse the input to extract:**
- Recipient(s) (required - look for "to X", "email X", "send to X")
- Subject (look for "subject:", "re:", "about:", or infer from context)
- Body/content (extract the main message, look for "asking", "requesting", etc.)
- CC/BCC (if mentioned with "cc:" or "bcc:")
**Then execute the send_email.py script ONCE with the parsed arguments to create ONE email via Mail.app.**
## Usage
```
/email to emily asking if we can reschedule to thursday
/email to john@example.com subject: Project Update - body: Here's the latest
/email to sarah cc: manager asking about the meeting time
```
## How it works
The script will:
- Parse recipient(s) from phrases like "to emily", "email john"
- Extract or infer subject from context (formatted professionally)
- Extract the main message/body from your input
- Format professionally: greeting, capitalization, closing
- Create and send via Mail.app (or create draft if "draft" is included)
/calendar— Add events to Apple Calendar
calendar.md
# Calendar Command
This command will be available in chat with `/calendar`
**INSTRUCTION: When user invokes `/calendar` followed by event details, parse the natural language input to extract:**
- Event title (required)
- Date/time (required - parse from "tomorrow at 2pm", "Dec 15 at 3pm", etc.)
- Location (if mentioned with "at", "location:", "in")
- Notes/description (if provided)
- Duration (if specified, otherwise default to 1 hour)
**Then execute the add_event.py script with the parsed arguments to create the event in Apple Calendar.**
## Usage
```
/calendar meeting with Sarah tomorrow at 2pm
/calendar dentist appointment Dec 20 at 10am location: Downtown Dental
/calendar team standup every weekday at 9am for 30 minutes
```
## How it works
The script will:
- Parse event details from natural language
- Handle relative dates (tomorrow, next Monday, etc.)
- Create the event in your default Apple Calendar
- Support recurring events and custom durations
/desktop— Auto-organize desktop files
desktop.md
# Desktop Organizer Command
This command will be available in chat with `/desktop`
**INSTRUCTION: When user invokes `/desktop`, automatically execute the script with `--live` flag to organize their desktop files.**
Organizes files on your desktop into appropriate folders based on file names and types.
## Usage
```
/desktop
```
## What it does
- **Categorizes files** by name patterns and file types:
- Screenshots (screenshot images)
- Images (photos, graphics)
- PDFs (all PDF documents)
- Documents (Word docs, text files)
- Spreadsheets (Excel files)
- Archives (old files, backups)
- **Creates year subfolders** when years are detected in filenames
- **Skips existing folders** you want to keep
- **Handles duplicates** by adding timestamps
## Safety
- Preview mode shows what will happen before moving files
- Handles duplicates by adding timestamps
- Configurable folder exclusions
/organizefolder— Intelligently organize any folder
organizefolder.md
# Organize Folder Command
This command will be available in chat with `/organizefolder`
**INSTRUCTION: When user invokes `/organizefolder` followed by a folder path, automatically execute the organize_folder.py script with `--live` flag to organize files in that folder. If no path is provided, ask the user which folder they want to organize.**
Intelligently organizes files in any folder into appropriate subfolders based on file names, types, and content analysis.
## Usage
```
/organizefolder /path/to/folder
/organizefolder ~/Downloads
/organizefolder .
```
## What it organizes
- **Documents** — Word docs, text files, markdown
- **PDFs** — All PDF documents
- **Spreadsheets** — Excel, CSV files
- **Images** — Photos, screenshots, graphics
- **Videos** — Video files
- **Audio** — Music, podcasts
- **Code** — Source code files
- **Presentations** — PowerPoint, Keynote
- **Archives** — ZIP files, compressed
## Features
- **Smart categorization** — Analyzes file names and extensions
- **Year subfolders** — Organizes by year when detected
- **Duplicate handling** — Adds timestamps to prevent overwriting
- **Safe by default** — Preview before moving
/meta— Auto-sync command docs to website
meta.md
# Meta Command - Update Wiki Documentation
This command will be available in chat with `/meta`
**INSTRUCTION: When user invokes `/meta`, execute the update_wiki.py script to automatically sync the custom commands documentation on your website with the actual commands in ~/.cursor/commands/. The script will:**
1. Read all command markdown files from ~/.cursor/commands/
2. Parse each command's name, description, and key features
3. Update the wiki page with current documentation
4. Commit and push the changes to GitHub
This keeps the website documentation always in sync with your actual command configurations.
## Usage
```
/meta
```
## What it does
- Scans all your custom commands
- Updates the wiki page with current documentation
- Commits with message "Update custom commands documentation"
- Pushes to GitHub for automatic deployment
## How it works
The script reads each .md file, extracts the command name and description, then regenerates the documentation section on your website. This means adding a new command or updating an existing one just requires running `/meta` to publish the changes.
Note: These commands require companion Python scripts in ~/.cursor/commands/[command-name]/. The markdown files tell Cursor's AI how to parse your input and what script to run.
Favorite Python Scripts 1▼
Utility scripts I use regularly with Cursor. These extend what's possible beyond just code editing.
html-to-pdf.py— Convert HTML files to PDF using Chrome headless
html-to-pdf.py
#!/usr/bin/env python3
"""
Convert HTML files to PDF using Chrome headless.
Usage:
python3 html-to-pdf.py [file.html]
If no file specified, converts all HTML files in the current directory.
Flow: HTML → Chrome Headless → PDF → open command → Preview
"""
import subprocess
import sys
import os
from pathlib import Path
def html_to_pdf_chrome(html_path, pdf_path):
"""Convert HTML to PDF using Chrome headless."""
chrome_path = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
# Convert to file:// URL
html_url = f"file://{os.path.abspath(html_path)}"
cmd = [
chrome_path,
"--headless",
"--disable-gpu",
"--no-pdf-header-footer",
f"--print-to-pdf={os.path.abspath(pdf_path)}",
html_url
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0 and os.path.exists(pdf_path):
print(f"Created: {pdf_path}")
return True
else:
print(f"Error creating {pdf_path}: {result.stderr}")
return False
def main():
# If specific file provided, convert just that
if len(sys.argv) > 1:
html_file = Path(sys.argv[1])
if html_file.exists():
pdf_file = html_file.with_suffix('.pdf')
if html_to_pdf_chrome(str(html_file), str(pdf_file)):
# Open the PDF
subprocess.run(["open", str(pdf_file)])
else:
print(f"File not found: {html_file}")
return
if __name__ == "__main__":
main()
Why this works: Chrome's headless mode includes a full rendering engine, so your CSS (including @page rules and print styles) renders perfectly. No dependencies beyond Chrome itself.
Use case: I use this to generate resumes and cover letters. Write styled HTML, run the script, PDF opens in Preview ready to send.