<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
  <title>Paradigma Digital</title>
  <link>https://www.paradigmadigital.com/blog/</link>
  <atom:link href="https://www.paradigmadigital.com/feed.xml" rel="self" type="application/rss+xml" />
  <description>Big Data, Blockchain, cultura ágil, desarrollo, diseño… Te ofrecemos toda la información que necesitas para estar al día en tecnología.</description>
  <generator>Eleventy - 11ty.dev</generator>
  <language>en-US</language>
  <lastBuildDate>Fri, 22 May 2026 06:47:29 GMT</lastBuildDate>
  <image>
    <url>https://www.paradigmadigital.com/assets/img/logo/favicon.png</url>
    <title>Paradigma Digital</title>
    <link>https://www.paradigmadigital.com/blog/</link>
    <width>192</width>
    <height>192</height>
  </image>
  <item>
        <dc:creator>
            <![CDATA[ Vanessa Davo Parreño ]]>
        </dc:creator>
        <title>Cursor Tracking with GSAP: Bringing Mouse Movement to Life</title>
        <link>https://en.paradigmadigital.com/dev/cursor-tracking-gsap-bringing-mouse-movement-life/</link>
        <pubDate>Thu, 21 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/cursor-tracking-gsap-bringing-mouse-movement-life/</guid>
        <description>Cursor tracking is one of those simple interactions that can make an interface feel much more alive. In today’s post, we explain how to implement it with GSAP, creating a smooth trail that naturally follows the mouse.
</description>
        <content:encoded>
            <![CDATA[
                <p>One of the most important aspects when designing a digital product, alongside accessibility, is the <strong>user experience</strong>. It basically defines how a person interacts with what we have built.</p>
<p><strong>And there is one thing that often makes a difference: the interface reacting</strong>. Feeling that what you do has an immediate response makes everything feel more alive and polished. It is true that adding these kinds of interactions does not always make sense, but when they are used well in the right context and at the right moment, they greatly improve the final result.</p>
<p>One of the simplest and most eye-catching effects is <strong>cursor tracking</strong>. And although it may seem complex at first glance, it is actually super easy to build.</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img data-src="https://www.paradigmadigital.com/assets/cms/eye_cursor_tracking_2255794f3a.gif" class="lazy-img" title="Cursor tracking" alt="eyes moving as you move the mouse, following it with their gaze"></article>
<h2 class="block block-header h--h30-15-400 left  ">What Exactly Is Cursor Tracking?</h2>
<p>Cursor tracking consists of <strong>detecting the cursor position and using it to update the position of an element on the screen</strong>.</p>
<p>From a technical perspective, it can be summarized in three steps:</p>
<ol>
<li><strong>Listen</strong> to mouse movement (<code>mousemove</code>)</li>
<li><strong>Retrieve</strong> its coordinates (<code>clientX</code>, <code>clientY</code>)</li>
<li><strong>Update the DOM</strong> using those values to create the interaction.</li>
</ol>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Basic Cursor Tracking Implementation</h2>
<p>Now let’s see how we can implement a simple cursor tracking effect. In this case, we are going to build a small trail that smoothly follows the cursor using <a href="https://gsap.com/" target="_blank">GSAP</a>, since it allows us to manage animations much more easily and efficiently than with pure CSS.</p>
<p>Here is the <a href="https://codepen.io/vanessadavo/pen/XJNbyaL" target="_blank">full example on CodePen</a>:</p>
<iframe id="" class="block block-iframe -like-text-width" src="https://codepen.io/vanessadavo/embed/XJNbyaL?default-tab=html%2Cresult" style="height:300px;  width:100%;"></iframe>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">The HTML: Preparing the Trail Elements</h3>
<p>For this effect, <strong>we need several elements</strong> that will form the trail. Each of these divs will act as a “particle” that follows the cursor position with a slight delay relative to the previous one.</p>
<pre><code class="language-html">&lt;div class=&quot;trail&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;trail&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;trail&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;trail&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;trail&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;trail&quot;&gt;&lt;/div&gt;
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">The CSS: Positioning and Styling</h3>
<p>Next, we give them a <strong>basic style so they behave like small dots</strong>. The most important parts here are <strong><code>position: fixed</code></strong>, so they move relative to the viewport, and <strong><code>pointer-events: none</code></strong>, so the circles do not intercept clicks intended for other buttons or links on the page.</p>
<pre><code class="language-css">body {
  height: 200vh;
  background: #111111;
  overflow: hidden;
}

.trail {
  width: 20px;
  height: 20px;
  background: #d9ed92;
  border-radius: 50%;
  position: fixed;
  top: 0;
  left: 0;
  pointer-events: none;
}
</code></pre>
<p>Then we are going to <strong>center the particles when the page loads</strong>. If we do not do this, the effect would suddenly start from the top-left corner of the screen (0,0) the first time we move the mouse. With <strong>gsap.set</strong>, we position them directly in the center:</p>
<pre><code class="language-javascript">// Center the particles on load to avoid the default (0,0) position
const centerX = window.innerWidth / 2;
const centerY = window.innerHeight / 2;

trails.forEach((el) =&gt; {
  gsap.set(el, {
    x: centerX,
    y: centerY
  });
});
</code></pre>
<p>It is important to mention that <strong>this is not strictly necessary</strong>. There are many ways to approach it. For example, you could hide the particles with <strong>zero opacity</strong> and make them appear only when the user moves the mouse. But in our example, since there is nothing else on the screen, it makes more sense for the elements to already be positioned and ready to react from the center.</p>
<p>Finally, we add an <strong>event listener</strong> that will detect mouse movement. On every movement, we trigger a <strong>GSAP animation for each particle</strong>:</p>
<pre><code class="language-javascript">// Cursor tracking with staggered delay to create a smooth trailing effect
window.addEventListener(&quot;mousemove&quot;, (e) =&gt; {
  trails.forEach((el, index) =&gt; {
    gsap.to(el, {
      x: e.clientX,
      y: e.clientY,
      duration: 0.2 + index * 0.05, // We use the index so each particle is slightly slower than the previous one
      ease: &quot;power2.out&quot;
    });
  });
});
</code></pre>
<p>By using the <strong>array index to calculate the duration</strong>, we make the first particle almost instantaneous while the following ones move with a slight delay. The result is that <strong>organic movement feeling</strong> that makes the effect much more visually appealing.</p>
<p><strong>Important</strong>: for this example to work correctly, we need to <strong>include GSAP in our project</strong>. We can do so by adding the following script:</p>
<pre><code class="language-none">&lt;script src=&quot;https://cdn.jsdelivr.net/npm/gsap@3.15/dist/gsap.min.js&quot;&gt;&lt;/script&gt;
</code></pre>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Advanced Cursor Tracking: Creating Eyes That Follow You</h2>
<p>We have already seen how to make something follow the cursor, but <strong>cursor tracking does not always have to involve full movement across the screen</strong>. We can use the same coordinate logic to create subtler and more playful interactions, such as eyes that follow the mouse movement.</p>
<p>In this case, instead of moving the elements themselves, we are going to <strong>calculate the angle and distance</strong> so that the pupils always stay inside the eye.</p>
<p>You can <a href="https://codepen.io/vanessadavo/pen/wBoaRjb" target="_blank">see the result on CodePen</a>:</p>
<iframe id="" class="block block-iframe -like-text-width" src="https://codepen.io/vanessadavo/embed/wBoaRjb?default-tab=html%2Cresult" style="height:300px;  width:100%;"></iframe>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">The HTML: Eye Structure</h3>
<p>For this to work, we need <strong>a container for each eye and an inner element for the pupil</strong>.</p>
<pre><code class="language-html">&lt;div class=&quot;eyes-container&quot;&gt;
  &lt;div class=&quot;eye&quot;&gt;
    &lt;div class=&quot;pupil&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;eye&quot;&gt;
    &lt;div class=&quot;pupil&quot;&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">The CSS: Constraining the Movement</h3>
<p>The trick here is making sure the <strong><code>.eye</code> container has <code>overflow: hidden</code></strong>. This guarantees that, even if our calculations go beyond the limits, the pupil will never leave the white area of the eye (or, if it does exceed its container, we simply will not see it).</p>
<pre><code class="language-css">body {
  margin: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100dvh;
  background-color: #f5f5f5;
  overflow: hidden;
}

.eyes-container {
  display: flex;
  gap: 20px;
}

.eye {
  width: 100px;
  height: 100px;
  background-color: white;
  border: 4px solid #1a1a1a;
  border-radius: 50%;
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
}

.pupil {
  width: 40px;
  height: 40px;
  background-color: #1a1a1a;
  border-radius: 50%;
  position: absolute;
}
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">The JavaScript: A Bit of Trigonometry and GSAP</h3>
<p>This is where things get interesting. To make the eyes look toward the mouse, we need to <strong>know the angle between the center of the eye and the cursor</strong>.</p>
<p>First, we <strong>select the pupils</strong>, which are the elements we are going to move:</p>
<pre><code class="language-javascript">const pupils = document.querySelectorAll(&quot;.pupil&quot;);
</code></pre>
<p>Now we calculate the movement. <strong>Math.atan2 gives us the angle</strong>, while <strong>Math.cos / Math.sin tells us how much to move the pupil on the X and Y axes</strong> so it points in that direction:</p>
<pre><code class="language-javascript">window.addEventListener(&quot;mousemove&quot;, (e) =&gt; {
  pupils.forEach((pupil) =&gt; {


    // Get the parent eye element and its center position
    const eye = pupil.parentElement;
    const rect = eye.getBoundingClientRect();
    const eyeCenterX = rect.left + rect.width / 2;
    const eyeCenterY = rect.top + rect.height / 2;

    // Calculate the angle between the mouse and the eye center
    const angle = Math.atan2(
      e.clientY - eyeCenterY,
      e.clientX - eyeCenterX
    );

    // Define the maximum movement radius for the pupil
    const maxDistance = 25;

    // Measure mouse distance from the eye center and clamp it
    const mouseDistance = Math.hypot(
      e.clientX - eyeCenterX,
      e.clientY - eyeCenterY
    );

    const distance = Math.min(mouseDistance / 10, maxDistance);

    // Calculate pupil offset based on angle and clamped distance
    const moveX = Math.cos(angle) * distance;
    const moveY = Math.sin(angle) * distance;

    // Animate the pupil for a smooth
    gsap.to(pupil, {
      x: moveX,
      y: moveY,
      duration: 0.4,
      ease: &quot;power2.out&quot;,
      overwrite: &quot;auto&quot;
    });
  });
});
</code></pre>
<p><strong>Important</strong>: just like in the previous example, for this to work correctly we need to include GSAP in our project. We can do so by adding the following script:</p>
<pre><code class="language-none">&lt;script src=&quot;https://cdn.jsdelivr.net/npm/gsap@3.15/dist/gsap.min.js&quot;&gt;&lt;/script&gt;
</code></pre>
<p>As you have seen, once you understand <strong>how to capture mouse coordinates</strong>, the possibilities are almost endless (and I say “almost” because there will always be something slightly impossible). But with this foundation, we can go from a simple trail effect to a much more advanced animation with only a few changes in the JavaScript logic.</p>
<p>And the best thing about using <strong>GSAP</strong> for these effects is that it takes away the heavy lifting of managing frames and smoothing, allowing us to focus on what really matters: <strong>making the interaction feel natural and adding value to the user experience</strong>.</p>
<p>I hope this post helped you better understand how GSAP works and inspires you to create your own animations. Time to experiment!</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Santiago López ]]>
        </dc:creator>
        <title>Green QA Metrics: Quality That Breathes</title>
        <link>https://en.paradigmadigital.com/dev/green-qa-metrics-quality-breaths/</link>
        <pubDate>Tue, 19 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/green-qa-metrics-quality-breaths/</guid>
        <description>Sustainability in software can also be tested. From the energy consumed by a test suite to the traceability of ESG metrics or shutting down staging environments, Green QA turns quality into a tangible driver of efficiency. We close this series by explaining the metrics and KPIs you should keep in mind.
</description>
        <content:encoded>
            <![CDATA[
                <p>With this post, we conclude the series dedicated to Green Quality Assurance. In the previous articles, we explained <a href="https://en.paradigmadigital.com/dev/what-is-green-qa-quality-that-breathes/" target="_blank">what Green QA means and its impact on companies</a> as well as a <a href="https://en.paradigmadigital.com/dev/green-qa-framework-quality-breaths/" target="_blank">possible framework for its implementation</a>.</p>
<p>Now that we already understand what this methodology is and how to implement it, the only thing left is to understand <strong>how we can measure it</strong>. In this final post, we focus on the foundation of the entire process: measurement, addressing the <strong>KPIs that can be used</strong> to turn requirements into data and to track progress as accurately as possible based on objective information.</p>
<p>It is not an easy task to have all the tools and frameworks required to perform these measurements, which is why <strong>the process is progressive and requires commitment</strong> from every member of the organization.</p>
<p>In Green QA, metrics are the thermometer of our efficiency. We do not measure for bureaucracy’s sake, but to identify <strong>“energy leaks” and “digital waste.”</strong></p>
<p>When defining the <strong>KPIs and OKRs</strong> needed to evaluate the different aspects of GQA, we grouped them into the following measurement categories:</p>
<ul>
<li>Energy and software (technical efficiency)</li>
<li>Carbon and waste (planetary impact)</li>
<li>ESG data quality (trust and compliance)</li>
<li>Operational efficiency and “Digital Waste” (process improvement)</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Energy and Software KPIs (Technical Efficiency)</h3>
<p>Here, we <strong>measure the physical effort hardware performs to run our software</strong>. The KPIs used for this area are the following:</p>
<table>
<thead>
<tr>
<th style="text-align:center">KPI</th>
<th style="text-align:center">Definition</th>
<th style="text-align:center">Suggested Tool</th>
<th style="text-align:center">Technical Metric</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">QA Energy Intensity</td>
<td style="text-align:center">Energy consumed per execution of the test suite.</td>
<td style="text-align:center">Scaphandre (via Prometheus)</td>
<td style="text-align:center">kWh \Tests</td>
</tr>
<tr>
<td style="text-align:center">Green Code Quality</td>
<td style="text-align:center">Detection of inefficient code patterns (loops, API calls).</td>
<td style="text-align:center">SonarQube (Eco-Code)</td>
<td style="text-align:center"># of Green Smells</td>
</tr>
<tr>
<td style="text-align:center">Idle Energy Rate</td>
<td style="text-align:center">Energy consumed by Staging environments while not being tested.</td>
<td style="text-align:center">AWS CCFT / Azure Dashboards</td>
<td style="text-align:center">Idle kWh</td>
</tr>
<tr>
<td style="text-align:center">CPU, Memory, and Idle Cycles</td>
<td style="text-align:center">Physical resource usage during the test lifecycle.</td>
<td style="text-align:center">Prometheus / Netdata</td>
<td style="text-align:center">% CPU + % RAM) \Idle Time</td>
</tr>
<tr>
<td style="text-align:center">Frontend Efficiency</td>
<td style="text-align:center">Carbon footprint generated on the end-user device.</td>
<td style="text-align:center">GreenFrame.io / Lighthouse</td>
<td style="text-align:center">gCO2 per session</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Carbon and Waste KPIs (Planetary Impact)</h3>
<p>We transform <strong>watts into real environmental impact</strong>. The KPIs used for this area are the following:</p>
<table>
<thead>
<tr>
<th style="text-align:center">KPI</th>
<th style="text-align:center">Definition</th>
<th style="text-align:center">Suggested Tool</th>
<th style="text-align:center">Technical Metric</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">Release Carbon Footprint</td>
<td style="text-align:center">CO2 emissions generated by deploying a new version.</td>
<td style="text-align:center">Cloud Carbon Footprint</td>
<td style="text-align:center">gCO2 per release</td>
</tr>
<tr>
<td style="text-align:center">Compute Efficiency (LCA)</td>
<td style="text-align:center">Environmental impact of QA hardware (manufacturing + usage).</td>
<td style="text-align:center">SimaPro / GaBi</td>
<td style="text-align:center">Hardware Carbon Debt</td>
</tr>
<tr>
<td style="text-align:center">Annual Reduction Rate</td>
<td style="text-align:center">Emission savings compared to the previous period.</td>
<td style="text-align:center">Watershed / Persefoni</td>
<td style="text-align:center">% Annual Reduction</td>
</tr>
<tr>
<td style="text-align:center">Hardware Circularity Index</td>
<td style="text-align:center">% of testing devices reused, repaired, or recycled.</td>
<td style="text-align:center">Internal ERP / Snipe-IT</td>
<td style="text-align:center">Refurbished Equipment\Total</td>
</tr>
<tr>
<td style="text-align:center">Compliance Deviation Rate</td>
<td style="text-align:center">Releases exceeding the established carbon budget.</td>
<td style="text-align:center">Jenkins / GitHub Actions</td>
<td style="text-align:center"># Blocked Releases</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">ESG Data Quality KPIs (Trust and Compliance)</h3>
<p>If sustainability data is unreliable, the strategy fails. The KPIs used to measure this area are the following:</p>
<table>
<thead>
<tr>
<th style="text-align:center">KPI</th>
<th style="text-align:center">Definition</th>
<th style="text-align:center">Suggested Tool</th>
<th style="text-align:center">Technical Metric</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">ESG Data Health Index</td>
<td style="text-align:center">% of sustainability data that is auditable and real.</td>
<td style="text-align:center">Persefoni / Plan A</td>
<td style="text-align:center">Verifiable Data \Total</td>
</tr>
<tr>
<td style="text-align:center">% of Auditable ESG Data</td>
<td style="text-align:center">Proportion of QA metrics with verifiable technical evidence.</td>
<td style="text-align:center">MS Sustainability Manager</td>
<td style="text-align:center">Auditable Metrics\Total</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Operational Efficiency and “Digital Waste” KPIs (Process Improvement)</h3>
<p>It is not enough for a test to consume little; the key is <strong>not executing what is unnecessary</strong>. Digital waste is silent pollution. The data used to measure this area includes the following:</p>
<table>
<thead>
<tr>
<th style="text-align:center">KPI</th>
<th style="text-align:center">Definition</th>
<th style="text-align:center">Suggested Tool</th>
<th style="text-align:center">Technical Metric</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><br>“Zombie Tests” Rate</td>
<td style="text-align:center">% of automated tests that run but provide no value (duplicated tests, tests that always pass without validating real logic, or tests for deprecated functionality).</td>
<td style="text-align:center"><br>Manual</td>
<td style="text-align:center"><br>Zombie Tests / Total</td>
</tr>
<tr>
<td style="text-align:center">Test Data Density</td>
<td style="text-align:center">Measures the size of datasets used. Do we really need a 1TB database for an integration test, or can we use smart subsetting? Less storage = less server energy consumption.</td>
<td style="text-align:center"><br>Manual</td>
<td style="text-align:center"><br>Used Data / Total</td>
</tr>
<tr>
<td style="text-align:center">Time-to-Feedback</td>
<td style="text-align:center">The longer a pipeline takes to fail, the more resources (cloud compute minutes) are wasted. Optimizing execution order to fail fast is an energy-saving strategy.</td>
<td style="text-align:center"><br>Manual</td>
<td style="text-align:center"><br>Optimized Pipelines / Total</td>
</tr>
</tbody>
</table>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Standards and Compliance</h2>
<p>It is not enough to “be green”; <strong>you must prove it</strong> to international regulators. Green QA is the final filter ensuring that a company does not incur legal risks by reporting inaccurate data.</p>
<p>In the previous post, we discussed <a href="https://en.paradigmadigital.com/dev/green-qa-framework-quality-breaths/" target="_blank">legal aspects where applying Green QA within a company is beneficial</a>. Here, we will look at <strong>how to ensure compliance through data</strong> and how to verify whether the quality process we followed <strong>has contributed to regulatory compliance</strong> using the KPIs defined above.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">CSRD (EU Directive) + ESRS</h3>
<p>The CSRD (Corporate Sustainability Reporting Directive) is the <strong>European regulation</strong> (in force since 2024) that <strong>requires large companies and publicly traded organizations to report detailed sustainability information under Environmental, Social, and Governance (ESG) criteria</strong>.</p>
<p>In Spain, the Corporate Sustainability Reporting Bill was approved on October 29, 2024, as a transposition of the CSRD. The <strong>ESRS</strong> (European Sustainability Reporting Standards) are the <strong>mandatory technical standards for complying with the CSRD</strong>.</p>
<p>From a QA perspective, we can <strong>audit sustainability data</strong>. Here, Green QA acts as the “Data Auditor.” It must <strong>ensure that ESG data</strong> (such as server consumption in Staging) is not based on rough estimates but has <strong>technical traceability</strong>. If reporting software fails, the company may face sanctions for <em>Greenwashing</em>. We can use the following checklist to verify compliance:</p>
<ul>
<li><strong>Data traceability</strong>. Is it possible to trace emission data from the original sensor/log to the final report without manual alterations?</li>
<li><strong>ESG API validation</strong>. Has the integration with Cloud providers (AWS/Azure/GCP) been tested to ensure consumption data is extracted without loss?</li>
<li><strong>Auditability</strong>. Does the QA metric include verifiable technical evidence for external audits?</li>
<li><strong>Accuracy vs. estimation</strong>. Have generic estimates been replaced with real hardware consumption data whenever possible?</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">GHG Protocol (Scope 3 - Software)</h3>
<p>The GHG Protocol (Scope 3) is the <strong>most widely used global standard for measuring and reporting indirect greenhouse gas emissions</strong> (GHG) occurring across a company’s value chain, excluding purchased energy emissions (Scope 2).</p>
<p>From a QA perspective, it is necessary to <strong>validate that third-party tools</strong> (testing SaaS platforms, CDNs, paid APIs) <strong>provide real emissions data</strong>. Quality Gates can be created to block deployments if the “carbon budget” of a microservice exceeds protocol limits. We can use the following checklist to verify compliance:</p>
<ul>
<li><strong>Footprint calculation</strong>. Have updated CO2 conversion factors been applied to the energy consumed during deployment?</li>
<li><strong>Supplier filtering</strong>. Has it been verified that partners (testing SaaS platforms, CDNs) hold ISO 14001 or Energy Star certifications?</li>
<li><strong>Carbon budget</strong>. Does the current release remain within the established emissions limit compared to the previous period?</li>
<li><strong>Formula validation</strong>. Have unit tests been performed on emissions calculation formulas to ensure mathematical accuracy?</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">ISO/IEC 21031 (Software Carbon Intensity - SCI)</h3>
<p>This is the Unit Testing of the carbon footprint. It is an <strong>international standard for calculating software carbon intensity (SCI)</strong>.</p>
<p>The role of Green QA here is to <strong>integrate carbon footprint measurement into the testing pyramid</strong>. Just as we validate response times, QA validates the energy cost per transaction. If a database change increases CPU cycles, QA acts as the gatekeeper preventing that “energy waste” from reaching production.</p>
<ul>
<li><strong>Intensity analysis</strong>. Has kWh consumption been measured for each test suite execution?</li>
<li><strong>CPU optimization</strong>. Does the code avoid unnecessary cycles or “Green Smells” (infinite loops, redundant API calls)?</li>
<li><strong>Headless testing</strong>. Have tests been run in headless mode to reduce the energy consumed by graphical rendering?</li>
<li><strong>Idle Energy validation</strong>. Has it been verified that Staging environments shut down or auto-scale to zero after execution?</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Consumer Empowerment Directive (Anti-Greenwashing)</h3>
<p>The <strong>EU is banning generic environmental claims without evidence</strong> (“100% eco-friendly software”). From a QA perspective, evidence must be certified. If marketing claims the app consumes 30% less battery, QA should have run energy regression tests (using tools such as GreenFrame or Lighthouse) that <strong>support the claim with empirical and repeatable data</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Web Accessibility (WAD / WCAG) as Sustainability</h3>
<p>There is a direct correlation: <strong>an accessible and lightweight website is also a low-consumption website</strong>. From a QA perspective, the DOM must be validated for efficiency. Fewer unnecessary elements and redundant requests mean fewer CPU cycles on the client device. Here, QA combines social impact (inclusion) with environmental impact (efficiency).</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Carbon Footprint Measurement Table</h2>
<p>At this stage, we present a table with useful data commonly used to <strong>automate carbon footprint calculations</strong>. These values evolve as technologies improve and become more efficient, so they should be considered estimates.</p>
<table>
<thead>
<tr>
<th style="text-align:center">QA / IT Activity</th>
<th style="text-align:center">Estimated Consumption / Emissions</th>
<th style="text-align:center">CO2e Equivalent</th>
<th style="text-align:center">Visual Impact</th>
<th style="text-align:center">Source</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">EC2 Instance (AWS m5.large) - 24h</td>
<td style="text-align:center">~0.105 kWh</td>
<td style="text-align:center">~2.52 kg CO2</td>
<td style="text-align:center">Charging a smartphone 300 times.</td>
<td style="text-align:center">AWS Customer Carbon Footprint Tool</td>
</tr>
<tr>
<td style="text-align:center">Azure VM (D2s v3) - 24h</td>
<td style="text-align:center">~0.088 kWh</td>
<td style="text-align:center">~2.10 kg CO2</td>
<td style="text-align:center">10 cold-water laundry cycles.</td>
<td style="text-align:center">Azure Emissions Impact Dashboard</td>
</tr>
<tr>
<td style="text-align:center">Cloud SQL / BigQuery (1h)</td>
<td style="text-align:center">~0.008 kWh</td>
<td style="text-align:center">~0.18 kg CO2</td>
<td style="text-align:center">Watching 4 hours of HD streaming.</td>
<td style="text-align:center">Google Cloud Carbon Footprint</td>
</tr>
<tr>
<td style="text-align:center">S3 Storage (1 TB/month)</td>
<td style="text-align:center">~0.05 kWh</td>
<td style="text-align:center">~0.12 kg CO2</td>
<td style="text-align:center">Driving 0.5 km in a gasoline car.</td>
<td style="text-align:center">Cloud Carbon Footprint Methodology</td>
</tr>
<tr>
<td style="text-align:center">Smartphone Usage (1h testing)</td>
<td style="text-align:center">~0.00077 kWh</td>
<td style="text-align:center">~5.8g CO2</td>
<td style="text-align:center">Keeping an LED bulb on for 45 minutes.</td>
<td style="text-align:center">ADEME / Scope3 Lifecycle Data</td>
</tr>
<tr>
<td style="text-align:center">Tablet Usage (1h testing)</td>
<td style="text-align:center">~0.003 kWh</td>
<td style="text-align:center">~2.9g CO2</td>
<td style="text-align:center">Similar to 1 hour of portable radio usage.</td>
<td style="text-align:center">ADEME “Numérique 2.0” (2025)</td>
</tr>
<tr>
<td style="text-align:center">AI Query (LLM / Gemini)</td>
<td style="text-align:center">~0.003 kWh</td>
<td style="text-align:center">~0.15g - 0.75g CO2</td>
<td style="text-align:center">50-90 times more than a search engine query.</td>
<td style="text-align:center">Joule / ITU-WBA Report 2025</td>
</tr>
<tr>
<td style="text-align:center">Smartphone Manufacturing (embedded)</td>
<td style="text-align:center">N/A</td>
<td style="text-align:center">~50 kg CO2 / year</td>
<td style="text-align:center">Emissions equivalent to producing 250 hamburgers.</td>
<td style="text-align:center">Öko-Institut (Life Cycle Study)</td>
</tr>
<tr>
<td style="text-align:center">1 Hour of Cloud Server Usage (standard)</td>
<td style="text-align:center">0.5 kWh</td>
<td style="text-align:center">~125g CO2</td>
<td style="text-align:center">Charging a smartphone 15 times.</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">Suite of 1,000 Automated Tests</td>
<td style="text-align:center">2.5 kWh</td>
<td style="text-align:center">~625g CO2</td>
<td style="text-align:center">Driving a gasoline car for 2.5 km.</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">Staging Environment Running (24h)</td>
<td style="text-align:center">12 kWh</td>
<td style="text-align:center">~3 kg CO2</td>
<td style="text-align:center">The amount of CO2 absorbed by 0.15 trees in a year.</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td style="text-align:center">Storing 1 TB of Logs/Data (1 month)</td>
<td style="text-align:center">10 kWh</td>
<td style="text-align:center">~2.5 kg CO2</td>
<td style="text-align:center">Keeping an LED bulb on for 4 months.</td>
<td style="text-align:center"></td>
</tr>
</tbody>
</table>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusions</h2>
<p>Throughout this three-part series on Green Quality Assurance, we have explored the <strong>possibilities within the technology world</strong>, and specifically within the software industry, to take action and improve energy efficiency.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ María Mira ]]>
        </dc:creator>
        <title>Why Strategy Breaks Down When It Reaches Operations: 3 Systemic Barriers No Spreadsheet Can Detect and How to Overcome Them</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/why-srategy-breaks-down-when-it-reaches-operations/</link>
        <pubDate>Thu, 14 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/why-srategy-breaks-down-when-it-reaches-operations/</guid>
        <description>Strategy rarely breaks because of a lack of vision. It breaks when it reaches day-to-day operations, where three invisible barriers appear: uncertainty, misaligned incentives, and workflow bottlenecks that no Excel sheet can reveal. Today, we’ll explain what you need to keep in mind to work in a truly productive environment.
</description>
        <content:encoded>
            <![CDATA[
                <p>When strategic plans fail, it is rarely due to a lack of vision. In fact, <strong>the data speaks for itself</strong>: while a global report by <a href="https://www.pmi.org/learning/thought-leadership/series/pmo/c-suite-failing-strategiy-lessons" target="_blank">The Economist Intelligence Unit and the Project Management Institute (PMI)</a> points out that 61% of companies admit they are unable to close the gap between strategy and real day-to-day execution, a recent publication from <a href="https://www.cio.com/article/4160977/beyond-the-25-reasons-projects-fail.html" target="_blank">CIO Magazine (April, 2026)</a>, supported by Gartner data from 2024, reveals that only 48% of corporate initiatives actually achieve their business objectives.</p>
<p>This happens mainly because of what we could call a kind of <strong>“systemic blindness.”</strong> When you look at the company from the Executive Committee table, everything seems like a perfect, clean, and organized org chart. Operational reality, however, is a <strong>complex network of human and technical interdependencies</strong>. Trying to manage deep change based only on the org chart is, essentially, managing an illusion.</p>
<p>If we truly want to connect strategy with day-to-day execution and protect the benefits of a successful transformation, we need to look at <strong>three invisible dimensions</strong> that very few people take into account. They don’t appear in financial reports, yet they are the forces that either drive or block a company’s progress:</p>
<ol>
<li><strong>Cognitive dimension</strong>: the available mental and emotional capacity of your team.</li>
<li><strong>Structural dimension</strong>: the real rules of the game (such as incentives and interactions between people and departments) beyond job titles.</li>
<li><strong>Flow dimension</strong>: the real path that value follows, regardless of hierarchy.</li>
</ol>
<p>Let’s see how these invisible barriers can block execution through real-world examples.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">1 <span class="enum-header"></span> Cognitive barrier: the hidden cost of uncertainty</h2>
<p>This dimension refers to the organization’s <strong>“mental bandwidth.”</strong> Think about it: if professionals spend their energy surviving fear or uncertainty, biologically they no longer have the resources to innovate or think long term.</p>
<p>Let’s take a typical example. Imagine a company announcing a merger or restructuring with the promise of “becoming more agile.” Months go by, and nobody knows exactly what their role is, whether their manager will remain the same, or whether their position is at risk because it overlaps with someone else’s.</p>
<p>Leadership reviews employee profiles and thinks: <em>“We have the best talent in the market, why is there so much resistance and so little proactivity?”</em></p>
<p>This is not an attitude problem—it’s pure biology. The <strong>human brain processes social uncertainty as if it were a physical threat</strong>. Different studies and research projects have addressed this issue and reached the following <strong>conclusions</strong>:</p>
<ul>
<li>High performance collapses without psychological safety (as demonstrated by Google’s famous <a href="https://www.google.com/search?q=https://rework.withgoogle.com/print/guides/5721312655835136/" target="_blank">Project Aristotle</a>).</li>
<li>Living under the stress of uncertainty can reduce functional IQ by around 13 points (according to the research of <a href="https://scholar.harvard.edu/sendhil/scarcity" target="_blank">Mullainathan and Shafir - Harvard/Princeton</a>).</li>
</ul>
<p>Let’s also add, although we won’t solve it here, the issue of <a href="https://www.paradigmadigital.com/techbiz/podcast-puede-ia-aumentar-inteligencia-humana-riesgos-limites-oportunidades/" target="_blank">how AI can help or limit human intelligence</a> and the uncertainty this is generating.</p>
<h2 class="block block-header h--h20-175-500 left  ">How can we overcome it?</h2>
<p>By understanding <strong>psychological safety</strong> as a form of <strong>risk management</strong> to protect the team’s intelligence—not as a matter of “being nice.” And yes, it can be measured by going beyond classic performance KPIs and starting to use <strong>Key Behaviour Indicators (KBIs)</strong>: indicators that measure real behaviors, such as how often teams report errors without fear (directly linked to psychological safety) or how much collaboration exists between departments. This allows us to visualize what drives success and what needs improvement.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">2 <span class="enum-header"></span> Structural barrier: the trap of local optimization</h2>
<p>This dimension is about <strong>how interactions and incentives are designed</strong> between the boxes of the org chart—not about how those boxes are drawn.</p>
<p>Imagine the classic end-of-quarter scenario. Sales leadership has a bonus tied to sales volume. Meanwhile, technology/operations leadership has its own incentives tied to stability and cost reduction. <strong>The result?</strong> Sales closes contracts by promising highly customized solutions that require massive amounts of work in order to hit quota. Meanwhile, Operations slows down deployments or limits customizations to reduce costs and meet its own targets.</p>
<p>The outcome is that both departments strictly meet their individual goals or KPIs, but customers don’t receive what they expected, the company loses money, teams waste time and effort, and everyone spends an immeasurable amount of time looking for someone to blame.</p>
<p>As <a href="https://thesystemsthinker.com/a-lifetime-of-systems-thinking/" target="_blank">Russell Ackoff</a> explained, organizations frequently fall into the trap of local optimization: <strong>when you improve the individual parts separately, you often end up destroying the performance of the whole</strong>.</p>
<h2 class="block block-header h--h20-175-500 left  ">How can we overcome it?</h2>
<p>By <strong>redesigning interactions</strong>: as long as incentives reward vertical silos, collaborative ways of working and agile methodologies will struggle to succeed. Here, the role of the C-Level must include, among other responsibilities, <strong>redesigning how different areas interact</strong> rather than evaluating each area’s performance in isolation.</p>
<p>This requires <strong>goals that directly impact the entire company</strong>, making Sales and Operations (in this case) work together to achieve them. Shared goals where people win—or lose—together.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">3 <span class="enum-header"></span> Flow barrier: what you can’t see is costing you money</h2>
<p>This dimension focuses on the <strong>difference between “busy people” and “completed work.”</strong></p>
<p>Imagine a scenario where everyone around you is constantly busy, overwhelmed with tasks: every calendar is packed and people are operating at 100% capacity. Yet a key initiative takes 12 months to reach the market. Sound familiar? And then the inevitable question arises: <em>“How can it take this long when everyone is working so hard?”</em></p>
<p>The reality is that <strong>value</strong> does not move when people work; <strong>it moves when work flows</strong>. In most companies, tasks spend a significant amount of time sitting in “invisible queues” (waiting for budget approval, waiting for validation, waiting for a testing environment, etc.).</p>
<h2 class="block block-header h--h20-175-500 left  ">How can we overcome it?</h2>
<p>By using Value Stream Management (VSM). Think of it as an “X-ray layer” that ignores hierarchy and visualizes the flow of work and information until it becomes value. As <a href="https://flowframework.org/" target="_blank">Mik Kersten explains in Project to Product</a>, by managing flow instead of isolated projects, you eliminate the waiting times that no org chart is capable of revealing.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion: from control to architecture</h2>
<p>There is a traditional inertia in the business world: when something fails, we tend to blame people and try to “fix” them with more pressure or more training. But <a href="https://deming.org/quotes/i-should-estimate-that-in-my-experience-most-troubles-and-most-possibilities-for-improvement-add-up-to-the-proportions-something-like-this94-belongs-to-the-system-responsibility-of-management6-sp-3/" target="_blank">W. Edwards Deming</a> already demonstrated with his <strong>94/6 Rule</strong> that 94% of problems belong to the system and only 6% to the individual.</p>
<p>The organizations leading the market today focus on <strong>“architecting the environment.”</strong> Taking <a href="https://en.paradigmadigital.com/organizational-transformation-rev/importance-warm-data-change-optimization-processes/" target="_blank">warm data into account in change and optimization processes</a> can contribute to more robust organizational evolution.</p>
<h2 class="block block-header h--h20-175-500 left  ">And what does “architecting the environment” mean?</h2>
<p>It means <strong>deliberately designing a work ecosystem</strong> where “doing the right thing” becomes the easiest option. In this way:</p>
<ul>
<li>Collective intelligence is protected (Neuroscience).</li>
<li>Incentives and ways of working are aligned to encourage collaboration (Systems Thinking).</li>
<li>Obstacles are removed so work can flow (VSM).</li>
</ul>
<p>As <a href="https://teamtopologies.com/key-concepts" target="_blank">Skelton and Pais explain in Team Topologies</a>, competitive advantage no longer belongs to those who pressure their teams the most, but to <strong>those who design better systems</strong>.</p>
<p>The question that remains is: <strong>are we managing people, or are we designing the system for success?</strong></p>
<p><strong>References</strong></p>
<ul>
<li><a href="https://www.pmi.org/learning/thought-leadership/series/pmo/c-suite-failing-strategiy-lessons" target="_blank">PMI-The Economist (2013)</a>. Why good strategies fail: Lessons for the C-suite.</li>
<li><a href="https://www.cio.com/article/4160977/beyond-the-25-reasons-projects-fail.html" target="_blank">CIO Magazine</a> (April, 2026).</li>
<li><a href="https://www.google.com/search?q=https://rework.withgoogle.com/print/guides/5721312655835136/" target="_blank">Google re:Work - Project Aristotle</a>.</li>
<li><a href="https://scholar.harvard.edu/sendhil/scarcity" target="_blank">Mullainathan, S., &amp; Shafir, E. (2013)</a>. Scarcity: Why Having Too Little Means So Much.</li>
<li><a href="https://thesystemsthinker.com/a-lifetime-of-systems-thinking/" target="_blank">Ackoff, R. L. (1994)</a>. The Democratic Corporation. Oxford Univ. Press.</li>
<li><a href="https://flowframework.org/" target="_blank">Kersten, M. (2018)</a>. Project to Product. IT Revolution.</li>
<li><a href="https://en.paradigmadigital.com/organizational-transformation-rev/importance-warm-data-change-optimization-processes/" target="_blank">Deming, W. E. (1986)</a>. Out of the Crisis. MIT Press.</li>
<li><a href="https://teamtopologies.com/key-concepts" target="_blank">Skelton, M., &amp; Pais, M. (2019)</a>. Team Topologies.</li>
</ul>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Alberto Martínez Pérez ]]>
        </dc:creator>
        <title>Clustering with Redis 8 vs Valkey 8: How to Improve Performance</title>
        <link>https://en.paradigmadigital.com/dev/clustering-redis-8-vs-valkey-8-improve-performance/</link>
        <pubDate>Tue, 12 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/clustering-redis-8-vs-valkey-8-improve-performance/</guid>
        <description>In this comparison, both Redis 8 and Valkey 8 show clear improvements over Redis 7, but Redis 8 stands out for an important reason: it not only delivers higher performance, but also behaves in a more stable and consistent way when you change the configuration and run it under real-world scenarios.
</description>
        <content:encoded>
            <![CDATA[
                 <h2 class="block block-header h--h30-15-400 left  add-last-dot">Single-Threading Can Be Fast</h2>
<p>Despite using a single-threaded implementation, <strong>Redis</strong>, the high-performance in-memory key-value storage system, is <strong>known for its incredible speed</strong>.</p>
<p><strong>How is it possible for Redis to handle hundreds of thousands of requests per second?</strong> First of all, it is important to clarify that Redis does use multiple threads; it is not a strictly single-threaded system.</p>
<p>Although it is true that it maintains a thread responsible for processing client requests and handling data structures, <strong>Redis uses other background threads to execute additional tasks</strong> required for its operation.</p>
<p>So why is it so fast?</p>
<ul>
<li>Redis keeps all <strong>data in memory</strong>, enabling extremely fast access.</li>
<li>The use of a simple <strong>key-value data model</strong> allows for <a href="https://redis.io/blog/redis-8-0-m03-is-out-even-more-performance-new-features/" target="_blank">O complexity</a> in key lookups.</li>
<li>The use of <strong>I/O multiplexing</strong> with <strong>non-blocking I/O</strong> enables efficient handling of multiple I/O operations.</li>
<li>Use of <strong>simple commands</strong> that require minimal CPU usage.</li>
<li>Use of <strong>optimized data types</strong> for in-memory operations.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Multithreading Optimizations</h2>
<ul>
<li><strong>Asynchronous Memory Release</strong>: starting with Redis 4.0, the lazy-free mechanism was introduced to <strong>release memory asynchronously</strong>. Memory release when deleting large keys is handled in a background thread.</li>
<li><strong>Multi-threading</strong>: as stated on the Redis blog, <em>“starting from version 6.0, Redis uses I/O threads to manage client requests, including socket reads and writes, as well as command parsing. However, the implementation does not fully leverage the potential performance benefits.”</em></li>
</ul>
<p>The use of <strong>multithreaded execution</strong> helps <strong>reduce the pressure</strong> on the single-threaded execution of incoming requests in high-concurrency scenarios. This multithreading process only applies to the <strong>parsing of the request protocol</strong>, while command processing and data manipulation remain single-threaded.</p>
<p>With the release of Redis 8.0, a <strong>new multithreaded I/O implementation</strong> arrived, promising major improvements in data transfer (between 37% and 112%, according to the <a href="https://redis.io/blog/memtier_benchmark-a-high-throughput-benchmarking-tool-for-redis-memcached/" target="_blank">data published by Redis</a>) on multi-core CPUs.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Testing the New Multithreaded Implementation</h2>
<p>As we already mentioned, Redis processes requests in a single thread, dividing execution into the following <strong>4 steps</strong>:</p>
<ol>
<li><strong>Reading</strong> the request from the socket</li>
<li><strong>Parsing</strong> the request</li>
<li><strong>Processing</strong> the request by executing the required operations on the data</li>
<li><strong>Writing</strong> the response to the socket</li>
</ol>
<p>A new request will not begin processing until these 4 steps have been completed sequentially for the current request.</p>
<p>Writing results to the socket in step 4 is typically a <strong>slow operation</strong> in terms of completion time. This is where we can benefit from the new multithreaded I/O implementation by configuring Redis to execute I/O operations in a separate thread. In this way, <strong>Redis is able to begin processing a new request in parallel</strong>, thus improving performance.</p>
<p>The Redis <strong>io-threads</strong> property (which is <strong>immutable</strong>) is the setting we will use to configure multithreaded socket writes. Remember that this property defaults to 1 and is used to indicate the <strong>maximum number of threads</strong> that can be created for socket writes.</p>
<p>Redis also provides the <strong>io-threads-do-reads</strong> configuration property, which enables multithreaded execution for reading and parsing requests from the socket (steps 1 and 2 described above). However, according to Redis documentation, this option <strong>does not have a significant impact</strong> on performance.</p>
<p>Therefore, we will focus solely on the impact of the <strong>io-threads</strong> configuration.</p>
<h2 class="block block-header h--h30-15-400 left  ">Synthetic Tests: How Were They Executed?</h2>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Benchmarking Tool</h2>
<p>For the tests, we used <strong>memtier_benchmark</strong>, an Open Source benchmarking tool developed by Redis Labs and integrated into their development processes, mainly for <strong>non-regression testing and performance optimization</strong>.</p>
<p>memtier_benchmark was introduced in the <a href="https://redis.io/blog/memtier_benchmark-a-high-throughput-benchmarking-tool-for-redis-memcached/" target="_blank">official Redis blog</a> and the <a href="https://github.com/RedisLabs/memtier_benchmark" target="_blank">project is available on GitHub</a>.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Our Redis Test Environment</h2>
<p>We are going to use a Redis cluster deployed on <strong>OpenShift Container Platform</strong> (OCP) with the following configuration:</p>
<ul>
<li><strong>Cluster nodes</strong>: 5</li>
<li><strong>CPUs per node</strong>: 4</li>
<li><strong>Memory per node</strong>: 4Gi</li>
</ul>
<p>We will use <strong>4 different images to build the nodes</strong>, allowing us to compare performance across versions:</p>
<ul>
<li><strong>redis.redis-stack-server:7.2.0-v10</strong> (image based on the official <strong>redis-stack-server</strong> image with some modules enabled)</li>
<li><strong>redis:7-bookworm</strong> (official image)</li>
<li><strong>valkey/valkey:8-bookworm</strong> (official image)</li>
<li><strong>redis:8-bookworm</strong> (official image)</li>
</ul>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Test Objectives</h2>
<p>With these tests, we aim to:</p>
<ul>
<li><strong>Determine the optimal value</strong> for the <strong>io-threads</strong> configuration parameter.</li>
<li><strong>Decide</strong> which <strong>Redis flavor</strong> we should choose: the old and well-known Redis or the fresh and young Valkey.</li>
</ul>
<p>As we have seen, we can <strong>set any value above the default value</strong> of one thread for the <strong>io-threads</strong> parameter. We are interested in understanding the performance impact of changing this configuration.</p>
<p>On the other hand, we know that after Redis announced it would <strong>no longer be open source</strong>, several forks of the project emerged. After reviewing those with the highest activity and contributor growth, <strong>we decided to limit our tests to Valkey</strong>.</p>
<p>We are also interested in <strong>comparing Valkey’s performance against the latest Redis versions</strong>. Redis, in particular, has received very positive feedback regarding performance improvements since the release of version 8.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Test Results</h2>
<p>Each test begins with a <strong>freshly created Redis cluster</strong> in a dedicated namespace within our OCP environment. Likewise, a <strong>new pod</strong> is created from which the benchmarking tool is executed at the start of each test.</p>
<p>The <strong>io-threads</strong> values used were: <strong>1, 8, 12, and 16</strong>.</p>
<p>The following table summarizes the <strong>results obtained in the different tests</strong>, showing the average number of operations per second for each image and io-threads configuration.</p>
<table>
<thead>
<tr>
<th>io-threads</th>
<th style="text-align:center">1</th>
<th style="text-align:center">8</th>
<th style="text-align:center">12</th>
<th style="text-align:center">16</th>
</tr>
</thead>
<tbody>
<tr>
<td>redis-stack-server:7.2.0</td>
<td style="text-align:center">441.316</td>
<td style="text-align:center">446.944</td>
<td style="text-align:center">290.793</td>
<td style="text-align:center">190.601</td>
</tr>
<tr>
<td>redis:7-bookworm</td>
<td style="text-align:center">432.611</td>
<td style="text-align:center">451.702</td>
<td style="text-align:center">289.670</td>
<td style="text-align:center">188.995</td>
</tr>
<tr>
<td>valkey:8-bookworm</td>
<td style="text-align:center">431.714</td>
<td style="text-align:center">860.290</td>
<td style="text-align:center">766.879</td>
<td style="text-align:center">584.707</td>
</tr>
<tr>
<td>redis:8-bookworm</td>
<td style="text-align:center">453.247</td>
<td style="text-align:center">1.027.698</td>
<td style="text-align:center">1.030.549</td>
<td style="text-align:center">1.025.972</td>
</tr>
</tbody>
</table>
<p>The same data represented <strong>as a chart</strong>:</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/grafico_barras_resultados_test_io_threads_f0c640d77f.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/grafico_barras_resultados_test_io_threads_f0c640d77f.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/grafico_barras_resultados_test_io_threads_f0c640d77f.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/grafico_barras_resultados_test_io_threads_f0c640d77f.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/grafico_barras_resultados_test_io_threads_f0c640d77f.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="io-threads values in a bar chart" title="undefined"/><figcaption>io-threads values in a bar chart</figcaption></figure>
<p>It seems that the <strong>optimal point</strong> is reached with an <strong>io-threads</strong> configuration equal to <strong>2 times the number of CPUs configured per Redis node</strong>.</p>
<p><strong>Beyond this value, performance degradation can be observed in Valkey 8</strong>, while <strong>Redis 8 maintains stable performance</strong> even when exceeding this optimal point. Therefore, <strong>Redis 8 results are more consistent</strong>.</p>
<p>As expected, <strong>no performance improvement was observed in Redis 7</strong> when increasing io-threads. On the contrary, we were surprised to observe performance degradation.</p>
<p><strong>Redis 8 outperformed Valkey 8 in all scenarios</strong>. Therefore, we settled on the <strong>2xCPU rule as the default io-threads configuration</strong>, and for now, the balance clearly favors <strong>Redis 8 as the image</strong> to use for our Redis clusters.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Applying the Knowledge Gained: Resource Optimization in a Real Scenario</h2>
<p><strong>The scenario</strong>: an application deployed on Kubernetes, making intensive use of a Redis cluster and requiring extremely high request-per-second rates.</p>
<p>The <strong>Redis cluster</strong>, during peak usage periods, must scale to 100 nodes in order to support the required performance. Currently, this cluster is made up of nodes instantiated from the Redis Stack 7.2 image, with 1 CPU per node.</p>
<p>Our <strong>goal</strong> is to <strong>reduce the number of cluster nodes by half</strong>, moving from 100 to 50 nodes using the <strong>Redis 8 image</strong>. To achieve this, we doubled the number of CPUs per node from 1 to 2 and set the io-threads configuration to 4, as previously determined, in order to benefit from the improvements offered by the new I/O threading implementation.</p>
<p>To <strong>validate that the platform with this new configuration is capable of supporting peak usage periods</strong>, we used a set of <strong>complex tests</strong> specifically designed to subject the platform to workloads similar to those expected during those peak periods, thus validating its ability to withstand extreme demand.</p>
<p>These <strong>End-to-End</strong> (E2E) tests were custom-developed using Spring Framework and the <a href="https://github.com/redis/lettuce" target="_blank">Redis Lettuce</a> client.</p>
<p>Taking advantage of the platform’s maintenance window, the <strong>full test suite</strong> was executed using the following configurations in order to compare the results:</p>
<ul>
<li><strong>Redis Stack 7.2</strong> - 100 nodes (1 CPU)</li>
<li><strong>Redis 8</strong> - 50 nodes (2 CPU)</li>
<li><strong>Valkey 8</strong> - 50 nodes (2 CPU)</li>
</ul>
<p>We also leveraged the Redis Operator developed to manage all Redis clusters (<a href="https://github.com/InditexTech/redkeyoperator" target="_blank">currently released as Open Source</a>), which deploys, alongside the cluster pods, an additional pod responsible for extracting a large number of metrics and exposing them to Prometheus, together with Kubernetes metrics, to be displayed in Grafana dashboards.</p>
<p>Let’s review the <strong>results obtained</strong>.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot"><strong>Processed Commands</strong></h2>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_procesados_redis_stack_100_nodes_2b64192b91.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_procesados_redis_stack_100_nodes_2b64192b91.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_procesados_redis_stack_100_nodes_2b64192b91.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_procesados_redis_stack_100_nodes_2b64192b91.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_procesados_redis_stack_100_nodes_2b64192b91.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Processed commands in Redis Stack 7.2 - 100 nodes" title="undefined"/><figcaption>Processed commands in Redis Stack 7.2 - 100 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_procesados_redis_8_50_nodes_9b61edc3a2.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_procesados_redis_8_50_nodes_9b61edc3a2.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_procesados_redis_8_50_nodes_9b61edc3a2.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_procesados_redis_8_50_nodes_9b61edc3a2.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_procesados_redis_8_50_nodes_9b61edc3a2.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Processed commands in Redis 8 - 50 nodes" title="undefined"/><figcaption>Processed commands in Redis 8 - 50 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_procesados_valkey_8_50_nodes_c845a40f20.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_procesados_valkey_8_50_nodes_c845a40f20.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_procesados_valkey_8_50_nodes_c845a40f20.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_procesados_valkey_8_50_nodes_c845a40f20.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_procesados_valkey_8_50_nodes_c845a40f20.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Processed commands in Valkey 8 - 50 nodes" title="undefined"/><figcaption>Processed commands in Valkey 8 - 50 nodes</figcaption></figure>
<p>We can see how the cluster built with <strong>Redis 8 takes advantage of the io-threads configuration and the new implementation</strong>, nearly matching the number of commands processed per unit of time by the reference Redis Stack 7.2 cluster. Each node practically <strong>doubles the number of processed commands per unit of time</strong> compared to Redis Stack 7.2.</p>
<p><strong>Valkey 8 shows behavior similar to Redis 8</strong>. Unfortunately, at the beginning of the test, one node pod was evicted, which explains the small drop visible in the chart.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Hits</h2>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/hits_redis_stack_100_nodes_88e2908a60.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/hits_redis_stack_100_nodes_88e2908a60.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/hits_redis_stack_100_nodes_88e2908a60.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/hits_redis_stack_100_nodes_88e2908a60.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/hits_redis_stack_100_nodes_88e2908a60.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Hits in Redis Stack 7.2 - 100 nodes" title="undefined"/><figcaption>Hits in Redis Stack 7.2 - 100 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/hits_redis_8_50_nodes_9847ef8f70.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/hits_redis_8_50_nodes_9847ef8f70.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/hits_redis_8_50_nodes_9847ef8f70.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/hits_redis_8_50_nodes_9847ef8f70.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/hits_redis_8_50_nodes_9847ef8f70.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Hits in Redis 8 - 50 nodes" title="undefined"/><figcaption>Hits in Redis 8 - 50 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/hits_valkey_8_50_nodes_1ca451862c.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/hits_valkey_8_50_nodes_1ca451862c.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/hits_valkey_8_50_nodes_1ca451862c.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/hits_valkey_8_50_nodes_1ca451862c.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/hits_valkey_8_50_nodes_1ca451862c.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Hits in Valkey 8 - 50 nodes" title="undefined"/><figcaption>Hits in Valkey 8 - 50 nodes</figcaption></figure>
<p>The same behavior observed for processed commands per unit of time <strong>is repeated in the number of hits</strong>. Both Redis 8 and Valkey 8 nearly achieve the <strong>reference performance of Redis Stack 7.2 using half the number of nodes</strong>.</p>
<p>To provide an idea of the <strong>amount of data</strong> handled during the tests, the following charts show the <strong>number of keys stored per node</strong>.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Cache Entries</h2>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/cache_entries_redis_stack_100_nodes_079c96b8ad.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/cache_entries_redis_stack_100_nodes_079c96b8ad.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/cache_entries_redis_stack_100_nodes_079c96b8ad.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/cache_entries_redis_stack_100_nodes_079c96b8ad.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/cache_entries_redis_stack_100_nodes_079c96b8ad.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Cache entries Redis Stack 7.2 - 100 nodes" title="undefined"/><figcaption>Cache entries Redis Stack 7.2 - 100 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/cache_entries_redis_8_50_nodes_f1e5831e15.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/cache_entries_redis_8_50_nodes_f1e5831e15.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/cache_entries_redis_8_50_nodes_f1e5831e15.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/cache_entries_redis_8_50_nodes_f1e5831e15.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/cache_entries_redis_8_50_nodes_f1e5831e15.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Cache entries Redis 8 - 50 nodes" title="undefined"/><figcaption>Cache entries Redis 8 - 50 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/cache_entries_valkey_8_50_nodes_7af9009820.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/cache_entries_valkey_8_50_nodes_7af9009820.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/cache_entries_valkey_8_50_nodes_7af9009820.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/cache_entries_valkey_8_50_nodes_7af9009820.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/cache_entries_valkey_8_50_nodes_7af9009820.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Cache entries Valkey 8 - 50 nodes" title="undefined"/><figcaption>Cache entries Valkey 8 - 50 nodes</figcaption></figure>
<p>If we take a look at <strong>CPU usage</strong>, we see <strong>more consistent results in Redis 8</strong> than in Valkey 8.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">CPU Usage</h2>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/cpu_usage_redis_stack_100_nodes_0eee7410f9.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/cpu_usage_redis_stack_100_nodes_0eee7410f9.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/cpu_usage_redis_stack_100_nodes_0eee7410f9.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/cpu_usage_redis_stack_100_nodes_0eee7410f9.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/cpu_usage_redis_stack_100_nodes_0eee7410f9.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CPU usage Redis Stack 7.2 - 100 nodes" title="undefined"/><figcaption>CPU usage Redis Stack 7.2 - 100 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/cpu_usage_redis_8_50_nodes_f1f6d2d4e1.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/cpu_usage_redis_8_50_nodes_f1f6d2d4e1.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/cpu_usage_redis_8_50_nodes_f1f6d2d4e1.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/cpu_usage_redis_8_50_nodes_f1f6d2d4e1.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/cpu_usage_redis_8_50_nodes_f1f6d2d4e1.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CPU usage Redis 8 - 50 nodes" title="undefined"/><figcaption>CPU usage Redis 8 - 50 nodes</figcaption></figure>
<p>To conclude the comparison of the collected metrics, let’s take a look at the <strong>network outbound throughput</strong> of the nodes.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Network Out Throughput</h2>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/network_out_throughput_redis_stack_100_nodes_f6d43d0c2e.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/network_out_throughput_redis_stack_100_nodes_f6d43d0c2e.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/network_out_throughput_redis_stack_100_nodes_f6d43d0c2e.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/network_out_throughput_redis_stack_100_nodes_f6d43d0c2e.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/network_out_throughput_redis_stack_100_nodes_f6d43d0c2e.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Network out throughput Redis Stack 7.2 - 100 nodes" title="undefined"/><figcaption>Network out throughput Redis Stack 7.2 - 100 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/network_out_throughput_redis_8_50_nodes_0d1240ce7a.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/network_out_throughput_redis_8_50_nodes_0d1240ce7a.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/network_out_throughput_redis_8_50_nodes_0d1240ce7a.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/network_out_throughput_redis_8_50_nodes_0d1240ce7a.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/network_out_throughput_redis_8_50_nodes_0d1240ce7a.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Network out throughput Redis 8 - 50 nodes" title="undefined"/><figcaption>Network out throughput Redis 8 - 50 nodes</figcaption></figure>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/network_out_throughput_valkey_8_50_nodes_b5cfe805c8.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/network_out_throughput_valkey_8_50_nodes_b5cfe805c8.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/network_out_throughput_valkey_8_50_nodes_b5cfe805c8.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/network_out_throughput_valkey_8_50_nodes_b5cfe805c8.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/network_out_throughput_valkey_8_50_nodes_b5cfe805c8.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Network out throughput Valkey 8 - 50 nodes" title="undefined"/><figcaption>Network out throughput Valkey 8 - 50 nodes</figcaption></figure>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Final Conclusions</h2>
<p>The new <strong>I/O threading</strong> implementation included in Redis 8 and Valkey 8 truly <strong>makes a difference compared to previous implementations</strong>. By using multiple threads to write command results to the socket, the load on the main thread is significantly reduced, enabling an <strong>impressive increase in performance per node</strong>.</p>
<p>From the test data, we can conclude that a <strong>performance improvement of 90–95%</strong> was achieved.</p>
<p>Using <strong>Redis 8</strong>, with the improvements it introduces and especially with its I/O Threading implementation, we can achieve a <strong>considerable reduction in resource consumption</strong>. After the tests, we were able to handle peak periods using half the number of nodes per cluster while increasing CPU allocation from 1 to 2 per node.</p>
<p>If we look only at the <strong>Redis metrics presented here</strong> (and several others omitted because they were less interesting), Redis 8 and Valkey 8 show very similar performance. However, we also reviewed logs and client application metrics. There we observed that <strong>Redis 8 behaved more consistently than Valkey 8</strong>. It maintained more stable throughput rates throughout the tests, while Valkey 8 showed some fluctuations.</p>
<p><strong>Redis 8</strong>, after returning to the Open Source world, has demonstrated <strong>impeccable performance</strong>. It has also shown a <strong>higher level of optimization</strong>, in addition to behaving <strong>more stably and consistently</strong> under different io-thread configurations.</p>
<p>For all these reasons, <strong>we are sticking with Redis 8</strong>, at least for now.</p>
<p><strong>References</strong></p>
<ul>
<li><a href="https://redis.io/blog/redis-8-0-m03-is-out-even-more-performance-new-features/" target="_blank">Redis 8.0-M03 is out. Even more performance &amp; new features</a>, Redis Blog</li>
<li><a href="https://redis.io/blog/memtier_benchmark-a-high-throughput-benchmarking-tool-for-redis-memcached/" target="_blank">memtier_benchmark: A High-Throughput Benchmarking Tool for Redis &amp; Memcached</a>, Redis Blog</li>
<li><a href="https://github.com/RedisLabs/memtier_benchmark" target="_blank">Github RedisLabs</a></li>
<li><a href="https://github.com/redis/lettuce" target="_blank">Github Redis Lettuce</a></li>
</ul>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Pablo Salvador ]]>
        </dc:creator>
        <title>Product mindset: purpose, user, and value</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/product-mindset-purpose-user-value/</link>
        <pubDate>Thu, 07 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/product-mindset-purpose-user-value/</guid>
        <description>There’s a question that helps determine whether an initiative is truly focused: what changes, for whom it changes, and how we’ll know it has changed. When this isn’t clear, the risk is starting to build, filling the backlog, and delivering outputs without a clear vision of the impact we want to create. In this post, we’ll show you how to approach a product mindset.
</description>
        <content:encoded>
            <![CDATA[
                <p>If I had 30 seconds to know whether an initiative is on the right track, I would ask this question:</p>
<p><strong>What changes, for whom does it change, and how will we know it has changed?</strong></p>
<p>When this isn’t clear, what usually happens is that we start with energy, the backlog grows, we deliver things… and a few weeks later someone asks: <em>“okay, and what was this for?”</em> And it’s usually not a problem of effort, but <strong>a problem of focus</strong>.</p>
<p>For me, a product mindset is not about roles, ceremonies, or tools. It’s about putting the <strong>focus</strong> on three things before we start building: <strong>what problem we want to solve, for whom, and what value we expect to generate</strong>.</p>
<p><strong>The most common mistake is starting with the “what.”</strong> Early conversations revolve around what needs to be built, expected deliverables, timelines, who does it, and where we track it. These are valid questions. The problem is that if we start there, we risk organizing ourselves around executing something that might not have been the most important thing.</p>
<p>That’s why, before going into execution, it’s worth <strong>grounding purpose, user, and value</strong> with these questions:</p>
<ul>
<li>Why are we doing this? What problem are we trying to solve?</li>
<li>Who is the real user?</li>
<li>What improvement do we expect to see and how will we notice it?</li>
</ul>
<p>If this isn’t clear, jumping into the backlog too early won’t help. This often happens with initiatives that already come framed like this:</p>
<ul>
<li>“We need a dashboard.”</li>
<li>“We need to automate this process.”</li>
<li>“We want a new screen.”</li>
</ul>
<p>The risk here is <strong>accepting the solution without fully understanding the need</strong>. It happens, for example, with requests like: <em>“automate request approvals.”</em> Up to that point, what we have is a solution. The useful conversation starts when you ask: <em>“okay, but for what purpose?”</em> And then the real problem emerges: <strong>reducing response times and avoiding errors</strong>. From there, you can be more precise:</p>
<ul>
<li><strong>User</strong>: the operations team managing the requests and the end customer affected by delays.</li>
<li><strong>Expected value</strong>: moving from 5 days to 24 hours and reducing rework.</li>
<li><strong>Decision</strong>: before automating, it might be better to remove redundant validations, clarify criteria, and define exceptions.</li>
</ul>
<p>The underlying need hasn’t changed. <strong>What changes is the quality of the decision</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Product is the combination of purpose, user, and value</h2>
<p>When we talk about <strong>product</strong>, for me there are <strong>three elements</strong> that cannot be missing: <strong>purpose, user, and value</strong>. If one of these is missing, it’s easy to fall into a dangerous dynamic where we work a lot but with unclear impact.</p>
<ul>
<li><strong>Without a user, value becomes abstract</strong>: we don’t know for whom we are improving something or what change we want to create. This also applies when the user is internal. Whether they are in Operations, Technology, Risk, or Finance doesn’t change the core idea: we still need to define who they are, what friction they face, and what improvement would truly be valuable to them.</li>
<li><strong>Without value, the user becomes an empty description</strong>. In this post we won’t go deep into what value means, but when I talk about <a href="https://www.paradigmadigital.com/techbiz/los-productos-digitales-lo-importante-valor/" target="_blank">value</a>, I don’t mean just business value. It can appear at different levels:
<ul>
<li><strong>User value</strong>: less friction, more clarity, fewer waits, fewer errors.</li>
<li><a href="https://www.paradigmadigital.com/techbiz/podcast-metricas-valor-negocio" target="_blank">Business value</a>: more adoption, lower cost, less risk, better conversion.</li>
<li><a href="https://www.paradigmadigital.com/techbiz/podcast-metricas-produccion-time-to-market" target="_blank">Delivery system value</a>: higher quality, more stability, less rework, fewer artificial urgencies.</li>
</ul>
</li>
<li><strong>Without purpose, everything sounds reasonable but is hard to prioritize</strong>. There’s a useful distinction here that connects with <a href="https://www.youtube.com/watch?v=Ppd4BxcbbNI" target="_blank">Simon Sinek’s Golden Circle</a>: it’s not the same to talk about the <strong>why</strong> as it is to talk about the <strong>what for</strong>. The <strong>why</strong> refers to the purpose of the initiative. The <strong>what for</strong> translates that purpose into impact—the change we want to create.</li>
</ul>
<p>What matters is that <strong>something changes in an observable way</strong>. If nothing visible changes, we are probably not creating value—we’re just doing things.</p>
<p>A good question to ground this is: <em>What real improvement will the user experience if this works?</em></p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">How to bring this into daily work</h2>
<ol>
<li><strong>Start with the problem and value, not the deliverable</strong>.</li>
</ol>
<p>Before talking about solutions, be clear about what pain you want to solve, for whom, and what improvement you expect. Tools like a well-focused <a href="https://www.paradigmadigital.com/transformacion-organizacional-rev/agile-si-implica-planificar/" target="_blank">Inception</a> help align purpose, user, value, and how we will know we’re on track.</p>
<p>For this starting point, it helps a lot to <strong>write down</strong> something as simple as:</p>
<ul>
<li><strong>Our objective</strong>: we are here to...</li>
<li><strong>The current problem</strong>: today, what happens is...</li>
<li><strong>Who it affects</strong>: this mainly affects...</li>
<li><strong>What we expect</strong>: if everything goes well, it should change...</li>
<li><strong>How we’ll know</strong>: we’ll notice it because we’ll see...</li>
</ul>
<p>Don’t see it as bureaucracy. See it as a way to align better and prevent the backlog from becoming just a task list.</p>
<ol start="2">
<li><strong>Connect strategy, focus, and backlog</strong>.</li>
</ol>
<p>If an initiative is not connected to a real priority, the backlog ends up full of work—but not necessarily value. That’s why it’s important to connect strategy, <a href="https://www.paradigmadigital.com/transformacion-organizacional-rev/desbloqueando-potencial-priorizacion-frameworks-mas-importantes" target="_blank">prioritization</a>, and <a href="https://www.paradigmadigital.com/transformacion-organizacional-rev/vision-accion-construye-primer-roadmap" target="_blank">roadmap</a>.</p>
<ol start="3">
<li><strong>Translate intention into real tracking</strong>.</li>
</ol>
<p>If you say you’re aiming for impact, you need to review it. It helps to define objectives properly and complement them with observable outcomes, without confusing activity with impact. For this, you can use <a href="https://www.paradigmadigital.com/techbiz/okrs-agile-producto-valor/" target="_blank">OKRs</a>, paying attention to their <a href="https://www.paradigmadigital.com/transformacion-organizacional-rev/odiosos-ocho-antipatrones-okr/" target="_blank">anti-patterns</a>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion</h2>
<p>Working with a <strong>product mindset</strong> is about <strong>making better decisions from the start</strong>. The next time you kick off an initiative, I would pause for a minute on these three questions:</p>
<ul>
<li><strong>What specific value do we want to create?</strong></li>
<li><strong>For whom, exactly?</strong></li>
<li><strong>How will we know we are achieving it?</strong></li>
</ul>
<p>Because value doesn’t appear at the end. It’s decided at the beginning and reviewed along the way.</p>
<p><strong>Your backlog shouldn’t prove that you’re working. It should prove that you’re changing something valuable for someone.</strong> I’ll read you in the comments! 👇</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Juan Martínez Cortés ]]>
        </dc:creator>
        <title>Analyzing the Energy Market: What Do we Do About Technical Debt?</title>
        <link>https://en.paradigmadigital.com/techbiz/analyzing-energy-market-what-do-we-do-technical-debt/</link>
        <pubDate>Tue, 05 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/techbiz/analyzing-energy-market-what-do-we-do-technical-debt/</guid>
        <description>The right technology, poorly integrated, can be worse than an imperfect technology that is well executed. In 2026, the energy sector is proving that leadership is not just about innovating, but about having the technical and organizational discipline to bring that innovation into production.
</description>
        <content:encoded>
            <![CDATA[
                <p>We’ve spent months hearing about the future of energy. About AI that will change everything. About data as the new oil. About digital transformation as a strategic imperative.</p>
<p>The future is already here. <strong>And it’s full of technical debt</strong>.</p>
<p>What the market is revealing in this second quarter of 2026 is not a story of technological promises. It’s a story of execution—and of who is capable of delivering it and who is not. Leading energy companies are not differentiating themselves today by the AI model they have chosen or by the cloud provider they sign contracts with. <strong>They differentiate themselves by</strong> something far more prosaic and far more difficult: <strong>the ability to bring complex systems into production within operational environments that have accumulated patches for decades</strong>.</p>
<p>Analyzing market behavior so far this year, <strong>five perspectives</strong> emerge that will define who leads the second half of this decade. These are not trends. They are diagnoses.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Perspective 1: your agentic AI has a plumbing problem, not an algorithm problem</h2>
<p>Until recently, Artificial Intelligence in the energy sector lived in PowerPoint presentations and isolated pilot projects. In 2026, <strong>the conversation has matured toward Agentic AI</strong>: autonomous systems embedded in critical workflows that not only recommend decisions but execute them—balancing loads in milliseconds, coordinating predictive maintenance, or managing distributed resource portfolios.</p>
<p>The operational reality we’ve observed in 2026 is this: <strong>it’s not the algorithm slowing you down. It’s the data architecture</strong> you’re trying to run it on.</p>
<p>Organizations that have failed to scale their agents haven’t done so because they chose the wrong model. They failed because <strong>they tried to automate on top of a fragmented data ecosystem—legacy silos, undocumented pipelines, and governance that exists in theory but not in production</strong>. Automating a broken process doesn’t fix it—it scales it. And failure scales with it.</p>
<p>Industry leaders are being forced to take the step no one wants to take: <strong>redesign the foundations</strong>. Not patch them—redesign them. That means abandoning cosmetic integration approaches and building truly AI-native architectures: unified data lakes, real governance, pipelines with end-to-end observability. Only from there can an agent reduce downtime in double digits. <strong>Only from there does AI stop being a cost and become a driver of financial efficiency</strong>.</p>
<p>This is not a science problem. It’s an engineering problem. And engineering is hard work.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Perspective 2: data sovereignty is not a regulatory option, it’s a business condition</h2>
<p>The <strong>energy transition</strong> demands orchestration at a scale no single company can solve alone. Integrating the power grid with electric mobility, HVAC systems, and intraday flexibility markets requires seamless data exchange between actors who are both partners and competitors.</p>
<p>At the same time, <strong>attacks on critical infrastructure</strong> continue to rise. Digital sovereignty is no longer a legal debate—it is a <strong>national and European security imperative</strong>.</p>
<p>Initiatives like <strong>energy data-X or V2G (Vehicle-to-Grid) projects</strong> are proving this in practice: it is possible to <strong>connect smart meters, charging points, and flexibility markets</strong> without losing control over proprietary data assets. The architecture that enables this separates the control plane (who accesses what, under which conditions, under which contract) from the data plane. Open standards become the condition for interoperability. The connector becomes the mechanism of sovereignty.</p>
<p>The conclusion for decision-makers is straightforward: participating in the decentralized energy economy will require federated infrastructure. Companies that do not build this capability today will not be able to monetize their data assets tomorrow. <strong>The sovereign cloud market is not a technological bet—it is the only entry point</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Perspective 3: energy efficiency is no longer reported, it is accounted for</h2>
<p>2026 marks the year sustainability stopped being a corporate reputation exercise and became a high-impact financial operation. This is not rhetoric—it is arithmetic.</p>
<p>The <strong>Energy Savings Certificates (CAE)</strong> system in Spain has reached a level of maturity where verifiable energy savings become liquid, monetizable assets. Every kilowatt-hour saved through infrastructure modernization, industrial process optimization, or efficient technology deployment generates a certificate that energy retailers are required to purchase. ROI is immediate, measurable, and audited.</p>
<p>At the same time, the CSRD directive requires this year <strong>carbon accounting as rigorous as traditional financial accounting</strong>. This is not a future deadline—it is happening now.</p>
<p>Companies lacking <strong>software platforms capable of automating</strong> consumption data capture, simulating decarbonization scenarios before committing CAPEX, and integrating environmental decision-making into executive governance will not lose sustainability points—they will lose financial competitiveness. Energy efficiency is no longer managed by the sustainability department. It is managed by business leadership. And it is executed through data tools.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Perspective 4: your grid needs a twin that thinks, not one that represents</h2>
<p>Power grids are operating at their limits. <strong>Mass electrification, intermittent renewable generation, and the rise of data centers</strong>, paradoxically driven by the same AI meant to optimize the grid, have turned transmission and distribution infrastructure into the primary <strong>bottleneck of the energy transition</strong>.</p>
<p>The market’s response has been the <strong>Digital Twin</strong>. The reality of 2026 shows that a Digital Twin as a 3D representation is necessary—but not sufficient. What operators need today are <strong>Simulation Twins</strong>: decision engines that ingest real-time IoT data and enable predictive scenario testing. What happens if a hyperscale data center suddenly demands a massive load spike in four hours? How does the grid respond to a heatwave with unusually high photovoltaic penetration? Where does the system break?</p>
<p>To get there, operators must <strong>modernize their legacy platforms</strong>—there is no alternative. A rigid infrastructure designed for unidirectional flows cannot process massive bidirectional transactions or interact with the cloud at the latency required by intraday markets. Modernization is not an IT project—it is the only way to manage assets resiliently without relying solely on physical expansion projects that take years and cost hundreds of millions. Those who solve it through platform engineering will gain operational flexibility. Those who don’t will depend on hardware.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Perspective 5: technology that no one adopts does not exist</h2>
<p>We can deploy the most sophisticated architecture in the market, but if the organization that must operate it still functions with logic from ten years ago, <strong>the value evaporates</strong> before reaching production.</p>
<p>April 2026 makes this clear: <strong>geopolitical volatility, supply chain bottlenecks, and the speed of AI innovation do not forgive slow organizations</strong>. This is not a talent or budget problem—it is an organizational design problem.</p>
<p>Digital transformation in the energy sector is not solved with methodologies—it is solved with operational culture. <strong>Multidisciplinary teams</strong> where engineering, cybersecurity, and business work in the same sprint, toward the same goal, with shared visibility over data. Structures that prioritize value flow over hierarchy. Organizations capable of absorbing regulatory changes, technological disruption, or supply crises without freezing.</p>
<p>This capability has a name—and it cannot be bought as a tool. It is built by redesigning how teams make decisions, prioritize work, and deliver value. Companies that understand this are systematically reducing technical debt, accelerating time-to-market, and building structures that withstand the next disruption. Those who don’t will continue automating broken processes and calling it digital transformation.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion: the risk is not technological, it is integration</h2>
<p>If 2026 leaves us with one clear lesson, it is this: <strong>the right technology, poorly integrated, is worse than imperfect technology that is well executed</strong>.</p>
<p>The forces shaping the market today—agentic AI, data sovereignty, efficiency monetization, predictive simulation, and organizational agility—are not independent. <strong>They either reinforce each other or cancel each other out</strong>. A company with excellent agentic AI on fragmented data will fail. A company with a perfect data platform but no ability to iterate on it will also fail.</p>
<p>Success in this industry no longer belongs to those with the best technology. It belongs to those with the discipline to integrate it, the engineering to sustain it, and the culture to adapt it. There is no shortcut—and no mystery.</p>
<p>It’s time to lead the present to secure the energy of tomorrow.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ David García Luna ]]>
        </dc:creator>
        <title>The Speed Paradox: Why XP (not AI) Will Keep your Team from Burning Out</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/speed-paradox-xp-not-ai-will-keep-team-burn-out/</link>
        <pubDate>Thu, 30 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/speed-paradox-xp-not-ai-will-keep-team-burn-out/</guid>
        <description>AI can accelerate delivery, but it shouldn’t turn teams into machines. In this new context, XP becomes relevant again for more than just its technical practices—it sets healthy boundaries on pace and protects team sustainability. We’ll walk you through how in this post.
</description>
        <content:encoded>
            <![CDATA[
                 <h2 class="block block-header h--h30-15-400 left  add-last-dot">The digital rat race</h2>
<p>The promise of Generative Artificial Intelligence is seductive: instant code, solutions in seconds, and skyrocketing productivity. But for project management roles, this raises an uncomfortable question: <strong>if machines don’t get tired, do we expect our human teams to keep up with that pace?</strong> In this productivity boom, XP’s “sustainable pace” is the only guarantee that your team won’t implode from burnout.</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/carrera_rata_digital_ia_52b5b15ddb.jpg"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/carrera_rata_digital_ia_52b5b15ddb.jpg 1920w,https://www.paradigmadigital.com/assets/img/resize/big/carrera_rata_digital_ia_52b5b15ddb.jpg 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/carrera_rata_digital_ia_52b5b15ddb.jpg 910w,https://www.paradigmadigital.com/assets/img/resize/small/carrera_rata_digital_ia_52b5b15ddb.jpg 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="the digital rat race: work, innovation, financial pressure, burnout" title="Digital rat race"/></article>
<p>This is where <a href="https://en.paradigmadigital.com/organizational-transformation-rev/ai-xp-from-craftsmanship-manifesto-to-ai-era/" target="_blank">Extreme Programming (XP) comes back into the spotlight</a>, not as an engineering methodology, but as a <strong>manifesto for human sustainability</strong>. Paradoxically, to move at AI speed, we need the <strong>safety brakes</strong> and <strong>psychological well-being</strong> that Kent Beck designed in the ’90s.</p>
<h2 class="block block-header h--h30-15-400 left  ">How does XP ensure well-being in “high-speed” environments?</h2>
<p>Unlike other agile frameworks that sometimes turn into a “ticket factory,” <strong>XP has explicit principles around team mental health</strong>. These are not HR suggestions—they are strict technical rules.</p>
<ul>
<li><strong>The Sustainable Pace rule</strong></li>
</ul>
<p>XP explicitly forbids heroics. The premise is simple: a tired person introduces more <em>bugs</em> in one hour than they can fix in two. XP states that if overtime happens one week, it’s an exception. If it happens two weeks in a row, the problem lies in the plan, not the team.</p>
<ul>
<li><strong>Psychological safety (the value of “courage”)</strong></li>
</ul>
<p>XP requires the courage to say <em>“no”</em> or <em>“I don’t know”</em>, but it also requires leadership to respect and listen to that truth. By eliminating fear-based estimation and replacing it with “accepted responsibility”—where the person doing the work estimates the work—anxiety around unrealistic deadlines is drastically reduced.</p>
<ul>
<li><strong>The end of the “lone wolf” concept</strong></li>
</ul>
<p>Through <em>Collective Code Ownership</em>, XP removes the stress of being “the only person who knows how this works.” If someone gets sick or goes on vacation, the project doesn’t stop—and no one has to take emergency calls from the beach.</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/bienestar_entornos_alta_velocidad_2d2956b5fc.jpg"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/bienestar_entornos_alta_velocidad_2d2956b5fc.jpg 1920w,https://www.paradigmadigital.com/assets/img/resize/big/bienestar_entornos_alta_velocidad_2d2956b5fc.jpg 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/bienestar_entornos_alta_velocidad_2d2956b5fc.jpg 910w,https://www.paradigmadigital.com/assets/img/resize/small/bienestar_entornos_alta_velocidad_2d2956b5fc.jpg 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="well-being in high-speed environments" title="Well-being in high-speed environments"/></article>
<h2 class="block block-header h--h30-15-400 left  ">Is AI the end of Pair Programming or its rebirth?</h2>
<p>One of the most controversial XP practices has always been <em>Pair Programming</em> (two people, one computer). With tools like Copilot, ChatGPT, Windsurf, Cursor, and many others, many managers ask: <em>“Why pay for two people if I have AI?”</em></p>
<p>To the question of whether AI will replace developers, we can respond with an analogy: <em>“Autopilot in airplanes has been around for decades, optimizing work—but it has never replaced the pilot. Why is the human factor still necessary?”</em></p>
<p>In software teams, we cannot rely solely on <em>Vibe Coding</em> (just as we cannot rely only on autopilot in aviation).</p>
<p><em>Vibe Coding</em> produces code that seems to work but is incomprehensible and ultimately unmaintainable, leading to <strong>production failures due to lack of human oversight</strong>, with much higher long-term cost and impact.</p>
<p>To avoid this scenario, XP proposes a <strong>crucial evolution</strong>:</p>
<ul>
<li><strong>From “Driver and Navigator” to “Cyborg Pairing”</strong>. AI doesn’t replace people—it elevates the pair. In this new model, AI acts as a “learning accelerator” for junior profiles, reducing the time spent searching for information—but (and this is critical) <strong>without removing the need for human validation</strong>.</li>
<li><strong>The danger of “Vibe Coding”</strong>. Martin Fowler and Kent Beck warn about the risk of accepting AI-generated code just because it “seems to work.” XP acts as a counterbalance: human <em>Pair Programming</em> remains essential for strategy and architectural design—areas where AI tends to hallucinate or introduce complex technical debt. AI writes, humans navigate, and XP sets the traffic rules.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/pair_programming_06934ea815.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/pair_programming_06934ea815.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/pair_programming_06934ea815.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/pair_programming_06934ea815.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/pair_programming_06934ea815.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Pair Programming with AI" title="Pair Programming with AI"/></article>
<h2 class="block block-header h--h30-15-400 left  ">TDD: why work twice as hard to go faster?</h2>
<p>XP requires writing the test <em>before</em> the code (Test-Driven Development).</p>
<ul>
<li><strong>TDD is not a testing technique—it’s an anxiety management technique</strong>. Knowing you have an automated safety net that alerts you in seconds if something breaks gives the team “extreme” confidence.</li>
<li><strong>AI excels at generating tests</strong>. Using AI to generate the TDD test suite before writing the code is the ultimate productivity hack. It turns AI into the strictest quality gatekeeper.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The death of documentation (as we know it)</h2>
<p>XP has a reputation for lacking documentation, which is false—but it stems from breaking away (with the Agile manifesto) from the traditional approach of the ’80s (pages and pages of documentation rarely used).</p>
<ul>
<li><strong>XP relies on clean code practices and self-explanatory code</strong> that others can understand without context.</li>
<li><strong>Today, AI tools can read XP’s clean code and automatically generate business documentation</strong>. But this only works if the team follows XP’s discipline of “Simplicity” and proper naming. If the code is a mess, AI will document a mess.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion: returning to the human to survive the artificial</h2>
<p>In the age of AI, speed is a <em>commodity</em>. Anyone can generate code quickly. A team’s competitive advantage is no longer <strong>how much</strong> code it produces, but its ability to <strong>maintain it, adapt it</strong>, and—above all—avoid imploding from burnout in the process. XP is the methodology that reminds us that software is built by people, for people.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Vanessa Davo Parreño ]]>
        </dc:creator>
        <title>How to Use GSAP to Create Particle Effects in the DOM</title>
        <link>https://en.paradigmadigital.com/dev/how-use-gsap-create-particle-effects-dom/</link>
        <pubDate>Tue, 28 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/how-use-gsap-create-particle-effects-dom/</guid>
        <description>You don’t need to fill a website with animations to improve the experience. Sometimes, a well-timed visual feedback is enough. A button, a burst of particles, and GSAP can turn a simple action like hitting “like” into something much more memorable. In this post, we’ll show you how to do it step by step.
</description>
        <content:encoded>
            <![CDATA[
                <p>Admit it: you’ve also clicked a “Like” button a thousand times just because it triggered a burst of color or a shower of hearts. I don’t blame you—I’ve done it too. These kinds of microinteractions are what create that satisfying feeling that <strong>the interface is alive</strong>.</p>
<p>This detail, which might seem trivial, is precisely what separates a well-crafted, thoughtfully designed digital product from a generic, dull application.</p>
<p>That said, there’s no need to overload your website with unnecessary animations. But when you use them in the right place (like on that primary action button), you achieve something very powerful: giving users immediate and satisfying feedback.<br>
And the truth is, creating these kinds of animations is much easier than it seems. So in today’s post, we’ll build, step by step, <strong>a particle-based microinteraction for a like button</strong>.</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img data-src="https://www.paradigmadigital.com/assets/cms/like_liked_transicion_b54a037d63.gif" class="lazy-img" title="Like button" alt="like button to liked transition"></article>
<h2 class="block block-header h--h30-15-400 left  ">What tools are we going to need?</h2>
<p>For this project, we’ll use <strong>HTML, CSS, and JavaScript</strong>, but the real animation engine will be <a href="https://gsap.com/" target="_blank">GSAP</a>.</p>
<p>If you haven’t heard of GSAP, it’s one of the <strong>most popular tools for animating almost anything on the web</strong>. It saves a lot of time (and lines of code) compared to doing it natively.</p>
<p>I’ve prepared a CodePen example so you can try it out and see the final result right away, but we’ll still go through it step by step. You can check it out here: <a href="https://codepen.io/editor/vanessadavo/pen/019d7c5e-bd13-744a-b078-08f91a48f5f8" target="_blank">Like Button (GSAP)</a></p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">HTML Structure: defining the semantic structure of the button</h2>
<p>To get started, we’ll <strong>set up a basic HTML structure</strong>. The most important part here—besides linking our local style and logic files—is <strong>importing the required libraries</strong> so the particle animation can work properly.</p>
<pre><code class="language-html">&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./style.css&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Like Button&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;!-- GSAP --&gt;
    &lt;script src=&quot;https://unpkg.com/gsap@3/dist/gsap.min.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://assets.codepen.io/16327/Physics2DPlugin3.min.js&quot;&gt;&lt;/script&gt;

    &lt;!-- SCRIPT --&gt;
    &lt;script src=&quot;./script.js&quot;&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>For this effect to work properly, we need to import <strong>two key pieces</strong> from the GSAP ecosystem:</p>
<ul>
<li><strong>GSAP Core</strong>: this is the main engine of the library. It allows us to create timelines and manage the basic properties of the elements we’re going to animate.</li>
<li><strong>Physics2DPlugin</strong>: this plugin acts as the physics simulation engine for the animation. It lets us define parameters such as gravity, velocity, and dispersion angle, delegating all the complex mathematical calculations to GSAP to achieve realistic trajectories.</li>
</ul>
<p><em><strong>Note:</strong> the Physics2D plugin is a premium GSAP tool. In this example, we use it via a specific URL for CodePen usage, but it requires a license if you plan to implement it in a commercial project.</em></p>
<p>Now, inside our &lt;body&gt; (and always before the &lt;script&gt; tags), we’ll add the <strong>button structure</strong>.</p>
<pre><code class="language-html">&lt;button id=&quot;like-btn&quot;&gt;
  &lt;div id=&quot;emitter&quot;&gt;
    &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;none&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;currentColor&quot;&gt;
      &lt;path stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; d=&quot;M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12Z&quot; /&gt;
    &lt;/svg&gt;
  &lt;/div&gt;
  &lt;span&gt;Like&lt;/span&gt;
&lt;/button&gt;
</code></pre>
<p>In this structure, we’ve defined <strong>two important identifiers</strong>:</p>
<ul>
<li><strong>like-btn</strong>: this is the ID of the main button. We’ll use it in JavaScript to listen for the click event and to manage style or text changes when the user interacts with it.</li>
<li><strong>emitter</strong>: this element is essential. It acts as the container for the icon, but its main purpose is to serve as the &quot;origin point&quot; for the particles. By keeping it separate, we can ensure that the explosion starts exactly from the position of the heart, rather than from any part of the button.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">CSS Styles: preparing the look &amp; feel and the container</h2>
<p>To define the styles, we’ll create a file called <strong>style.css</strong>. The first step is to import the typography and define a set of CSS variables (<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascading_variables/Using_custom_properties" target="_blank">Custom Properties</a>). This will allow us to <strong>manage colors and reusable values</strong> from a single place, making our design much easier to maintain.</p>
<pre><code class="language-css">@import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&amp;display=swap');

:root{
  --color-bg: #e9ecef;
  --color-primary: #495057;
  --color-accent: #ff3562;
  --color-on-accent: #ffffff;

  --text-sm: 1.1em;
  --text-md: 1.8rem;
    
  --transition-default: all 0.25s ease;
}
</code></pre>
<p>Next, we'll define the <strong>global style</strong> to clear the margins and center our button on the screen.</p>
<pre><code class="language-css">*{
  font-family: &quot;DM Sans&quot;, sans-serif;
}

body,
html {
  height: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
}

body {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  min-height: 100vh;
    background-color: var(--color-bg);
}
</code></pre>
<p>In addition, we'll set up the <strong>.particles-container</strong> class. Although we'll create this container dynamically in JavaScript, for the sake of code clarity, we'll define its style here:</p>
<pre><code class="language-css">.particles-container {
  position: absolute;
  left: 0;
  top: 0;
  overflow: visible;
  z-index: 2;
  pointer-events: none;
  opacity: 0;
}
</code></pre>
<p>In the .particles-container class, there are a few properties that deserve special attention:</p>
<ul>
<li><strong>z-index: 2:</strong> the z-index property controls the stacking order of elements along the Z-axis (depth). By default, elements have a value of 1 (or auto). If we want the particles to explode <em>above</em> the button and not be hidden behind it, we need to assign them a higher value—in this case, 2.</li>
<li><strong>pointer-events: none:</strong> this property is key. It prevents the particles from interfering with mouse interactions. This way, even if a particle passes over the cursor, the user can still click the button without any issues.</li>
<li><strong>opacity: 0:</strong> initially, the container is invisible. We’ll only reveal it with GSAP at the exact moment of the animation.</li>
</ul>
<p>The next step is to <strong>define the style of our button</strong>. You’ll notice that we make use of the <strong>CSS variables defined earlier</strong>, which helps keep the code cleaner and more consistent.</p>
<p>We’ll also prepare the <strong>.clicked</strong> state. This class will be added via JavaScript when the button is clicked, allowing us to modify the style of the button and its inner elements (such as the icon and the text):</p>
<pre><code class="language-css">button{
  border-radius: 8px;
  cursor: pointer;
  padding: 12px 26px;
  font-size: var(--text-md);
  border: 2px solid var(--color-primary);
  display: flex;
  align-items: center;
  gap: 12px;
  color: var(--color-primary);
  background-color: #e9ecef;
  transition: var(--transition-default);
}

button.clicked{
  border-color: var(--color-accent);
  background-color: var(--color-accent);
  color: var(--color-on-accent);
}

button svg{
  width: var(--text-sm);
  fill: var(--color-primary);
  stroke: var(--color-primary);
  transition: var(--transition-default);
}

button.clicked svg{
  fill: var(--color-on-accent);
  stroke: var(--color-on-accent);
}
</code></pre>
<p>Finally, we need to <strong>define the particle's appearance</strong>. In this example, we've chosen a design featuring circular dots. However, you can customize this style however you like.</p>
<pre><code class="language-css">.dot {
  position: absolute;
  border-radius: 50%;
}
</code></pre>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">JavaScript Logic: building the particle system with GSAP</h2>
<p>It’s time to take action. Now we’ll set up the <strong>logic required for the button to respond to clicks</strong> and generate the particle explosion. We’ll manage this entire process from our <strong>script.js</strong> file.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Step 1. Register GSAP plugins</h3>
<p>The first thing we need to do is <strong>register the plugin with the GSAP core engine</strong>. This is essential so the library can recognize the physical properties we’ll use later.</p>
<pre><code class="language-javascript">gsap.registerPlugin(Physics2DPlugin);
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Step 2. Declare the elements</h3>
<p>In this step, we’ll <strong>capture the DOM elements</strong> we’re going to interact with. We’ll also take the opportunity to dynamically create the container where our particles will live:</p>
<pre><code class="language-javascript">// Main emitter element (used as explosion origin)
const emitter = document.getElementById(&quot;emitter&quot;);

// Like button + text
const likeBtn = document.getElementById(&quot;like-btn&quot;);
const text = likeBtn.querySelector(&quot;span&quot;);

// Container that holds all particles
const container = document.createElement(&quot;div&quot;);
container.className = &quot;particles-container&quot;;
document.body.appendChild(container);
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Step 3. GSAP configuration and states</h3>
<p>At this point, we’ll <strong>define the variables that control the behavior of our animation</strong>. What’s interesting about this approach is that, by simply tweaking these values, you can completely transform the effect.</p>
<p>I encourage you to experiment with parameters like <strong>velocity or gravity</strong> to see how the physics of the motion changes. In addition, in this step we’ll also <strong>declare the initial state</strong> of the button:</p>
<pre><code class="language-javascript">const emitterSize = 2;        // spawn area radius
const dotQuantity = 12;     // number of particles
const dotSizeMax = 12;      // max particle size
const dotSizeMin = 4;       // min particle size
const speed = 0.6;            // initial velocity multiplier
const gravity = 0.1;          // gravity strength

// Toggle state (liked / not liked)
let liked = false;
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Step 4. Explosion setup</h3>
<p>In this step, we’ll create a <strong>reusable function</strong> responsible for generating the &quot;explosion&quot; every time it is called. The idea is to build a <strong>GSAP timeline</strong> that contains the individual animations for each particle.</p>
<pre><code class="language-javascript">const explosion = createExplosion(container);

function createExplosion(container) {
  const tl = gsap.timeline({ paused: true });

  for (let i = 0; i &lt; dotQuantity; i++) {

    // Create particle element
    const dot = document.createElement(&quot;div&quot;);
    dot.className = &quot;dot&quot;;

    // Assign random color
    const colors = [&quot;#ff4d6d&quot;, &quot;#fb6f92&quot;, &quot;#ff8fab&quot;, &quot;#ffb3c1&quot;, &quot;#cdb4db&quot;, &quot;#a2d2ff&quot;];
    dot.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];

    container.appendChild(dot);

    // Random size &amp; direction (angle in radians)
    const size = gsap.utils.random(dotSizeMin, dotSizeMax, 1);
    const angle = Math.random() * Math.PI * 2;

    // Initial offset inside emitter radius
    const length = Math.random() * (emitterSize / 2 - size / 2);


    gsap.set(dot, {
      x: Math.cos(angle) * length,
      y: Math.sin(angle) * length,
      width: size,
      height: size,
      xPercent: -50,
      yPercent: -50,
      force3D: true,
      scale: gsap.utils.random(0.8, 1.2)
    });

    tl.to(
      dot,
      {
        physics2D: {
          angle: (angle * 180) / Math.PI, // convert to degrees
          velocity: (120 + Math.random() * 200) * speed,
          gravity: 500 * gravity
        },
        duration: 1 + Math.random()
      },
      0
    )
    .to(
      dot,
      {
        opacity: 0,
        scale: 0.5,
        duration: 0.3,
        ease: &quot;power2.in&quot;,
      },
      0.3
    );
  }

  return tl;
}
</code></pre>
<p>In this function, there are a few <strong>technical concepts</strong> we need to understand:</p>
<ol>
<li><strong>Creation loop</strong>. We use a <code>for</code> loop based on the <code>dotQuantity</code> variable to generate all particles at once. Each one gets a random color and size so the explosion doesn’t look artificial or repetitive.</li>
<li><strong>Trajectory calculation</strong>. We use mathematical functions (<code>Math.cos</code> and <code>Math.sin</code>) to position the particles in a circle around the center point. This allows them to shoot out in all directions (360 degrees).</li>
<li><strong>The power of Physics2D</strong>. Instead of manually animating the <code>x</code> and <code>y</code> coordinates, we simply pass an angle, velocity, and gravity to the plugin. GSAP takes care of drawing the perfect parabolic motion.</li>
<li><strong>Synchronization (position parameters)</strong>. You’ll notice that the <code>.to()</code> functions include a <code>0</code> or a <code>0.3</code> at the end. In GSAP, this is called a <a href="https://gsap.com/resources/position-parameter/" target="_blank">Position Parameter</a>.</li>
</ol>
<ul>
<li><strong>The &quot;0&quot;</strong>: forces all particles to start their animation exactly at second zero on the timeline. Without it, particles would appear one after another; with it, they all fire simultaneously, creating the explosion effect.</li>
<li><strong>The &quot;0.3&quot;</strong>: indicates that the particle should start fading out (opacity 0) when the timeline reaches 0.3 seconds, allowing it to disappear while still moving, resulting in a much smoother and more natural effect.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Step 5. Explosion function</h3>
<p>Once we have the animation logic ready, we need a <strong>function that positions the particle container in the correct place and triggers the movement</strong>. Without this step, the particles might appear in a corner of the screen instead of originating from the center of the button.</p>
<pre><code class="language-javascript">function explode(element) {
  const bounds = element.getBoundingClientRect();

  // Move container to element center
  gsap.set(container, {
    x: bounds.left + bounds.width / 2,
    y: bounds.top + bounds.height / 2,
    opacity: 1
  });

  // Restart animation from the beginning
  explosion.restart();
}
</code></pre>
<p>This function is responsible for <strong>positioning the effect in space</strong>: first, we use <strong>getBoundingClientRect()</strong> to calculate the exact coordinates of the button on the screen, and then, using <strong>gsap.set()</strong>, we instantly move the particle container to its center.</p>
<p>Finally, we execute <strong>explosion.restart()</strong> so the animation timeline resets and plays from the beginning with each new click, ensuring the explosion always originates from the correct position.</p>
<h2 class="block block-header h--h20-175-500 left  add-last-dot">Step 6. Click event and final interaction</h2>
<p>To wrap up, we need to <strong>detect when the user interacts with the button and trigger all the logic we’ve implemented</strong>. With the following code, we handle the state change, visual update, and particle launch:</p>
<pre><code class="language-javascript">likeBtn.addEventListener(&quot;click&quot;, () =&gt; {

  // Toggle like state
  liked = !liked;
  text.textContent = liked ? &quot;Liked&quot; : &quot;Like&quot;;

  // Toggle active class (for styling)
  likeBtn.classList.toggle(&quot;clicked&quot;, liked);

  // Button press animation (quick scale feedback)
  gsap.fromTo(
    likeBtn,
    { scale: 1 },
    { scale: 0.9, duration: 0.1, yoyo: true, repeat: 1 }
  );

  // Trigger particle explosion
  liked &amp;&amp; explode(emitter);
});
</code></pre>
<p>In this final block, <strong>two key things happen</strong>:</p>
<ul>
<li><strong>Tactile feedback</strong>: using <code>gsap.fromTo</code>, we create a real press sensation by slightly scaling the button. The use of <code>yoyo: true</code> makes the button automatically return to its original size.</li>
<li><strong>Conditional logic</strong>: thanks to the <code>&amp;&amp;</code> operator, the <code>explode</code> function only runs when the user hits &quot;Like&quot;, preventing particles from triggering when the action is undone.</li>
</ul>
<p>I hope this post has helped you better understand how these kinds of effects work and that, from now on, you feel confident enough to <strong>implement your own particle animations</strong> to add a touch of “magic” to your interfaces. Time to experiment!</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ José Luis Palomino ]]>
        </dc:creator>
        <title>The Importance of Prompt Engineering</title>
        <link>https://en.paradigmadigital.com/dev/importance-prompt-engineering/</link>
        <pubDate>Thu, 23 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/importance-prompt-engineering/</guid>
        <description>A prompt is not a nicely written piece of text or an improvised instruction—it’s code. And like any other code, it requires testing, versioning, continuous evaluation, and a clear operational strategy. Especially when working with agentic systems, multiple models, and workflows where a small error can drastically increase latency, cost, and complexity. We’ll walk you through it in this post.
</description>
        <content:encoded>
            <![CDATA[
                <p>Many people think that generative AI is about throwing questions into the air and crossing your fingers hoping the answer is correct. But have you stopped to think whether the model’s response is actually accurate? Have you considered whether the execution process is efficient? Whether you’re even using the right model?</p>
<p>In this post, we break down the reality. <strong>What happens if you don’t measure latency, cost per token, and the traceability of each call?</strong> Simply put, you end up with an experiment that’s not very useful in a professional environment.</p>
<p>Integrating LLMs into production requires an engineering mindset where the prompt is just the tip of the iceberg of a complex and auditable system.</p>
<h2 class="block block-header h--h30-15-400 left  ">Is prompting a trend or an engineering discipline?</h2>
<p>There is a misconception that simplifies prompt engineering to just writing polite instructions for language models. The reality in development teams is very different. When you try to scale an agentic system, you quickly realize that <strong>the prompt is code</strong> and, as such, <strong>it requires versioning, testing, and constant monitoring</strong>.</p>
<p>We’ve seen organizations embedding prompts directly into their source code, creating an operational nightmare every time they want to tweak a comma or test a new model. <strong>Treating the prompt as an external, managed asset</strong> allows iteration without redeploying the entire microservices infrastructure.</p>
<p>The real problem arises when we move from a simple chat to a network of specialized agents. Here, a <strong>misinterpretation error</strong> in the “supervisor agent” can lead to an endless loop of API calls that skyrocket your monthly bill. Designing a robust AI system means controlling which model responds to each task based on its complexity.</p>
<h2 class="block block-header h--h30-15-400 left  ">How much does each word your model generates actually cost?</h2>
<p>If you don’t have <strong>visibility into token consumption</strong>, you’re navigating blind. Model selection is a matter of process economics. Using high-performance models for simple classification tasks is a waste of resources, negatively impacting both budget and user experience due to accumulated latency.</p>
<p>In our implementations, we <strong>segment tasks</strong>: we reserve heavier models for complex reasoning and use “Flash” versions or local models for metadata extraction or intent classification.</p>
<p>Why settle for the first response? Prompt optimization using <strong>advanced techniques like Few-Shot or Chain of Thought</strong> improves accuracy and reduces the need for retries.</p>
<p>Every failed or hallucinated call means wasted time for the user and unnecessary cost. <strong>End-to-end traceability</strong> becomes essential to identify where efficiency is lost or where the model starts drifting.</p>
<h2 class="block block-header h--h30-15-400 left  ">Why operate a black box without real metrics?</h2>
<p>Observability is the Achilles’ heel of many AI projects. This is where tools like <strong>Langfuse</strong> come into play, shedding light on what happens behind each request.</p>
<p>It’s not enough to know that the system responded—we need to know <strong>how long each node in the execution graph took, which prompt version was used, and whether the retrieved context (<a href="https://en.paradigmadigital.com/techbiz/retrieval-augmented-generation-corporate-usage/" target="_blank">RAG</a> was actually useful for the final answer</strong>.</p>
<p>Having a centralized prompt repository with caching policies reduces retrieval latency and ensures scalability under high demand.</p>
<p><strong>Evaluation cannot be subjective</strong>. We implement “LLM-as-a-judge” systems and test datasets to automatically score toxicity, conciseness, and factual accuracy against a ground truth. <strong>Automating performance evaluation</strong> allows us to detect quality regressions before end users encounter inconsistent responses.</p>
<h2 class="block block-header h--h30-15-400 left  ">How does model size influence your prompt structure?</h2>
<p><strong>Not all LLMs process information with the same level of sophistication</strong>, and this is where cost efficiency collides with technical reality.</p>
<p>In our architecture, we orchestrate flash, mini, nano, or pro versions depending on the task, confirming an inverse rule: <strong>the larger the model, the less prompting effort you need</strong>. When using a powerful model, you rarely need complex prompt structures—it resolves things through brute force.</p>
<p>The challenge arises when optimizing for millisecond-level latency with smaller models. <strong>Technical demands grow exponentially: the lighter the model, the more precise and unambiguous your prompt must be to avoid inconsistent outputs</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusions</h2>
<p>The success of a generative AI implementation does not depend on finding the “perfect prompt,” but on <strong>building an engineering ecosystem around it</strong>.</p>
<p>Controlling latency, optimizing costs through smart model selection, and measuring every interaction with observability tools are essential steps for any team aiming to move beyond the prototype phase.</p>
<p><strong>Operational transparency</strong> is the only way to build trust in systems that are, by nature, probabilistic.</p>
<p>If you still have doubts about whether anyone can work as a prompt engineer, here’s a bonus:</p>
<h3 class="block block-header h--h20-175-500 left  ">Are you talking to the real engine or a polished version?</h3>
<p>There’s a reality shock when you move from interacting with a language model through its conversational interface to integrating it via code. The interface you use daily hides a massive system prompt that shapes everything.</p>
<p>That artificial politeness and tendency toward long explanations come from a layer designed for end users. <strong>When you connect directly to the API, you face a raw environment that assumes nothing for you</strong>.</p>
<p>Proactive assistants disappear, and you encounter vague systems. Operating at this level forces you to build your own guardrails. Every detail matters.</p>
<p>If you still think this role isn’t necessary in an AI team and want to give it a try—good luck 🍀. I’ll read you in the comments 👇.</p>
<p><strong>References and links</strong></p>
<ul>
<li><a href="https://langfuse.com/docs" target="_blank">Langfuse integration documentation</a></li>
<li><a href="https://langfuse.com/docs/prompts/get-started" target="_blank">Prompt management and two-level caching guide</a></li>
<li><a href="https://langfuse.com/docs/evaluation/evaluation-methods/scores-via-sdk" target="_blank">Quality and fidelity evaluation systems in LLMs</a></li>
<li><a href="https://langchain-ai.github.io/langgraph/" target="_blank">Agent orchestration architecture with LangGraph</a></li>
</ul>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ David García Luna ]]>
        </dc:creator>
        <title>AI-XP: from the Craftsmanship Manifesto to the AI era</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/ai-xp-from-craftsmanship-manifesto-to-ai-era/</link>
        <pubDate>Tue, 21 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/ai-xp-from-craftsmanship-manifesto-to-ai-era/</guid>
        <description>AI accelerates software delivery, but it can also accelerate technical debt, confusion, and loss of control. That’s why it makes sense to talk about AI-XP: using the speed that AI provides within a framework that ensures quality, learning, and sustainability. We’ll show you how to leverage its potential with AI.
</description>
        <content:encoded>
            <![CDATA[
                <p>In the software development ecosystem, when we talk about <strong>agile methodologies</strong>, Scrum and Kanban tend to be the undisputed protagonists, often leaving <strong>Extreme Programming (XP) as “the forgotten one.”</strong></p>
<p>However, for roles like Manager / Scrum Master / Flow Master who aim not only to organize work but to <strong>ensure technical excellence and team sustainability</strong>, overlooking XP is a strategic mistake. While other frameworks focus on management flow, XP focuses on the trenches—on <strong>how the product is built to be robust, flexible, and sustainable</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  ">What is XP?</h2>
<p>If you’ve never gone deep into XP, think of it not as a radical invention, but as a <strong>collection of what actually works</strong>. Just as J.R.R. Tolkien didn’t invent myths about elves and dwarves, but instead compiled and systematized centuries of European folklore into a coherent and functional mythology, Kent Beck did something similar with software engineering in the late ’90s.</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/que_es_extreme_programming_7b616f493f.jpg"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/que_es_extreme_programming_7b616f493f.jpg 1920w,https://www.paradigmadigital.com/assets/img/resize/big/que_es_extreme_programming_7b616f493f.jpg 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/que_es_extreme_programming_7b616f493f.jpg 910w,https://www.paradigmadigital.com/assets/img/resize/small/que_es_extreme_programming_7b616f493f.jpg 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="circular diagram. starting point is &quot;on site customer&quot; and you can move right or left. to the right: test driven development (tdd), two linked minds, sustainable pace, code as documentation, collective code ownership. to the left: pair programming and collective code ownership" title="What is Extreme Programming"/></article>
<p>Beck didn’t invent testing, code review, or customer collaboration. What XP did was <strong>gather these isolated “best practices”</strong>, already known to improve quality, and <strong>push them to the extreme of their effectiveness</strong>, organizing them under a unified philosophy.</p>
<p>Beyond technical excellence, XP also emphasized the importance of having what we now call a <strong>Product Owner physically present with the team</strong> (<a href="http://www.extremeprogramming.org/rules/customer.html" target="_blank">on-site customer</a>) to improve the conversation between business and development. Additionally, one of XP’s most remembered contributions to Agile is <strong>User Stories</strong> as we know them today (with the <a href="https://ronjeffries.com/xprog/articles/expcardconversationconfirmation/" target="_blank">3 C’s</a>), replacing heavy and hard-to-understand requirement documents.</p>
<p>In short, XP is a framework designed to <strong>reduce risk in projects with vague or changing requirements</strong>, applying strong technical practices, fostering communication, and discarding what is not needed at the moment. In summary: <strong>prioritizing customer satisfaction and software quality</strong>.</p>
<p>That’s the <strong>quick overview</strong> for those who missed that class.</p>
<p><strong>But be careful</strong>: thinking XP is <em>just</em> this (a set of programming practices) is like reading the synopsis <em>“a dysfunctional family in space”</em> and assuming you understand the entire Star Wars saga.</p>
<p>What that summary misses is the real value for leadership. <strong>XP is a system for risk management and psychological safety</strong>.<br>
XP assumes that <strong>agility without technical excellence becomes a factory of technical debt</strong>. That’s why it builds an unbreakable safety net (through automated testing, continuous integration, and simple design) that allows teams to move fast, adapt constantly, and avoid burnout. It ensures that speed doesn’t destroy quality.</p>
<p>And it is precisely this <strong>tension between speed and safety</strong> that hits us today.</p>
<p>We now have in our hands the <strong>greatest productivity accelerator in history: Generative AI</strong>. But generating code at high speed is not the same as generating maintainable or correct code. <strong>How do we govern this new hyper-speed without burning out teams or breaking products?</strong> The answer has existed for nearly 30 years.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">A new hope: evolving XP with Artificial Intelligence</h2>
<p>How does this ’90s framework fit into the era of Generative AI? The reality is that AI doesn’t make XP obsolete—on the contrary, it turns it into the <strong>necessary safety structure</strong> for this new speed. We are witnessing the <strong>birth of AI-XP</strong> (<a href="https://dev.to/dev3l/ai-concept-to-code-integrating-ai-into-agile-development-5ai8" target="_blank">term used by Justin Beall</a>).</p>
<p>Integrating AI into XP is not just about using autocomplete tools—it’s a <strong>systemic evolution</strong> that enhances the framework’s original principles through three modern feedback loops:</p>
<ol>
<li><strong>VISION (Planning)</strong>. Where we once relied only on human intuition to define long-term goals, AI can now analyze market data to align XP’s “Planning Game” with real needs and trend predictions.</li>
<li><strong>ADAPT (Agile iterations)</strong>. AI acts as a facilitator that improves responsiveness. It can help break down complex user stories and ensure the team understands acceptance criteria, reducing ambiguity.</li>
<li><strong>LEAP (Daily execution)</strong>. This is where classic <em>Pair Programming</em> evolves into <strong>“AI Pairing.”</strong> AI handles routine and boilerplate code, allowing developers (the “navigator”) to focus on strategy, security, and design.</li>
</ol>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The new paradoxes of AI-XP</h2>
<p>Before celebrating and assuming AI plus ’90s practices will solve everything, as technical and delivery leaders we must reflect. This new model introduces <strong>paradoxes and uncertainties</strong> that will reshape the rules:</p>
<ul>
<li><strong>The user story paradox</strong></li>
</ul>
<p>Originally, XP freed us from heavy requirement documents with lightweight user stories (promises of conversation). Today, to prevent AI from hallucinating, we need extremely rich context (detailed specs, exhaustive prompts, explicit business rules).<br>
<strong>Are we returning to hyper-documentation just so machines understand us?</strong> The challenge is ensuring AI requirements don’t kill human conversation.</p>
<ul>
<li><strong>Redefining the “hybrid team”</strong></li>
</ul>
<p>Not long ago, hybrid meant remote vs. in-office. Today, <strong>a modern hybrid team is composed of human minds and AI agents</strong>. Managing trust, expectations, and collaboration in this new setup is the real challenge for Agile Coaches.</p>
<ul>
<li><strong>AI as the new “knowledge silo”</strong></li>
</ul>
<p>XP promoted Collective Code Ownership to avoid knowledge concentration. But what happens if AI writes most of the code and developers only review it? We risk turning AI into a <strong>black box</strong>, losing deep understanding and control of our product.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Back to humanity</h2>
<p>In conclusion, <strong>AI has the potential to accelerate software delivery—but also to accelerate chaos without proper governance</strong>, and XP provides that governance.</p>
<p>By automating technical complexity and routine code generation, AI enables XP to fulfill its most ambitious promise: <strong>humanity and respect</strong>.</p>
<p>Freed from repetitive coding tasks, teams can focus on what XP has always valued most: <strong>creativity</strong>, <strong>complex problem-solving</strong>, and <strong>high-value human collaboration</strong>. XP is not dead—it has simply found, thirty years later, the perfect tool to reach its full potential.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Raúl Martínez ]]>
        </dc:creator>
        <title>NLP pipeline for risk analysis: from unstructured documents to structured JSON</title>
        <link>https://en.paradigmadigital.com/dev/nlp-pipeline-risk-analysis-unstructured-documents-structured-json/</link>
        <pubDate>Thu, 16 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/nlp-pipeline-risk-analysis-unstructured-documents-structured-json/</guid>
        <description>Critical information rarely comes in a SQL table. It arrives in PDFs, urgent emails, or chaotic reports. In this post, we show how an NLP pipeline can classify, extract context, and turn all of that into structured JSON for real-time risk analysis.
</description>
        <content:encoded>
            <![CDATA[
                <p>In the real world (especially in banking or insurance), <strong>critical information does not come in a SQL table</strong>. It comes in PDFs, urgent emails, or incident reports written in a messy way. If you have to analyze 2,000 of these per day, either you have an army of people reading them—or you build something automated.</p>
<p>In this post, I want to show you <strong>how I designed an NLP pipeline</strong> to tackle this problem. It’s not about “adding AI just for the sake of it,” but about creating a logical flow that classifies, extracts, and cleans the information for us. The best part is that, with a few tweaks, this approach works just as well for risk analysis as it does for classifying support tickets or legal contracts.</p>
<p>What we’re going to build does four key things:</p>
<ul>
<li><strong>Prioritizes</strong>. Is this a fire or a routine alert?</li>
<li><strong>Labels</strong>. Is it fraud, a technical failure, or a legal issue?</li>
<li><strong>Detects data</strong>. Extracts IPs, accounts, emails... the “hard” stuff.</li>
<li><strong>Understands context</strong>. Identifies which laws or companies are mentioned.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The flow architecture (Keep it simple)</h2>
<p>There’s no need to overcomplicate things with huge models for everything. Here we combine <strong>business logic (rules)</strong> with <strong>statistical models</strong>.</p>
<p>The <strong>flow</strong> is:</p>
<p>Raw document → Urgency classifier → Risk labeling → Technical data extractor → NER (Entities) → <strong>Structured JSON</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">A real case to test it</h2>
<p>To avoid staying in theory, let’s use this <strong>incident alert</strong> (I made it up, but it’s very close to what you’d find in a real system):</p>
<p><strong>OPERATIONAL RISK ALERT - ID-2026-00142</strong> A critical failure has been detected in the transaction processing system... it affects credit cards. It started at 14:23 UTC and impacts around 15,000 customers. <strong>Data</strong>: IP 192.168.1.50 | Error: ERR-DB-TIMEOUT | TXNs: TXN-A7B3C9D2, TXN-F4E8A1B6. <strong>Warning</strong>: It exceeds the 0.5% MiFID II threshold. CNMV must be notified.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Classifying the fire: criticality</h2>
<p>The first step is to know whether we need to escalate immediately or if it can wait until tomorrow. For this, we use a <strong>weight-based system</strong>. If words like “penalty” or “fraud” appear, the score skyrockets.</p>
<pre><code class="language-python">class CriticalityClassifier:
    def __init__(self):
        # Define what keeps us up at night
        self.keywords_critico = {'fraud': 10, 'loss': 10, 'non-compliance': 10, 'fine': 10}
        self.keywords_alto = {'risk': 7, 'alert': 6, 'failure': 5}
        # ... (other levels)

    def _calculate_scores(self, text: str):
        text_lower = text.lower()
        # Add points based on matches
        return {
            'critical': sum(w for k, w in self.keywords_critico.items() if k in text_lower),
            'high': sum(w for k, w in self.keywords_alto.items() if k in text_lower),
            # ...
        }
</code></pre>
<p><strong>Result</strong>: in our example, it would yield a <strong>HIGH</strong> level with 57% confidence. Enough to trigger an automatic alert.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">What are we dealing with? (Categories)</h2>
<p>A document can belong to multiple categories at the same time. For example: <strong>technical</strong> (server outage) and <strong>compliance</strong> (regulatory breach). I used precompiled Regex patterns because, honestly, for specific keywords they are much faster and cheaper than a neural network.</p>
<pre><code class="language-python"># A small map of what to look for in each risk
self.category_keywords = {
    'operational': ['failure', 'error', 'outage', 'technical incident'],
    'compliance': ['regulation', 'penalty', 'cnmv', 'mifid'],
    'cybersecurity': ['attack', 'malware', 'hack', 'breach']
}
</code></pre>
<h2 class="block block-header h--h30-15-400 left  ">Extraction of technical &quot;threads&quot;</h2>
<p>This is where <strong>NLP shines by saving time</strong>. Instead of having an analyst copy and paste IPs or error codes, we let regular expressions do the dirty work.</p>
<p>We extract simultaneously:</p>
<ul>
<li><strong>IPs</strong>: 192.168.1.50</li>
<li><strong>Transaction IDs</strong>: TXN-A7B3C9D2</li>
<li><strong>Emails</strong>: incidents@sample-bank.com</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  ">NER. Who’s who?</h2>
<p>To extract entities (organizations, laws, products), I use <strong>spaCy</strong>. It’s the Swiss Army knife for this. We add a custom dictionary because spaCy knows what a “person” is, but sometimes struggles to understand what “MiFID II” or “CNMV” are unless we explicitly tell it.</p>
<pre><code class="language-python"># We combine spaCy with our own domain-specific rules
self.custom_entities = {
    'regulations': ['mifid ii', 'gdpr', 'pci dss'],
    'organizations': ['cnmv', 'ecb', 'bank of spain']
}
</code></pre>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The final result: JSON</h2>
<p>In the end, the pipeline outputs something as clean as this:</p>
<pre><code class="language-json">{
  &quot;criticality&quot;: &quot;high&quot;,
  &quot;categories&quot;: [&quot;operational&quot;, &quot;compliance&quot;, &quot;technical&quot;],
  &quot;indicators&quot;: {
    &quot;ipv4&quot;: [&quot;192.168.1.50&quot;],
    &quot;error_code&quot;: [&quot;ERR-DB-TIMEOUT&quot;]
  },
  &quot;entities&quot;: {
    &quot;regulations&quot;: [&quot;MiFID II&quot;],
    &quot;organizations&quot;: [&quot;CNMV&quot;]
  }
}
</code></pre>
<h2 class="block block-header h--h30-15-400 left  ">Does this scale?</h2>
<p>If you run it sequentially, it might put you to sleep. But using ThreadPoolExecutor in Python, I’ve managed to process around <strong>1,500 documents per minute</strong>. For most companies, that’s more than enough to handle the entire incoming flow in real time.</p>
<ul>
<li><strong>Real metrics:</strong></li>
<li><strong>Latency</strong>: 38ms (blazing fast).</li>
<li><strong>Accuracy</strong>: ~95% (the remaining 5% is usually very ambiguous language that requires human judgment).</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion</h2>
<p>Automating this is not just about cost savings—it’s about <strong>reaction time</strong>. If a system detects a regulatory breach in 40 milliseconds, you can mitigate the risk before it turns into a million-dollar fine.</p>
<p>What do you think? Would you introduce heavier models like Transformers (BERT/LLMs), or do you believe this hybrid approach is more stable for risk classification? I’ll read you in the comments.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Cristina Redondo ]]>
        </dc:creator>
        <title>The importance of warm data in change and optimization processes</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/importance-warm-data-change-optimization-processes/</link>
        <pubDate>Tue, 14 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/importance-warm-data-change-optimization-processes/</guid>
        <description>KPIs explain what is happening in a process, but not why it is happening. To understand that, we need warm data: relationships, trust, culture, and context. Without them, any optimization stays superficial. In this post, we show you how to balance them with cold data.
</description>
        <content:encoded>
            <![CDATA[
                <p>In the age of AI, automation, and the obsession with what can be quantified, we still face a fundamental unresolved problem: <strong>the models we build do not explain the reality we experience</strong>. Why? Because representing data and processes is not enough—they fail to capture the complexity of <strong>living systems and interactions</strong>.</p>
<p><strong>One of Sociology’s core pursuits is precisely this: getting closer to an accurate representation of reality</strong>, and therefore of complexity (<strong>because reality is always complex</strong>).</p>
<p>This is where <strong>warm data</strong> comes into play: relational and transcontextual information that allows us to understand how a system is sustained (or blocked) beyond KPIs.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Cold data vs. warm data (a useful distinction)</h2>
<ul>
<li><strong>Cold data</strong> (Hard, Cold Data): what is measurable and comparable. Time, costs, throughput, errors, queues, deviations.</li>
<li><strong>Warm data</strong>: what connects and gives meaning to the above. Trust, implicit norms, tensions, commitments, “what is left unsaid,” fears, shared stories, social and cultural context—what Sociology refers to as “interactions.”</li>
</ul>
<p>Both are necessary. The problem begins when we try to optimize only what can be “easily” measured.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Three theses for viewing organizations as living systems</h2>
<p>This topic was a fundamental part of the work of <strong>Gregory Bateson</strong>, philosopher, sociologist, and cyberneticist, and later of his daughters Cathy and <a href="https://neurocognitiveacademy.org/nora-bateson/" target="_blank">Nora Bateson</a>. The <a href="https://batesoninstitute.org/" target="_blank">Bateson family’s theses</a> on what to consider when analyzing ecosystems such as organizations are as follows:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">1 <span class="enum-header"></span> The transcontextuality thesis</h3>
<p><strong><em>“No process exists in a single context.”</em></strong></p>
<p>In traditional process design (<a href="https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation" target="_blank">Business Process Model and Notation</a> - BPMN), we tend to isolate processes (e.g., “credit approval”). For the Batesons, this is a <strong>functional simplification error</strong>. Warm data provides that <strong>transcontextual information</strong>: the approval process is “marinated” in economic context, workplace climate, the employee’s personal life, and the company’s technological culture.</p>
<p><strong>Application in processes</strong></p>
<p>Process Mining may detect technical inefficiencies such as delays (cold data). Warm data may explain that the delay occurs because the employee prioritizes the client relationship over system metrics to avoid cultural conflict.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">2 <span class="enum-header"></span> The relationality thesis</h3>
<p><strong><em>“Intelligence is not in the parts, but in the relationships between them.”</em></strong></p>
<p>Gregory Bateson argued that to understand a system, we must look not at the subjects but at the messages they exchange. Nora extends this idea, stating that warm data describes the <strong>interdependencies</strong> that keep the system alive.</p>
<p>Cold data measures silo performance; warm data measures the health of the connections between silos.</p>
<p><strong>Application in processes</strong></p>
<p>In a DTO (Digital Twin of the Organization), it is not enough to model tasks. You must also model “adhesion” and trust in the process. A process may be technically optimal but relationally toxic, ensuring long-term failure.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">3 <span class="enum-header"></span> The coalescence thesis</h3>
<p><strong><em>“Real changes in complex systems are invisible processes of coalescence.”</em></strong></p>
<p>This thesis states that before a change becomes visible in a KPI (cold data), an “<a href="https://journals.isss.org/index.php/jisss/article/view/3887" target="_blank">Aphanipoiesis</a>” occurs: an accumulation of small variations in relationships and perceptions (warm data), subtle but system-shaping. They “coalesce” (like raindrops merging into a larger drop). If we only manage what is measured (cold data) and ignore this coalescence, we will react too late to crises or opportunities.</p>
<p><strong>Application in processes</strong></p>
<p>For example, in their work, an Agile Coach does not only look for “burn rate velocity,” but for changes in team communication that precede efficiency gains. Before a team becomes formally “agile” (events, artifacts… cold data), there is a “coalescence of trust, shared language, and tacit rule understanding.” Without seeing this, a consultant risks deploying processes on unstable ground.</p>
<p>Warm data enables <strong>proactive orchestration</strong>, detecting system fatigue before logs reflect performance drops.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Warm data in a process: a practical example enriching VSM</h2>
<p>Imagine you <strong>map a process using a Value Stream Map</strong>: you extract a SIPOC matrix, measure activity times, classify inefficiencies, and validate hypotheses. You detect that an administrative process has <strong>30% waste in waiting time</strong>. Cold data may suggest automation, but warm data may reveal that delays stem from lack of trust between teams, fear of mistakes, underused tools, or implicit norms slowing agility.</p>
<p><strong>Without relational data, any optimization is superficial—and often counterproductive.</strong></p>
<p>For an optimization expert, ignoring warm data is like trying to understand a forest by analyzing only the wood (cold data), without considering root symbiosis and climate (warm data).</p>
<p><strong>A comprehensive orchestration in 2026 requires both</strong>. This approach can mean the difference between a solution that works on paper and a real, sustainable transformation.</p>
<p>Warm data has traditionally been dismissed as “soft,” subjective, or unscientific. Relational sociology proves otherwise. It captures <strong>relationships</strong>, not isolated variables. Combined with cold data (costs, time, performance), it helps explain <strong>how human and cultural dynamics shape those numbers</strong>, including interactions with processes and machines—as anticipated by Lean TPS autonomation (<a href="https://www.paradigmadigital.com/rev/lean-it-eficiencia-optimizacion/" target="_blank">Jidoka</a>).</p>
<h3 class="block block-header h--h20-175-500 left  ">How do we integrate warm data into process analysis?</h3>
<p>Detecting and measuring warm data is challenging, which is why it is often ignored. As a starting point:</p>
<ul>
<li><strong>Observe interactions, not just outcomes</strong>. How are decisions made? What conversations never happen? Why are certain tools chosen? How do teams relate? Are there implicit rules?</li>
<li><strong>Analyze behavioral patterns, not just outputs</strong>. Why do inefficiencies persist despite good solutions? Are we automating hidden inefficiencies?</li>
<li><strong>Include multiple perspectives</strong>. Operational data is not enough; we must understand lived experiences, emotions, and leadership dynamics. <em>#diversitymatters</em></li>
<li>Finally, <strong>challenge your own optimization efforts</strong>. Does optimization reduce cognitive load or just redistribute it? Is change adopted or merely tolerated?</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Warm data and agility: a natural connection</h2>
<p>Agile and Lean frameworks emphasize adaptation and iterative improvement. <strong>Defining a framework is defining a way of working together</strong>, and agility has invested heavily in this. However, without understanding invisible relationships and contexts, improvement remains superficial.</p>
<p>Warm data reveals resistance to change, cultural values, and systemic impacts of interventions.</p>
<p>At <strong>Paradigma Lean Papers</strong>, we have discussed the <a href="https://www.paradigmadigital.com/rev/kata-ba-evolucion-lean-gestion-conocimiento/" target="_blank">importance of BA (context)</a> to understand systems, daily team life, and the observation of Gen-ba as a living ecosystem.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion</h2>
<p>In a world obsessed with numerical precision, we must remember that organizations and their processes are living systems.</p>
<p><strong>If you work in optimization, remember: complexity is an experience. If your models do not explain the reality teams live, you are not optimizing—you are dangerously simplifying.</strong></p>
<p>How do you integrate relational data into your agile projects? I’ll read you in the comments 👇</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">References</h3>
<ul>
<li><a href="https://neurocognitiveacademy.org/nora-bateson/" target="_blank">Nora Bateson, Neurocognitive Academy</a></li>
<li><a href="https://batesoninstitute.org/" target="_blank">Bateson Institute</a></li>
<li><a href="https://www.warmdata.life/international-bateson-institute" target="_blank">Warm Data Labs, Bateson Institute</a></li>
<li><a href="https://journals.isss.org/index.php/jisss/article/view/3887" target="_blank">“Aphanipoiesis”, Nora Bateson</a></li>
</ul>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Nacho Badenes ]]>
        </dc:creator>
        <title>Purpose-Driven Technology Platforms: Governance, Security, and Digital Resilience</title>
        <link>https://en.paradigmadigital.com/techbiz/purpose-driven-technology-platforms-governance-security-digital-resilience/</link>
        <pubDate>Thu, 09 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/techbiz/purpose-driven-technology-platforms-governance-security-digital-resilience/</guid>
        <description>A purpose-driven technology platform doesn’t end with architecture. Data governance, cybersecurity, traceability, and software efficiency are key decisions to truly align technology, business, and ESG criteria.
</description>
        <content:encoded>
            <![CDATA[
                <p>In the previous post, we explored in depth <a href="https://en.paradigmadigital.com/techbiz/purpose-driven-technology-platforms-aligning-technology-business-sustainability/" target="_blank">how decisions around cloud, AI, inclusive design, and interoperability lay the foundations for a purpose-driven architecture</a>. However, for a platform to truly have purpose and align with ESG principles, it’s not enough to focus on how it is built; it must also be <strong>managed and protected</strong> with the same level of awareness.</p>
<p>Today, we complete our <strong>map of 8 key technology decisions</strong> by analyzing the final four pillars that ensure the integrity, security, and long-term impact of our digital ecosystem.</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/esg_technological_decision_map_b2b84140e8.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/esg_technological_decision_map_b2b84140e8.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/esg_technological_decision_map_b2b84140e8.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/esg_technological_decision_map_b2b84140e8.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/esg_technological_decision_map_b2b84140e8.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="ESG technology decision map" title="undefined"/><figcaption>ESG technology decision map</figcaption></figure>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">5 <span class="enum-header"></span> Data governance and traceability</h2>
<p>This is the engine that ensures data remains a trustworthy asset, directly impacting the company’s <strong>Governance (G)</strong>. Reliable data doesn’t just ensure compliance—it accelerates decision-making and builds market trust.</p>
<p><strong>Key selection factors</strong></p>
<p>Data must have a clear identity and ownership. It is essential to choose technologies that guarantee <strong>end-to-end traceability</strong> for critical data and provide governance capabilities that ensure quality and integrity.</p>
<ul>
<li><strong>Key usage factors</strong></li>
</ul>
<p>Transparency is non-negotiable. It requires clearly defined <strong>access and retention policies</strong>, along with continuous security monitoring and audit processes for responsible usage.</p>
<ul>
<li><strong>Organizational impact</strong></li>
</ul>
<p>Faster decisions driven by trusted data. The result is strong regulatory compliance and <strong>support for ESG transparency</strong> through verifiable and auditable reporting.</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/data_governance_traceability_8e21dee232.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/data_governance_traceability_8e21dee232.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/data_governance_traceability_8e21dee232.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/data_governance_traceability_8e21dee232.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/data_governance_traceability_8e21dee232.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Data governance and traceability" title="undefined"/><figcaption>Data governance and traceability</figcaption></figure>
<blockquote class="block-blockquote -like-cms-text-width"><p><em>“<strong>Trusted data</strong> doesn’t just ensure compliance: it accelerates decisions, builds market confidence, and opens the door to <strong>new opportunities</strong>.”</em></p>
</blockquote>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">6 <span class="enum-header"></span> Cybersecurity and resilience</h2>
<p>Security is not a cost; it is the insurance policy that protects business continuity and value, making it a critical pillar of <strong>Governance (G)</strong> and <strong>Social Responsibility (S)</strong>.</p>
<ul>
<li><strong>Key selection factors</strong></li>
</ul>
<p>Prepare for “when,” not “if.” We must evaluate <strong>incident response and recovery capabilities</strong>, ensuring compliance with standards such as <strong>ISO 27001, NIS2, or DORA</strong>.</p>
<ul>
<li><strong>Key usage factors</strong></li>
</ul>
<p>No one enters without permission. Implement <strong>Zero Trust-based access management</strong> and foster a security culture through continuous training and strict protocols.</p>
<ul>
<li><strong>Organizational impact</strong></li>
</ul>
<p>Peace of mind knowing your business is resilient. It minimizes financial risks from <strong>cyberattacks</strong>, ensures <strong>operational continuity</strong>, and strengthens trust among customers and investors.</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/cybersecurity_resilience_e5f78b2756.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/cybersecurity_resilience_e5f78b2756.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/cybersecurity_resilience_e5f78b2756.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/cybersecurity_resilience_e5f78b2756.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/cybersecurity_resilience_e5f78b2756.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Cybersecurity and resilience" title="undefined"/><figcaption>Cybersecurity and resilience</figcaption></figure>
<blockquote class="block-blockquote -like-cms-text-width"><p><em>“Security is no longer a cost: it is the insurance policy that protects <strong>continuity, reputation, and business value</strong>.”</em></p>
</blockquote>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">7 <span class="enum-header"></span> ESG integration in the supply chain</h2>
<p>Our technological responsibility extends to every partner; a supply chain aligned with <strong>Environmental (E), Social (S), and Governance (G)</strong> criteria is more competitive and reliable.</p>
<ul>
<li><strong>Key selection factors</strong></li>
</ul>
<p>Tell me who you work with, and I’ll tell you who you are. It is essential to adopt platforms that enable <strong>supplier traceability</strong> and integrate with ESG risk management systems.</p>
<ul>
<li><strong>Key usage factors</strong></li>
</ul>
<p>Your suppliers’ commitment is your own commitment. It requires continuous monitoring of their <strong>ESG performance</strong> and clear criteria for <strong>selection and retention</strong>.</p>
<ul>
<li><strong>Organizational impact</strong></li>
</ul>
<p>A “clean” platform end to end. It reduces <strong>reputational risks</strong> across the value chain and ensures compliance with governance best practices.</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/esg_integration_supply_chain_fcb00ca9db.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/esg_integration_supply_chain_fcb00ca9db.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/esg_integration_supply_chain_fcb00ca9db.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/esg_integration_supply_chain_fcb00ca9db.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/esg_integration_supply_chain_fcb00ca9db.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="ESG integration in the supply chain" title="undefined"/><figcaption>ESG integration in the supply chain</figcaption></figure>
<blockquote class="block-blockquote -like-cms-text-width"><p><em>“An ESG-aligned supply chain is <strong>more competitive</strong>, more reliable, and more attractive to customers and investors.”</em></p>
</blockquote>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">8 <span class="enum-header"></span> Software lifecycle optimization</h2>
<p>Efficient code means lower costs and faster delivery; it contributes positively to the <strong>Environmental (E)</strong> pillar by optimizing resource consumption.</p>
<ul>
<li><strong>Key selection factors</strong></li>
</ul>
<p>Build today with tomorrow in mind. Choose frameworks that facilitate maintainability and scalability, while supporting energy efficiency metrics.</p>
<ul>
<li><strong>Key usage factors</strong></li>
</ul>
<p>Deploy fast, but thoughtfully. Implement <strong>CI/CD processes</strong> for agile delivery and apply refactoring strategies to eliminate obsolete code that consumes unnecessary resources.</p>
<ul>
<li><strong>Organizational impact</strong></li>
</ul>
<p>Sustainability translated into profitability. It reduces operational costs, improves delivery quality, and extends the lifespan of technological assets.</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/software_lifecycle_optimization_1086f3863f.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/software_lifecycle_optimization_1086f3863f.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/software_lifecycle_optimization_1086f3863f.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/software_lifecycle_optimization_1086f3863f.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/software_lifecycle_optimization_1086f3863f.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Software lifecycle optimization" title="undefined"/><figcaption>Software lifecycle optimization</figcaption></figure>
<blockquote class="block-blockquote -like-cms-text-width"><p><em>“<strong>Efficient code</strong> means lower costs, faster delivery, and development that leaves a… <strong>positive footprint</strong>.”</em></p>
</blockquote>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion: choosing technology is choosing the future</h2>
<p>As I shared at the <strong>Smart Energy Congress 2025</strong>, choosing technology is choosing the future. By integrating these 8 decision points into our strategy, we transform technology from a support function into a driver that aligns business with social, environmental, and governance challenges.</p>
<ul>
<li><strong>Enabler of real impact</strong>: technology drives everything from energy efficiency to digital inclusion.</li>
<li><strong>Competitive advantage</strong>: conscious decisions in architecture, data, security, AI, and accessibility enable new business models.</li>
<li><strong>Investment in resilience</strong>: purpose-driven design is not a cost, but an investment that fosters innovation and trust.</li>
<li><strong>Engine of transformation</strong>: platforms don’t just support the business—they connect it to a positive global impact.</li>
</ul>
<p><em><strong>&quot;True technological disruption lies not in what machines can do, but in the purpose we choose when designing them.&quot;</strong></em></p>
<p>After everything shared in this series of three posts on technology platforms, <strong>what will you do from today onwards?</strong> I’ll read you in the comments.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Simón Rodríguez ]]>
        </dc:creator>
        <title>Running LLMs Locally: Docker</title>
        <link>https://en.paradigmadigital.com/dev/running-llms-locally-docker/</link>
        <pubDate>Tue, 07 Apr 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/running-llms-locally-docker/</guid>
        <description>With the launch of Model Runner, Docker officially enters the world of generative AI, enabling you to run models locally, integrate them into pipelines, and deploy them as just another service within your stack. In this post, we’ll show you how.
</description>
        <content:encoded>
            <![CDATA[
                <p>Closing this series of posts on running LLMs locally, we now arrive at <strong>one of the latest players to join the trend of local LLM/AI execution: Docker!</strong></p>
<p>Being one of the latest to arrive does not mean it should be overlooked. Given its track record as a true <em>game-changer</em>—especially when it comes to transparent application execution—Docker has completely revolutionized the development world.</p>
<p><a href="https://docs.docker.com/ai/model-runner/" target="_blank">Model Runner</a> is the new tool that <a href="https://www.docker.com/blog/announcing-docker-model-runner-ga/" target="_blank">Docker has released</a> for running AI models locally, and in this article we will explore its main features.</p>
<p>As a quick reminder, in case you missed any of the previous articles, you can check out the rest of the <strong>local LLM execution series</strong> here:</p>
<ul>
<li><a href="https://en.paradigmadigital.com/dev/running-llms-locally-getting-started-ollama/" target="_blank">Running LLMs locally: getting started with Ollama</a></li>
<li><a href="https://en.paradigmadigital.com/dev/running-llms-locally-getting-started-ollama/" target="_blank">Running LLMs locally: advanced Ollama</a></li>
<li><a href="https://en.paradigmadigital.com/dev/running-llms-locally-lm-studio/" target="_blank">Running LLMs locally: LM Studio</a></li>
<li><a href="https://en.paradigmadigital.com/dev/running-llms-locally-llamafile/" target="_blank">Running LLMs locally with Llamafile</a></li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">How it works and key features</h2>
<p><strong>Docker Model Runner enables AI model execution by embedding an inference engine</strong> (built on top of the llama.cpp library) <strong>as part of the Docker runtime environment</strong>. At a high level, the <strong>architecture is composed of three main components</strong>:</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/arquitectura_docker_model_runner_54c4c99cfb.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/arquitectura_docker_model_runner_54c4c99cfb.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/arquitectura_docker_model_runner_54c4c99cfb.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/arquitectura_docker_model_runner_54c4c99cfb.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/arquitectura_docker_model_runner_54c4c99cfb.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Docker Model Runner architecture" title="undefined"/><figcaption>Docker Model Runner architecture</figcaption></figure>
<ul>
<li><strong>Model distribution</strong> (model storage and client): the <em>model store</em> is the core component of the architecture, where tensor files are stored. The <em>client</em> performs operations (such as downloading) against <a href="https://opencontainers.org/" target="_blank">OCI</a> registries.</li>
<li><strong>Model Runner</strong>: maps API requests to processes that run inference engines (/engines) and models (/models). It includes components such as the <em>scheduler, loader</em>, and <em>runner</em>, which coordinate loading and unloading models from memory (both inference engines and models operate as ephemeral processes). For each combination of inference engine (e.g., llama.cpp) and model (e.g., ai/llama3.2:3B-Q4_0), a separate process is executed depending on incoming API requests.</li>
<li><strong>Model CLI</strong>: the main user interaction component. This is a Docker CLI plugin that provides an interface similar to running Docker images. Under the hood, the CLI communicates with the Model Runner API to execute most operations.</li>
</ul>
<p>An important note is that, although the overall architecture remains the same, <strong>depending on the platform where it is deployed, these three components are packaged, stored, and executed differently</strong> (sometimes on the host, sometimes in a virtual machine, and sometimes inside a container).</p>
<p>Some of the <strong>main features of Docker Model Runner</strong> include:</p>
<ul>
<li>Ability to <strong>download and upload</strong> models to/from <a href="https://hub.docker.com/u/ai" target="_blank">Docker Hub</a>.</li>
<li><strong>Model execution</strong> via endpoints compatible with the OpenAI API.</li>
<li><a href="https://www.docker.com/blog/oci-artifacts-for-ai-model-packaging/" target="_blank">Packaging GGUF files as OCI artifacts</a> to publish them in any container registry.</li>
<li><strong>Running and interacting</strong> with models directly from the command line.</li>
<li><strong>Managing</strong> local models.</li>
<li>Defining <strong>input prompt details</strong> as well as model responses.</li>
<li><strong>Support</strong> for multi-turn interactions (chat).</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Installation</h2>
<p><strong>Model Runner is available for major operating systems</strong> (Windows, macOS, and Linux), either through <a href="https://docs.docker.com/ai/model-runner/get-started/#docker-desktop" target="_blank">Docker Desktop</a> or <a href="https://docs.docker.com/ai/model-runner/get-started/#docker-engine" target="_blank">Docker Engine</a>. In this article, we will run Docker Model Runner on <strong>Ubuntu</strong> using <strong>Docker Engine</strong>.</p>
<p>After installing <a href="https://docs.docker.com/engine/install/" target="_blank">Docker Engine</a> if necessary, you can proceed to install Model Runner by executing the following command:</p>
<pre><code class="language-none">sudo apt-get install docker-model-plugin
</code></pre>
<p>Verifying the installation using the command:</p>
<pre><code class="language-none">docker model version
</code></pre>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comprobacion_instalacion_model_runner_7fd9b2d8ab.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comprobacion_instalacion_model_runner_7fd9b2d8ab.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comprobacion_instalacion_model_runner_7fd9b2d8ab.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comprobacion_instalacion_model_runner_7fd9b2d8ab.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comprobacion_instalacion_model_runner_7fd9b2d8ab.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Model Runner installation verification" title="undefined"/><figcaption>Model Runner installation verification</figcaption></figure>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">CLI Commands</h2>
<p>Once Docker Model Runner is installed, you can <strong>interact with models</strong> using the following commands:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">1 <span class="enum-header"></span> INSPECT</h3>
<p>This command displays <strong>detailed information about a model</strong>.</p>
<pre><code class="language-none">docker model inspect ai/llama3.2:3B-Q4_0

docker model inspect ai/llama3.2:3B-Q4_0 --openai #Presentar la información en formato OpenAI
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_inspect_1537dbd737.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_inspect_1537dbd737.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_inspect_1537dbd737.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_inspect_1537dbd737.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_inspect_1537dbd737.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CLI Commands: inspect docker model" title="Inspect"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">2 <span class="enum-header"></span> LIST</h3>
<p>Command to <strong>list the models</strong> downloaded to the local environment.</p>
<pre><code class="language-none">docker model list

docker model list --json #List the models in JSON format

docker model list --openai #List the models in OpenAI format

docker model list --quiet #Show only the model IDs
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_list_cd905f5b70.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_list_cd905f5b70.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_list_cd905f5b70.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_list_cd905f5b70.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_list_cd905f5b70.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CLI commands: list" title="List"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">3 <span class="enum-header"></span> LOGS</h3>
<p>Command to <strong>display</strong> logs.</p>
<pre><code class="language-none">docker model logs

docker model logs --follow#View logs in real time
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_logs_1b567aa4b5.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_logs_1b567aa4b5.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_logs_1b567aa4b5.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_logs_1b567aa4b5.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_logs_1b567aa4b5.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Cli Commands: logs" title="Logs"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">4 <span class="enum-header"></span> PACKAGE</h3>
<p>Command to <strong>package a file in GGUF format</strong> into a Docker Model OCI artifact.</p>
<pre><code class="language-none">docker model package --gguf &lt;path&gt; [--license &lt;path&gt;...] [--context-size &lt;tokens&gt;] [--push] MODEL

docker model package --gguf /home/simonrodriguez/dockerModelRunner/model.gguf my_new_llama_model
</code></pre>
<p>The <strong>available options</strong> for this command are:</p>
<ul>
<li><strong>--chat-template</strong>: absolute path to the chat template file (the template must be in Jinja format).</li>
<li><strong>--context-size</strong>: size of the context window.</li>
<li><strong>--gguf</strong> (required): absolute path to the file in GGUF format.</li>
<li><strong>--license</strong>: absolute path to the license file.</li>
<li><strong>--push</strong>: upload to the registry.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_package_b70c56f82c.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_package_b70c56f82c.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_package_b70c56f82c.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_package_b70c56f82c.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_package_b70c56f82c.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CLI command: package" title="Package"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">5 <span class="enum-header"></span> PULL</h3>
<p>Command to download a model from <a href="https://hub.docker.com/u/ai" target="_blank">Docker Hub</a> or <a href="https://huggingface.co/models?library=gguf" target="_blank">Hugging Face</a>.</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_pull_4cf9846bc6.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_pull_4cf9846bc6.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_pull_4cf9846bc6.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_pull_4cf9846bc6.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_pull_4cf9846bc6.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CLI commands: pull" title="Pull"/></article>
<p>When downloading from Hugging Face, <strong>if no tag is specified</strong>, it will attempt to download the <strong><em>Q4_K_M</em></strong> version of the model. If this version does not exist, it will download the <strong>first GGUF file found in the model’s <em>Files</em> section</strong> on Hugging Face. To specify the model quantization, you simply need to <strong>add the corresponding tag</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">6 <span class="enum-header"></span> PUSH</h3>
<p>Command to <strong>upload a model</strong> to Docker Hub.</p>
<pre><code class="language-none">docker model push ai/llama3.3
</code></pre>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">7 <span class="enum-header"></span> RM</h3>
<p>Command to <strong>delete</strong> local models.</p>
<pre><code class="language-none">docker model rm ai/llama3.2:3B-Q4_0

docker model rm ai/llama3.2:3B-Q4_0 --force #Force model deletion
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_rm_5d2619a29f.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_rm_5d2619a29f.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_rm_5d2619a29f.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_rm_5d2619a29f.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_rm_5d2619a29f.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="comandos cli: RM" title="RM"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">8 <span class="enum-header"></span> RUN</h3>
<p>Command to <strong>run a model and interact with it</strong> by sending a prompt or via chat mode.</p>
<pre><code class="language-none">docker model run ai/llama3.2:3B-Q4_0 #A prompt opens for an interactive chat, which you can exit with the command /bye

docker model run ai/llama3.2:3B-Q4_0 “Hello, what can you tell me about Docker Model Runner?”

docker model run ai/llama3.2:3B-Q4_0 --debug #Enables debug mode

docker model run ai/llama3.2:3B-Q4_0 --ignore-runtime-memory-check #Option to prevent the download from being blocked if the model is estimated to exceed system memory
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_run_1_a0832a9dba.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_run_1_a0832a9dba.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_run_1_a0832a9dba.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_run_1_a0832a9dba.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_run_1_a0832a9dba.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Comando cli: run" title="Run"/></article>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_run_2_0ce0199301.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_run_2_0ce0199301.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_run_2_0ce0199301.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_run_2_0ce0199301.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_run_2_0ce0199301.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="comando cli: run" title="Run"/></article>
<p>When a Docker model is executed, it calls the API endpoint of the inference server hosted by Model Runner. The model will remain in memory until another model is loaded or the inactivity timeout is reached.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">9 <span class="enum-header"></span> PS</h3>
<p>Command that <strong>displays the models</strong> currently running.</p>
<pre><code class="language-none">docker model ps
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_ps_c235a35577.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_ps_c235a35577.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_ps_c235a35577.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_ps_c235a35577.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_ps_c235a35577.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="CLI command: ps" title="PS"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">10 <span class="enum-header"></span> UNLOAD</h3>
<p>Command to <strong>unload a running model</strong>.</p>
<pre><code class="language-none">docker model unload ai/llama3.2:3B-Q4_0
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_unload_be1e8a6d63.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_unload_be1e8a6d63.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_unload_be1e8a6d63.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_unload_be1e8a6d63.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_unload_be1e8a6d63.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="comandos cli: unload" title="Unload"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">11 <span class="enum-header"></span> DF</h3>
<p>Command that displays the <strong>disk space</strong> occupied by the models.</p>
<pre><code class="language-none">docker model df
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_df_6c72548655.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_df_6c72548655.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_df_6c72548655.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_df_6c72548655.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_df_6c72548655.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="comando cli: DF" title="DF"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">12 <span class="enum-header"></span> STATUS</h3>
<p>Command to <strong>check</strong> if Docker Model Runner is running.</p>
<pre><code class="language-none">docker model status

docker model status --json #Display the information in JSON format
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_status_1cddd8195e.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_status_1cddd8195e.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_status_1cddd8195e.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_status_1cddd8195e.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_status_1cddd8195e.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="comando cli: status" title="Status"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">13 <span class="enum-header"></span> TAG</h3>
<p>Command to <strong>create a specific tag</strong> for a model.</p>
<pre><code class="language-none">docker model tag ai/llama3.2:3B-Q4_0 quantized-model
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_tag_932b73aab5.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comando_cli_tag_932b73aab5.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comando_cli_tag_932b73aab5.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comando_cli_tag_932b73aab5.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comando_cli_tag_932b73aab5.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="cli-command: tag" title="TAG"/></article>
<p>If the tag is not specified, the default value is <em>latest</em>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">14 <span class="enum-header"></span> VERSION</h3>
<p>Command to <strong>check which version</strong> of Docker Model Runner is installed on the system.</p>
<pre><code class="language-none">docker model version
</code></pre>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_version_71473b2cc3.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/comandos_cli_version_71473b2cc3.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/comandos_cli_version_71473b2cc3.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/comandos_cli_version_71473b2cc3.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/comandos_cli_version_71473b2cc3.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Comando cli: version" title="Version"/></article>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">API</h2>
<p>Once Model Runner is enabled, <strong>API endpoints are automatically exposed</strong> (both native Docker Model Runner endpoints and OpenAI-compatible endpoints), which can be used to <strong>interact</strong> with models programmatically.</p>
<p><strong>When making requests to the exposed API, it is important to consider the origin of the request</strong>:</p>
<ul>
<li><strong>From other containers</strong>: send requests to http://172.17.0.1:12434/. This interface may not always be available for calls from containers. If that is the case, you must include the <em>extra_hosts</em> instruction in the Docker Compose configuration file:</li>
</ul>
<pre><code class="language-none">extra_hosts:
  - &quot;model-runner.docker.internal:host-gateway&quot;
</code></pre>
<p>With the previous instruction, the API can be accessed through the address http://model-runner.docker.internal:12434/</p>
<ul>
<li><strong>From the host</strong>: send requests to http://localhost:12434/</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Native endpoints</h3>
<p>The <strong>available endpoints</strong> are:</p>
<ul>
<li><strong>/models/create (POST)</strong>: endpoint to <strong>download</strong> a model.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_model_create_1_c73b16e565.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/endpoints_propios_model_create_1_c73b16e565.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/endpoints_propios_model_create_1_c73b16e565.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/endpoints_propios_model_create_1_c73b16e565.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_model_create_1_c73b16e565.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="custom endpoints: /models/create" title="/models/create"/></article>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_models_create_2_6a4577f348.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/endpoints_propios_models_create_2_6a4577f348.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/endpoints_propios_models_create_2_6a4577f348.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/endpoints_propios_models_create_2_6a4577f348.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_models_create_2_6a4577f348.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="custom endpoints: /models/create" title="/models/create"/></article>
<ul>
<li><strong>/models (GET)</strong>: endpoint to <strong>list</strong> existing models in the system along with their information.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_models_get_81094cb4f6.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/endpoints_propios_models_get_81094cb4f6.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/endpoints_propios_models_get_81094cb4f6.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/endpoints_propios_models_get_81094cb4f6.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_models_get_81094cb4f6.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="custom endpoints: /models (get)" title="/models (get)"/></article>
<ul>
<li><strong>/models/{namespace}/{name} (GET)</strong>: endpoint to <strong>display information</strong> about a model.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_models_namespace_name_0f800d2955.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/endpoints_propios_models_namespace_name_0f800d2955.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/endpoints_propios_models_namespace_name_0f800d2955.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/endpoints_propios_models_namespace_name_0f800d2955.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/endpoints_propios_models_namespace_name_0f800d2955.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="custom endpoints: /models/{namespace}/{name} (get)" title="/models/{namespace}/{name} (get)"/></article>
<ul>
<li><strong>/models/{namespace}/{name} (DELETE)</strong>: endpoint to <strong>delete</strong> a local model.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/models_namespace_name_delete_3e95e27ab3.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/models_namespace_name_delete_3e95e27ab3.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/models_namespace_name_delete_3e95e27ab3.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/models_namespace_name_delete_3e95e27ab3.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/models_namespace_name_delete_3e95e27ab3.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="/models/{namespace}/{name} (DELETE)" title="/models/{namespace}/{name} (DELETE)"/></article>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">OpenAI-compatible endpoints</h3>
<p>The exposed endpoints are:</p>
<ul>
<li><strong>/engines/llama.cpp/v1/models (GET)</strong>: endpoint to <strong>list</strong> available models in the system.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/engines_llama_v1_models_79f4d33c1d.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/engines_llama_v1_models_79f4d33c1d.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/engines_llama_v1_models_79f4d33c1d.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/engines_llama_v1_models_79f4d33c1d.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/engines_llama_v1_models_79f4d33c1d.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="/engines/llama.cpp/v1/models (GET)" title="/engines/llama.cpp/v1/models (GET)"/></article>
<ul>
<li><strong>/engines/llama.cpp/v1/models/{namespace}/{name} (GET)</strong>: endpoint to <strong>expose information</strong> about a model.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_models_name_09b51bb285.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/engines_v1_models_name_09b51bb285.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/engines_v1_models_name_09b51bb285.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/engines_v1_models_name_09b51bb285.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_models_name_09b51bb285.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="/engines/llama.cpp/v1/models/{namespace}/{name} (GET)" title="/engines/llama.cpp/v1/models/{namespace}/{name} (GET)"/></article>
<ul>
<li><strong>/engines/llama.cpp/v1/chat/completions (POST)</strong>: endpoint to <strong>send</strong> a chat interaction and receive the assistant’s response. Multiple parameters can be specified, such as temperature, stream, seed, etc.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_chat_completions_109f433701.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/engines_v1_chat_completions_109f433701.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/engines_v1_chat_completions_109f433701.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/engines_v1_chat_completions_109f433701.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_chat_completions_109f433701.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="/engines/llama.cpp/v1/chat/completions (POST)" title="/engines/llama.cpp/v1/chat/completions (POST)"/></article>
<ul>
<li><strong>/engines/llama.cpp/v1/completions (POST)</strong>: model response to user input. This endpoint is <strong>already deprecated</strong> by OpenAI.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_completions_22bcc1fea1.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/engines_v1_completions_22bcc1fea1.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/engines_v1_completions_22bcc1fea1.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/engines_v1_completions_22bcc1fea1.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_completions_22bcc1fea1.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="/engines/llama.cpp/v1/completions (POST)" title="/engines/llama.cpp/v1/completions (POST)"/></article>
<ul>
<li><strong>/engines/llama.cpp/v1/embeddings (POST)</strong>: endpoint to <strong>retrieve</strong> embeddings from a text.</li>
</ul>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_embeddings_30040dd096.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/engines_v1_embeddings_30040dd096.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/engines_v1_embeddings_30040dd096.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/engines_v1_embeddings_30040dd096.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/engines_v1_embeddings_30040dd096.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="/engines/llama.cpp/v1/embeddings (POST)" title="/engines/llama.cpp/v1/embeddings (POST)"/></article>
<p>Since currently only one inference engine (llama.cpp) is supported, <strong>this part can be omitted from the URLs above</strong> (for example, /engines/llama.cpp/v1/models becomes /engines/v1/models).</p>
<article class="block block-image  -inline-block -like-text-width -center lazy-true"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/omitir_parte_url_2cd5efa0c0.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/omitir_parte_url_2cd5efa0c0.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/omitir_parte_url_2cd5efa0c0.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/omitir_parte_url_2cd5efa0c0.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/omitir_parte_url_2cd5efa0c0.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="URL simplification" title="URL simplification"/></article>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Docker Compose</h2>
<p><strong>Docker Compose allows you to define models as core components of your application, so they can be declared alongside services</strong>, enabling the application to run on any platform compatible with the Compose specification. <strong>To run models in Docker Compose, you need at least version 2.38.0 of the tool</strong>, as well as a platform that supports models in Compose, such as Docker Model Runner.</p>
<p><strong>For using models in Docker Compose, the <em>models</em> element has been introduced</strong>, which allows you to:</p>
<ul>
<li><strong>Declare AI models</strong> required by the application.</li>
<li><strong>Specify configurations and requirements</strong> for each model.</li>
<li><strong>Make the application portable</strong> across different platforms.</li>
<li>Allow the platform to <strong>manage</strong> the model lifecycle.</li>
</ul>
<p>The <strong>configuration options for the <em>models</em> element</strong> are:</p>
<ul>
<li><strong>model</strong> (required): the OCI artifact identifier for the model. This is what will be downloaded and executed by Model Runner.</li>
<li><strong>context_size</strong>: defines the maximum context window size for the model.</li>
<li><strong>runtime_flags</strong>: list of parameters passed to the inference engine when the model starts. For example, for llama.cpp, the parameters can be found <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md#usage" target="_blank">here</a>.</li>
<li><strong>x-</strong>*: extensible properties for platform-specific options.</li>
</ul>
<p>A simple example of a <em>models</em> definition could be:</p>
<pre><code class="language-none">models:
  llm:
    model: ai/llama3.2:3B-Q4_0
    context_size: 4096
    runtime_flags:
      - &quot;--temp&quot;                # Temperature
      - &quot;0.1&quot;
      - &quot;--top-p&quot;               # Top-p sampling
      - &quot;0.9&quot;
</code></pre>
<p><strong>Services can reference models in two ways</strong>:</p>
<ul>
<li><strong>Short form</strong>: the simplest approach. With this method, the platform automatically generates environment variables based on the model name:
<ul>
<li><strong>LLM_URL</strong>: URL to access the LLM model.</li>
<li><strong>LLM_MODEL</strong>: identifier of the LLM model.</li>
<li><strong>EMBEDDING_MODEL_URL</strong>: URL to access the embedding model.</li>
<li><strong>EMBEDDING_MODEL_MODEL</strong>: identifier of the embedding model.</li>
</ul>
</li>
</ul>
<pre><code class="language-none">services:
  app:
    image: my-app
    models:
      - llm
      - embedding-model

models:
  llm:
    model: ai/llama3.2:3B-Q4_0
  embedding-model:
    model: ai/embeddinggemma
</code></pre>
<ul>
<li><strong>Long form</strong>: with this configuration, the service is explicitly provided with:
<ul>
<li><strong>AI_MODEL_URL</strong> and <strong>AI_MODEL_NAME</strong> for the LLM model.</li>
<li><strong>EMBEDDING_URL</strong> and <strong>EMBEDDING_NAME</strong> for the embedding model.</li>
</ul>
</li>
</ul>
<pre><code class="language-none">services:
  app:
    image: my-app
    models:
      llm:
        endpoint_var: AI_MODEL_URL
        model_var: AI_MODEL_NAME
      embedding-model:
        endpoint_var: EMBEDDING_URL
        model_var: EMBEDDING_NAME

models:
  llm:
    model: ai/llama3.2:3B-Q4_0
  embedding-model:
    model: ai/embeddinggemma
</code></pre>
<p>Here you can find <a href="https://docs.docker.com/ai/compose/models-and-compose/#common-runtime-configurations" target="_blank">some configurations for specific use cases</a> of the <em>models</em> element in Docker Compose.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Demo</h2>
<p>To see this new <em>models</em> element in Docker Compose in action, we created a <strong>simple application to interact with an LLM</strong>. The application uses the following components:</p>
<ul>
<li>Java 21</li>
<li>Spring Boot 3.4.4 (with built-in support for <a href="https://buildpacks.io/" target="_blank">Buildpacks</a> to create Docker images for applications)</li>
<li><a href="https://www.paradigmadigital.com/dev/deep-learning-spring-ai-primeros-pasos/" target="_blank">Spring AI</a></li>
<li>Maven 3.8.5</li>
<li>Docker version 28.4.0</li>
<li>Docker Model Runner 0.1.40</li>
<li>Docker Compose 2.39.4</li>
</ul>
<p>The application simply exposes a <strong>/chat endpoint</strong> that receives user input and sends it to the corresponding LLM.</p>
<figure class="block block-caption  -inline-block -like-text-width -center"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/docker_demo_models_2245d3e6ce.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/docker_demo_models_2245d3e6ce.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/docker_demo_models_2245d3e6ce.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/docker_demo_models_2245d3e6ce.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/docker_demo_models_2245d3e6ce.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Demo Models" title="undefined"/><figcaption>Demo Models</figcaption></figure>
<p>Here you can <a href="https://github.com/paradigmadigital/local-llms" target="_blank">download the sample application code and the README file with the steps to run it</a>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusions</h2>
<p>In this final post of the series, we explored how to run LLMs with Docker and the <strong>ease it provides</strong> to integrate them into our applications thanks to <strong>Docker Compose integration</strong>.</p>
<p>Throughout this series focused on running LLMs locally, we have reviewed the most widely used tools and their particularities, all of which offer core functionalities such as commands and API endpoints to interact with models. Currently, <strong><a href="https://www.paradigmadigital.com/dev/ejecutando-llms-local-primeros-pasos-ollama/" target="_blank">Ollama</a> arguably stands out among the rest in terms of available features and advanced model customization</strong>.</p>
<p>Based on what we have seen with Ollama and Docker, will we soon see custom AI models (containerized or not) running in the cloud alongside our microservices? Only time will tell.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">References</h3>
<ul>
<li><a href="https://docs.docker.com/ai/model-runner/" target="_blank">Docker Model Runner Documentation</a></li>
</ul>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Santiago López ]]>
        </dc:creator>
        <title>The Green QA Framework: Quality that Breathes</title>
        <link>https://en.paradigmadigital.com/dev/green-qa-framework-quality-breaths/</link>
        <pubDate>Tue, 31 Mar 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/green-qa-framework-quality-breaths/</guid>
        <description>Green QA is not just about reducing tests or consumption, but about changing how we understand software quality. It involves integrating energy and carbon metrics into the entire software development lifecycle. Sustainability becomes another quality criterion, just like performance or functionality.
</description>
        <content:encoded>
            <![CDATA[
                <p>After understanding <a href="https://en.paradigmadigital.com/dev/what-is-green-qa-quality-that-breathes/" target="_blank">what it means to be eco-conscious in the world of QA</a> and recognizing the regulatory and corporate pressures pushing us toward more sustainable practices, the inevitable question arises: <strong>how do we actually implement it?</strong> The transition to a sustainable testing model requires structure, methodology, and, above all, a clear objective.</p>
<p>In this second article of our Green Quality Assurance (GQA) series, we leave behind the “why” and move into the <strong>“how.”</strong> If in the <a href="https://en.paradigmadigital.com/dev/what-is-green-qa-quality-that-breathes/" target="_blank">first article</a> we established that measuring quality in watts and CO2 is just as important as ensuring software works properly, now it is time to <strong>build the foundations that will support this new way of working</strong>. It is not just about reducing the energy consumption of our tests or running fewer test cases; it is about <strong>completely reimagining our approach to software quality</strong>.</p>
<p>The software industry must understand that <strong>technical excellence and environmental responsibility are not mutually exclusive goals</strong>. In fact, the most innovative organizations are discovering that sustainable QA practices often lead to more efficient processes, more productive teams, and, surprisingly, <strong>better final product quality</strong>.</p>
<p>But to achieve this balance, we need a <strong>robust framework</strong> that allows us to assess, implement, and continuously improve our practices.</p>
<p><strong>The journey toward Green QA is evolutionary</strong>. We cannot expect an organization to go from zero to one hundred overnight. That is why, in the following sections, we explain a <strong>gradual approach</strong> that recognizes different maturity levels, provides concrete tools for each stage, and enables us to measure our progress.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Framework layers</h2>
<p>Addressing cultural change in an organization regarding quality is usually an evolutionary process in which awareness plays a major role. The shift proposed by GQA (Green QA) introduces a <strong>new dimension to that awareness</strong>: the goal of doing things in the greenest way possible. But are we really aware of what must change to make this happen? Let’s explore it.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Governance</h3>
<p>First of all, it is important to have governance that is appropriate for this context. This is the organization’s official “mandate” and the basis of the entire process. Without it, Green QA remains an isolated initiative. Governance addresses the following points:</p>
<ul>
<li><strong>Sustainable quality policy</strong></li>
</ul>
<p>This is not just a document; it is about defining the “Green Acceptance Threshold.” It establishes the sustainability goals the company is pursuing, setting targets by resource type. Once these goals are defined, everything else is aimed at meeting them. For example: <em>“No production deployment may increase the energy consumption of the microservice by more than 5%.”</em></p>
<ul>
<li><strong>Responsibility matrix</strong></li>
</ul>
<p>This defines what each member of the organization involved in the delivery lifecycle is responsible for.</p>
<ol>
<li><strong>QA</strong>: designs efficiency test cases, defines baseline metrics, and is responsible for executing measurements in each cycle.</li>
<li><strong>Architecture</strong>: validates that design decisions do not introduce structural energy debt before reaching the testing phase.</li>
<li><strong>DevOps / Platform Engineering</strong>: ensures that the instrumentation needed to measure consumption is available in test environments. Without observability infrastructure, QA cannot measure.</li>
<li><strong>Sustainability</strong>: provides energy-to-CO2 conversion factors and ensures data traceability into the ESG reporting system.</li>
<li><strong>Compliance</strong>: verifies that data collection, processing, and reporting comply with current regulations, particularly the CSRD.</li>
<li><strong>Product Owner</strong>: formally accepts that acceptance criteria include efficiency metrics, not only functionality and traditional performance.</li>
</ol>
<ul>
<li><strong>Alignment with ESG and corporate strategy</strong>. In the <a href="https://www.paradigmadigital.com/dev/que-es-green-qa-calidad-que-respira/" target="_blank">previous post</a>, we discussed ESG extensively and its connection to Green QA, and it is something that must be considered within governance.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Processes</h3>
<p>This layer establishes how Green QA is integrated into the project’s day-to-day work.</p>
<ul>
<li><strong>Shift-Left Green</strong>: integrating environmental criteria during the Refinement phase. If a feature consumes too much unnecessary data, it is rejected before development begins.</li>
<li><strong>Green Gateways in the Pipeline</strong>: adding “quality gates” into CI/CD. If automated tests detect an unusual spike in CPU or RAM usage, the build fails. Environmental controls must be present in design, development, testing, and deployment.</li>
<li><strong>Suppliers</strong>: evaluating whether our service providers (Cloud, SaaS) operate using renewable energy.</li>
</ul>
<p>It is important that governance also defines the consequences of non-compliance with the policy, whether by blocking a release, creating technical debt, or establishing the appropriate mechanisms to prevent bypassing the defined goals.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Data and metrics</h3>
<p>This framework layer analyzes the <strong>quality of the data</strong> that will support decision-making.</p>
<ul>
<li><strong>Data traceability</strong>: ensuring that ESG data has a clear lineage, from the sensor or server log to the annual report.</li>
<li><strong>QA Data Cleaning</strong>: a process for deleting test environments, temporary databases, and old execution logs that worsen storage conditions and consume unnecessary energy.</li>
<li><strong>Accuracy vs. estimation</strong>: defining which data is measured (real) and which is estimated (mathematical models), applying different QA approaches to each.</li>
<li><strong>Definition of environmental and ESG KPIs</strong></li>
<li><strong>Data quality controls</strong> (accuracy, completeness, traceability)</li>
<li><strong>Audit and reporting</strong></li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Technology</h3>
<p>This is the layer of <strong>tools</strong>. Green QA needs technical eyes to “see” energy. Therefore, it is advisable to have tools to <strong>measure the impact of programming languages</strong> (for example, comparing Python vs. Rust consumption in critical processes), optimize test suites so they do not run 2,000 tests if only 2 lines of code changed (risk-based test selection), configure the framework so test environments “self-destruct” immediately after execution, and have measurement tools (energy, carbon, resources), green test automation, and infrastructure optimization (cloud, hardware).</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Continuous improvement</h3>
<p>Within the framework layers, it is advisable to invest in the <strong>cultural and improvement aspect</strong> so that the framework becomes circular rather than linear.</p>
<p>Elements such as “Retro-Green,” where each sprint retrospective can include a question like: “what process or code did we make more efficient this month?”, gamification through rankings of development/QA teams that have reduced their digital carbon footprint the most, and the updating of standards.</p>
<p>As ESG laws evolve, this layer changes and is typically reviewed quarterly. In this way, the framework continues to comply with new regulations and allows organizations to establish measurable reduction goals, whether quantitative or qualitative.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The path toward Zero-waste Testing</h2>
<p>One of the points mentioned above is <strong>measurement</strong>. It is essential to understand at every moment where we stand relative to the objectives in order to <strong>take the necessary actions and decisions</strong> while working within the defined governance. If you are familiar with <a href="https://www.tmmi.org/" target="_blank">TMMi</a>, it is a process that <strong>measures maturity levels</strong> in relation to testing within an organization.</p>
<p>In this regard, below is an <strong>analysis of existing levels in relation to GQA</strong>, so that we can understand where we are and what the goals should be to consolidate or advance through them. <strong>Each of these levels should be further developed to make evaluations more concrete.</strong></p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Level 1: initial (we start walking)</h3>
<p>At this level, the company is not aware of the environmental impact of its testing. If there is efficiency, it is for cost savings, not because of purpose. Compliance is reactive, without metrics.</p>
<p>At this early stage, all tests are always executed in environments where we have no visibility into their consumption and which generally remain on 24/7.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Level 2: basic (awareness has awakened)</h3>
<p>Stakeholders understand what Green QA is, and the first manual efforts begin to document impact. Manual controls and basic reporting appear.</p>
<p>At this intermediate level, assets such as <strong>servers and tools</strong> are identified in order to request sustainability reports from providers, creating an inventory of digital assets. Testing begins to be handled more consistently with this policy, for example by deleting old test data.</p>
<p>At this stage, actions still depend on people rather than automated processes.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Level 3: defined (the green standard)</h3>
<p>Sustainability is officially integrated into the quality manual. The first standardized processes and KPIs appear.</p>
<p>At this level, having a green production readiness checklist should be one of the goals. To support this, <strong>green KPIs</strong> are defined (for example, watts per test suite).</p>
<p>At the same time, this level seeks to ensure that the QA team has sufficient training in Green Coding and energy efficiency.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Level 4: managed (automated and measurable quality)</h3>
<p>A set of metrics has been established, and continuous reporting automation through pipelines is in place.</p>
<p>Once certain aspects are consolidated, including cultural ones, the goal becomes the use of “real-time carbon dashboards” integrated into tools like Jira or Grafana, so teams can see their daily impact.</p>
<p>The challenge is <strong>integrating this data with the rest of the company (ESG)</strong>. CI/CD pipelines include tools that automatically measure the CPU/RAM consumption of tests. If a test is inefficient, an alert is generated.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Level 5: optimized (Green QA as DNA)</h3>
<p>GQA is no longer an “extra”; it is the only way of working. <strong>It is aligned with the company’s overall strategy.</strong></p>
<p>Now the company uses <strong>AI to predict and minimize the energy consumption</strong> of tests. The carbon savings achieved by the QA team are reported directly in the company’s annual sustainability report (ESG). The challenge is <strong>maintaining innovation and leading standards in the industry</strong>.</p>
<p>Aspects such as the “circular economy of data,” where test data is intelligently reused to avoid generating new loading processes, begin to be taken seriously in order to consolidate green goals.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Strategy and methodology</h2>
<p>The <strong>strategy</strong> is the <strong>decision-making framework</strong> in which the elements needed to address GQA in practice are defined, aligned with all the framework layers described above.</p>
<p>The <strong>methodology</strong> describes <strong>how we implement the strategy</strong> we have defined and is responsible for defining <strong>how to execute GQA</strong>.</p>
<p>In the context of <strong>GQA</strong> (or sustainability in the software lifecycle), these tools do not only measure emissions, but also integrate into the quality process to ensure that software is efficient and complies with environmental regulations (ESG).</p>
<p>Once a strategy aligned with objectives has been established, the <strong>tools and frameworks</strong> that will be used for its implementation are selected. Below are some examples.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Measuring software efficiency (Green Testing)</h3>
<p>This is where <strong>QA has direct control</strong>. The energy consumption of a process or test suite is measured. These measurements are used to establish the baseline.</p>
<p>Before optimizing a single line of code, QA needs to know <strong>how many grams of CO2 the hardware running the application generates</strong>. Without that, we cannot measure improvement after an optimization.</p>
<p><strong>Tool: Scaphandre (energy metrology)</strong></p>
<p>An open-source power consumption metrics agent designed for Kubernetes and bare-metal servers.</p>
<ul>
<li><strong>What it is used for</strong></li>
</ul>
<p>It measures exactly how many watts a specific process consumes (for example, your Selenium suite or a microservice under load).</p>
<ul>
<li><strong>Setup and use</strong></li>
</ul>
<ol>
<li><strong>Installation</strong>: it is installed as a binary or Docker container on the server where tests run.</li>
<li><strong>Usage</strong>: it exposes metrics in Prometheus format.</li>
<li><strong>Green QA Step</strong>: configure a Grafana dashboard that crosses “CPU consumption” with “Watts consumption.” If, after a code optimization, the tests take the same time but consume fewer watts, Green QA has succeeded.</li>
</ol>
<p><strong>Tool: Eco-Code / SonarQube (Green Rules)</strong></p>
<ul>
<li><strong>What it is used for</strong></li>
</ul>
<p>Static code analysis focused on energy efficiency.</p>
<ul>
<li><strong>Setup</strong></li>
</ul>
<ol>
<li><strong>Installation</strong>: add the &quot;Green IT&quot; or &quot;Eco-Code&quot; plugin to your SonarQube instance.</li>
<li><strong>Usage</strong>: QA defines quality gateways. If the code contains patterns that wake up the CPU unnecessarily (inefficient loops, redundant API calls), the quality test fails.</li>
</ol>
<p><strong>Tool: SimaPro and GaBi</strong></p>
<p>These are industrial standards that can be adapted to the QA ecosystem in the following way:</p>
<ul>
<li><strong>What they mean for IT environments</strong></li>
</ul>
<p>They allow us to model the impact of our digital infrastructure (servers, test mobile devices, or networks). They do not only measure energy expenditure, but also the “carbon debt” of the hardware supporting our software.</p>
<ul>
<li><strong>Their strategic use in Green QA</strong></li>
</ul>
<p>They are used to establish the baseline. Before optimizing a single line of code, QA needs to know how many grams of CO2 the hardware generates. Without this, we cannot measure improvement after optimization.</p>
<ul>
<li><strong>Setup and data sources</strong></li>
</ul>
<p>To control the environmental footprint of our applications, Green QA maps:</p>
<ul>
<li><strong>Hardware inventories</strong>: CPUs, RAM, and storage systems used in staging and production environments.</li>
<li><strong>Environmental databases</strong>: sources such as Ecoinvent are integrated to calculate the impact of the energy mix (it is not the same to run a test on a server in Norway powered by hydroelectric energy as in a coal-dependent region).</li>
<li><strong>Practical decision example</strong></li>
</ul>
<p>Thanks to these tools, the QA team can make comparisons based on real data:</p>
<p>Case study: is it more sustainable to run our regression suite on old on-premise servers or migrate testing to a cloud instance with Energy Star certification and auto-scaling? Green QA uses LCA to demonstrate that migration reduces carbon footprint by X%.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Measuring Cloud Carbon Footprint (CCF)</h2>
<p>If you do not want to rely on native tools (which are sometimes opaque), <strong>Cloud Carbon Footprint is the open standard</strong>.</p>
<p><strong>Tool: Cloud Carbon Footprint (CCF)</strong></p>
<ul>
<li><strong>What it is used for</strong></li>
</ul>
<p>To visualize emissions from AWS, Azure, and GCP in one place with a transparent calculation methodology.</p>
<ul>
<li><strong>Setup</strong></li>
</ul>
<ol>
<li><strong>Connection</strong>: you need read permissions for billing files (CUR in AWS, Billing Export in GCP).</li>
<li><strong>Usage</strong>: it allows the QA team to compare regions.</li>
<li><strong>Technical decision</strong>: QA can demonstrate that moving the staging environment from a coal-based region (for example, Virginia, US-East-1) to one powered by cleaner energy (for example, Sweden or France) instantly reduces carbon footprint without changing a single line of code.</li>
</ol>
<p><strong>Tools: Watershed, Persefoni, Plan A</strong></p>
<p>These are SaaS platforms for measuring corporate carbon footprint.</p>
<ul>
<li><strong>What they are</strong></li>
</ul>
<p>They automate the calculation of Scope 1, 2, and 3 emissions.</p>
<ul>
<li><strong>Usage in Green QA</strong></li>
</ul>
<p>Software falls under Scope 3 (indirect emissions). These tools collect data from your electricity bills and cloud providers.</p>
<ul>
<li><strong>Setup</strong></li>
</ul>
<p>They connect via API to your inventory systems. The QA team reports the energy consumption of test server farms here so the company has real data on IT department impact.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Measuring sustainability in the Frontend</h2>
<p>GQA also measures the <strong>impact on the end-user device</strong>.</p>
<p><strong>Tool: GreenFrame.io or Lighthouse (Carbon Indicator)</strong></p>
<ul>
<li><strong>What it is used for</strong></li>
</ul>
<p>To measure the carbon footprint of a user session in the browser.</p>
<ul>
<li><strong>Setup and use</strong></li>
</ul>
<ol>
<li><strong>CI/CD Integration</strong>: it integrates with GitHub Actions or Jenkins.</li>
<li><strong>Usage</strong>: every time a visual regression test is launched, GreenFrame estimates the grams of CO2 produced by loading the page (data transfer + JS execution on the client).</li>
<li><strong>QA Metric</strong>: “this new Home version weighs 2MB more and generates 0.5g of extra CO2 per visit.” This is reported as a Sustainability Bug.</li>
</ol>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">QA and audit: green quality management</h2>
<p>This is where <strong>you connect data with the testing process</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Jira and TestRail</h3>
<ul>
<li><strong>Usage in Green QA</strong>: they do not measure carbon by themselves, but they are configured to manage green requirements.</li>
<li><strong>Setup</strong>
<ul>
<li><strong>Jira</strong>: create custom fields such as Estimated Carbon Cost in User Stories.</li>
<li><strong>TestRail</strong>: create a “Green Test Cases” section where you validate that the app enters power-saving mode or does not make unnecessary API requests.</li>
</ul>
</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">ESG data platforms (Environmental, Social, and Governance)</h3>
<ul>
<li><strong>What they are</strong></li>
</ul>
<p>Repositories where all evidence for legal audits is stored.</p>
<ul>
<li><strong>Usage in Green QA</strong></li>
</ul>
<p>The result of your green tests is uploaded here as proof of regulatory compliance (for example, to comply with the CSRD directive in Europe).</p>
<ul>
<li><strong>Pipeline configuration</strong></li>
</ul>
<p>For this to be true “Green QA,” the flow must be:</p>
<ol>
<li><strong>Define thresholds</strong>: in Jira, set an energy consumption limit per feature.</li>
<li><strong>Measure</strong>: during execution (Cucumber/Playwright), monitor consumption with tools such as Scaphandre or Intel Power Gadget.</li>
<li><strong>Visualize</strong>: cross that data with the Azure Emissions Dashboard.</li>
<li><strong>Audit</strong>: export reports to Persefoni or Plan A for annual accounting.</li>
</ol>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusions</h2>
<p>The transition process within an organization to embrace GQA involves a series of unavoidable steps and an adaptation process at every level.</p>
<p>It requires involvement from both the business and technical sides, beginning with cultural change and continuing through methodological and strategic adaptation.</p>
<p>All these changes will help the company comply with the legal framework already mentioned in the previous post.</p>

            ]]>
        </content:encoded>
    </item>
</channel>
</rss>
