Eight Cursor Prompts I Wish I Had When I Started
After six months of building with Cursor, here are the eight prompts I come back to most — the ones that consistently produce working results on the first try.
Eight Cursor Prompts I Wish I Had When I Started
I wasted a lot of time figuring out how to talk to Cursor.
Not because Cursor is hard to use. Because I did not understand what it needed from me. I kept typing requests the way I would type a search query — short, contextless, assuming the tool would fill in the gaps.
Cursor does not fill in the gaps. It either makes assumptions or asks you. Usually the assumptions are faster but wrong.
After six months of building, I have a collection of prompts that consistently produce working results on the first try. These are the eight I come back to most.
Building a new component:
Create components/OrderCard.tsx.
Props: orderId (string), orderDate (string), total (number), status ('pending' | 'fulfilled' | 'cancelled').
Display all four. Status as a badge — match the color logic in components/StatusBadge.tsx.
Tailwind only. No new packages. No test file.
Why it works: referencing an existing component for style means Cursor matches your existing patterns instead of inventing new ones.
Adding a field to an existing form:
In components/ProfileForm.tsx, add an optional company name field.
Text input, label "Company name", no validation.
Position it below the full name field.
Include company_name in the form submission object.
Do not change any other fields or the submit handler.
The "do not change" line does a lot of work here. Without it, Cursor will often refactor nearby code.
Writing a database query:
In lib/queries/orders.ts, add getRecentOrdersByUser.
Accepts userId: string. Returns 5 most recent orders where user_id matches.
Select only: id, created_at, total, status. Order by created_at descending.
Use the Supabase client from lib/supabaseClient.ts. Follow the same pattern as existing functions in this file.
Typed return. No console.logs.
"Follow the same pattern as existing functions" is one of my most-used instructions. It keeps the codebase consistent without me having to explain my conventions.
Fixing a bug:
In components/Dashboard.tsx around line 47, I have this error:
[paste full error text]
Relevant function:
[paste function]
Fix only this error. Do not refactor or change behavior anywhere else.
Paste the full error. "It does not work" gives Cursor nothing. The stack trace gives it everything.
Creating an API route:
Create app/api/waitlist/route.ts.
POST: reads email from body. Validates it exists and is non-empty (400 if not). Inserts into Supabase table 'waitlist' (id uuid auto, email, created_at default now()). Returns {success: true} on success, {error: 'Failed to save'} on error.
Use Supabase client from lib/supabaseClient.ts with service role key.
No auth required.
Styling a page:
Update app/dashboard/page.tsx layout:
- Full-width header, title 'Dashboard' left-aligned
- Three stat cards in a row (they exist — just arrange them)
- Full-width OrdersTable below
- 24px gaps between sections
Tailwind only. Do not change component logic. Match spacing from app/settings/page.tsx.
"Do not change component logic" prevents layout work from turning into a refactor.
Refactoring:
In lib/utils/formatDate.ts, the formatDate function is duplicated three times with slight variations.
Consolidate into one function with an optional format param: 'short' | 'long' | 'relative'. Default 'short'.
Update all three call sites.
Do not change the output format of any call site — only consolidate the implementation.
Adding loading and error states:
In components/UserList.tsx, add three conditional renders:
1. If isLoading is true: show 'Loading...'
2. If there is an error: show 'Something went wrong. Please refresh.'
3. If data array is empty: show 'No users found.'
Use the existing isLoading and error values from the hook. Do not change the data fetching logic.
The pattern in all eight: one file target, reference to existing code, explicit constraint, defined output. Cursor is good. These prompts make it consistent.
If writing these out for each request feels tedious, Briefli generates them through a two-minute interview. You describe the task, it asks the right questions, it writes the Cursor prompt.
briefli.io → Free to start.
Stop re-writing prompts. Let Briefli build them for you.
Two-minute interview → precise, first-attempt prompt. Free to start.
Try It Free →