Using LLMs and Cursor to finish side projects
zohaib.me
zohaib.me
One thing I've also been doing now is I have a "template" to use for fullstack applications that's configured out-of-the-box with tech that I like, has linters and hooks set up, as well as is structured in a way that's natural to me. This makes it a lot more likely that the generated code will follow my preferred style. It's also not uncommon that on the first iteration I get some code that's not what I'd like to have in my codebase and I just say "refactor X in this and this way, see <file> for an example" at which point I mostly get code that I'm happy with.
Do you commit this in the same repo or a centralized note taking?
Two things I would add:
1. Use git and commit changes (very) frequently.
Often the AI makes a recommendation that looks good, but has consequences 4 or 5 changes later that you'll need to reckon with. You'll see this especially with web vs. mobile UI behaviours. Cursor isn't so good at reverting changes yet, and GIT has saved me a LOT of headache.
2. Collaborate with o1 to create a PRD and put it in the same folder as your specs.
This increases the likelihood Cursor's recommended changes comply with your intent, style and color guidelines and overall project direction.
what is a PRD?
A high-level specification of what the thing should do and why.
But MVPs are a good testbed for determining if something is worth iterating.
I build quick prototypes for validation and LLMs have really helped decrease the effort. Here is an example of a site which took me 2 weeks with help from ChatGPT. https://post.withlattice.com/
It was enough to get interior designers to start using it, provide feedback, and validate if it’s worth additional time investment.
My hypothesis is that 2025 will bring forth a lot of indie products which focus on doing one thing well and can be supported my a small or fractional team.
I look forward this break from VC funded and big tech consumer products!
Gemini Exp 1206 and Gemini 2.0 Thinking Model exceed o1 in my experience and best part is that its free with insane context token size.
For agentic code experience RooCline is quite good but I actually do most of my work in ai studio and like to create the folders and files manually.
I almost think agentic code generation is the wrong step forward. Without knowledge transfer/learning involved during the code generation phase, you end up cornering yourself into unfixable/unknowable bugs.
You can see the examples on the linked site are quite simple. These are hardly real world use cases. Most of us aren't generating things from scratch but rather to gain understanding of systems being worked on by multiple people and very carefully inspecting and undertanding the output from GPT
This is why a lot of tools like Bolt, Lovable, Cursor, Windsurf will be toys aimed at people looking to use codegen as a toy rather than a tool. It will serve you better if you look at AI codegen as a knowledge transfer/explorer tool and an AI agent isn't wise imho.
You're the best fullstack engineer and LLM engineer, prefer using Vite + React, TypeScript, Shadcn + Tailwind (unless otherwise specified).
CODE ORGANIZATION: All code should be grouped by their product feature.
/src/components should only house reusable component library components.
/src/features/ should then have subfolders, one per feature, such as "auth", "inventory", "core", etc. depending on what is relevant to the app.
Each feature folder should contain code/components/hooks/types/constants/contexts relevant to that feature.
COMPONENTS:
Break down React apps into small composable components and hooks. If there is a components folder (eg. src/components/ui/*), try to use those components whenever possible instead of writing from scratch.
CODE SYTLE:
Clear is better than clever. Make code as simple as possible.
Write small functions, and split big components into small ones (modular code is good).
Do not nest state deeply, prefer state data structures that is easy to modify.
It's a lot to manage, but I find it better that trying to move my whole workflow into VSCode when really I only want the AI features and then only 30% of the time.
This is a me problem. For instance, I've also disabled animation in Slack because I can't focus on talking to people over the "noise" of all of their animated gif's.
Mostly I just stay out of Cursor unless I'm conversing with an AI because I find the interface sluggish and awkward to use without a mouse (not Cursor's fault, that's a VSCodium/electron thing) and full of little bugs that end up entangling me in politics between plugin maintainers and VSCode people.
I like chasing down bugs and helping people fix them, but that ecosystem is just a bit too busy for me to feel like those efforts are likely to come back at me looking like a return on my investment. If I'm going to be finding and helping fix bugs (which is what I do with most of the tools I use), I want that effort to be in a place that's as open and free as possible--and not coupled to anybody's corporate strategy (these days that's wezterm, zellij, nushell, and helix). I have no animosity for Cursor, and only some animosity for Microsoft, but since I can't help but get involved with the development of my tools, I'd rather get involved elsewhere.
So it's really all about managing the scopes within which I'll let myself be distracted, and not at all about AI.
For example, I wrote my personal blog in Angular+Scully, thought about migrating to Gatsby due to threads here and on Reddit, and it took me one actual weekend worth of coding to get it migrated to Gatsby, though I am ironing out the kinks where I can.
That leads me to believe that the "manager" task itself may be one of the most trivial to automate.
Time to give AI the jira credentials maybe
1. do commit frequently, recommend to do commit for every big change(a new feature such as a new button added for some function, some big UI change like added some new component changing the UI layout a bit)
2. test everything(regression testing) after doing big change with cursor, it may affect existing functions when adding new features you think should not impact other parts
3. if trying to add a new complete feature including changes to multiple places(fe, be etc), please using Composer instead of Chat
4. when working with UI changes(fe), be careful of needing forth and back of changes. one recommendation is you write the skeleton yourself, then ask cursor to fill in the missing components.
5. when giving instructions, use bullet points and state clearly about the requirements(write the step-by-step instructions) would have better result.
These tips are based on working with one side project(was trying to test cursor's capability): https://www.pixelstech.net/application/sudoku
So I ask for some feature, it implements, I test and either give feedback or simply say "good" or "that works" in which case it'll produce a commit command I can just press Run on. Makes it very easy to commit constantly.
Also I use Composer exclusively over Chat and have zero hesitation to hit those restore buttons if anything went down the wrong path.
They have different failures modes but are largely similar. Cursor seems to be better at indexing and including docs but that’s a qualitative impression rather than a rigorous evaluation.
Both are rather useless in my mixed C++/Rust codebase but work pretty well for traditional web stuff. I’d say at this point that Cursor has an edge but there’s so much development going on that this comment will be outdated within a few weeks.
Good editors/IDEs tend to stick around for much longer and generally have a clear statement of how they’re different/better. Just my view of course.
Now I use Windsurf, $10/month, as an early backer
But recently impressed by Cline + Deepseek/Gemini
VS Code's free Copilot is also good for smaller tasks, as it has Claude 3.5, but Copilot very slow, no image support.
So if I need something more comprehensive, especially global view and planning, I'll use Windsurf.
VS Code Copilot is good for the simplest tasks.
Cline is in the middle, flexible.
I ended up cancelling my Claude subscription because I was constantly getting timed out, and I think I was getting pushed to a quantized or smaller model that sucked when I used it too much.
Also their artifact UI sucks and doesn't update the code most of the time. It had apparently been broken for a while when I searched to see if other people had the issue.
It's also the only open source model anywhere near the leading edge, which might be of interest for various reasons aside from immediate self hosting.
https://marketplace.visualstudio.com/items?itemName=ms-vscod...
Basically, what I'd like is to never copy-paste code to/from the LLM but for it to happen automatically when I ask the LLM a change. And I'd like an interaction model where all the changes are applied directly to the workspace and then use whatever tools I like to review them before committing. (But I guess anything that achieves the same effect would be fine as well, e.g. the changes being automatically git-committed in which case the outcome of a failed code review is a revert, or for the changes being provided as a unified diff.)
You're able to run LLM APIs, local models, multimodals, etc. It is great!
So I'm currently using LLM-lite tools such as ChatGPT and simple copilot completions. These tools obviously provide utility. I have yet to play with more advanced tooling or models besides these. I'm currently experiencing absolutely no pressure at my job to "up my game," and my hobby programming is mostly done in very niche languages (contribute little to my resume whether or not I finish them).
Given this situation, I've decided to stop using LLM tooling altogether, with the assumptions that 1) the tooling in 2+ years will be completely different anyways so I'm not loosing by not familiarizing myself with the current "hot" tools, and 2) if I ever need to get up to speed with the latest LLM tooling, it is something that one should pretty easily get up to speed, especially with improved models (people have seemed to master the current state of affairs in matters of months, so in the future it should be even easier). I know some people will reply that I'm just wasting time when I could automate stuff, but in reply, I find coding tasks fun (I know, old fashioned) and I feel I otherwise have a good work-life-balance.
Do these assumptions hold up? Are there any perspectives I'm missing?
It greatly reduced the bottleneck of bringing to reality what was in my mind. While it was nothing very complex, it surprised me how much time i could save from just typing literally what i wanted.
I recommend trying it just for fun and to learn something new. Maybe you decide to incorporate it in your day to day from a quality of life rather than from a productive standpoint.
I would give it a try it on my day-job, but I am still freaked out by the privacy aspect of it.
LLMs are good for the first 70% (I'd argue probably 50%).
Whenever I try to navigate a new project I ask Cody to give me an overview. Also writing and modifying code using it is way more than Cursor‘s capabilities. Because it can „understand“ the context.
You seem to be hung up on "This is something that anyone can do" and "how innovative is that really?" - that's NOT the point of this. This isn't about building innovative things that nobody else could build, it's about being able to churn out small, useful projects more productively thanks to assistance from LLMs.
makes me think we're talking about two types of side projects. "side hustles" and work you'd enjoy doing irrespective of money.