<?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: Tiziano Basile</title>
    <description>The latest articles on Forem by Tiziano Basile (@basteez).</description>
    <link>https://forem.com/basteez</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%2F77918%2Ffed72e92-c80b-4055-b7de-883ae35abb91.png</url>
      <title>Forem: Tiziano Basile</title>
      <link>https://forem.com/basteez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/basteez"/>
    <language>en</language>
    <item>
      <title>How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality</title>
      <dc:creator>Tiziano Basile</dc:creator>
      <pubDate>Fri, 17 Apr 2026 17:35:03 +0000</pubDate>
      <link>https://forem.com/basteez/how-to-use-sonarqube-and-sonarscanner-locally-to-level-up-your-code-quality-4087</link>
      <guid>https://forem.com/basteez/how-to-use-sonarqube-and-sonarscanner-locally-to-level-up-your-code-quality-4087</guid>
      <description>&lt;p&gt;Code quality tools can make a huge difference in improving your coding skills by helping you identify code smells, bugs, and potential vulnerabilities. &lt;/p&gt;

&lt;p&gt;In this guide, we’ll explore how to set up &lt;strong&gt;SonarQube&lt;/strong&gt; and &lt;strong&gt;SonarScanner&lt;/strong&gt; locally. This allows you to analyze your code for potential improvements right on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting Up SonarQube with Docker
&lt;/h2&gt;

&lt;p&gt;First, ensure you have Docker installed. With Docker, getting SonarQube up and running is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pull the SonarQube image&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker pull sonarqube&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run SonarQube&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command runs SonarQube in the background, mapping port &lt;code&gt;9000&lt;/code&gt; (for the SonarQube web interface) and &lt;code&gt;9092&lt;/code&gt; (optional).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Accessing SonarQube
&lt;/h2&gt;

&lt;p&gt;With SonarQube running, open your browser and go to &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt;. Enter the default credentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once logged in, you will be prompted to change the default password.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Generate an Authentication Token
&lt;/h2&gt;

&lt;p&gt;To allow SonarScanner to connect to SonarQube, you need to create an authentication token.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;A&lt;/strong&gt; icon in the top-right corner and select &lt;strong&gt;My Account&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Security&lt;/strong&gt; tab and click &lt;strong&gt;Generate a token&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name your token (it can be user-specific or global) and save it somewhere secure, as it will only be displayed once.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 4: Configure &lt;code&gt;sonar-project.properties&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Next, set up a configuration file to define key project properties SonarQube will use to analyze your code. In the root directory of your project, create a file named &lt;code&gt;sonar-project.properties&lt;/code&gt; and add the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;sonar.projectKey=my:project&lt;/span&gt; &lt;span class="c1"&gt;# Must be unique &lt;/span&gt;
&lt;span class="s"&gt;sonar.projectName=my project name&lt;/span&gt; 
&lt;span class="s"&gt;sonar.projectVersion=1.0 sonar.sources=src/main/java&lt;/span&gt; &lt;span class="c1"&gt;# Adjust based on your source directory &lt;/span&gt;
&lt;span class="s"&gt;sonar.java.binaries=target/classes&lt;/span&gt;  &lt;span class="c1"&gt;# Adjust based on your compiled classes &lt;/span&gt;
&lt;span class="s"&gt;sonar.tests=src/test/java&lt;/span&gt; &lt;span class="c1"&gt;# Adjust based on your test directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration file tells SonarQube about the structure and setup of your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Run SonarScanner
&lt;/h2&gt;

&lt;p&gt;With everything set up, it’s time to analyze your project. Open a terminal at the root of your project and execute the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
mvn dependency:copy-dependencies &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
docker run &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--network&lt;/span&gt; host &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;SONAR_HOST_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://{YOUR LOCAL IP}:9000"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;SONAR_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{YOUR SONARQUBE TOKEN}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:/usr/src"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    sonarsource/sonar-scanner-cli

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

&lt;/div&gt;



&lt;p&gt;This command does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleans and builds your project using Maven (&lt;code&gt;mvn clean install&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Copies dependencies needed for analysis.&lt;/li&gt;
&lt;li&gt;Runs SonarScanner in a Docker container and connects it to your local SonarQube instance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replace &lt;code&gt;{YOUR LOCAL IP}&lt;/code&gt; with your machine’s local IP address and &lt;code&gt;{YOUR SONARQUBE TOKEN}&lt;/code&gt; with the token you generated in Step 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Review the Analysis Results in SonarQube
&lt;/h2&gt;

&lt;p&gt;Once SonarScanner completes its run, return to &lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt; and navigate to your project dashboard. Here, you’ll see a detailed report on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code smells&lt;/strong&gt;: Areas of the codebase that could benefit from refactoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bugs&lt;/strong&gt;: Logical errors or anomalies in the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulnerabilities&lt;/strong&gt;: Security-related issues.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Setting up SonarQube and SonarScanner locally allows you to take your code quality analysis into your own hands. Regularly reviewing these reports can help you develop better habits, improve your understanding of code quality principles, and ultimately level up your coding skills.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>sonarqube</category>
    </item>
    <item>
      <title>Don't be mad, BMAD instead</title>
      <dc:creator>Tiziano Basile</dc:creator>
      <pubDate>Fri, 17 Apr 2026 10:06:47 +0000</pubDate>
      <link>https://forem.com/basteez/dont-be-mad-bmad-instead-3d4i</link>
      <guid>https://forem.com/basteez/dont-be-mad-bmad-instead-3d4i</guid>
      <description>&lt;p&gt;A few weeks ago I wrote about the tension I felt using AI coding tools, the fear that by outsourcing the friction, I was also outsourcing my competence. That piece ended with a question: are you extending yourself, or outsourcing yourself?&lt;/p&gt;

&lt;p&gt;I didn't have a clean answer then. I still don't have a universal one. But I found something that changed how I think about the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The grave I thought I was digging
&lt;/h2&gt;

&lt;p&gt;When a colleague first mentioned BMAD, my reaction was skepticism dressed as caution. Another AI framework. Another promise that the machine will handle it. My concern wasn't that it wouldn't work, it was that it would work too well, and I'd wake up one day having forgotten how to build things myself.&lt;/p&gt;

&lt;p&gt;That fear isn't irrational. I've seen what happens when you reach for autocomplete before you've finished the thought. You produce, but you don't learn. The output looks fine, but the map never forms. You become dependent on a system you can't fully reason about, and every time you hit a similar problem, you prompt again instead of drawing from understanding.&lt;/p&gt;

&lt;p&gt;So when someone told me "try this method where AI agents play different roles," I heard: more ways to stop thinking. More automation. More distance between me and the craft I'd spent years developing.&lt;/p&gt;

&lt;p&gt;I was wrong. But it took some hands-on experimentation to see why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with vibe coding
&lt;/h2&gt;

&lt;p&gt;Before I explain what BMAD does differently, let me describe what it's pushing against.&lt;/p&gt;

&lt;p&gt;There's a pattern that's become disturbingly common, often celebrated even, that I'll call "vibe coding." It goes like this: you have a rough idea of what you want to build. You open your editor, write a prompt, and let the AI generate something. If it looks mostly right, you keep it. If it doesn't work, you prompt again with a correction. You iterate like this, adjusting and regenerating, until the output seems functional.&lt;/p&gt;

&lt;p&gt;I've always hated this approach. It treats software development like a slot machine: pull the lever, see what comes out, try again if you don't like it.&lt;/p&gt;

&lt;p&gt;But here's what's actually happening: you're making decisions without articulating them. You're accepting code without fully understanding it. You're building something that works (maybe) without building a mental model of why it works. The AI is filling in gaps you never consciously identified, which means you can't evaluate whether it filled them correctly.&lt;/p&gt;

&lt;p&gt;Vibe coding optimizes for output. It feels efficient in the moment. But it produces fragile results, because no one (not you, not the AI) ever defined what "correct" actually means. When something breaks later, you're debugging a system you never fully understood in the first place.&lt;/p&gt;

&lt;p&gt;This isn't a problem with AI. It's a problem with how we use it. And it's the problem that spec-driven development solves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What spec-driven development actually means
&lt;/h2&gt;

&lt;p&gt;If you haven't encountered the term before, spec-driven development is exactly what it sounds like: you write the specification before you write the code.&lt;/p&gt;

&lt;p&gt;That might seem obvious. "Of course you should know what you're building before you build it." But there's a difference between having a vague idea in your head and having a written document that defines requirements, constraints, acceptance criteria, and architectural decisions.&lt;/p&gt;

&lt;p&gt;The spec isn't just documentation. It's a thinking tool. The act of writing it forces you to confront questions you might otherwise skip: What exactly is this feature supposed to do? What happens at the edges? How does this component interact with that one? What does "done" look like?&lt;/p&gt;

&lt;p&gt;When you answer these questions upfront, implementation becomes a translation exercise. You're not discovering the requirements as you code. You're executing a plan you've already validated. The code follows from decisions you consciously made, not from guesses the AI filled in for you.&lt;/p&gt;

&lt;p&gt;This is the opposite of vibe coding. Instead of iterating toward something that seems to work, you define what "working" means first, then build to that definition.&lt;/p&gt;

&lt;p&gt;The challenge, of course, is that writing good specs is hard. It requires discipline, experience, and (honestly) a fair amount of tedium. Which is exactly where BMAD comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BMAD actually is
&lt;/h2&gt;

&lt;p&gt;BMAD stands for "Build More Architect Dreams." It's an open-source framework that uses AI agents to guide you through a structured development process, from initial idea through implementation.&lt;/p&gt;

&lt;p&gt;But here's the crucial part: BMAD doesn't generate code and call it done. It forces you through the specification process first.&lt;/p&gt;

&lt;p&gt;The framework includes multiple specialized agents, each with a distinct role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Product Manager&lt;/strong&gt; who helps you clarify what you're building and why&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Business Analyst&lt;/strong&gt; who digs into requirements and edge cases&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Architect&lt;/strong&gt; who designs how components will fit together&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Developer&lt;/strong&gt; who implements based on the specs you've created&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;QA Engineer&lt;/strong&gt; who defines how you'll verify the implementation works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each agent asks questions. Each one pushes you to articulate something specific before you move forward. You can't skip to the code, because the developer agent won't have what it needs until the earlier stages are complete.&lt;/p&gt;

&lt;p&gt;This structure is the key insight. The AI isn't doing the thinking for you. It's holding you accountable to a process that requires thinking. The agents are collaborators, not replacements. They augment your capability to do the specification work, but the decisions remain yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this feels different
&lt;/h2&gt;

&lt;p&gt;Most AI coding tools are optimized for a simple interaction: you prompt, you get code. The faster and more accurate that loop, the better the tool seems.&lt;/p&gt;

&lt;p&gt;BMAD optimizes for something else: the quality of your thinking before code exists.&lt;/p&gt;

&lt;p&gt;When I started experimenting with it, I chose deliberately small tasks. An Emacs configuration I'd been putting off. A bug I wanted to reproduce in isolation before fixing. Low stakes, easy to abandon if it felt like hype.&lt;/p&gt;

&lt;p&gt;What surprised me wasn't the speed. It was the structure.&lt;/p&gt;

&lt;p&gt;Working with the Product Manager agent, I had to articulate what I actually wanted (not just "fix this bug," but what specific behavior should change, and why, and how I'd know it was fixed). Working with the Architect, I had to think about how my change would interact with existing code. Working with the QA persona, I had to define acceptance criteria before implementation.&lt;/p&gt;

&lt;p&gt;By the time I reached the Developer agent, I wasn't prompting and hoping. I was handing over a spec that I understood, because I'd helped build it. The implementation felt like execution, not experimentation.&lt;/p&gt;

&lt;p&gt;And here's what I didn't expect: that constraint is liberating. The process felt slower at first (more steps, more questions, more writing). But I wasn't backtracking. I wasn't debugging code I didn't understand. I wasn't prompting the same thing five different ways hoping for a better result.&lt;/p&gt;

&lt;p&gt;The spec had done its job. The thinking was front-loaded, where it belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Orchestrator, not passenger
&lt;/h2&gt;

&lt;p&gt;The shift I described in my earlier post, from active thinker to passive prompter, doesn't happen with BMAD. It can't. The method requires you to validate, decide, and course-correct at every stage.&lt;/p&gt;

&lt;p&gt;The AI handles the grunt work: generating document templates, suggesting architectural patterns, writing implementation code that follows the spec. But you're still the one reviewing, adjusting, and approving. You're still the one who understands why the system is designed the way it is.&lt;/p&gt;

&lt;p&gt;That's the answer I was looking for. Not "don't use AI," but "use it in a way that keeps you in the driver's seat."&lt;/p&gt;

&lt;p&gt;I delegate the dirty work. I orchestrate. I stay in the loop.&lt;/p&gt;

&lt;p&gt;The mental model I keep coming back to is this: BMAD turns AI into a team of junior collaborators who are fast and capable, but who need direction. You're the senior engineer. You set the vision, define the constraints, and make the judgment calls. They execute, and they execute well, but only because you've told them what "well" means.&lt;/p&gt;

&lt;p&gt;That's extending yourself. That's the version of AI assistance I was hoping existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dopamine is real (and so is the fun)
&lt;/h2&gt;

&lt;p&gt;I should mention something else: this process is genuinely enjoyable.&lt;/p&gt;

&lt;p&gt;There's a particular satisfaction in watching a well-defined spec turn into working code without surprises. The gap between "what I wanted" and "what I got" shrinks dramatically when you've done the specification work upfront.&lt;/p&gt;

&lt;p&gt;And (I didn't expect this) role-playing with the different personas is fun. Switching from the PM mindset to the Architect mindset to the Developer mindset keeps the work varied. You're not just grinding through one mode of thinking. You're shifting perspectives, which keeps you engaged.&lt;/p&gt;

&lt;p&gt;BMAD even has something called "Party Mode" where multiple agents can participate in a single conversation, debating approaches and surfacing trade-offs. It sounds gimmicky until you try it. Having the Architect and QA agents push back on each other while you moderate is surprisingly useful for finding blind spots.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;This is the first in a series of three posts.&lt;/p&gt;

&lt;p&gt;In the next one, I'll go deeper on the agents themselves: who they are, what each one does, how they hand off work to each other, and how you can customize the process for your own workflow.&lt;/p&gt;

&lt;p&gt;In the third post, I'll walk through a real project I built using BMAD: a productivity app called &lt;a href="https://github.com/basteez/TODOdoro" rel="noopener noreferrer"&gt;TODOdoro&lt;/a&gt;. It combines todo management with the Pomodoro technique, and I'll show how the method helped me go from a philosophical idea ("a mirror, not a manager") to a working application with a clear architecture.&lt;/p&gt;

&lt;p&gt;If you've felt the same tension I did, excited by AI's potential but worried about what you might lose, this might be worth following. BMAD isn't the only answer, but it's an answer. And for me, it's been the difference between feeling like AI is happening to me and feeling like I'm using it deliberately.&lt;/p&gt;

&lt;p&gt;The tools are getting more powerful every month. The question isn't whether to use them. It's whether you'll use them in a way that makes you better, or in a way that quietly makes you less than you were.&lt;/p&gt;

&lt;p&gt;I know which one I'm choosing.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.bmad-method.org/" rel="noopener noreferrer"&gt;BMAD Method documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bmad-code-org/BMAD-METHOD" rel="noopener noreferrer"&gt;BMAD on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>specdrivendevelopment</category>
      <category>sdd</category>
      <category>bmad</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
