Daniel Howells

How I Build (Summer 2025)

2025-07-15

The other day I realised I had three Cursor projects open at once, and each was cranking away in Agent mode on various tasks I had given it. All I was doing was hopping between each, tweaking and guiding as it generated what was probably thousands of lines of code largely unsupervised. If this is what's capable now, it's unfathomable what will be possible in 3-6 months time, let alone 5 years.

If you're not embedding AI in your engineering workflow already, you need to start right now. Here are the nerdy details if you want to briefly know what I've found to work.

⚫️ Claude 4 Sonnet feels like a giant leap after recent models being incremental nudges in capability. It's still a bit eager to please but its capability is now vastly better than all others, such that my earlier workhorse Gemini Pro 2.5 just seems lacking in every way. (It swears a lot more than Gemini does too, or maybe that's just me.)

⚫️ Give your projects intensely tight guardrails, way more strict than you'd ever give yourself. I'm 100% Node, and I have elaborate ESLint configs that are strict about what can go where and coding style, so that as soon as the model commits anything to a file, the linter will immediately shout back at it with errors, creating a feedback loop the model physically can't ignore. The same with Typescript: go as strict as you can, and again, Cursor will have no choice but to be disciplined about types. See linting as a secondary prompting layer, continuously feeding back with jobs to be done.

⚫️ Try to give your project a comprehensive and modular architectural structure. Using Turborepo even for a single app, or simply a domain-oriented file structure (enforced by ESLint) means again, the agent has nowhere to go but the correct place first or second shot.

⚫️ Make sure your data model is as complete as possible, including tables and relationships that you're nowhere near needing to use. It'll lay the architectural groundwork and give shape to your project, which will all be consumed by Cursor's context window. And, if you can land on a very strict API: I've found using tRPC works very well, because it's strict. Using Zod for everything will help too.

⚫️ Comment absolutely everything. Casually, or strictly JSDoc every file you can. If comments help you understand the code, it'll help the model. I document architectural notes in .md files and rules files that outline everything there is to know about the project. And for some projects, I keep a "vision.md" in the root, which is an over-arching outline of what I want the app to do eventually—both initially and in the future. Adding this usually non-technical writing often helps Cursor understand what it needs to do.

🟢 I haven't even touched on Warp, Claude Code, and MCP, or even the projects I'm actually working on which almost all now include a huge element of AI and ML experimentation, so I could go on and on. If you're interested in chatting about this I'm more than happy to help.