I’ve been using GitHub Copilot, Claude, and ChatGPT to help me code for a couple of years now. But AI has always been in the assistant role – I was the one in the driver’s seat, asking technical questions or letting GitHub Copilot generate sections of code based on what I was writing. It makes you a more productive developer because it’s faster than Googling, but at the end of the day, I was still the one fundamentally coding, just with better tooling.
My real interest, however, has always been getting others to code for me. Not because I can’t code or I’m lazy but because coding takes time – it’s a gap between “knowing what needs to be built” and “having it built.” Hence why I always have found platforms (Microsoft Power Platform, Salesforce, etc.) so interesting. It’s why scaffolding sites and code generation from a data model always interested me. Anything that reduced the time it took from when someone wrote down what to do and there was a system doing it excites me.
This is what a lot of “consultants” are doing. Understanding requirements and writing out specifications for developers who often have limited knowledge of the domain they are building for. If you have good developers, it works okay; if not, it’s frustrating. But this is how most software gets built today.
The problem is the inevitable back-and-forth – it’s time-consuming and suffers from all the usual communication challenges. It’s often less efficient than doing it yourself. The mythical man-month principle still holds: nine women can’t make a baby in one month.
That’s why I’ve been really interested in products like Cursor.AI, Bolt.new, and CLINE for VS Code. The idea of giving natural language prompts to an LLM and receiving working software in return sounds too good to be true. I didn’t really believe it could work.
I was waiting for the right project to try it out. One Saturday morning, we were playing a word card game that my (just-turned) five-year-old daughter, Emilia, received for Christmas. She really enjoyed it, and it was educational. I thought it would be fun to create something similar for her to play on her own.
And here we come to the classic problem. I could code the logic – no problem. It would be a fun Saturday night project, and I figured I could knock it out in a couple of hours. The logic wasn’t complicated. But I’m not deeply experienced in building interactive HTML pages. I don’t have all the CSS memorized. My UI experience is mostly in boring business applications. I knew I could figure it out, but that would turn it from a two-hour project into an all-day event.
This seemed like the perfect opportunity to try AI-driven development – using agentic AI to build complete solutions.
The BLUF: It Worked.
And it worked so well that in the same evening, I built two more games. Since then, I’ve added a fourth. That success has pushed me deeper into prompting AI to build applications. CLINE’s ability to utilize the terminal means it can run commands and process output, allowing it to scaffold and build projects on its own.
I’ve since taken it further, having it create an ASP.NET Core API solution with a React frontend, set up persistence (for both development and production), create deployment scripts, document the solution, write tests, and generate API endpoints to validate functionality. And it worked. I also had it build a working mobile application using the Ionic framework – I’ve tested it successfully on Android, though I haven’t gotten around to copying it to a Mac to build for iOS. But I’m confident it will work fine or require only minor tweaks. I’ve also been experimenting with using ChatGPT and other LLMs to generate the prompts for these types of applications – I’m not an iOS/Android developer, I don’t know all the nuances to account for in a prompt but the LLMs are great at figuring it out.
This is going to fundamentally change how organizations operate. So much of how organizations operate is driven by what can and cannot be automated and where organizations must adopt their process to available tooling because custom tools are not financially justifiable. I’m more focused in this post on my experience building, but I think there is a lot of to think through here from an impact perspective – and I think most of the thinking at the enterprise level on this is way behind the curve.
The Bigger Picture
This is going to fundamentally change how organizations operate. So much of organizational decision-making is based on what can and cannot be automated. Companies often adapt their processes to available tooling because custom solutions aren’t financially justifiable.
I’ve focused here on my hands-on experience, but there’s a lot to unpack from a business and strategic perspective. And right now, I think most enterprise-level thinking on this is way behind the curve.
Btw, these games may seem trivial. And they are. As far as software goes. The applications we build in enterprises are orders of magnitude larger and more complicated. But it doesn’t matter because the time savings is real. And the time to build applications go up as they become more complicated because there are more moving parts to keep track of and test in an integrated manner. But in just this trivial use case we are talking about a 90% reduction in effort (2 hours to 10 minutes.) And that was with really poor prompting, I can only imagine how much better this stuff would get with better quality prompts.
So my message to every one – CIOs, developers, business unit leaders, etc. – is that this is real. It is going to completely change how we think about building and deploying capabilities. Many existing investments will be turned on their head. And anyone trying to hang on to the past and previous investments is setting their organization up for failure. If you don’t have people in your organization working on this today, figuring out how you’ll go faster and faster using this technology you already have a problem.
How I Actually Built What I Built
So now, here my experience building this little game and how I prompted Anthropic using CLINE/VS Code:
For reference, I used VS Code with the CLINE extension. I have an account with Anthropic that I bought tokens through. It’s a bit hard for me to get an exact number but it was less than $3 in Claude consumption to create this application.
At first, I was going to write up the JavaScript logic and then just ask it to build a UI based on a set of method calls. See if it could just take natural language, not visual, prompting to build a UI against defined logic. But I decided I should just try having it build everything, why should I spend 2 hours coding if I didn’t need to (okay, well I like coding but that’s another matter.)
I wrote up what I wanted the application to do and it built everything – essentially reducing coding time to a matter of minutes (during which I was just waiting.) Even an experienced and good frontend dev would have still had to think through the problem and solution and then write the code, so at least an hour of work. Then you have revisions, which I could do at my leisure rather than be tied to a developer. Not to mention, any issues they found with my logic while building the frontend causing more time to be consumed.
It wouldn’t work if you didn’t know anything about software development, you would get lost and not be able to work with the tooling to get to the desired outcome. And once I had the basic game working I did spend another hour or so having it add additional capabilities (sound effects, high score tracking), but I did that at 10 pm with a few beers and got near instant feedback on my requests.
So this was the requirement I gave it to start with:
In phonics (and phonological awareness), we often talk about a syllable as having two parts: the onset (the initial consonant or consonant cluster) and the rime (the vowel and everything after it). In the word cat:
- Onset = c
- Rime = at
So, the “at” portion of “cat” is called the rime. By changing the onset (for example, from c to p), you get pat—different word, same rime.
We are creating an online learning game for kids based on the above concept.
There will be two decks of cards, the Onsets and the Rimes, where the Onsets are always a single consonant letter.
To play the game the player is dealt three onset cards face up.
To start a round the user clicks the “Go” button. They are then dealt a single Rime card face up. The object is to match one of your Onsets with the Rime card to create a valid English word: Onset + Rime = Valid Word. If there is no valid match they click “No Match”. They have 10 seconds to complete the round. If they don’t finish in 10 seconds the round is over and they get 0 points.
When the user clicks on “No Match” or one of their Onset cards the application should check their result. If they selected an Onset card then check if the Onset + Rime = Valid Word, if it doesn’t they lose the round and get 0 points. If they selected “No Match” the application should validate no valid word exists based on the available Onset cards and the Rime card, if a valid word exists they get 0 points.
If they were successful they get a point for each second that was left from the 10 second count down.
After 10 rounds the game is over. Display the total score and allow the user to start over.
And that got me this game: Onset-Rime Word Game. And that was all I gave it. No screen mockup or anything.
It didn’t have a very good list of rimes and words, so I had ChatGPT create a much larger list and provide it to me in JavaScript array format that I then just plugged in. Btw, I also had ChatGPT write the top part of that requirement.
Getting started I didn’t have a really good way of explaining the word breakdown. So I asked ChatGPT o1 to help me with this prompt:
In the word “cat”, what is the “at” part of the word called? For example, I can replace “c” with “p” and have the word “pat”. How would we describe this in terms of parts of words?
Once it gave me the answer (which is in the prompt above) I gave it the following prompt:
Great. I have the following list of onset’s: [‘B’, ‘C’, ‘D’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’] I need you to generate two lists in JavaScript array format. A list of of 2-3 letter rimes and a list of all valid English words that can be generated using the list of onsets provided and the list of rimes you provide.
But I wasn’t super happy with it’s response. It basically was over-reasoning, making assumptions that weren’t necessary. Basically the overambitious junior person. So I gave it another prompt and that got me the lists that are in the app today:
I need significantly more rines and valid words. Use both 2-letter and 3-letter rines. Aim for at least 500 valid english non-slang words. Do not attempt to limit the word list arbitrarily.
And so I have a fully working game that I dropped onto my website. I spent a few dollars making it. It also had a massive productivity benefit, I never had to get into a flow state. If I want to code something significant I need to be in flow state and interrupts become the enemy of my productivity. And external interruption to one’s flow state can derail a developer for an hour or more. But I wasn’t coding. I didn’t need to keep track of a bunch of different objects, their purposes, names, methods, etc.
But then I wanted to create another game (I feel this could become an addiction, but a healthy one.) This was one to help master sight words. I had built one for phonics, so why not.
So the first thing I needed was a list of sight words and I needed them to be spoken:
So off to ChatGPT o1:
I need to generate a list of 300 sight words.
That worked great. But I need to figure out how to get them into sound files:
The list of 300 is perfect. I need a sound file of the word being pronounced. What would be the best way to get an individual MP3 file of each word being pronounced?
I got suggestions to use AWS (or Google or Azure) along with a Python script to call the service and save an MP3 locally. But I also got a recommendation to use gTTS which is a Python text to speech package and a script to run to create the MP3s. I took the gTTS path because it was the easiest and the files were good enough, I’m sure a cloud service could produce higher quality files.
Finally, I had ChatGPT convert the list of words to a Python array (which, I also used as a JavaScript array in the app.)
So now I had a list of words and sounds files so I went back to VS Code and gave CLINE the following task:
We will be creating a sight word game. It should have a similar UI/UX to wordgame.html and mathgame.html. The game will be in the file sightwords.html. It will be called “Our Sight Words”.
There is no timer for this game. There are no difficulty levels.
It is played in rounds of 10.
For each round the app will randomly select a sight word from an array of words. Each word has a corresponding mp3 sound file of the same name in the sightwordmp3s directory. For example, the word “the” would use the file named “the.mp3”.
There is a large speaker icon for the user to press to hear the word. The user presses this button to play the sound.
Below the icon are four buttons each with a sight word in it. One is the correct word and the other two are randomly selected.
The user can press the speaker to play the sound as many times as they wish. The sound will play once automatically at the start of each round. The user gets 3 guesses to get the word. If the user selects an incorrect answer that answer is locked out for the rest of the round.
If they get the correct answer on their first guess they get 5 points, on their second guess 3 points, and on their third guess 1 point.
In between I had created another game of math problems (hence the reference to mathgame.html and difficulty levels in the task prompt.)
After it created the game I did have some back and forth to get the button experience to be what I wanted.
The resulting game: https://nicknow.net/games/games/sightwords.html
One of the coolest experiences I had was on the Math Game I created (https://nicknow.net/games/games/mathgame.html). When I originally prompted for it I only had a Level slider. After watching my kid play with it I realized I needed the timer to be variable because she needed more time for anything but the most basic addition problems (she isn’t even in Kindergarten yet, so timed math tests are not her experience.)
When I prompted it to add the time limit slider it did it correctly but it didn’t work right. The problem was it was using a ‘range’ control with min of 10, a max of 60, and a step of 10. So it would let you select 40 and 50, which wasn’t part of the requirement I gave it. I had told it the options were 10, 20, 30, and 60. But it was struggling with how to update it and after several tries it didn’t seem to figure out how to make it work correctly.
So I played senior dev. I looked at the code and realized that the time limit slider needed to work the same as the level slider: range of 1 to 4 with a step of 1 which is then mapped to a time limit. I prompted it by telling it to look at it this way, and with that simple instruction it figured it out and got it working.