AI Wrote 99% of My Production App (In 3 Months)

A developer (operator of McAdemy) demonstrates a production educational platform that he says was built with AI generating ~99% of the code. The video walks through student-facing pages (SEO-optimized lesson slugs, Markdown-driven content, MUX-hosted videos, progress tracking), an admin area (course/playlist/lesson management, draft/publish workflow, caption/translation queue), and a sophisticated exam system (timed exams, question pools, category allotments, human review + AI-generated variants). The creator emphasizes a simple, Laravel-based tech stack and describes a three-month build after several months of requirements work.
Questions this video answers
Over 15,000 registered students.
Nearly 20 completed courses.
Over a million dollars made since starting the business.
63 lessons total; 5 free preview lessons.
Question pool ≈ 200 questions; each exam contains 50 questions.
Chapters
I've heard so many people doubt that AI can write 99% of your code, and I get it, it Sounds like complete BS, but I'm living proof that it works. I run McAdemy, I train Magento developers and have over 15,000 registered students on my platform, nearly 20 completed courses, and I've actually made over a million dollars since I've started this business. The platform you're about to see though, is the one that will run my entire business moving forward. And AI wrote 99% of it. This isn't just like a hobby project either. This is my livelihood and my family and my salary depends on it. I wouldn't be running this business with AI generated garbage code. So I'm going to walk you through the entire thing. The front end experience, the admin backend panel, and the absolutely insane exam portal that shouldn't have been possible for a solo developer to build in three months. If you've been at all skeptical about AI coding, the should change your mind all right, let's start with what the students actually see. These are public landing pages, think lesson pages, courses, playlists. Pretty standard stuff. We have thumbnails, titles, durations for videos, and we can actually click in to one of these lessons and see the experience. When you click into a lesson, you'll see that it belongs to a course or playlist, or it also could be a standalone lesson. The standalone capability was crucial. Crucial for me because I wanted to be able to create one off lessons with their own specific links. Check out the URL structure. Also, it's atomic. This URL never changes and it doesn't include a reference to the course or playlist if it has one, but it does detect the underlying course or playlist and display the related content in the sidebar. This keeps everything ranking well on Google because each lesson focuses only on one specific topic. The slug, the page title and the summary are all completely optimized for SEO. Also notice that the left sidebar title is different from the main title of the lesson. This is so we reap the full benefits of SEO in the H1 tag, but have a more streamlined look in the sidebar. If we take a look at the video, we'll see that it's a completely playable video and it's hosted by mux. I needed a great API driven service that didn't depend on building building the video system myself and MUX handles everything and gives me absolutely amazing access to all the API endpoints to control the entire process. If we take a look at this lesson content, it's actually driven from Markdown and then parsed as HTML. And you'll see references to inline code, big coding blocks with copy and paste functionality, callouts with block quotes, and we can even reference stuff like complex tables on the front end. And I also made something completely custom that's actually not shown on this lesson page and we'll get to that in a little bit. But as of right now, we have this main three column sidebar and this right sidebar is under development and that's where access to the AI tutor and comments will actually go. To see the rest. We actually need to log in as a student, so let's go ahead and click Log in and you'll see that the page refreshed after we logged in. But what actually happened here is that it called Teachable, which is my previous course platform. It called its OAuth system and actually authenticated with the user over on that platform. This in turn logs in the user and stores the session over in Laravel. Eventually I'll migrate completely off the teachable OAuth process and just run with my own custom authentication system. Oh, and now here's where things get interesting. You'll see these icons at the top. I can jump straight into editing a lesson, copy the entire lesson content over in Markdown, and even download a thumbnail image of the video. I can use this info to generate stuff like social media posts really quickly. And in the sidebar you'll see little circles that are displayed next to each lesson item. If we go ahead and play one of the videos and then fast forward to a spot in the video where it's about 80% complete, we'll see that it gets marked as complete. And I can also toggle it complete on or off just by clicking that icon. And you'll see the progress bar also changes dynamically as we change this progress. This UI totally beats the heck out of having a big ugly complete and continue button at the top of the page. This is much cleaner. Let's head back to the main playlist and we can check out the progress at the top of the page. And we have this nice thumbnail view. And if we go back to display all the playlists, you'll see that I also have some draft playlists here that aren't available to the public. Public as an admin, I'm the only one that can see them. And the same thing happens with lessons and courses and playlists. This allows me to create them, view them, edit them without anyone seeing it, and then when it's ready it can be published and same deal happens with courses. If I go to my courses, you'll see that I have the same draft capability and the ability to track progress. But there's something I haven't even touched base on yet and that's exams. This has full blown exam taking capability and it's one of the most comprehensive parts of this entire platform. This was the most intricate build and actually the first part of the system that I created. I just recently launched an Adobe Commerce CertPrep course and I needed fully featured exam software and I researched all the other platforms out there and couldn't find anything that I liked and that was able to do what I wanted it to do for the course course. So this is why I built my own. If we take a look at the progress of one of these exams that I just took, you'll see that I have the details summary of how long it took for me to take the exam, my passing level, how I did in each category and the questions and answers of how I did it on the entire exam. And what I really needed custom that no other platform did was the explanation field which breaks down the entire question and all of the related answers and explained it in detail of how we came up with the answer and why answers were incorrect or correct. And what's cool is I can also share this exam results publicly. So I have a share icon and I can copy this to the clipboard and if I open up a new window and paste it in, you'll see that I get the exam summary. But the category performance is blurred out and it says it's only available to those enrolled in the course or university students. Pretty neat way to just share your score and let everyone know how you did on this test. It's a little bit of social proof that might help drive traffic to my site. And of course if we go back to my results and back to the exam, I can actually take the entire exam and it works just like any other exam software out there where you have multiple choice or multi select options. Very cool. Has a timer at the top, you can flag specific questions. Very, very neat. All right, that's the gist of the front end experience. This has been live since my CERT prep course launched a couple months ago and I've been continuously publishing lessons to the platform. It's so much easier now and I save so much time compared to my last course platform and you're about to see why. Okay, welcome to where the Magic happens. This is the admin figuring out the layout was A bit tricky, but I went with a skinny sidebar and some sub nav at the top just to keep things really simple and streamlined and allowing me to navigate through a multilevel hierarchy in the admin. And and this was the easiest way to do it. We'll see that there are sections for courses, playlists and lessons in this education tab. I can view exam results on this section and I can also view all the users and their progress and actually impersonate their login by just by clicking a button next to their name. I also have an FAQ section that spawns off an API that I can call on the front end of my site to build out my help desk. And and there's also a couple icons here that I haven't built out yet, but they're placeholders for sales and analytics data that I'll be adding in in the future. This admin is not complete by any means. It's definitely a work in progress, but I build things as they go and that's sort of how you code things with AI. You don't want to have some giant grandiose plan that you can never execute on because it's just so large. I tried that a few times, but once I started breaking things down and working on it section by section, just like I do with my lessons and courses content, I then started to make significant, significant progress on things. Now when I started I really just needed the exam software. So that's the first part I actually built. And then I also needed some basic course functionality. Once I decided to launch this new course on this new platform, everything else was secondary. So those are the only parts that I focused on and it made it work really well instead of trying to envision everything in a final perfect state. And a quick note before we dive a bit deeper into this platform kept this tech stack really, really simple, very purposely. Everything's built on Laravel. I use Tailwind for the styling, I use Blade templates and Alpine JS and coupled with vanilla JavaScript. There is no fancy headless setup here, no proprietary stuff like Livewire or Filament. I kept things really simple so I full control over everything and so the AI can really focus on writing idiomatic Laravel code. I made this choice because the AI is already trained on the stack. There's tons of information on Laravel out there, tons of info on Blade templates, and not so much on newer technologies. So I really wanted it to keep things simple so it just writes straightforward, simple code for me. If you're currently working With a more complex architecture, you're kind of swimming uphill right now. I've seen this with Magento because I trained developers on it. It's such a complex system and it's so involved. The AI just gets so confused when it's needs to figure out a certain architecture, pattern or level on this complex software. So the simpler you can keep this software, the better results you'll get from the AI. And I built 99% of the system all by myself. You're probably wondering where that 1% is. It's typically the foundation that I worked on when I just started on this project. I defined how the templates will look and how things are structured in the code. I laid things out very modularly with a component driven architecture using blade templates. So I kept things simple, but I also kept it modular and streamlined. So once the AI starts seeing that code base, it starts to understand how things are supposed to look and then it starts building on top of that layer. And anytime it creates a new file or a new structure, it will look at your existing data or see it as it scans the code. So you want to make sure that initial core base is really well developed and refined before you start developing all the other stuff. Without that foundation, the AI just wants to build whatever it wants. So once I set these patterns and told it to follow them, everything else just started clicking. All right, let's take a look at the first course that I published to this platform, which is the Adobe Commerce CertPrep course. This course has 63 lessons, five free preview lessons. So if someone's not enrolled in the course, they can still watch a lesson from it. Courses have sections or subsections and we can expand and collapse all of these different sections. We can drag and drop anything around this system and it just works flawlessly and updates with ajax. It's very neat. And we can reorganize and drag and drop anything we want on this system so it works really intuitively and well. Now this was extremely complex to build. Probably couldn't have figured this out myself, but the AI developed everything for me. It was a painful process, I'm not gonna lie. It took a few days for it to build this out, but it got it done. Let's go ahead and go into this targeted study practice section and go into one of these areas with some lessons. You'll notice when I hover over, you'll see a few icons. We can view the lesson details in the admin, we can add, edit them directly, or we can hit the preview button to see how it displays on the front end. And we can also unassign the lesson from the course just by clicking the button. And because of how I set things up with the URLs, I can actually move lessons all around the course and different sections or different playlists. And the main URL never changes. That's kind of why I set things up the way I did. So there was a lot of planning going on with this build. Let's take a look at the main content and how it displays. In this admin area, we have the main content. In this area, we have details of when it's been created or updated. This video area is where I can actually display and change the thumbnail directly around by moving the slider bar. And there's also this section for captions which collapses when they're all published, where I can control all the translations that are linked to the video. This caption and translation functionality is actually really intricate. It's actually one of the main reasons I built this platform in the first place. On my previous course platform, I had to manually upload every single caption, and it took like three or four clicks for every single caption. And I would generate this outside of the system. It was so incredibly time consuming and so tedious that I knew I just had to build something better. I'll walk you through this whole caption workflow in just a little bit, but it's built on a queuing system and it's really, really neat. If we scroll down, we can see if this lesson is assigned to a specific course or playlist, and it actually can be assigned to multiple courses down the line. I will build in custom context switching capabilities, so when you're on a specific lesson page, the context will switch if that lesson is in multiple playlists or courses. Very cool functionality. Just thinking down the line. Let's go back to this lessons table and we can see a list of all of the lessons in the system. We have some pagination down here and we can see quickly if the lesson is within a course or playlist. And I can also actually search for specific lessons. For example, I can type in Docker and I get all of the results back. And I can also actually filter by status if it's published or unpublished, and if it belongs to a specific course. All very cool. And I can disable filters or add on multiple filters. And I also have a lesson redirect section. So if you rename a slug on a lesson that's already been published, it'll automatically create A redirect for you, or you can manually manage these redirects right here. Okay, let's go ahead and create a new lesson. I'll walk you through what I do when I create these new lessons and assign them to courses and playlists. First comes the title. I always use a consistent format. It's what the lesson teaches. For example, create a custom controller in Magento. I consistently use a format in and then the platform. And this plays well with SEO. And it's this slug is auto created for you also, which removes all the filler words like in or. And I can change that custom sidebar just by clicking that button. You'll notice it strips out the in and the part after it automatically. Very, very cool. And just saves me a ton of time. Now over in this content section, I could just type anything that I want here and it looks like just a regular text area box, right? But it's not. It's actually a full markdown editor behind the scenes. It uses the tiptap editor. I typically work in Notion, so I learned something similar to Notion and how it works where I can just type in, let's say two pound signs and then a title and then on enter it completely goes to paragraph form. So this saves a ton of time. I could do backticks and then enter in custom code. It's very cool and I can control what language it is and even assign a file name to this code block. This is all completely custom. Nothing like this exists. I haven't seen this file name functionality anywhere else, but I needed it in this platform. So students can reference the code blocks to specific file names. So this little addition really helps things out when you're teaching things. Now let me go ahead and remove this and I'm just going to copy and paste some info over from Notion. You'll notice that some backslashes are added, so I do have to clean those up, but I can easily add a filter to remove those on the paste. And within this file name, I can actually just paste in the file name. This all looks good. And this summary box, I would typically always write a short summary for meta descriptions or just up here underneath the lesson title. But rather than having me type that out every time myself, I built this little icon that just calls OpenAI and generates it for for me based on the lesson content that I've actually input here, I can specify when something's published or leave it unpublished. If I'm still working on it as a draft should broadcast post it over to my campus community. So if we go ahead and check that out. Here's a recent lesson that was published. It takes that summary, a link and the title and it just links it all together. So my university students can easily see if something's been published right in the community and click over back to it. That really helps. I used to manually copy and paste everything over every time I published a specific lesson, which is just mind numbing. And this publish date, I can set dates in the future and stagger lessons out so they're consistently published so I don't have to be around when that lesson is published, which really saves some time. I can mark the lesson as a free preview and I can also create links, for example, documentation. And I can link over to, let's say just google.com for this to see how this works. And I can add on multiple links as well. So let me go ahead and create this lesson and you'll see how this page is kind of taking shape. You'll see the title and how it's formatted along with this giant code block, how all of the other inline code is really formatted nicely. But I want to focus on this video area, which is one of the most exciting parts of this whole build. What I'm going to do is drag an MP4 of the video lesson over and you'll see that it's a really nice interface. And what it's doing right now is uploading the video to MUX. It's calling their APIs, uploading them, what it does after it uploads, you'll see the UI just refreshes right in front of me. The state from MUX is auto updated. As it uploads and processes the video, you'll see that we have a preview ready. The video is already uploaded. I can click around to just change the thumbnail that's displayed on the page, which is also used as an open graph image on the front end lesson area. English captions. You'll see it's correcting. So what happens after you upload a video to mux? It actually auto generates captions with Whisper works quite well. However, I have a lot of technical content in my lessons, like specifically formatted name syntaxes and references to classes and things like that with specific casing and references to functions. So Whisper doesn't do well with that. And we'll see this if we click this ready for review button. Okay. When we see the captions generated with mux's Whisper process, we'll see that it just spells out the words in human language like foo, slash, Bar, but that's not what we want. I actually want it to say foo slash bar and have it quoted out and you'll see that this happens throughout the entire transcript. Very cool. So what I'm doing is a proprietary process where I'm taking that lesson content that we just pasted in to the lesson and it actually merges it with this auto generated whisper captions and comes up with a very refined subtitle file that retains the subtitle timestamps, but it updates all of the text to be in that tech friendly format. And what this also does byproduct is when it's translated to other languages, I'm actually able to keep the tech references and translate everything else, which is cool. Sometimes the translations just aren't that good so I'll need to review it and make some changes which I can do right here. But after that's done, I can click save and translate. That just kicked off jobs that get sent to a worker queue in Redis. And what it's doing is it actually sent that corrected lesson content over to an AI API and it will autocorrect and translate all of those captions to the various languages. And you'll see as it's processing this all happens in the background. So I can actually refresh the page and come back to it and it's, it's still processing. And after it processes those, it then uploads them to MUX and syncs them up so all the captions are visible right away when this completes. Now I have it set up to auto accept and publish automatically. I could create a toggle if I wanted to manually review every single one of these language files, but I think this is one of the best parts of the system. And you'll see after all captions are uploaded, it collapses them just to tell me they're all published. Very cool. And I can actually click into any of these and see the translations. And you'll see what I mean by retaining the references here, depending on the language. And I'm sure it's well translated, but very cool. That's, that's one of my favorite parts of the system. Just doing that alone for five languages that I had before, it would take me 15 minutes to do a single lesson and now it's just done in a minute and they're perfectly translated and I have all eight different languages, so it's absolutely wonderful. And after this is all published, we can go ahead and click preview and we'll see that we have the full content here. Everything's formatted as we'd expect, we can actually play the video and change the captions to any one of these languages and it just translates it. Very cool. It's all automated and I can click back to go right back into the admin. So let's go ahead and move on over to the exam taking form functionality. And you can see that this is very easily the most complex area of the entire platform. I can create exams, but let me go into the related exam. For the Adobe Commerce CertPrep course, you'll see that this has different categories and we have different allotments depending on the category. If we go ahead and take a look at the overall exam data, we'll see that we have an overall passing score, the total number of questions, all of the red text locks all these out from editing. Once an exam has been published, you want to retain the integrity of the exam once it's published. And once students have taken the exam, which makes things really complex, control the time limit, which has a countdown timer. And at the end, if they haven't completed the exam, it will go ahead and auto submit the exam for them automatically. But we also could assign different categories. So each of these categories does have a specific allotment. We'll see that this architecture category makes up 26 questions out of the 50 on the exam. And so when someone takes the course, it will automatically pull out 26 questions out of the entire exam question pool out of this specific category. So it very much closely mirrors and mimics the actual test taking process that they will take with Adobe. You'll see that we have tons of questions here if we go ahead and click into one of them. Now, this data closely represents what displays for a student when they actually take an exam. And you'll notice that this question is read only because it's part of a published exam. It can't be modified once it's been approved or it's been used in an exam session. So when a student starts an exam, it actually prunes out all of the randomized questions and creates a session linked to those specific question IDs. And that's how it tracks what questions have been taken and what haven't been taken. So you can only change things around before that specific process happens. This whole exam functionality involved some very heavy research and R and D and requirements gathering. I flushed out a lot of features and functionality. Only after the requirements were created is when AI actually went and built the stuff. So I fed it the requirements and I worked on it methodically. One section at a time. But some of the functionality wasn't developed until later, like this question group functionality, which was developed after I had the initial 50 questions loaded in. So I wanted to get the core exam taking functionality all flushed out and complete first. This question group functionality allows you to get different questions on the exam every time you take it. So the whole entire question poll is made up of about 200 questions and the actual exam is 50 questions, which means you can take the exam four times and actually get a completely fresh and different exam every time. And if we actually look at these variants, we'll see that they are very similar but slightly different. And that's because they're actually driven off of the data from this explanation field, which was crucial to have to explain students why questions were correct or incorrect. But what's cool is that these variants were entirely made with AI. A big problem with AI, as you know, is that it hallucinates makes stuff up. And the same thing with these exam questions, it definitely makes stuff up. It'll say everything is correct or certain things are correct that don't even exist in the platform. So every single one of these questions actually needed to be reviewed by a human. And it's part of the process. We have an AI verification that does actually check with AI, but it's still incorrect. So there's a complete human approved disapproved process built into this entire platform. Only when a question has been approved is when it will actually be published and available on the exam. So for the first initial 50 questions, it took a few weeks to go through all of them and verify every single thing mentioned in all the questions, answers and explanations. Luckily two Van, my Magento, tech guru at M Academy, really helped out here and helped flush out that initial 50. But what's cool is once those initial 50 were complete and human reviewed and updated, we had completely verified information to build the next rendition of exam questions. So what's cool is I actually built a sub agent in cloud code to go and take the initial question and build those variant questions. And I did it by creating a custom prompt with a sub agent. And when I executed it, it actually created those 150 extra questions answers explanations in about one minute. Now I did have to human review again all of the questions, answers, explanations, every single one I had to review. But it went way quicker because I told it to only use information that's available within the explanation field, not assume any context outside of that field. And that really helped speed up the process. It had about 95% correct using that method, which was amazing. I only had a junk seven or eight of them so it was very accurate. When you tell it to do something with a very well defined prompt, it may work really well for specific scenarios. And this sub agent process was a really cool use of AI for me. We can preview how actually things look in the front end as well. Very cool to preview it out. Something I didn't mention before is that we actually have light and dark mode everywhere which is cool. And it can also use the system mode, so that's something I had the AI completely build and all these question groups can of course be managed and assigned separately and you can see how the nice navigational structure works with the many levels. All of this backend logic is very complex. There are checks for deleted questions, soft deleted questions, questions from pools, questions from groups. There are timed exams, specific number of questions, passing score when time's up IT auto submits gives warnings along the way if any exam is started, but no questions are answered within it. I have a cron job that kicks off and prunes those out on a schedule every hour so it doesn't affect the student's overall score. It's all very intricate and it just works flawlessly on the front end. I'm also thinking about building in even more intricate logic to find exact questions that students are struggling with, and that logic could possibly flag questions where something like 80% of the students got something wrong, so they know to focus on the specific areas that trip everyone up. All right, there's actually a lot more to this platform that I haven't even covered. The code base is growing pretty large, but it's very uniform and consistent and works at a very high level with a high level of quality. I might get into the actual code in future videos if there's interest. If there's is, let me know in the comments below. But I've been a coder for 20 years and I know what good code and bad code looks like. And there is a process of working with AI. You need to know what looks good, what looks bad, when to push back, when to ask it to dive deeper. There's a whole development workflow that I flushed out over this last year. For example, that exam software part of the system is just ridiculously complex. But I did build the entire core of this entire platform in about three months all by myself. But I did spend a couple months flushing out all of the requirements before I started building anything. Now I have talked to developers that worked for tech ed companies that built their own custom LMS like this and they said they had a team of six people working on it for over three years and I believe it. This is a very complex system, but I was able to do it myself alone in three months. It's absurdly amazing. And here's what's great. I own the entire code base. I have full control over everything and every aspect of it. And it's designed exactly how I wanted it. And if I would build the same thing today, I'd probably build the exact same thing. Laravel was an awesome choice for this platform. The queuing system works flawlessly. I have the database running in postgres and I actually completed a full MySQL to post Postgres migration with the AI handling the entire migration, writing all these custom scripts. It sends emails when exams are completed. Auth works great. Everything's built in. It just all works wonderfully. Now, all of this works with Laravel, but there's no doubt in my mind that if you're dealing with more complex architectures, platforms like Magento, these same requirement gathering phases and development processes should work or will work. It's just taking time for everyone to figure out how to work with these more complex code bases. There are different strategies that are cropping up, such as indexing your entire database with AI, training it on specific data and patterns. I'm continuing to research all of these and everything that's involved with this, but you definitely want to keep up to speed with all of these developments that are happening. Everything's changing at such a rapid pace. Simple systems like Laravel are just easier to build with now. But as we develop better tools and workflows for dealing with more complex systems, all of this will trickle down into these complex systems and you'll eventually be able to to work with them in a process just like this. If you want to learn about my personal development processes and how I built this entire amazing platform, I am planning on building content around cloud code, which is the primary tool that I use to build all of this. And I'm also sketching out the development, workflow and process that I personally use to ship this entire platform. I've had a tremendous amount of signups just from a few posts over on LinkedIn. Blew my expectations out of the water and I'm just going down the cloud code rabbit hole. Cloud code and anthropics APIs are amazing and they keep getting updated. At the time of this video, Sonnet 4.5 just got released in cloud code 2.0. That means I built this entire platform on cloud code 1 and Sonnet and Opus 4, so this stuff can only get better, faster and more efficient moving forward. There are also more specific workflows that you can adopt such as test driven development and spec driven development, and that really increases the reliability and speed that you're able to develop all this stuff. If you are interested in following me along, there is a link in the description below. Get on my mailing list and I hope that this walkthrough was really useful to you and let me know what you think in the comments. But hopefully now you're more convinced than you were before watching the video that you could definitely build a production level app and have AI write 99% of the code for you. It's really wrote all of the code for this entire system. After I define that initial set of code, I rarely go into code anymore and fix anything. I have the AI do everything for me. So at this point my entire process involves me writing pretty much zero code. So be sure to take a look at this AI stuff if you haven't already. It's probably going to be detrimental to your career if you don't hop on it and pick it up. There are developers out there that are, and their efficiency is just going to far surpass yours. I recently switched from being a teacher who creates educational content to a builder who shares what he learns. If you wanted to learn more about this switch, be sure to watch this next video. And until next time, keep shipping code.










