In this video, I share some of the experiences that I had using Copilot CLI to make enhancements to my Blazor blog that serves as the home for the content I create.
📄 Auto-Generated Transcript ▾
Transcript is auto-generated and may contain errors.
Hey folks, I'm just driving home from work. We're going to do a little AI chat. I'm just going to talk about some of the stuff I've been building on the side of work. Mostly there's just been a lot more vibe coding, I guess. And um figured it'd be fun to talk through some of that. I'm not sure if I have any I don't know like foundational learnings that have shifted how I think about everything since the last time I made a video. But I like I've been saying throughout the beginning of this year, I think it's good to keep checking in on this stuff and see how it's going. So, um I have been doing a few things. Um I think in one of the recent videos I talked about how I've been trying to get my website updated and stuff like that. So, I've been doing a lot of uh a lot of coding around that.
Um, it's been kind of cool using C-Pilot to do a bit of a back and forth where I'll use uh an MCP server for Google page insights. Um, let it process the data and um like uh like co-pilot process the data and then make recommendations. It goes and fixes it. We try to validate it. Um, it's kind of reached a point with that that it's seeming like I don't know a good way to say it. It's like it's feeling like it's being kind of stupid now. And I I wonder if it's honestly just because I don't know how it's able to leverage the data that it gets from Google Page Insights to make informed decisions. So, I'm not trying to say like it's a bad tool. I'm just saying that I feel that it's trying to make these optimizations. It's like, oh, there's there's latency here or there's, you know, there's layout shifts here, blah, blah, blah.
And it seems like it doesn't have enough information to know like specifically what's causing it. So it's like making assumptions about it tries to go address them and the feedback loop is like okay well then I I publish the website and then try to to measure it again and then inevitably it's like oh that didn't fix anything and sometimes it's breaking stuff. So the I think the biggest wins for performance uh that are left it's kind of just like really struggling with and then it's funny because some of those uh page insights reports are saying like it's like 12 seconds to like to see any content from your website on mobile and like that's that seems crazy and then like I try my website on my phone and it's like instant and yes I was doing like you know warming the ash and stuff before using Google page insight.
So, I don't I don't know what to say. Uh it seems like something is measuring and it's slow, but point is like that's been a a good feedback loop. Um feels good. It just I don't know like some stuff like my blog it's uh it's it's easy to like to put it aside and then just not worry about it because it's one more thing to like maintain to to write articles for blah blah blah. It's just it's a lot and so when that's out of sight out of mind it's like one less problem but it is kind of nice to get back into it and see it see it going. So, um, yeah, I'm I'm happy about that. Oh, boy. How are we going to How are we going to do this, folks?
Spot's a crappy spot for getting on the highway cuz you got a lot of people that are coming off and a lot of people that are coming on, but uh it's pretty confusing because the lane turns into a an HO on the right. It's really bizarre. Anyway, um website stuff's been good. I also did a couple of interesting things. Maybe not to you, but to me it was pretty cool. So, my blog is a Blazer uh based blog. And so, I did a couple things. One was like some of the the posting mechanics were a little bizarre with like the date formats and stuff. And I made this scary decision to like to track a different publish date so that I don't accidentally break the blog links kind of like preserving a permal link. And so for me that was a pretty scary change.
So that was a fun one to work back and forth on Copilot because I really needed it to prove to me that it wasn't going to break literally every uh like page I have. Like I don't want to redeploy. It's like, "Cool. I migrated all your data. By the way, every link you've ever posted to your website is now busted because I'm, you know, using a different uh date to make your your article links." So, you know, that was that was a pretty scary one. But, um, I think what was interesting about that is the back and forth with coding went pretty well. Like, it did migrations. It had good good tests around stuff. It wrote uh like it did TDD around it which was nice. It made sure that before it made changes too that some of the areas that weren't covered with tests properly also had tests.
So I felt good on like the code is doing what it says it should be doing. But I was still nervous that like if we missed edge cases or we didn't factor something in, am I about to migrate a bunch of stuff and all of the the post break? So, the way that I built the confidence in that was that I said, I'm not going to I'm not going to feel good about it until I see it actually migrate my data. And I see it in my browser. And so, I was kind of stumped because I'm like, I don't I don't have like a prod or a pre-pro environment I push to. I really should. And so I realized that I have a whole test uh schema in my database and I was like, "Holy crap, wait, I can use my local blog and post to uh sorry, not post, use my local blog and then point it at uh my my test schema." And so then it can actually use real data.
So, I actually cloned all the data from my blog, uh, put it into my test schema, and then when Copilot was feeling pretty confident that it had everything down, I was like, "Cool, let's blast it at this test schema, and then I'm going to poke around." And then I had it uh go run like playright tests and other things so it could visit these uh these blog posts running locally. And the reason you might be saying, "Well, why doesn't it like why does it matter, aren't all the blog posts, if you can do one, can't you do the rest?" And the answer is it should. But um my blog's been migrated from WordPress to to this format and I changed some things along the way. So there's a few things that are like kind of legacy and kind of busted. So I'm trying to maintain those permal links.
And so there's a bit of just like, you know, legacy that I don't want to lose. Um, so I did that and that was pretty good. Uh, but yeah, I got saved by having that that test schema and being able to to allow C-Pilot to use a running blog locally pointing at real real data like real, but it's uh a copy of it. So, let's uh get out of that lane. That's for sure. Holy cow. Okay. Um, and then another thing I built on top of that once I had it was uh from looking at some of the SEO stuff on Google for my my website a lot of uh because of like all this schema migration from before with my my URLs doing like proper redirects and stuff so that that the next time Google's indexing it it does a good job. So there was that.
Um I had this Where do I want to go next? There's two more things I want to talk about with my blog in terms of like using C-pilot. Uh let's let's jump to this one. I trying to do all this work for like SEO optimization because it's a blog and I want people to visit the blog and if you're not optimized for SEO, they won't find your blog. So doing all this work and I'm like get to finally like getting over to the site map and stuff and I was like oh man like the site map has these stupid cuz I saw it in Google search console like the or yeah Google search console there's the site map has these double slashes in it where it shouldn't. It's like I can't believe my site map is broken. I don't I don't know when this broke though.
Like I don't remember touching this but co-pilot must have broken. So, okay, Copilot, fix the site map. Blah, blah, blah. No problem. You know, it couldn't figure out when it broke it or if it did. Fixes it. Okay, so I see the code. We got tests on it. Good stuff. I push it up. Site map still broken. Same problem. And I'm stumped. I'm like, I don't know what's going on here. And co-pilot, oh, it's using a cached one. It's using a cached one. I'm like, dude, it's not using a cached one. like we don't have caching on this endpoint that generates it. Sorry, we do but not from Cloudflare and um and I'm busting the cache in memory and we just deployed it, right? So like when it's a new deployment, there's no site map in memory and then we came we as in co-pilot came to this terrifying realization that like nothing's been using that endpoint for the site map.
In fact, that endpoint is not actually wired up properly, so nothing calls it. And it's been serving a site map to my blog from 2024. How messed up is that? So, for just under two years, Google hasn't used a site map from my website to go index posts. It's just from crawling. Uh anyway, that was the worst. And so we got that fixed. And then the final thing was that um from a lot of the optimizations I've been trying to do with Copilot, uh I don't know like a lot of people are not Blazer developers, and I totally get that. But as a C developer, working with Blazer is really nice for me because I can stick to something I like. But there's there's obviously going to be trade-offs, right? it's not going to be the best for um I don't know like a a super optimized website the way I'm using it especially.
So there's a payload that has to land uh that's pretty beefy in the beginning. Like there's just a bunch of things that aren't set up well for like making it a rocket ship the way I'm using it. And so I ended up switching a lot of stuff over to a Blazer uh static server side. And so instead of having interactive pages, I'm not sure if you guys are familiar with Blazer or not, but um when it's interactive, it keeps uh a websocket connection open with Signal R. And so there's this two-way communication from your browser to the server. And so you get this really cool experience where like pages like you navigate the website and like you're not actually reloading the whole page. It's cool. Uh, so I think it's conceptually cool, but it means like there's some weird like when the site redeploys, you just get like while it's not up or there's a blip, you get this thing that's like signal R connection lost and it's super awkward.
Um, there's some some downside to that kind of stuff too, like when it's doing page insights and things like that. So, I said, "You know what? Like, 99% of my blog content does not need Signal R." Like, it's nice when I'm editing posts and things like that, like as an admin, cool. Um, but as a user of my site, like, no, we just we don't need that. So, I worked with Copilot to do this uh this conversion to Blazer serverside rendering. That was another scary one. Um, fortunately, because we did that one after, I had an interactive blog pointing at uh, you know, a database with test data in it that's hosted in the cloud. I could poke around. It felt okay. So, that was pretty good. Ended up pushing it up. A couple little bugs here and there and then, uh, overall worked pretty well.
So, happy that I could do that with Copilot. One thing that I missed was that um I actually lost I lost my Google Analytics tag when I did that. Somehow the tests were passing but the tests weren't sufficient because it was checking for a script that was uh the text was present but it wasn't actually loading in the page properly. So anyway, bunch of stuff with the blog. I feel like it's in a good spot now. And I also feel like if I want to go add things and mess around, I can do that. Um, so that's all gone pretty good. There's a few more things I want to talk through and um, I'm doing a live stream on them tonight. By the time you watch this, it will already be a week after. So um, if you're curious, it's on the Devleer podcast. That's where I do my live streams.
And, uh, they're not always coding. They're usually topics from code commute actually and I write a newsletter on them, but the one I'm doing tonight is going to be just walking through different things I built with Copilot. And so I'll talk about a few of those and I'm actually going to do some YouTube videos on them so you can see them in more detail if you're interested. So live stream will help tonight. It will be recorded so you can check it out if you're watching this in the future. and uh otherwise I'll do some more edited down videos on my my main dev leader channel. Let's talk about them. So, first few are going to be three MCP servers. I think I've talked about these before um because I didn't make them over the weekend, but I did like Google Page Insights, Google Keyword Planner, and uh Google Analytics.
I think there's one I think came from Google, but I I I did three three Google ones uh mostly around SEO related things. So, I had that. Um I actually what I thought was really cool was I have all of these now with um their own like landing pages and stuff like that. You can navigate uh some of the the the documentation and all that by going to my website. So, yes, they're in GitHub. you can check them out if you want to use them. Uh, but if you're on my website, it's actually like uh through the same domain and everything. And so I thought that was pretty cool. And Neler, which is the dependency injection and scanning framework I have, is done the same way. So, um, I I think I need to do like just a reminder for myself on my blog, I'll do a page where it will link out to those and you can find them.
But otherwise, if you go to my GitHub, you can find them, too. So, um I like like those ones are kind of fun because uh using some CI/CD pipeline stuff, it will go make all the documentation and um just cool like it's kind of like these little subsites. So, I was happy about that. I built um this I thought it was a you know software engineers are bad with naming. I'm particularly bad, but um GitHub Copilot has this uh this SQL database, SQLite database called, uh Chronicle. I feel like I've talked about all this stuff before. Maybe not, though. This week weekend was a blur from Vibe Coding, so I apologize, but this Chronicle uh database has all your session information. So, I vibe coded a little MCP server and a web UI. It's called Narnia for like the Chronicles of Narnia. It's clever. Um, so Narnia is a little portal that you can go to and it's like a it's just a UI over your your Chronicle database.
And the reason I built it was that I because I'm doing so much development in the Copilot CLI and I have like, you know, five to eight PowerShell tabs open at a time doing stuff. Um, if my computer doesn't update overnight, I just everything's gone and like the session information is recorded, but I don't know what sessions like it's a mess. So, I built Narnia so I can open up a new co-pilot window and say like launch the Narnia um UI or I can ask some of the MCP tools from Narnia and just say like, hey, like find me this session where I was designing whatever and it will go search through the the stuff and go find it. I'm sure everything I'm describing right now for Narnia will be like a first class thing with all these tools. So, it doesn't matter. Like, it's me playing around, you know, loweffort thing to do and it was kind of fun.
So, uh yeah, I built Narnia and the next time my computer restarts, I'm going to launch that little web UI and go search for the the sessions that I need to follow up on. But, uh yeah, that was a cool little one. and add some value. And one of the reasons why I wanted to talk about all of these, like because none of them are really that fascinating, right? I'm not making this video being like, "Oh, please go use my my free tool." Like, I don't care. If you want to, that's super cool. But, uh, not my intention. My intention is just to say one of the really cool things about having AI tools is that as developers instead of me being like frustrated with something that I'm using and then being like finally caving and being like I'm going to build the best whatever cuz I'm so frustrated.
It's like I don't have to wait for that tipping point. I can just be like, "Hey, this is kind of annoying. Like new PowerShell window co-pilot, go build this." And then I got a little thing, right? So that's where those MCP servers came from. It's like I would really like to be able to give Co-Pilot some of this uh data for SEO. Uh that's where this Narnia thing came from cuz I was getting kind of frustrated when I have this situation where I lose my session information. And I know it's tracked. I just like don't have a good way to to dig it up. But yeah, we can spin these little things up and it's, you know, not a ton of effort. So two more things I'll try to talk through. One is uh brand ghost related um because I was doing so many updates to needler which is my dependency injection framework.
Um dependency injection scanning framework. It's not a whole framework for dependency injection. Um I was like I really got to get Brandos updated with it because I u it's in it's in like an alpha stage. I'm breaking a bunch of stuff and I'm like I don't want it to get too far away before I I update and try using it in like a real real code base. So I was using co-pilot between two sessions and like the brand goes codebase is pretty monstrous in terms of how the projects and dependencies are set up. So it's kind of like a stress test on Needler. So I yeah I basically updated it broke a bunch of stuff like at compile time because I changed a lot of uh implicit behaviors because I think it's making it better and I would rather be the guinea pig to do it.
So I did that and then would give like let would let co-pilot try to correct it as much as it could to come to a a working state and then I'm looking at the hacks it had to put in place because in my opinion if it's done right you should have no hacks right like it should drop in you should feel happy about what it does and if your codebase already had a couple hacks then you might have to introduce a couple of little workarounds but it's kind of understood it shouldn't be the, you know, the the normal case that you're like, I have to go hack all this in here just to make it work. Um, in this case, I was able to take what Copilot reported on from the one session in Brand Ghost and then give it to another co-pilot session that
was working in Needler and saying like, "Hey, we have uh, you know, a customer using our package and here's what they're reporting." And so the needler or co-pilot would go fix it for needler. And I would do this back and forth until like things are working. And then I would say but like okay needler developer co-pilot I want you to go look at this brand goes codebase and see like what patterns are they like they working around like where is their friction because you can see the usage. You can see how the other co-pilot tried to make things work. So it would generate this little report and then I would talk with it and say like you know that's it's it's trying to achieve these behaviors and I want that to be default. So how do we build that right? Like clearly if me as the primary user has to go hack around these things to solve a problem like I'm not solving my problem the way I want to.
Right? I'm I am my best user in this case. So, it was really good to go back and forth between these two sessions. It's pretty complicated just because it's doing source generation across like hundreds of projects. Um, but yeah, I I'm still working on that. Try to get that wrapped up this evening. And then finally, because depending on how many videos of mine you've watched, you've probably heard at some point me talk about side projects, right? Like in general, side projects for developers. One of my side projects that I've had for over 20 years is a role playing game. And it's not uh a good one. It will, I can almost guarantee will never be something that is shipped and played. And that's not really the point because the point has always been it's fun to build. And so I don't know what I don't know what happened.
Okay, to be honest, I don't know what happened over the weekend, but I had this urge or I said I'm multitasking between all these co-pilot sessions. I got I got years of this legacy code sitting here from like these rewrites of this role playing game and like I I think semi-reently within the last like few months at some point maybe 6 months now I went back to some of this code and was like I don't think I'm like it's been so long that I don't even think I would want to try and like clean it up. Like that's how that's kind of where it got to. Um, so I made a new folder and I opened up Copilot and I pointed it at all this legacy code. Buddy, are you going? What are you doing? Oh, you're using two lanes when there's only one. Okay. Um, and then I said to Copilot, "Hey, we're going to rebuild this thing." So, I started I started using Co-Pilot to go rebuild my role playing game.
And, uh, it's it's pretty crazy to be honest. It's like uh I don't even know like how to how to describe this. It's like some of that code is things that I spent like lit like literally decades thinking about. Okay? And I'm not I'm not telling you this from a position of like, oh, it's because my code is so good. It's not. I'm telling you this like these are these are systems in games that I've been thinking about literally for decades, right? Like how how should crafting work? How how should uh if you're generating items, what should the aix pool look like so you can get like enchantments and things like that? What are the stats? How do we make all of this so that you can take the same like framework and then change all the game data and just make a completely new game?
Um, like all of these things are uh are things that I've spent decades thinking about and like playing around with and trying different architectures and designs and stuff out. And so I had this code sitting and then I told it like, hey, a lot of these concepts like, you know, I'm I'm borrowing ideas from games like like Diablo, Diablo II, Path of Exile, Path of Exile 2, Last Epoch, right? Like that's where some of these things are coming from. And then you know my quest and dialogue system that's based on a lot of the Elder Scrolls games I played like and here's these pieces and like okay well you see these mechanics in Balders's Gate like that's where some of these ideas came from. Uh or what's the other it's not like Larian Studios right? Like how what do they have? Divinity. Um I know Boulders G3.
I'm just saying Divinity is the other one I was thinking of. Uh there's even things from like Pokemon, right? Like uh the the missing piece there, by the way, is that a lot of the time when I would talk about what this game looked like was 2D overhead kind of like Pokemon. Uh but there's, you know, there's concepts when you're you're dealing with Pokemon, they have like what do they call them? Intrinsic values. Like is it Eevees and Ivy's or something? Um Ivy for intrinsic value. Is there Eevee? whatever. And I don't know enough about Pokemon. I just know those things exist. And so I was like, hey, when we generate items, like I want a system that's kind of like the items themselves have like a DNA to them. So, you know, there's like almost like a quality concept. So all of these things and I can get it to go find like software engineering documentation even if it's kind of like reverse engineered from communities building tools pull that stuff in.
Right? We're building a knowledge base here and I told it like I want you to we're going to maintain this agents MD file. This is going to be uh sort of like our guiding principles and all of that. and just said like what are we starting with, right? And it kind of deduced we should start with like some simple stat calculation stuff. Then we got into um like uh aixes and modifiers, right? So when you're making items that can have abilities on them, what what do those look like? Right? I don't know how many of you watching or listening have played these types of games, right? you find a sword and like you could have a sword, but you could also have like a a sword of darkness or like uh I don't know like soldiers sword of speed. So like these affixes generate on the items and give them abilities.
There's different tiers of these items, all this kind of stuff. So um I just worked with co-pilot like literally rebuilding these things from scratch. And the thought of doing that before was so crazy because it's like it's just years and years and years of like of these systems being built up that I've coded and recoded and I'm like I don't want to do it again. Like that's such a nightmare. But the difference was that I could sit there and talk about the ideas with co-pilot. And then instead of me spending all of this time trying to to mess around with like how do I make this work in the language or whatever else, um I just talked to it about what I'm trying to accomplish and uh and then it would go do the the crappy part for me. Right?
So, I wanted to share this one because I I've talked about it a little bit in other videos where we talk about, you know, some people who as software engineers, it's like, well, it's with AI, I'm not coding as much. And coding was the thing that I really loved. And I think I was trying to identify for myself like sure like I I do like writing code, but that's not the part that I love the most out of software engineering. I like building things. It's not specifically the code. I think yes, there are interesting challenges in code that are fun to think through, but um I felt hooked like sitting talking with co-pilot in a terminal just being like cool, we built this part like here's something I've always wanted to do and never actually coded up in that kind of like framework. Can we do that?
and it's like here's how we go change it like okay cool go do it. Um and I I I felt that that enjoyment of like just having things being made and was not missing the code. So anyway, I thought that was I thought that was fun. Uh and it just made me think back to one of the things I've said about software development. One of the reasons I like fell in love with programming and software development was that it felt like when I was learning how to program, it felt like building Lego, which I love. It felt like building Lego with any brick you wanted in any quantity you wanted. You can build anything. And throughout my life since then, it's been like that still holds true.
It's just that in order to shape the bricks and to to make more bricks, it's like that that takes time to go find the right brick or to make the right brick and to reuse the the bricks you put together to make sure the bricks don't fall apart, right? Like all that takes time. And so it's just super cool to see that, you know, I can have something put the bricks together for me. I can kind of dream up the idea and it's working in some of these cases. Now, I'm not saying that to suggest like therefore I'll never need to program again or or that even like what I'm suggesting is what people should be doing for work necessarily. Everything I've talked about is purely like hobby stuff except for brand ghost, right? And I do use AI when building brand ghost, but like I'm I'm heavily involved when I'm doing that.
Uh but some of these other things it's like you know the MCP tools this Narnia tool this uh me having it rewrite parts of this old role playing game you know I'm in the conversation I'm not glued to the code which is uh it's just it's super cool. So anyway that's what I've been up to. Still using C-Pilot CLI for all that stuff because it's been a good tool so far. I'm enjoying it. And uh I think that's it. So if you got questions, you want to answer it about your career, software development, that kind of stuff, leave below in the comments. You go to codemute.com, submit stuff anonymously, and I will see you in the next one. Take care.
Frequently Asked Questions
These Q&A summaries are AI-generated from the video transcript and may not reflect my exact wording. Watch the video for the full context.
- How do you use Copilot CLI with Google Page Insights to optimize your Blazor blog, and what have you learned?
- I use an MCP server for Google Page Insights, let Copilot process the data, and then I validate the recommendations before applying fixes. I find it helpful for performance feedback, but sometimes it seems like it's guessing because it can't always tell what's causing latency or layout shifts. I also test on my phone to compare, and I notice the real-world speeds can feel instant even when Page Insights reports slow.
- How did you manage changing the publish date to preserve permalinks for your Blazor blog?
- I made the scary decision to track a different publish date so that I wouldn't accidentally break the permalinks. I needed Copilot to prove to me that it wasn't going to break literally every page, so I migrated all my data and tested the changes locally using a test schema. Copilot wrote the migrations with tests and even did TDD around it to cover edges.
- Why did you convert your Blazor site to server-side rendering and what role did Copilot play?
- I decided that 99% of my blog content doesn't need SignalR interactivity, so I converted to Blazor server-side rendering. I worked with Copilot to perform the conversion, pushed it live, and fixed a few small bugs along the way. I even discovered I lost my Google Analytics tag during the process, which tests didn't catch.