I wouldn’t say I’ve avoided static-site generators and JavaScript component frameworks—I’ve dipped my toes. A bit of experimenting with Jekyll, a few courses on React. For the websites I build, though, they just never seemed like the right tools for the job. A custom CMS build remained the best option for almost all my projects—generally content-heavy marketing sites with limited on-page interaction. Or at least, the interaction that was there could be pretty easily handled with a plugin, some Twig and vanilla JS, or, at worst, a custom PHP module.

But as my little freelancer raft settles in the trough of another wave, and the dried, wrinkling skin of my ancient portfolio site cracks and flakes before my eyes, the time feels ripe to get familiar in the only way that really works: build something from scratch, dream up new functionality for it, run into problems, sort them out. Laugh, cry, rage, love.

After some searching, I settled on Astro, perhaps because their pitch hit my usual business case on the head: The web framework for content-driven websites. Yup. I ran through their tutorial project and was super impressed with the ease of use. There’s tons of potential for complexity, but none of that complexity is required out of the box. That’s my kinda deal—build a car that drives; add the leather seats and infotainment system later, if you need them.

AI’s Turned the Corner

The plan was to put all this LLM voodoo magic to work learning and building with Astro. Overall, I’m impressed—it’s legitimately a revelation. The misty, primordial past of scouring documentation, Stack Overflow and crying in frustration is becoming harder to remember with each passing day.

A few experiences that stood out:

  • Asking it for best practices works great: “What’s the recommended way to create a collection of pages with lots of custom data, some of which needs to be surfaced elsewhere on the site?”. Content Collections, cool. It spins up the necessary template and config files and together we iterate until I have the structure I need.
  • Creating a slide-out drawer menu placeholder was basically instantaneous. I tweaked the generated TypeScript a bit, but that was mostly just personal aesthetic preference. Generating typical components like this—the kinds that have been added to millions of projects—works really, really well.
  • I ran into issues with more complex parts of image handling and content collections. As we were iterating on code, I often had to send references from the Astro documentation to the AI so it could fix its own errors or stop suggesting functions that didn’t exist. I’ve found this frustratingly common with other codebases as well, particularly Shopify.
  • Building a custom font animation was an interesting experiment. The first pass got us 90% of the way there, and then it took about 30 prompts to tie a bow on it. I would have been better off finishing it on my own, but I was curious to see how long it would take to steer the AI there. Quite a while it turns out.
  • Sometimes we would spend 20 minutes going down an increasingly complex path to add some little piece of functionality. The suggestions would become more and more convoluted; patching one hole would create three more. I backed away from the screen, my nose being just several centimeters away now, took a deep breath, and told Cursor to do the same. “Try again with a different approach”, I said with hollow managerial certainty. This time, it had the problem solved in a few lines of code on the first try. It’s a strange type of interaction with a machine, watching it get stuck in the trees and miss the forest just like us humans.

This was the first time I’d truly learned and iterated alongside Cursor’s AI, leaning on it for almost every part of the build. I came away with essentially the same conclusions I’ve been reading elsewhere for months, and experiencing at smaller scale in my other projects: it’s an incredible prototyping tool. It can spin up functionality in minutes that would take me hours. But it also can’t do its job without significant guidance and often generates broken code using methods and functions that don’t actually exist. So you’d better know what the hell you’re doing and be able to communicate it effectively.

And I imagine that last bit—you better know what you’re doing and be able to communicate it effectively—will be one of the most important developer skills in the coming years as the industry adopts and changes alongside AI. A successful developer’s most important skill? Communication. That definitely wasn’t on my bingo card a few short months ago.