<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Alex Rebula</title>
    <description>The latest articles on Forem by Alex Rebula (@alexrebula).</description>
    <link>https://forem.com/alexrebula</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3886918%2F0b21d75b-acbe-4515-bfc6-74e371b3bef6.png</url>
      <title>Forem: Alex Rebula</title>
      <link>https://forem.com/alexrebula</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alexrebula"/>
    <language>en</language>
    <item>
      <title>The Grey Enemy and the Copilot Friend Who’s Turning My GitHub Green</title>
      <dc:creator>Alex Rebula</dc:creator>
      <pubDate>Sun, 03 May 2026 06:33:41 +0000</pubDate>
      <link>https://forem.com/alexrebula/the-grey-enemy-and-the-copilot-friend-whos-turning-my-github-green-3dl</link>
      <guid>https://forem.com/alexrebula/the-grey-enemy-and-the-copilot-friend-whos-turning-my-github-green-3dl</guid>
      <description>&lt;h2&gt;
  
  
  The grey enemy and the friend to save me from it
&lt;/h2&gt;

&lt;p&gt;If you're a software developer and you are on GitHub, you already know what I'm talking about: the contribution graph. That public heatmap on your profile that tracks your every commit, PR, and review you've ever made. That grid of gray and green squares that tells a story about your coding life, Or rather, a biased version of it. In some cases, it looks like a well maintained patch of grass. Just not on mine. &lt;/p&gt;

&lt;p&gt;By the title you can already deduce how mine looks. Imagine my hair (I am 45) but worse. Although, my wife disputes the ratio. For years I couldn't look at it without feeling I had something to answer for. &lt;/p&gt;

&lt;p&gt;Anyway, here it is. The current year of it at least:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3w8tb0s4749yt9k8gefz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3w8tb0s4749yt9k8gefz.jpg" alt=" " width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article is about why that grey is almost always a lie for enterprise developers, what I've been doing to reclaim a public record since April, and what a single morning of code review (alone, without a team behind you) taught me about how these tools actually work when you most need them to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "problem" with Github
&lt;/h2&gt;

&lt;p&gt;GitHub's contribution graph is built for open-source and personal work. Enterprise consulting work leaves almost no public trace, by design. Here's how the graph actually works. I asked Copilot Chat (the VS Code extension, not the GitHub PR reviewer) to explain it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Public repos stay on your profile forever, even after you leave. Private repos on the other hand show up if you enable "Include private contributions" in your profile settings. Private org repos however show up only while you still have access. In other words, when the org removes you, those green squares disappear from your graph.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started writing code professionally in 2005. The decade before 2015 was enterprise work in Slovenia: financial systems, energy forecasting platforms, information portals. None of it on GitHub. Then SeamlessCMS in Melbourne, building government intranets and public-facing websites, none of it on GitHub. Then six and a half years at Avanade as a software engineer and senior consultant, working with Australian clients including city councils, Bankfirst, Funlab, Vanguard, CPI, NBN, and Australian Retirement Trust. All of it in Azure DevOps, behind client firewalls, invisible to any public graph.&lt;/p&gt;

&lt;p&gt;Even if Avanade had used GitHub, my 6.5 years of commits would have vanished from my profile the day I left. The most productive years of an enterprise career leave the least public trace. My GitHub profile suggests I started writing code in 2025. That gap isn't laziness; it's how enterprise development works.&lt;/p&gt;

&lt;p&gt;Could I have done extra open-source work on the side? Maybe. But I was also studying, working full days, and changing a toddler's diapers. I didn't, and I'm roughly at peace with it. The same way I'm at peace with not buying Bitcoin when a friend told me to. That was my Laszlo Hanyecz moment. Laszlo who? Laszlo was the programmer who, in 2010, paid 10,000 Bitcoin for two Papa John's pizzas when Bitcoin was worth fractions of a cent. Those coins are worth hundreds of millions today. I'm not glad for him, but at least I'm not alone in my mistakes. Some decisions only look obvious in hindsight. At the time I was writing C# and JavaScript in Sežana, Slovenia. I've learned one thing for certain: I'll never buy pizza with internet money.&lt;/p&gt;

&lt;p&gt;The point is: my graph doesn't show the real systems, real scale, or real deadlines I've dealt with. But try explaining that to a heatmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quiet erosion
&lt;/h2&gt;

&lt;p&gt;I left Avanade in February 2024, made redundant, along with a wave of others during the AI spending hangover. Deep down I knew it was time for a change. What I didn't anticipate was how much I would miss being corrected by someone who knew better.&lt;/p&gt;

&lt;p&gt;When you stop having code reviews, the love for the craft stays. The habit stays. But the muscle hasn't been tested, and you know it. There is no one to catch what you miss. You rest the brain, enjoy the break, and then every recruiter sees the grey graph and draws the wrong conclusion. My GitHub profile remained grey until I did something concrete about it. If you're in the same position: in my view, the answer isn't to explain the gap, but it's to DO something about it. Building something public ended to be super fun for me. I just hope I am not too late at my age.&lt;/p&gt;

&lt;p&gt;I had a portfolio website in 2015 that got me my first Australian job. I removed it eventually. For some odd reason I wasn't proud of it anymore. Ten years on, I needed a new one. This time I wanted to build something I actually stood behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it green again
&lt;/h2&gt;

&lt;p&gt;Since start of April, this year I've been changing that - I've been "overseeding" my lawn. If you're a gardener, you'll know what I mean, but if you're not, here's the "with other words" part: square by square, day by day I started to build open-source, in public, with work worth showing. I am not yet out of the grey, but I'll get there.&lt;/p&gt;

&lt;p&gt;Three open-source packages, a portfolio site on Next.js 16 + React 19, 267 passing tests, a pre-push quality gate that runs six checks before anything hits the Main branch. Nobody asked me to build it that way, but I did, because I saw it when on an NBN project and because my twenty years of experience taught me what codebases look like without those tools. Tools I could only have dreamed of in 2015, let alone in 1992 when I was still loading games from a cassette on the Commodore 64.&lt;/p&gt;

&lt;p&gt;I'm 45 now and at this age, sleep is the most valuable commodity I own, and I guard it accordingly. And when I do manage to wake up fresh, I don't waste it. So, every morning, I do my routine and walk to my computer with a cup of coffee, open the last PR, read the review comments from the day before, fix what needs fixing, and close the loop. Yes, I ask Copilot to fix it for me, I am not silly. I then review him, his buddy reviews him, I review the buddy with Copilot and this is how we roll. I like planning and I do that a lot. Therefore, before writing a single line of new code, I review, clean, document, and plan. Which might sound like boring maintenance, it is however the most valuable part of my day. It is the thing that keeps the muscle sharp and the codebase honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  One morning, one pull request
&lt;/h2&gt;

&lt;p&gt;On this particular morning, my ritual led somewhere interesting. The PR number 33 in my private portfolio repo had been done but not yet merged the night before, after a decent amount od first-round reviewing. Then, overnight, the GitHub Copilot PR reviewer (the one on the actual Github website) had left three extra comments I have not acted on yet after the final fix commit. I suppose, because I clicked the "Request review" button again for some reason. These new comments were in fact so good I was happy I purchased the Copilot subscription, even though I may suffer from hangover, when the bill comes. Could it be that it is also the fact that it is not cheap, the reason why I am even more motivated to use the tool in its fullest. To think of it, maybe a little, but to be very honest, I simply love how Good Github is and has become. It does make boring tasks super fun,exiting. It hits all the right dopamine spots of a developer such as I am.&lt;/p&gt;

&lt;p&gt;So I acted on them - I took those post PR merge comments seriously. Even though this particular repo is private and I am the only developoer in it, so nobody is watching but me. The way how I am wired, I strongly believe that no time spent on code review is time lost. I also firmly believe code reviews are indeed an investment in my own future, money or no money involved. And they should be yours too.&lt;/p&gt;

&lt;p&gt;I even had a good night sleep the previous night, so I had no excuses. I therefore opened a new Copilot chat session in VS Code and asked the question that had been sitting in the back of my mind since the night before:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I need you to review your buddy at Github and look at the review comments for PR #33 in my private portfolio repo. Tell me what do you think about them and what would you do if you were the one to act on them. Would you do the fixes as per suggestions or would you do something even better? I'm also interested in knowing why was Copilot on GitHub website able to find things but you missed them while writing the code. I thought you had the same power, capability, and context."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last statement I wrote ("I thought you had the same power, capability, context") opened the whole conversation up and the answer I got back was one of the most useful explanations I've received about how these tools actually work in practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The 9 comments split into two rounds and all nine were correct. None were nitpicks. Would I have done the same? Better? Honestly, I would have done same or equivalent on the code-level bugs. But here's the real answer to your question about why the GitHub PR reviewer found them and I didn't: &lt;br&gt;
The GitHub Copilot PR reviewer has a fundamentally different activation model. Here's the simplest way to picture it: you open VS Code chat and ask me about one file. I respond to that file. The PR reviewer is invoked once on the full diff and must find every issue across the entire change set, without being prompted. It scans the entire diff in one shot — 89–99 changed files simultaneously — and its job is specifically "find all problems across this entire change set.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The output is as good as the input was
&lt;/h2&gt;

&lt;p&gt;The PR reviewer on Github is a completeness tool. It scans the full diff and finds things you didn't know to look for. The VS Code Copilot however is a depth tool. It goes as deep as you direct it, on exactly what you show it. Both are the same model but they do different jobs, and produce different results. Once you understand the distinction, you then stop expecting one to replace the other and start using both deliberately.&lt;/p&gt;

&lt;p&gt;That's the thing nobody told me when I started working with AI coding tools: the output quality is mostly a function of how you activate them. Directed conversation gives you depth and a full-diff review gives you breadth. And you do need both, because neither substitutes for the other.&lt;/p&gt;

&lt;p&gt;Or in other words, you can give the instruction (the input) in just a few words, or you can spend a bit more time to think of more detailed instructions and write a paragraph. You can and should be doing both and both will give you different results, but both results are equally important. Simple when you think of it, right?&lt;/p&gt;

&lt;p&gt;But it isn't. Because you need time, patience, motivation and devotion to do that. I've been doing this for twenty years, and the fact is I'm still learning how to use the tools. And I'd like to believe that's not a failure but it's the job. Because the day you stop discovering how something works is the day you start declining. Ask any "tradie", they will likely all tell you the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the cost
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot Premium+ isn't cheap and I have just discovered a few days ago that they've just announced a shift to a consumption-based model, which, based on how I use it, I'm not expecting it to get any cheaper.&lt;/p&gt;

&lt;p&gt;So is it worth the money? Yes! And here's is why in my example.&lt;/p&gt;

&lt;p&gt;In my case several real bugs and accuracy issues were caught in a single PR pass. Out these, at least two were production-risk issues. They were the kind of defects that don't show up in unit tests and aren't obvious in a code walkthrough. This specific one - the "process.env dynamic-key" issue would have caused a runtime crash in the browser on certain Next.js builds; the regex portability hole would have silently failed on Windows only, the worst kind of bug to diagnose. I would had absolutely no idea until too late.&lt;/p&gt;

&lt;p&gt;So, I am confident each fix saved me hours if not days of production debugging. These hidden mistakes are the kind that survive code review in a team, let alone when you're the only reviewer.&lt;/p&gt;

&lt;p&gt;Because as sad as it may sound, I'm a solo developer at the moment and I have no team, no tech lead, no senior to glance over my shoulder and say "that regex won't work on Windows." There's just me, the codebase, and the tools I've assembled to approximate a professional environment, so that when my time comes again, I am ready.&lt;/p&gt;

&lt;p&gt;So like in a sci-fi movie, Copilot is indeed for me personally the closest thing I have to a senior code reviewer at the moment. That is someone who reads every PR, never gets tired, and flags when a comment contradicts the implementation. It's not infallible though, it will make mistakes, of course, as it does miss things a human would catch from institutional, maybe architectural knowledge, and it can be wrong about intent. However, for breadth of coverage on a solo projects like the one I am working on now, nothing else comes even close. This great tool saves me days, not just hours, so, yes, that's a reasonable investment and I am not saying this lightly. I say this in a period when I have arguments with my wife regarding how we will spread the costs and ration food for the month. At least this is what I tell my wife about Copilot being a justifiable cost when it's time to pay the bills.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;FUN FACT&lt;/strong&gt; If you are reading this part of the article, then you're an absolute legend! It means there's a chance you might have actually read it in full. For this reason, I want you to at least have some fun with this story and I want to share the following anecdote with you. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  I must be AI
&lt;/h2&gt;

&lt;p&gt;Since we're speaking about AI reviewers, here's a funny one about the GPTZero AI reviewer.  &lt;/p&gt;

&lt;p&gt;I write articles on my own, relying heavily on spell checkers and AI detectors. I do not hide it and I am not afraid to admit it.I also hate being judged as lazy, when I know I'm not. A recent case of a man unjustly losing his degree in shame over this issue still bothers me. I believe I mentioned it in a previous article. In my particular case, I spent days before I was happy with what I wrote. I wanted it to be mine, even if it seemed like a rant or tangent. So I tested my work with GPTZero. Here's the score.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hatk4vpm0408qxfrilh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hatk4vpm0408qxfrilh.jpg" alt=" " width="492" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As almost everything was ok and it looked human (green), I ran the GPTZero scan again. And guess what?! The above paragraph (starting with "So like in a movie sci-fi movie") was deemed fully AI! I was in shock and horror! So, I left it. As is. Whatever! Because despite the fact I worked so hard on it, GPT Zero kept highlighting it all yellow and I leave it to you, dear reader, to figure out why in the world would anyone or any tool think the sentences above are AI. I was about to change it as per suggestion, but went: "Yeah, nah!" and just decided to leave it there, just for fun. Because the reason why some text gets flagged as AI makes you want to either laugh or cry and this time I was baffled.&lt;/p&gt;

&lt;p&gt;But, since this is indeed a bit of a tangent, let's conclude today's Github topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;If anything, what should we remember?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Github contribution graph is biased towards enterprise work, sorry.&lt;/li&gt;
&lt;li&gt;Contributions made in private org repos will disappear once you are no longer part of the project - in other words, twenty years of Azure DevOps commits will produce zero green squares.&lt;/li&gt;
&lt;li&gt;The way how I decided to fight this is to build open-source. Public packages and repos, discipline, planning and morning rituals that close the loop on review comments. It's like going to the gym every day. The effort compounds, unlike the graph. I wish I went to the gym more often too.&lt;/li&gt;
&lt;li&gt;Code review is my daily discipline and GitHub is really great at it. Every morning I try to review first, then build. This keeps my brain muscle sharp and the codebase good.&lt;/li&gt;
&lt;li&gt;GitHub Copilot in VS Code IDE and the GitHub PR reviewer are the same model activated differently. Depth versus breadth, so, know which one you need, then use it on purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, my fixes in the branch are up and the three files are clean and likely none of what I described was glamorous, but that's what a good morning looks to me - another green square earned today. &lt;/p&gt;

&lt;p&gt;Can't wait to get the next one tomorrow. Who knows, maybe one day my green patches will no longer be just patches, but pastures.&lt;/p&gt;

&lt;p&gt;If you came this far in the article, maybe I did something good after all and for that I say thank you. Let me know in the comments if that's the case, it would make my day. And if you're in the same position as I am, I'd love to hear from you and how you are dealing with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My open source repos (still in beta)
&lt;/h2&gt;

&lt;p&gt;As of time of writing this it may not be much yet, but it will be. I would really love it if you would want to contribute or give me any feedback. No feedback is bad feedback.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/AlexRebula/giselle-mui" rel="noopener noreferrer"&gt;https://github.com/AlexRebula/giselle-mui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AlexRebula/giselle-ui" rel="noopener noreferrer"&gt;https://github.com/AlexRebula/giselle-ui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AlexRebula/giselle-sections-sdk" rel="noopener noreferrer"&gt;https://github.com/AlexRebula/giselle-sections-sdk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Portfolio website
&lt;/h2&gt;

&lt;p&gt;Coming soon.&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Ethics of AI-Assisted Work: What the Professional Codes Actually Say</title>
      <dc:creator>Alex Rebula</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:53:46 +0000</pubDate>
      <link>https://forem.com/alexrebula/the-ethics-of-ai-assisted-work-what-the-professional-codes-actually-say-35dd</link>
      <guid>https://forem.com/alexrebula/the-ethics-of-ai-assisted-work-what-the-professional-codes-actually-say-35dd</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is Part 2&lt;/strong&gt; of my series on AI in professional work.&lt;br&gt;
&lt;a href="https://dev.to/alexrebula/i-used-ai-for-90-of-my-portfolio-website-am-i-cheating-10dm"&gt;Read Part 1 → I Used AI for 90% of my Portfolio Website — Am I Cheating?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you read this article, you'll notice the em dash ( — ) appearing. I'm aware of it, and we'll address that later. But ask yourself: What does a punctuation mark once known only to real writers tell you today versus what it meant in the past?&lt;/p&gt;

&lt;p&gt;I'm back on the job market, updating my portfolio, writing posts, networking, and staying on top of industry developments. This time I'm approaching it more deliberately, treating the process like a researcher. I want to examine things properly, write about it, and cite sources, examples, not just assert facts and give advice that anyone can copy from an AI model conversation and paste on LinkedIn.&lt;/p&gt;

&lt;p&gt;Every conversation loops back to AI. Articles everywhere tell you that "AI will replace you", "AI is a cheat code", "AI users are lazy", "AI users are the future". Everyone has a strong opinion.&lt;/p&gt;

&lt;p&gt;I've seen developers and writers get frustrated with people who use AI heavily but don't make it their own. I get that frustration. I've seen the kind of output they're complaining about — generic, polished, completely interchangeable, with almost no real human voice left in it.&lt;/p&gt;

&lt;p&gt;The problem isn't AI. The stone in the shoe for many of us is the misuse of a powerful tool. Any tool can be used well, even the worst one. The same way any screwdriver can open a bottle of beer, the same way any pair of scissors can cut a finger. AI is no different. Here's another example. Try asking AI to print a Slovenian famous "jota" (pronounced roughly "YOTA") cabbage and beans soup. I can assure you with 100% accuracy that other than getting a perfect recipe, you will stay hungry. Unless you put your apron on and really start cooking.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Worked For Centuries, So Why Fix It Now?
&lt;/h2&gt;

&lt;p&gt;It is not that the em dash should not be used, it should! It is beautiful! It served a purpose for centuries and it still does in books, but in today's AI world it is a visual tell, and sometimes even a first impression, as sad as this may sound. &lt;/p&gt;

&lt;p&gt;In case you want to know, the em dash is named after the width of a capital M in a typeface and has been used in English writing for centuries to show interruptions or asides. The only thing is, no one, except professional copywriters, ever used it. And now, suddenly everyone is Shakespeare. The issue is that LLMs are trained mostly on formal writing – essays, journalism, books – so they love throwing in em dashes. &lt;/p&gt;

&lt;p&gt;I personally find them very useful and feel they SHOULD be a standard in any text. I am curious what the writers have to say about this.&lt;/p&gt;

&lt;h2&gt;
  
  
  But, I'm Not A Writer
&lt;/h2&gt;

&lt;p&gt;A colleague once asked if I'd used AI on a document I prepared for a client. &lt;/p&gt;

&lt;p&gt;I said &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Yes, of course! Why?". &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He said, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I could tell straight away. Not because of the em dashes, but because you used American English instead Australian." &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's just say  felt like the Homer Simpson meme. The client was a big Australian company. &lt;/p&gt;

&lt;p&gt;What happened? The model just defaulted to American English because most of its training data is American. I'm a Slovenian living in Australia, writing for Australian clients and readers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Do IEEE and ACM Actually Require?
&lt;/h2&gt;

&lt;p&gt;The IEEE Software Engineering Code of Ethics and the ACM Code of Ethics are comprised of obligations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obligation #1:&lt;/strong&gt; Do you understand what you're producing? If you can't explain it, that's a problem, regardless of how you built it. You shouldn't claim expertise or authorship if you don't actually have it, and you own your output, full stop. Whatever ends up in production with your name on it is yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obligation #2:&lt;/strong&gt; You have to disclose AI use in published work and name the tool you used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obligation #3:&lt;/strong&gt; AI can't be listed as an author; you have to disclose when you used it, and the humans involved are fully responsible for what gets published.&lt;/p&gt;

&lt;p&gt;None of these policies prohibit AI use but both require disclosure and accountability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure: Tools Used for This Article
&lt;/h2&gt;

&lt;p&gt;Because I just spent the last few paragraphs talking about professional obligations around disclosure, I’m going to practise what I preach.&lt;/p&gt;

&lt;p&gt;I wrote every single idea, opinion, story, and personal reflection in this article myself. The core content — the em dash observation, the jota soup analogy above, the stories below - the "šlepar" story from university, , the CodeProject funeral, the Andy Serkis analogy, and all the feelings around being accused of cheating — are 100% mine. They came from my own experience and thinking.&lt;/p&gt;

&lt;p&gt;I did, however, use AI assistance (Grok) for two very specific things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helping me condense the original 2000+ word messy draft into a tighter, more readable version while keeping every idea and every one of my own words.&lt;/li&gt;
&lt;li&gt;Light structural feedback and suggestions on flow and order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did &lt;strong&gt;not&lt;/strong&gt; ask the AI to generate any new ideas, rewrite my stories, or polish my voice. I reviewed every change and kept full ownership of the final text.&lt;/p&gt;

&lt;p&gt;I believe this is the right balance — using the tool for what it’s good at (speed and structure) while staying the one who owns the thinking, the stories, and the final decisions.&lt;/p&gt;

&lt;p&gt;But my story is absolutely NOTHING compared to &lt;a href="https://www.mprnews.org/story/2025/01/17/phd-student-says-university-of-minnesota-expelled-him-over-ai-allegation" rel="noopener noreferrer"&gt;this guy's story&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's a Gollum Hiding in My Article
&lt;/h2&gt;

&lt;p&gt;I recently saw Andy Serkis doing the audition for the Lord of the Rings. Seriously? Andy Serkis needs an audition for a job? This analogy can be translated into engineering – every good and experienced engineer will eventually be humbled on a tough interview, no matter his portfolio and experience.&lt;/p&gt;

&lt;p&gt;I always try to stay grounded with the knowledge that no matter what, I never know everything, and there is always someone above me that will easily destroy me on an interview with more knowledge, experience, and intelligence.&lt;/p&gt;

&lt;p&gt;Therefore, I would be terrified going on an interview, not knowing what my code does when questioned. This would destroy my self-worth, my ego, and my reputation. I'm okay not knowing things, but I'm not okay going on an interview and not knowing what my code does and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Cheat" at The University &amp;amp; Serena Williams
&lt;/h2&gt;

&lt;p&gt;In Slovenian, we use the word "šlepar" (pronounced roughly "SHLEH-par"), which describes a person who fakes competence – someone who pretends they know the material and have prepared properly while secretly relying on cheat sheets or hidden notes to pass the exam. In short, it describes a cheat.&lt;/p&gt;

&lt;p&gt;Even when I was still at the university, a professor once accused me to my face of being a cheat during an exam. With no evidence. Just on a hunch. I was upset and justifiably so. Not because I failed that test, but because I am not a cheat, let alone there was no proof or real indication of that. I don't have issues with authority and I always loved my mat teacher from high school, despite the fact that I struggled with math at that time. &lt;/p&gt;

&lt;p&gt;I can still hear Serena Williams' voice clearly: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I have never cheated in my life. I have a daughter, and I stand for what's right for her. I have never cheated."&lt;/em&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly the same how I felt at that exam "incident", and I still feel like that if I think about it - the shame, the frustration, the loss of reputation in front of a professor. &lt;/p&gt;

&lt;p&gt;The differences between Serena and me are just immense -&amp;gt; Serena is a wonderful athlete and I am not. Also, she has a daughter and I have a son. &lt;/p&gt;

&lt;p&gt;For all these reasons, I stand by the principle that whether you can explain it now, without documentation, under direct questioning or not, makes the difference between an honest person and a cheat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vibe Coding - Brrrrr... :)
&lt;/h2&gt;

&lt;p&gt;I do allow myself to "vibe code" for things I don't know much about (YET) - example - devops. This allows me a great, effective, fast learning opportunity for things it would take me forever to learn back in the days when there was no AI other than in The Terminator movies - but I always and always want to know what the code does and I want it to be documented - Not just pressing the accept button and then no review. At least press that button, but review it after. I know, I know, in a perfect world, you should never push your code before it is perfect, but at least, while you're learning and working on professional code, you are allowed to make mistakes that will make you a better professional at work, when it really conunts.&lt;/p&gt;

&lt;p&gt;For things I know, making the code with AI is a breeze – I can review quickly and ask AI to review specific things because I know them.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can you explain your codebase to a junior developer without documentation in front of you?"&lt;/p&gt;

&lt;p&gt;Can you defend the decision in your codebase in an interview?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Personal Voice Is a Professional Signal
&lt;/h2&gt;

&lt;p&gt;Recruiters can usually tell when a portfolio is AI-drafted. The rhythm and structure are the same, nothing that could only have come from one person.&lt;/p&gt;

&lt;p&gt;The ones I remember are the ones where something clearly happened to a real person.&lt;/p&gt;

&lt;p&gt;AI is good at structure, at mocking, at explaining, at finding needles in a haystack. But it doesn't have your experience, it doesn't see the full context of the app architecture without your expert explanation and putting everything in proper perspective.&lt;/p&gt;

&lt;p&gt;Only when this is done, AI will help you. I've learned this the hard way - I lost my job because of AI, and I'm going to get a new one with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Emerging Problem: Article Fatigue
&lt;/h2&gt;

&lt;p&gt;Everyone writes now. Publishing used to require effort, time, and skill. That barrier is basically gone. The volume has exploded, and the average quality has dropped. Readers are fatigued. Nobody believes the text is yours.&lt;/p&gt;

&lt;p&gt;Do you remember CodeProject? Here's a reminder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgwlaz99mtsihpgr60b9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgwlaz99mtsihpgr60b9.jpg" alt=" " width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do, you're probably around my age, in your 40s and 50s. It launched in 1999 and was THE blogging place. At its peak, it had 15 million registered members. The articles on the site were long and properly structured. Source code was included. Design decisions were explained. It went offline in March 2026. Not because the content was bad. The financial model just collapsed. There wasn't enough attention to go around, and there was too much free content everywhere. It died right as the flood of low-effort AI content peaked. I find that depressing.&lt;/p&gt;

&lt;p&gt;The only thing that actually cuts through now is specificity. A post that could only have come from one person, about one specific situation, from a perspective nobody else has.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Know what you're shipping, own the output, and don't claim things that aren't true. AI just makes all three easier to get lazy about.&lt;/p&gt;

&lt;p&gt;The engineers I've seen use it well are the ones who stay close enough to the work that they're still making the calls.&lt;/p&gt;

&lt;p&gt;If you're reading something and trying to figure out if it's worth your time, stop worrying about AI involvement. Check if there's a real person behind it. Is there something specific? Is there a specific opinion, something that could only have come from one person's situation?&lt;/p&gt;

&lt;p&gt;That's what matters. The tool used is irrelevant, your ethics are not.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[1] CodeProject — Wikipedia... (accessed 23 April 2026)&lt;br&gt;
[2] IEEE Author Center. Guidelines for Artificial Intelligence (AI)-Generated Text...&lt;br&gt;
[3] ACM. ACM Policy on Authorship...&lt;br&gt;
[4] IEEE Computer Society. Software Engineering Code of Ethics...&lt;br&gt;
[7] Rebula, A. I Used AI for 90% of My Portfolio Website — Am I Cheating? DEV Community, 23 April 2026.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Used AI for 90% of my Portfolio Website — Am I Cheating?</title>
      <dc:creator>Alex Rebula</dc:creator>
      <pubDate>Sun, 19 Apr 2026 06:36:49 +0000</pubDate>
      <link>https://forem.com/alexrebula/i-used-ai-for-90-of-my-portfolio-website-am-i-cheating-10dm</link>
      <guid>https://forem.com/alexrebula/i-used-ai-for-90-of-my-portfolio-website-am-i-cheating-10dm</guid>
      <description>&lt;p&gt;I am currently building my new portfolio site with extremely heavy use of AI (Claude + Copilot). Probably around 90% of the code, documentation, tests, and even some of the architectural thinking have been accelerated or directly generated by AI tools.&lt;/p&gt;

&lt;p&gt;And I’m completely fine with that — the same way I am completely fine pasting my own ideas, sweat and experience into a prompt in bullet points and thoroughly revising the result before publishing the article like in this case. As times change, tools change, and people should move with them and add human value to the ever-improving toolset.&lt;/p&gt;

&lt;p&gt;But the question still comes up (both from others and occasionally from myself): "Am I cheating?"&lt;/p&gt;

&lt;h2&gt;
  
  
  My Honest Answer
&lt;/h2&gt;

&lt;p&gt;No, I’m not cheating.&lt;/p&gt;

&lt;p&gt;I use AI aggressively for speed, but I follow a deliberate, systematic process to stay in full control and maintain ownership of the code.&lt;/p&gt;

&lt;p&gt;Every generated piece goes through structured review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I maintain detailed TODO lists in Markdown files for every major section and component.&lt;/li&gt;
&lt;li&gt;I write tests (Vitest) for critical data factories and components.&lt;/li&gt;
&lt;li&gt;I force myself to understand and be able to explain every function and major decision.&lt;/li&gt;
&lt;li&gt;I regularly push back on AI suggestions that feel off, overly clever, or not aligned with existing codebase patterns.&lt;/li&gt;
&lt;li&gt;I treat AI output as a strong first draft — never the final product.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This review discipline is something I’m actually proud of. It’s how I make sure the massive speed AI gives me doesn’t come at the cost of depth or long-term maintainability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Does AI Really Help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Boilerplate&lt;/strong&gt; → It removes boring boilerplate and lets me move extremely fast.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New learning discoveries&lt;/strong&gt; → It surfaces patterns and solutions I might not have considered immediately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt; → It helps me maintain consistency across a large number of components and even documentation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick note about code documentation though — I personally do not care if a documentation is written with AI or not, as long as it helps and as long as it is well written. I really don't. An article may not belong in this same category, depending on the premise, but as far as documentation concerns, I am totally fine with using AI. In other words, if you produce great documentation and you used AI for that, I can only say thank you!&lt;/p&gt;

&lt;h2&gt;
  
  
  A Concrete Example From My Own Project
&lt;/h2&gt;

&lt;p&gt;When I asked the AI to silence Iconify’s “icon loaded online” warnings, it suggested importing large JSON packages (&lt;code&gt;@iconify-json/solar&lt;/code&gt;, &lt;code&gt;@iconify-json/logos&lt;/code&gt;, &lt;code&gt;@iconify-json/simple-icons&lt;/code&gt;) and writing a &lt;code&gt;pickIcons()&lt;/code&gt; helper. It compiled and the warnings disappeared — technically “correct.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before — what AI suggested:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// icon-sets.extra.ts (AI version)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;icons&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;logosIcons&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@iconify-json/logos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;icons&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;solarIcons&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@iconify-json/solar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pickIcons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IconifyJSON&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="nx"&gt;IconifyJSON&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]]))&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;addCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pickIcons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;logosIcons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;angular-icon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]));&lt;/span&gt;
&lt;span class="nf"&gt;addCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pickIcons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;solarIcons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;code-bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;settings-bold&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]));&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This however, was the wrong solution.&lt;/p&gt;

&lt;p&gt;The codebase I used already had a clean and established pattern in icon-sets.minimals.ts: inline SVG strings, no extra package imports, explicit width/height control. Copilot / Claude didn’t see or follow that pattern — it reached for the general Iconify documentation approach instead of reading the existing code first.&lt;/p&gt;

&lt;p&gt;I caught it though. I pushed back, and we rewrote it together properly: no heavy imports, only the exact icons we use, explicit dimensions, and clear comments explaining the rules for anyone who adds icons later.&lt;/p&gt;

&lt;p&gt;After — the correct pattern already in the codebase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// icon-sets.extra.ts (correct version)&lt;/span&gt;
&lt;span class="c1"&gt;// Rule: inline SVG body only. For logos: collection, always include explicit width + height&lt;/span&gt;
&lt;span class="c1"&gt;// because register-icons.ts forces the collection default to 24×24, which clips non-square paths.&lt;/span&gt;
&lt;span class="nf"&gt;addCollection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;logos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;angular-icon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;271&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;path fill="#E23237" d="M0 134.5L11.5 ..." /&amp;gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// ... one entry per icon, exactly the ones we use&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI's version: ~18 MB of JSON. The correct version: ~75 KB of inline strings. &lt;strong&gt;247× smaller&lt;/strong&gt; — and it follows the pattern that was already there.&lt;/p&gt;

&lt;p&gt;This is exactly why the review process exists.&lt;/p&gt;

&lt;p&gt;Here’s the actual difference:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Raw size&lt;/th&gt;
&lt;th&gt;Icons available&lt;/th&gt;
&lt;th&gt;Icons we actually use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@iconify-json/solar&lt;/td&gt;
&lt;td&gt;6.3 MB&lt;/td&gt;
&lt;td&gt;7,404&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@iconify-json/logos&lt;/td&gt;
&lt;td&gt;7.3 MB&lt;/td&gt;
&lt;td&gt;2,091&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@iconify-json/simple-icons&lt;/td&gt;
&lt;td&gt;4.6 MB&lt;/td&gt;
&lt;td&gt;3,693&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18.2 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13,188&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;118&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The correct approach used 118 inline SVG strings across two registration files, which only weighs around 75 KB total. And that my friends is an oustanding 247× difference in payload. And that's not a small number.&lt;/p&gt;

&lt;p&gt;Another issue Claude pointed out to me after my aditional analysis was a defect hiding in the AI’s "lazy" approach: logos icons had a 256×256 viewBox, but register-icons.ts forced all non-carbon collections to default to 24×24. Basically, what happened was, that the pickIcons() approach copied only body and dropped the metadata, so icons like logos:typescript-icon would have silently rendered with the wrong dimensions at any non-standard render size.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Audit Proved My Point
&lt;/h2&gt;

&lt;p&gt;When the inline SVG pattern was correct, I still continued with my questions and asked the AI to audit the codebase and re-confirm every icon was registered. Just to be on the safe side.&lt;/p&gt;

&lt;p&gt;A second scan revealed the real usage: 105 solar icons (not 4). It had also missed 5 logos icons because they were stored as string values in TypeScript data objects rather than JSX props.&lt;/p&gt;

&lt;p&gt;So I went further and asked AI to handle both patterns (JSX attributes + string literals) with a whitelist of known Iconify prefixes. The 5 missing icons were finally added, the tests now pass against the correct 118-icon count, and the site is better for it.&lt;/p&gt;

&lt;p&gt;And I like to believe this is exactly the kind of thing a senior developer catches that AI alone misses. Maybe you don’t even need to be a senior developer for that — just one that cares.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Rules for This Project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI is allowed to draft, but I must review, understand, and be able to defend every important piece.&lt;/li&gt;
&lt;li&gt;Critical parts (like the sections-api data layer) get extra scrutiny and manual refinement.&lt;/li&gt;
&lt;li&gt;I will eventually go through the entire codebase and make sure I can explain every function and design decision without referring back to the AI conversation.&lt;/li&gt;
&lt;li&gt;When AI produces a wrong pattern and I correct it, I write a regression test so the mistake can never happen again.&lt;/li&gt;
&lt;li&gt;This portfolio is my test project: use AI aggressively to ship fast, but then do the deeper work to truly own the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Disclosure: Tools Used for This Article
&lt;/h2&gt;

&lt;p&gt;Because I talk a lot in this post about staying in full control and owning the work, I want to be transparent here too.&lt;/p&gt;

&lt;p&gt;I wrote every single idea, story, example, and opinion in this article myself. The Iconify story, the audit experience, my rules, and all the feelings around “Am I cheating?” are 100% mine.&lt;/p&gt;

&lt;p&gt;I did use AI assistance (Claude + Copilot) while writing and refining this post itself — mainly for light structural suggestions, tightening some paragraphs, and improving flow. I reviewed every change and kept full ownership of the final text.&lt;/p&gt;

&lt;p&gt;This is the same approach I use in the actual codebase: AI helps me move faster, but I stay the one who understands, reviews, and takes responsibility for everything that ships.&lt;/p&gt;

&lt;p&gt;I believe this is the honest and professional way to do it.&lt;br&gt;
I’m not ashamed of using AI heavily. I’m actually quite proud of the system I built around it to make sure I stay a better engineer, not a worse one.&lt;/p&gt;

&lt;p&gt;The goal isn’t to write every line myself. The goal is to ship high-quality work while keeping my skills and understanding sharp.&lt;/p&gt;

&lt;p&gt;That’s the balance I’m aiming for.&lt;/p&gt;




&lt;p&gt;What about you? Have you found yourself above? Have you built something similar with heavy AI use you can talk about? Is so, please, do drop your experience in the comments, it will make me hapy and I do respond.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
