The pushback I hear the most from people, even experienced devs, is that AI can be used for vibe coding silly games or basic apps without a lot of depth, but not for anything advanced. Let alone extending an already existing application.
I want to try to keep this valuable for both developers and non-developers, but here is how I approach things and have been building or extending quite complex applications using AI with Cursor.
With a few simple tactics, I think anyone can start building better stuff, developer or not.
TLDR:
Rules and Context: Define what you want it to do very well.
Tasks: Scope up every feature you build.
Modularise: Eat the elephant piece by piece.
Testing: If you get less involved in coding, you need to have a good way to test.
I think we’re heading to a world where people won't be coding much anymore, but still need to be good at telling AI what to code. That involves thinking through how components work together. While in theory, everyone can be a developer, right now you still need to be quite good at giving the right instructions.
Solid rules and Context
AI models need to know exactly what to do. It's like working with an external development company.
If you don't tell them exactly what to do, they'll try to interpret your ambiguity and likely produce something you didn't ask for.
First thing here is to provide as much context as possible. If you're lazy, like I am, use speech-to-text.
Be extremely specific about what you want, how you want it to be built, and include logs or screenshots. Also, provide references to where you have done something similar.
Rules are part of the context, but they're the stuff you don't want to repeat for every prompt. Depending on your development environment, there are different ways to do this. Cursor has project rules, user rules and even file type rules.
Don't overthink it. What works best is to add whatever you repeat often to your prompts into your rules.
Things like "Build easy-to-maintain code by breaking up larger blocks into reusable components" might seem obvious, but they can help improve the quality.
For beginners: Don’t worry about the technical parts, instead focus on outlining what you want, with as much detail as possible.
Tasks
To ensure you and the AI don't lose track of every action item for a new feature, I use a simple approach.
For every new feature, scope up what you want to build. In the prompt, say that you want to iterate on the best solution instead of implementing straight away.
Once you're happy with the game plan, let it create a requirements.md with tasks for each step of the implementation.
Now, go through it one by one and refer to the file to tick off what has been completed (or let AI do it). This is only partially for yourself, you mainly want AI to not forget about what you had planned.
You can go all fancy with different solutions here, but I found a simple text file does the job.
For beginners: Don’t stress about this, see it more as a tool to help AI.
Modularise
If you just keep vibe coding, chances are AI will create these impossibly long code files. As a result, they become hard to maintain not only for humans but also for the AI model itself.
I think it has something to do with the size of the files; i.e., if you have more than 2,000 lines, Cursor struggles to read and edit the file properly (likely related to the LLM context window).
Rules can help here, but it is best to explicitly task AI to do a cleanup of the codebase.
Before you venture into these larger changes, ensure that you create a fresh branch—a copy of your codebase — to test the new changes. Newcomers might not know this, but understanding how Git works is going to save you, so make sure to learn about it.
A simple way to kick off a refactor is to:
Task it with a refactor of the app to modularise and optimise for maintainability
Ideate through it first, then create a requirements.md
Work through the refactor step by step
Test if everything works as before
For beginners: You won’t have much experience to judge things, BUT not telling AI to modularise will make things even worse. So just fire away and trust the system.
Testing
I spend a lot less time doing the actual coding. Here, my productivity has increased significantly.
While tests were important before, now that you are not writing the actual code, running modularised tests becomes crucial. If your codebase is nice, clean and modularised, you can test every individual module.
Good thing, AI is quite good at writing these tests and automating them for you. Don't go crazy. A couple of scripts that you can run prior to deploying changes will do.
Developer Experience (DX) becomes increasingly important here. You want your life to be as easy as possible, and even if it might cause a little more effort upfront, once these tests are in place, you can vibe code even more, knowing that you will detect if AI broke something.
For beginners: Ask AI on how to best automate testing, but do it.
Annoying bits
This is going to sound strange, but IYKYK.
When I used to develop software, I loved getting into a flow. A flow state is defined by entering a tunnel where you lose sense of time because you are so focused on a task. To be focused on a task, you need that immediate feedback and need to be able to go deep.
The way you code with AI is you prompt (ideally with voice and a lot of context), and then you wait. That wait I find is extremely annoying as it takes me out of my flow. Once AI is working to modify my codebase, I do something else, which gets me ripped out of the flow. Good thing I've got Cold Turkey to stop me from going on Twitter, but really, anything can be a distraction here.
Anyhow, that's just some nostalgia.
What's quite cool is that almost everyone can now try coding with a very low barrier. The barriers for the advanced and more complex apps are still quite high, but these will also get lowered over time.
Share this post