<?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, 12 Jun 2026 06:47:32 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[ Fran Vañó ]]>
        </dc:creator>
        <title>Enterprise Blockchain: Real-World Use Cases and the Leap Toward the “Internet of Value”</title>
        <link>https://en.paradigmadigital.com/dev/enterprise-blockchain-real-world-use-cases-internet-of-value/</link>
        <pubDate>Thu, 11 Jun 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/enterprise-blockchain-real-world-use-cases-internet-of-value/</guid>
        <description>When you hear the word blockchain, what comes to mind? Most likely Bitcoin or cryptocurrencies. But this technology goes far beyond that. From auditable supply chains to authenticity certificates for luxury goods, blockchain is enabling entirely new ways of establishing trust in digital ecosystems. In this article, we explain how it works and, more importantly, how companies across a wide range of industries are already putting it into practice.
</description>
        <content:encoded>
            <![CDATA[
                <p>Blockchain has traditionally been associated with <strong>monetary investment</strong>, and this global perception is <strong>severely limiting the full range of possibilities</strong> this technology offers. If we move into pure technical development, we find that this infrastructure has <strong>enormous competitive advantages</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The Technical Anatomy of an Incorruptible Record</h2>
<p>At its strictest core, we are operating with a <strong>distributed database</strong> that encapsulates information into blocks. The real disruption does not come from this concept itself, but from <strong>three non-negotiable architectural properties</strong>.</p>
<p>First, <strong>immutability</strong>. Each block integrates the cryptographic hash of the previous one. This alphanumeric identifier acts as an unalterable mathematical seal that links the entire sequence back to the original block, known in blockchain terminology as the Genesis block. Modifying a single intermediate record would require recalculating the entire subsequent chain. In mature networks with significant volume, this computational effort becomes directly prohibitive and practically impossible to execute.</p>
<p>Second, <strong>decentralization</strong>. We completely do away with master servers or controlling entities. The network is sustained by thousands of nodes that apply identical rules through what we call a “consensus protocol.” This mathematical mechanism validates each transaction, placing trust exclusively in code and eliminating any single point of failure.</p>
<p>And third, <strong>transparency</strong>. In public deployments, information is visible to any participant. Although we operate under pseudonyms based on alphanumeric addresses, asset traceability is absolute.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">From Wallet to Mempool</h2>
<p>To understand its potential, we need to get into the details and <strong>observe how information flows</strong>. The deployment of an operation does not happen by magic: it follows a <strong>logical and auditable sequence</strong>.</p>
<p>Everything starts in the <strong>wallet or digital wallet</strong>. This tool acts as the user’s cryptographic gateway to the network. If I decide to transfer an asset, I sign the request specifying the destination address and the amount. This is where the <strong>network of nodes</strong> comes into play. When the transaction is launched, a first node intercepts it, mathematically verifies its validity, and propagates it in cascade across the rest of the infrastructure.</p>
<p>Once validated, the request is not executed immediately. It moves into a <strong>temporary waiting room called the mempool (memory pool)</strong>. Transactions wait there until the nodes responsible for assembling blocks select and package them. Depending on the rules of that specific network’s consensus protocol, <strong>a particular node will seal the block, recording the operation in the immutable history of the database</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The Threshold of the “Internet of Value”</h2>
<p>For decades, we have been comfortable with the “internet of data.” Until now, the network allowed us to send simple copies of digital files. Today, however, <strong>we have crossed the threshold into the “internet of value.”</strong></p>
<p>This infrastructure enables the <strong>peer-to-peer movement of real assets</strong>, eliminating dependency on banks, clearing houses, or traditional validation entities. When the first network, Bitcoin, was launched in late 2008, its only function was to transfer native value. Smart contracts did not yet exist.</p>
<p>The corporate explosion arrived with later operating ecosystems such as <strong>Ethereum</strong>. Here, the native cryptocurrency does not function as a mere investment. It acts as the technical fuel strictly required to <strong>deploy and run decentralized applications</strong>. If, as a developer, I want to upload a solution to this infrastructure, I need to pay that operational cost in the network’s currency.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Operational Deployments Beyond the Bubble</h2>
<p>The financial impact overwhelms inherited standards. We settle cross-border transfers in minutes compared to the days required by archaic banking pipelines. Decentralized finance (DeFi) already supports complex institutional-grade operations. We operate with <strong>algorithmic banks that issue loans or applications that generate yields</strong>. From my current company, Merso, we are immersed in this deployment by developing native protocols for installment payments using cryptocurrencies.</p>
<p>But the real qualitative leap for traditional industry happens in <strong>supply chains</strong>. The ability to audit the origin and journey of products on an immutable foundation solves historical trust deficits. These functional deployments already dominate the market:</p>
<ul>
<li><strong>Food traceability</strong>: Navidul monitors the full biography of its Iberian cured meats, from the moment the animal steps onto the pastureland to the supermarket shelf. Consumers can audit this unalterable record, including curing processes and factory timelines, by scanning a QR code.</li>
<li><strong>Industrial auditability</strong>: the AIJU technological institute applies this logic to legally prove that toy manufacturing processes meet the most demanding regulatory and safety standards regarding materials.</li>
<li><strong>Luxury certification</strong>: consortia such as Aura Blockchain, promoted by brands like Prada, Cartier, and Louis Vuitton, issue digital passports. These certificates protect authenticity against counterfeiting, tracing the product from raw material extraction to manufacturing, while also enabling a secure secondary market.</li>
<li><strong>Mechanical guarantees</strong>: the second-hand vehicle market suffers from chronic mistrust. Recording maintenance history and mileage on a distributed network neutralizes fraud. Buyers verify the real condition of the car, sellers increase the value of their asset, and the certifying workshop boosts its credibility against competitors.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Roadmap for Executive Teams: How to Bring This Down to Earth</h2>
<p>Bringing this infrastructure into your company requires <strong>technical strategy</strong>. It is not enough to install prepackaged software. Based on my experience, the integration I always propose requires <strong>three key steps</strong>:</p>
<ol>
<li><strong>Audit the technological foundation</strong></li>
</ol>
<p>Study the fundamentals. Understanding the technology is a non-negotiable requirement before proposing business hypotheses. Dive into open resources such as the book <em>Mastering Ethereum</em> or subscribe to daily technical newsletters like the one I personally write. If you do not understand the base architecture, implementation failure is guaranteed.</p>
<ol start="2">
<li><strong>Track the industry</strong></li>
</ol>
<p>Look for pioneers who have validated similar models in your sector. The trial-and-error phase in distributed systems consumes resources at an alarming rate. Validate your idea by observing previous success cases to avoid burning budget on blind experiments.</p>
<ol start="3">
<li><strong>Ground the architecture</strong></li>
</ol>
<p>Rely on technical profiles capable of analyzing the real feasibility of the infrastructure. Present your business model, design the optimal solution, and make sure to “bring it down to earth” by validating technical feasibility before writing the first line of code.</p>
<p>The paradigm shift has already happened. The only decision left is <strong>whether your organization will lead the adoption of this new “Internet of Value” or try to adapt</strong> once market standards have changed forever.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Sergio David Morel ]]>
        </dc:creator>
        <title>Measuring the Performance of AWS S3 Files: A Comparative Benchmark with S3fs-fuse</title>
        <link>https://en.paradigmadigital.com/dev/measuring-performance-aws-s3-files-comparative-benchmark-s3fs-fuse/</link>
        <pubDate>Tue, 09 Jun 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/measuring-performance-aws-s3-files-comparative-benchmark-s3fs-fuse/</guid>
        <description>AWS launched S3 Files in April 2026 as a native alternative for mounting S3 buckets as a filesystem. It sounds promising on paper, but how does it actually perform compared to s3fs-fuse in production environments? We put it to the test using fio, Terraform, and real-world workloads. The numbers tell an interesting story.
</description>
        <content:encoded>
            <![CDATA[
                <p>Based on our experience in cloud environments, <strong>accessing object storage such as AWS S3</strong> is typically solved in one of three ways: through direct API calls (<strong>AWS CLI</strong>), by mounting the bucket as a local filesystem using <strong>s3fs-fuse</strong>, or through Amazon’s new native client, <strong>AWS S3 Files</strong>.</p>
<p>In this article, we present an automated benchmark built with <strong>Terraform/OpenTofu</strong> to compare the real-world performance of these three approaches, measuring sequential read and write operations across different file sizes.</p>
<p>We analyze the <strong>IOPS, latency, and throughput of each method</strong>, concluding that there is no universally superior solution. Instead, the optimal choice depends on the characteristics of the workload.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Architecture</h2>
<p>The <strong>test environment</strong> is fully defined as <strong>Terraform infrastructure-as-code</strong> and consists of the following components:</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/entorno_pruebas_terraform_dd27ab9529.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/entorno_pruebas_terraform_dd27ab9529.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/entorno_pruebas_terraform_dd27ab9529.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/entorno_pruebas_terraform_dd27ab9529.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/entorno_pruebas_terraform_dd27ab9529.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Test environment configured with Terraform" title="undefined"/><figcaption>Test environment configured with Terraform</figcaption></figure>
<p>Each component serves a specific <strong>role</strong>:</p>
<ul>
<li><strong>S3 Bucket</strong> — Object storage with versioning enabled, SSE-KMS encryption, and public access blocked.</li>
<li><strong>EC2 Instance</strong> — Executes the benchmark automatically at startup through <strong>user-data</strong>.</li>
<li><strong>IAM Role</strong> — Least-privilege policies: GetObject, PutObject, DeleteObject, ListBucket, and HeadObject on the test bucket.</li>
<li><strong>S3 Files Mount Target</strong> — NFS mount point within the VPC subnet that connects the EC2 instance to the S3 Files filesystem.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Methodology</h2>
<p>The benchmark follows a <strong>structured design</strong> to ensure comparable results across all approaches.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Test Parameters</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Parameter</th>
<th style="text-align:center">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">Region</td>
<td style="text-align:center">eu-south-2 (Spain)</td>
</tr>
<tr>
<td style="text-align:center">Instance</td>
<td style="text-align:center">t3.micro (2 vCPU, 1 GiB RAM)</td>
</tr>
<tr>
<td style="text-align:center">OS</td>
<td style="text-align:center">Amazon Linux 2023</td>
</tr>
<tr>
<td style="text-align:center">File Sizes</td>
<td style="text-align:center">1 KB, 100 KB, 1 MB, 10 MB, 100 MB</td>
</tr>
<tr>
<td style="text-align:center">Files per Size</td>
<td style="text-align:center">10</td>
</tr>
<tr>
<td style="text-align:center">Generation Method</td>
<td style="text-align:center">/dev/urandom (non-compressible data)</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Measured Operations</h3>
<p>For <strong>AWS CLI</strong>, five sequential operations are measured:</p>
<ul>
<li><strong>UPLOAD</strong> — Upload 10 files to the bucket.</li>
<li><strong>LIST</strong> — Recursively list the test directory.</li>
<li><strong>DOWNLOAD</strong> — Download the 10 files to local disk.</li>
<li><strong>HEAD / STAT</strong> — Retrieve metadata for each object.</li>
<li><strong>DELETE</strong> — Remove the 10 objects from the bucket.</li>
</ul>
<p>For <strong>s3fs-fuse</strong> and <strong>S3 Files</strong>, benchmarks are performed using  <a href="https://github.com/axboe/fio?utm_source=chatgpt.com" target="_blank">oai_citation:0‡github.com</a> (v3.32) with direct I/O (libaio, direct=1), measuring:</p>
<ul>
<li><strong>IOPS</strong> — Sustained I/O operations per second over 30 seconds.</li>
<li><strong>Throughput (MB/s)</strong> — Effective bandwidth.</li>
<li><strong>Latency (μs)</strong> — Average latency per operation.</li>
</ul>
<p>The primary metric is the <strong>total execution time in milliseconds</strong> required to complete each operation (10 files) for the CLI approach, complemented by <strong>IOPS and throughput (MB/s)</strong> for the FUSE and S3 Files mounts.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Automation</h3>
<p>The entire lifecycle—creating the bucket, launching the instance, installing dependencies, compiling s3fs-fuse from source, mounting S3 Files, executing the tests, and generating the results CSV—is orchestrated through a single script executed as <strong>user-data</strong> during instance startup.</p>
<p>The infrastructure is defined as code using Terraform with <strong>two reusable modules</strong>:</p>
<ul>
<li><strong>modules/s3-bucket</strong> — Creates the bucket with the required security configurations.</li>
<li><strong>modules/ec2-benchmark</strong> — Deploys the instance, IAM Role, Security Group, and uploads the benchmark script to the bucket so the instance can download it at startup.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Components</h2>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">AWS CLI (Native S3)</h3>
<p>The native approach uses <strong>AWS CLI v2</strong> (aws-cli/2.33.15), which internally performs calls to the <strong>S3 REST API</strong>. Each invocation of <code>aws s3 cp</code> involves:</p>
<ul>
<li>Starting a new Python/CLI process.</li>
<li>Resolving credentials from the instance profile metadata service.</li>
<li>Establishing an HTTPS connection to the S3 endpoint.</li>
<li>Authenticating using <strong>SigV4</strong> signing.</li>
<li>Transferring content (multipart upload for files larger than 8 MB).</li>
<li>Closing and cleaning up the process.</li>
</ul>
<pre><code class="language-none"># UPLOAD — a single file
aws s3 cp &quot;test_10MB_1.dat&quot; &quot;s3://my-bucket/native/test_10MB_1.dat&quot; --no-progress

# LIST — recursive listing
aws s3 ls &quot;s3://my-bucket/native/&quot; --recursive

# HEAD — object metadata
aws s3api head-object --bucket &quot;my-bucket&quot; --key &quot;native/test_10MB_1.dat&quot;
</code></pre>
<p>For <strong>UPLOAD</strong> and <strong>DOWNLOAD</strong> operations, the benchmark iterates sequentially over the 10 files while measuring the total execution time of the entire block.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">s3fs-fuse</h3>
<p><strong>s3fs-fuse</strong> (v1.97, compiled from source from  <a href="https://github.com/s3fs-fuse/s3fs-fuse?utm_source=chatgpt.com" target="_blank">oai_citation:1‡github.com</a>) mounts an S3 bucket as a  <a href="https://en.wikipedia.org/wiki/Filesystem_in_Userspace?utm_source=chatgpt.com" target="_blank">oai_citation:2‡en.wikipedia.org</a> (<strong>Filesystem in Userspace</strong>), allowing objects to be accessed using standard POSIX operations such as <code>cp</code>, <code>ls</code>, <code>stat</code>, and <code>rm</code>.</p>
<pre><code class="language-none"># Build from source (Amazon Linux 2023)
dnf install -y fuse fuse3 fuse3-devel fuse-devel libcurl-devel \
libxml2-devel gcc-c++ make openssl-devel autoconf automake libtool git

cd /tmp &amp;&amp; git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd s3fs-fuse &amp;&amp; ./autogen.sh &amp;&amp; ./configure
make -j$(nproc) &amp;&amp; make install &amp;&amp; ldconfig

# Mount using temporary IAM Role credentials
eval $(aws configure export-credentials --format env)

s3fs &quot;my-bucket&quot; &quot;/mnt/s3&quot; \
-o access_key_id=&quot;$AWS_ACCESS_KEY_ID&quot; \
-o secret_access_key=&quot;$AWS_SECRET_ACCESS_KEY&quot; \
-o session_token=&quot;$AWS_SESSION_TOKEN&quot; \
-o use_cache=/tmp \
-o use_path_request_style \
-o enable_noobj_cache \
-o sigv2
</code></pre>
<p><strong>Note:</strong> s3fs-fuse is not available as a package for <strong>Amazon Linux 2023</strong>, so it must be compiled from source during instance initialization.</p>
<p>The <strong>mount options</strong> are critical for performance:</p>
<table>
<thead>
<tr>
<th style="text-align:center">Option</th>
<th style="text-align:center">Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">use_cache=/tmp</td>
<td style="text-align:center">Stores downloaded files in RAM (tmpfs), avoiding repeated downloads.</td>
</tr>
<tr>
<td style="text-align:center">enable_noobj_cache</td>
<td style="text-align:center">Caches object non-existence to reduce HeadObject calls.</td>
</tr>
<tr>
<td style="text-align:center">use_path_request_style</td>
<td style="text-align:center">Uses path-style URLs (/bucket/key) instead of virtual-hosted style.</td>
</tr>
<tr>
<td style="text-align:center">sigv2</td>
<td style="text-align:center">Forces API Signature Version 2, reducing authentication overhead.</td>
</tr>
</tbody>
</table>
<p>Internally, s3fs-fuse translates each POSIX operation into the corresponding S3 API call. For example, copying a new file becomes a PUT Object request, while a <code>stat</code> operation maps to a HEAD Object request.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">AWS S3 Files (mount.s3files)</h3>
<p><strong>AWS S3 Files</strong> is Amazon’s native service for mounting S3 buckets as filesystems, available through <code>mount.s3files</code> on Amazon Linux 2023. Unlike s3fs-fuse, S3 Files <strong>does not connect the EC2 instance directly to S3</strong>. The actual data path is as follows:</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/aws_s3_files_428b2dfccb.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/aws_s3_files_428b2dfccb.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/aws_s3_files_428b2dfccb.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/aws_s3_files_428b2dfccb.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/aws_s3_files_428b2dfccb.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="AWS S3 Files" title="undefined"/><figcaption>AWS S3 Files</figcaption></figure>
<p>The EC2 instance mounts a <strong>filesystem</strong> via the <strong>NFS protocol</strong> from an EFS-backed mount target that acts as a high-performance cache. This cache serves local copies of files and synchronizes changes back to the S3 bucket.</p>
<pre><code class="language-none"># Installation (Amazon Linux 2023)
dnf install -y amazon-efs-utils

# Mounting — OpenTofu creates the File System and Mount Target in the VPC.
# The benchmark script mounts it using the File System ID:

mount_file_id=$(cat /root/benchmark-results/s3files_fs_id)
/usr/sbin/mount.s3files &quot;${mount_file_id}&quot; /root/s3files-mount

# Verify mount
mount | grep s3files

# Example output:
# fs-0bbbd1d66142be171 on /root/s3files-mount type s3files ...
</code></pre>
<p>Key characteristics of <strong>S3 Files</strong>:</p>
<table>
<thead>
<tr>
<th>Characteristic</th>
<th>S3 Files</th>
<th>s3fs-fuse</th>
</tr>
</thead>
<tbody>
<tr>
<td>Architecture</td>
<td>NFS Client → Mount Target (VPC) → File System → S3</td>
<td>FUSE → HTTPS → S3 API</td>
</tr>
<tr>
<td>Protocol</td>
<td>NFSv4.1 / NFSv4.2</td>
<td>FUSE (POSIX operations translated into S3 REST API calls)</td>
</tr>
<tr>
<td>Network Path</td>
<td>EC2 → Local VPC Mount Target → S3 (AWS-managed)</td>
<td>EC2 → Internet/VPC Endpoint → S3 REST API</td>
</tr>
<tr>
<td>Read Cache</td>
<td>EFS cache (Fast Path for files &lt;128 KB)</td>
<td>Local RAM cache (use_cache=/tmp, tmpfs)</td>
</tr>
<tr>
<td>Consistency</td>
<td>Strong read-after-write by default</td>
<td>Eventual consistency with enable_noobj_cache</td>
</tr>
<tr>
<td>Credentials</td>
<td>Automatic IAM Role resolution via Mount Target</td>
<td>Manual injection of temporary credentials</td>
</tr>
</tbody>
</table>
<p>S3 Files is designed to provide <strong>strong consistency and simplified operations</strong>, but its performance characteristics can differ significantly from s3fs-fuse depending on the workload.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Environment Setup</h2>
<p>The full deployment is executed with <strong>three commands</strong>:</p>
<pre><code class="language-none"># 1. Initialize OpenTofu
tofu init

# 2. Review the plan
tofu plan -var-file=terraform.tfvars

# 3. Deploy
tofu apply -var-file=terraform.tfvars

After apply, OpenTofu returns the instance's public IP.
The benchmark starts automatically in less than one minute:

Outputs:

instance_public_ip = &quot;&lt;EC2_PUBLIC_IP&gt;&quot;
results_location = &quot;/root/benchmark-results/&quot;
ssh_command = &quot;ssh -i &lt;ssh_key&gt;.pem ec2-user@&lt;EC2_PUBLIC_IP&gt;&quot;
</code></pre>
<p>Results are stored in <strong>/root/benchmark-results/</strong> with the following files:</p>
<ul>
<li><strong>results.csv</strong> — Raw benchmark data (<code>test_name</code>, <code>operation</code>, <code>file_size</code>, <code>bw_mbps</code>, <code>iops</code>, <code>lat_us</code>).</li>
<li><strong>fio_*.json</strong> — Detailed fio logs per method and file size (latency percentiles, I/O distribution).</li>
<li><strong>benchmark.log</strong> — Complete execution log.</li>
<li><strong>summary.txt</strong> — Configuration summary and commands for downloading results.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Results</h2>
<p>The complete dataset is collected in CSV format. CLI results are measured as the total time required to perform 10 sequential operations, while s3fs-fuse and S3 Files results are measured using <strong>fio</strong> in sustained mode (30 seconds, direct I/O with libaio).</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Sequential Read — IOPS</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">AWS CLI</th>
<th style="text-align:center">s3fs-fuse</th>
<th style="text-align:center">S3 Files</th>
<th style="text-align:center">FUSE vs Files</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">1</td>
<td style="text-align:center">30,546</td>
<td style="text-align:center">1,452</td>
<td style="text-align:center">21.0x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">1</td>
<td style="text-align:center">13,213</td>
<td style="text-align:center">750</td>
<td style="text-align:center">17.6x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">1</td>
<td style="text-align:center">1,590</td>
<td style="text-align:center">30</td>
<td style="text-align:center">53.0x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">0</td>
<td style="text-align:center">114</td>
<td style="text-align:center">16</td>
<td style="text-align:center">7.1x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">0</td>
<td style="text-align:center">14</td>
<td style="text-align:center">2</td>
<td style="text-align:center">7.0x</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Sequential Read — Average Latency (μs)</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">AWS CLI</th>
<th style="text-align:center">s3fs-fuse</th>
<th style="text-align:center">S3 Files</th>
<th style="text-align:center">FUSE vs Files</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">738</td>
<td style="text-align:center">34</td>
<td style="text-align:center">686</td>
<td style="text-align:center">0.05x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">745</td>
<td style="text-align:center">75</td>
<td style="text-align:center">1,389</td>
<td style="text-align:center">0.05x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">785</td>
<td style="text-align:center">503</td>
<td style="text-align:center">33,580</td>
<td style="text-align:center">0.02x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">735</td>
<td style="text-align:center">8,761</td>
<td style="text-align:center">67,888</td>
<td style="text-align:center">0.13x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">729</td>
<td style="text-align:center">71,089</td>
<td style="text-align:center">493,593</td>
<td style="text-align:center">0.14x</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Sequential Write — IOPS</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">s3fs-fuse</th>
<th style="text-align:center">S3 Files</th>
<th style="text-align:center">FUSE vs Files</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">22,600</td>
<td style="text-align:center">219</td>
<td style="text-align:center">103.2x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">9,211</td>
<td style="text-align:center">82</td>
<td style="text-align:center">112.3x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">1,453</td>
<td style="text-align:center">49</td>
<td style="text-align:center">29.7x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">105</td>
<td style="text-align:center">12</td>
<td style="text-align:center">8.8x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">10</td>
<td style="text-align:center">2</td>
<td style="text-align:center">5.0x</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Sequential Write — Average Latency (μs)</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">s3fs-fuse</th>
<th style="text-align:center">S3 Files</th>
<th style="text-align:center">FUSE vs Files</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">42</td>
<td style="text-align:center">4,553</td>
<td style="text-align:center">0.01x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">106</td>
<td style="text-align:center">12,246</td>
<td style="text-align:center">0.01x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">684</td>
<td style="text-align:center">20,514</td>
<td style="text-align:center">0.03x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">9,496</td>
<td style="text-align:center">80,100</td>
<td style="text-align:center">0.12x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">103,649</td>
<td style="text-align:center">485,609</td>
<td style="text-align:center">0.21x</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Read Throughput (MB/s)</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">s3fs-fuse</th>
<th style="text-align:center">S3 Files</th>
<th style="text-align:center">FUSE vs Files</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">30.5</td>
<td style="text-align:center">1.4</td>
<td style="text-align:center">21.4x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">1,321</td>
<td style="text-align:center">74</td>
<td style="text-align:center">17.8x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">1,620</td>
<td style="text-align:center">30</td>
<td style="text-align:center">54.0x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">1,164</td>
<td style="text-align:center">164</td>
<td style="text-align:center">7.1x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">1,496</td>
<td style="text-align:center">210</td>
<td style="text-align:center">7.1x</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Write Throughput (MB/s)</h3>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">s3fs-fuse</th>
<th style="text-align:center">S3 Files</th>
<th style="text-align:center">FUSE vs Files</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">24.0</td>
<td style="text-align:center">0.2</td>
<td style="text-align:center">120x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">1,117</td>
<td style="text-align:center">9</td>
<td style="text-align:center">124x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">1,761</td>
<td style="text-align:center">52</td>
<td style="text-align:center">33.9x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">1,120</td>
<td style="text-align:center">136</td>
<td style="text-align:center">8.2x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">1,027</td>
<td style="text-align:center">216</td>
<td style="text-align:center">4.8x</td>
</tr>
</tbody>
</table>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">AWS CLI Operations — Total Times (ms, 10 files)</h3>
<table>
<thead>
<tr>
<th>Operation</th>
<th>1 KB</th>
<th>100 KB</th>
<th>1 MB</th>
<th>10 MB</th>
<th>100 MB</th>
</tr>
</thead>
<tbody>
<tr>
<td>UPLOAD</td>
<td>1,801</td>
<td>777</td>
<td>911</td>
<td>1,071</td>
<td>1,432</td>
</tr>
<tr>
<td>STAT</td>
<td>738</td>
<td>734</td>
<td>785</td>
<td>735</td>
<td>729</td>
</tr>
<tr>
<td>DOWNLOAD</td>
<td>824</td>
<td>854</td>
<td>878</td>
<td>880</td>
<td>1,539</td>
</tr>
</tbody>
</table>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Results Analysis</h2>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">1 <span class="enum-header"></span> AWS CLI Has a Fixed Overhead of ~7–10 Seconds</h3>
<p>Regardless of file size (1 KB or 10 MB), AWS CLI operations show a <strong>constant floor of 7 to 10 seconds</strong> to process 10 files (meaning it cannot go below that value). This is because each <code>aws s3 cp</code> invocation runs an independent process that:</p>
<ul>
<li><strong>Initializes</strong> the Python runtime.</li>
<li><strong>Loads</strong> AWS configuration (<code>~/.aws/config</code>, environment variables, metadata service).</li>
<li><strong>Establishes</strong> a new TLS connection with the S3 endpoint.</li>
<li><strong>Calculates</strong> the SigV4 signature (which includes payload hashing for uploads).</li>
</ul>
<p>File size has little influence because the <strong>setup cost dominates</strong> over the actual transfer cost, especially for small files over a sufficiently capable network connection.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">2 <span class="enum-header"></span> s3fs-fuse Takes Advantage of the Kernel Page Cache</h3>
<p>The most dramatic performance difference (up to <strong>750x</strong> in DELETE) is explained by the <strong>in-memory cache</strong>. With the <code>use_cache=/tmp</code> option, s3fs-fuse stores downloaded files in tmpfs (RAM). On Amazon Linux 2023, <code>/tmp</code> is a tmpfs mounted in memory, not on disk. This means the cache competes directly with the available memory of the instance. When the test downloads the same files that were previously uploaded, the kernel satisfies reads from the <strong>page cache</strong> without generating network traffic.</p>
<p>This is not “cheating”; it reflects a real usage pattern: <strong>in production, the same files are often read more than once, and the s3fs-fuse cache eliminates network latency on repeated access</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">3 <span class="enum-header"></span> S3 Files: Consistency in Exchange for Performance</h3>
<p>AWS S3 Files behaves fundamentally differently from s3fs-fuse. Benchmarks with <strong>fio</strong> in direct mode (<code>direct=1</code>, <code>libaio</code>) show that S3 Files presents read latencies <strong>7x to 53x higher</strong> and write latencies <strong>8x to 115x higher</strong> than s3fs-fuse:</p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>S3 Files (1 KB)</th>
<th>s3fs-fuse (1 KB)</th>
<th>Difference</th>
</tr>
</thead>
<tbody>
<tr>
<td>Read IOPS</td>
<td>1,426</td>
<td>30,546</td>
<td>FUSE 21x faster</td>
</tr>
<tr>
<td>Read Latency</td>
<td>698 μs</td>
<td>31 μs</td>
<td>FUSE 23x faster</td>
</tr>
<tr>
<td>Write IOPS</td>
<td>219</td>
<td>22,600</td>
<td>FUSE 103x faster</td>
</tr>
<tr>
<td>Write Latency</td>
<td>4,553 μs</td>
<td>42 μs</td>
<td>FUSE 108x faster</td>
</tr>
</tbody>
</table>
<p>For <strong>large files (10 MB)</strong>, the gap narrows but remains significant:</p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>S3 Files (10 MB)</th>
<th>s3fs-fuse (10 MB)</th>
<th>Difference</th>
</tr>
</thead>
<tbody>
<tr>
<td>Read IOPS</td>
<td>16</td>
<td>114</td>
<td>FUSE 7x faster</td>
</tr>
<tr>
<td>Read Latency</td>
<td>62,423 μs</td>
<td>8,761 μs</td>
<td>FUSE 7x faster</td>
</tr>
<tr>
<td>Write IOPS</td>
<td>12</td>
<td>105</td>
<td>FUSE 9x faster</td>
</tr>
<tr>
<td>Write Latency</td>
<td>80,100 μs</td>
<td>9,496 μs</td>
<td>FUSE 8x faster</td>
</tr>
</tbody>
</table>
<p>The main cause is <strong>s3fs-fuse userspace caching</strong>. Even with the fio <code>direct=1</code> option (which bypasses the kernel page cache), s3fs-fuse maintains its own cache in <code>/tmp</code> at the FUSE process level, while S3 Files performs each request through NFS toward S3 without an intermediate cache, <strong>prioritizing strong read-after-write consistency</strong>. This double-hop architecture (EC2 → EFS → S3) explains part of the additional latency observed with large files.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">4 <span class="enum-header"></span> UPLOAD with s3fs-fuse Shows Variable Results</h3>
<p>UPLOAD times with s3fs-fuse fluctuate (35–55 ms) without direct correlation to file size. This happens because the <code>cp</code> operation to a FUSE mount is <strong>asynchronous by default</strong>: the kernel returns success when data enters the buffer, while s3fs-fuse performs the PUT to S3 in the background. The subsequent <code>sync</code> <strong>forces the full write</strong>, but the measurement captures only the initial return of <code>cp</code>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">5 <span class="enum-header"></span> LIST Is Extremely Fast with s3fs-fuse</h3>
<p>The LIST operation with s3fs-fuse (2–3 ms) is notably faster than with AWS CLI (721–738 ms) because <strong>the directory is already cached after previous operations</strong>. AWS CLI, by contrast, runs paginated <code>ListObjectsV2</code> on each invocation, traversing all bucket prefixes.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">6 <span class="enum-header"></span> HEAD/STAT: The Metadata Cache Advantage</h3>
<p>The <code>enable_noobj_cache</code> option allows s3fs-fuse to <strong>also cache negative HeadObject responses</strong>. With a constant 15 ms for any file size, s3fs-fuse resolves STAT operations from local cache, while AWS CLI must perform 10 independent HTTP calls (one per file).</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">7 <span class="enum-header"></span> S3 Files Latency Scales with File Size</h3>
<p>A distinctive characteristic of S3 Files is that <strong>its latency grows proportionally with file size</strong>, both for reads and writes. This is expected in a system without local caching where each I/O operation must complete synchronously through the NFS Mount Target toward S3: <strong>EC2 → Mount Target (VPC) → File System → S3</strong>. Unlike s3fs-fuse, where per-operation latency remains low thanks to local in-memory caching (tmpfs), <strong>S3 Files does not have that intermediate layer</strong>:</p>
<ul>
<li><strong>Read</strong> 1 KB → 686 μs; read 10 MB → 67,888 μs (99x slower)</li>
<li><strong>Write</strong> 1 KB → 4,553 μs; write 10 MB → 80,100 μs (18x slower)</li>
</ul>
<p>By comparison, <strong>s3fs-fuse shows much smoother growth</strong>:</p>
<ul>
<li><strong>Read</strong> 1 KB → 34 μs; read 10 MB → 8,761 μs (258x, but starting from a much lower base)</li>
<li><strong>Write</strong> 1 KB → 42 μs; write 10 MB → 9,496 μs (226x)</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">8 <span class="enum-header"></span> At 100 MB: S3 Files Throughput Gets Closer to s3fs-fuse</h3>
<p>The 100 MB data reveals a key pattern: <strong>the s3fs-fuse advantage decreases significantly for large files</strong>. For reads, S3 Files throughput (210 MB/s) approaches s3fs-fuse throughput (1,496 MB/s), reducing the gap from 54x (1 MB) to 7.1x (100 MB). For writes, the trend is similar: S3 Files reaches 216 MB/s compared to 1,027 MB/s for s3fs-fuse, a difference of only 4.8x.</p>
<p>This <strong>behavior is consistent with the S3 Files architecture described by AWS</strong>: for large files (≥ 1 MB), reads are streamed <strong>directly from S3</strong>, bypassing the cache layer. Since S3 provides high throughput for large sequential transfers, performance converges toward the available network bandwidth.</p>
<p>However, <strong>s3fs-fuse read throughput for large files</strong> (1,496 MB/s for 100 MB) suggests that <strong>its local cache is still serving data</strong> from the kernel page cache, since 1.5 GB/s exceeds what a typical network connection can provide. This confirms that fio tests with <code>direct=1</code> do not fully bypass the s3fs-fuse cache at the FUSE process level, unlike what happens with S3 Files.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">9 <span class="enum-header"></span> S3 Files vs. s3fs-fuse in Scalability</h3>
<p>The following table summarizes <strong>how write latency evolves</strong> with file size:</p>
<table>
<thead>
<tr>
<th style="text-align:center">Size</th>
<th style="text-align:center">s3fs-fuse (μs)</th>
<th style="text-align:center">S3 Files (μs)</th>
<th style="text-align:center">Ratio</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">1 KB</td>
<td style="text-align:center">42</td>
<td style="text-align:center">4,553</td>
<td style="text-align:center">108x</td>
</tr>
<tr>
<td style="text-align:center">100 KB</td>
<td style="text-align:center">106</td>
<td style="text-align:center">12,246</td>
<td style="text-align:center">115x</td>
</tr>
<tr>
<td style="text-align:center">1 MB</td>
<td style="text-align:center">684</td>
<td style="text-align:center">20,514</td>
<td style="text-align:center">30x</td>
</tr>
<tr>
<td style="text-align:center">10 MB</td>
<td style="text-align:center">9,496</td>
<td style="text-align:center">80,100</td>
<td style="text-align:center">8.4x</td>
</tr>
<tr>
<td style="text-align:center">100 MB</td>
<td style="text-align:center">103,649</td>
<td style="text-align:center">485,609</td>
<td style="text-align:center">4.7x</td>
</tr>
</tbody>
</table>
<p>The advantage of s3fs-fuse decreases convergently: from 108x at 1 KB to only 4.7x at 100 MB. This has important <strong>practical implications</strong>:</p>
<ul>
<li><strong>For small-file workloads</strong> (metadata, configs, logs), s3fs-fuse is unavoidable: 100x faster.</li>
<li><strong>For large-file workloads</strong> (videos, datasets, backups), the difference shrinks to ~5x, and S3 Files offers strong consistency in exchange for lower performance.</li>
<li><strong>For massive transfers</strong> where throughput matters more than per-operation latency, S3 Files at 216 MB/s write throughput may be sufficient for many pipelines.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Advantages and Challenges</h2>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Advantages of AWS CLI (Native S3)</h3>
<ul>
<li><strong>Operational simplicity</strong> — Requires no additional installation or compilation. It comes preinstalled on all Amazon Linux AMIs.</li>
<li><strong>Strong consistency</strong> — Each operation queries S3 directly, ensuring up-to-date data.</li>
<li><strong>Granular control</strong> — Full support for all S3 options: multipart tuning, storage class transitions, tagging, and lifecycle policies from the CLI.</li>
<li><strong>No local state</strong> — Does not depend on cache or persistent mounts. Ideal for ephemeral pipelines (CI/CD, Lambda with containers).</li>
<li><strong>Auditable</strong> — Each operation leaves an explicit record in CloudTrail with the CLI user-agent.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Advantages of s3fs-fuse</h3>
<ul>
<li><strong>Dramatically higher performance</strong> for repeated access thanks to local file and metadata caching.</li>
<li><strong>Transparency for legacy applications</strong> — Any application that works with a POSIX filesystem can work against S3 without modifications.</li>
<li><strong>Interactivity</strong> — Manual bucket exploration with standard tools (<code>ls</code>, <code>cat</code>, <code>less</code>, <code>grep</code>).</li>
<li><strong>Integration with existing tools</strong> — <code>rsync</code>, <code>tar</code>, <code>find</code>, and Bash scripts that operate on file paths.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Advantages of AWS S3 Files</h3>
<ul>
<li><strong>Guaranteed strong consistency</strong> — Each read reflects the latest write without the risk of stale data. Ideal for workloads where data integrity is critical.</li>
<li><strong>Simplified credential management</strong> — Automatically resolves the instance profile IAM Role without needing to manually inject temporary credentials.</li>
<li><strong>NFS protocol with managed Mount Target</strong> — S3 Files uses NFSv4.1 to communicate with a Mount Target in the VPC without going through FUSE. AWS manages the S3 connectivity endpoint, avoiding the kernel/userspace context-switch overhead introduced by FUSE.</li>
<li><strong>Official AWS support</strong> — Maintained by Amazon, with native integration in Amazon Linux 2023 and technical support.</li>
<li><strong>Simple installation</strong> — Available as a system package (<code>amazon-efs-utils</code>) without needing to compile from source.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Challenges of s3fs-fuse</h3>
<ul>
<li><strong>Eventual consistency</strong> — The local cache may serve stale data if the bucket is modified from another source. Manual invalidation is required in multi-writer scenarios.</li>
<li><strong>Mounting complexity</strong> — Requires compiling from source on Amazon Linux 2023 (dependencies: <code>fuse3-devel</code>, <code>autoconf</code>, <code>automake</code>, <code>libtool</code>). Temporary IAM Role credentials must be injected explicitly because s3fs-fuse does not always resolve <code>iam_role=auto</code> correctly.</li>
<li><strong>POSIX limitations</strong> — Does not support atomic renames, hard links, or operations that require file locking. Directory operations can be slow in buckets with millions of objects.</li>
<li><strong>Mount lifecycle management</strong> — Reconnections after network failures require monitoring scripts or systemd mount units with <code>x-systemd.automount</code>.</li>
<li><strong>Memory overhead</strong> — The s3fs process consumes memory proportional to the number of cached objects, which can be significant on resource-constrained instances (such as the t3.micro used in this benchmark).</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Challenges of AWS S3 Files</h3>
<ul>
<li><strong>Lower performance than s3fs-fuse</strong> — Without local cache, each I/O operation incurs network latency against S3. In our benchmark, S3 Files shows 7x to 115x fewer IOPS than s3fs-fuse, and latencies 7x to 108x higher.</li>
<li><strong>Latency proportional to file size</strong> — Without intermediate caching, each operation’s duration scales linearly with object size, especially affecting large files (62 ms per 10 MB read vs. 8.7 ms in s3fs-fuse).</li>
<li><strong>Limited availability</strong> — AWS S3 Files is not available in all regions. If the region does not support S3 Files, the option simply does not exist.</li>
<li><strong>Limited IOPS for small files</strong> — With only ~1,400 read IOPS for 1 KB files, S3 Files is far below the ~30,500 achieved by s3fs-fuse, making it unsuitable for metadata-intensive workloads.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Challenges of AWS CLI</h3>
<ul>
<li><strong>Per-file performance overhead</strong> — Each file involves a full process execution. For massive transfers of small files, overhead dominates over actual transfer time.</li>
<li><strong>No native cache</strong> — Every <code>aws s3 cp</code> download requests the data from S3 again, even if the file has not changed.</li>
<li><strong>Limitations for legacy applications</strong> — Applications expecting POSIX file paths cannot use the CLI directly without a wrapper or adapter layer.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Production Use Cases</h2>
<p>Beyond the benchmark numbers, these are the <strong>scenarios where each method fits best</strong>:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">ML Training with Datasets in S3</h3>
<p>With S3 Files, we can mount petabytes of training data directly as a filesystem without duplicating them onto EBS volumes. Training workers (up to 25,000 simultaneously) access the data as local files, and large training batches are streamed directly from S3.</p>
<p><strong>Recommendation</strong>: S3 Files for shared accessibility; s3fs-fuse if epoch-level latency is critical and eventual consistency is acceptable.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Collaborative Workspaces for AI Agents</h3>
<p>Multi-agent systems where each agent reads and writes logs, state, and memory into a shared S3 directory. Up to 25,000 resources (EC2, Lambda, EKS pods) can connect to the same filesystem simultaneously.</p>
<p><strong>Recommendation</strong>: S3 Files — strong consistency for concurrent writes and bidirectional S3 ↔ NFS access.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Batch ETL Pipelines</h3>
<p>Processes that download files from S3, transform them, and upload them back. They do not require a persistent mount.</p>
<p><strong>Recommendation</strong>: AWS CLI — simplicity, no local state, and no mounts to manage.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Interactive Bucket Exploration</h3>
<p>Data scientists and DevOps teams that need to browse a bucket using <code>ls</code>, <code>cat</code>, <code>grep</code>, or <code>find</code> without mounting anything permanently.</p>
<p><strong>Recommendation</strong>: s3fs-fuse — local caching provides instant responses for repeated access, and POSIX interactivity is unmatched.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Large File Processing (&gt; 100 MB)</h3>
<p>Videos, image datasets, and backups where throughput matters more than per-operation latency.</p>
<p><strong>Recommendation</strong>: S3 Files or s3fs-fuse — at 100 MB, the throughput difference narrows to 5–7x. Prefer S3 Files if strong consistency or simultaneous access from multiple instances is required.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion</h2>
<p>This benchmark shows that the <strong>choice between native AWS CLI, s3fs-fuse, and AWS S3 Files</strong> depends fundamentally on the <strong>access pattern, file size, and consistency requirements</strong>:</p>
<ol>
<li>For <strong>single-use batch workloads</strong> (ETL, backups, one-off migrations), <strong>AWS CLI</strong> is the simplest and most predictable option, with strong consistency and no local state.</li>
<li>For <strong>frequent interactive access or applications expecting a filesystem, s3fs-fuse</strong> delivers 7x to 115x higher IOPS than S3 Files, and 7x to 108x lower latency, thanks to local caching, in exchange for managing eventual consistency and mount lifecycle.</li>
<li>For <strong>workloads requiring strong consistency with concurrent writes and filesystem access, S3 Files</strong> provides read-after-write guarantees without the need to manage caches, but with significantly lower performance for small files: 1,452 read IOPS for 1 KB files compared to 30,546 with s3fs-fuse, and write latencies of 4.5 ms compared to 42 μs.</li>
<li>For <strong>large file transfers (100 MB+), S3 Files converges toward s3fs-fuse throughput</strong>: at 100 MB, S3 Files reaches 210 MB/s read throughput (7.1x lower than s3fs-fuse), which may be acceptable when strong consistency is the priority.</li>
</ol>
<p>A key point to consider is that s3fs-fuse results benefit significantly from the <strong>read cache</strong>. In first-read scenarios (cold cache), download times will be comparable to AWS CLI and S3 Files, since all three approaches must transfer data from S3 over the network.</p>
<p>Adding S3 Files to the benchmark reveals that <strong>there is no universally superior solution</strong>: s3fs-fuse sacrifices consistency for performance, S3 Files sacrifices small-file performance for consistency and operational simplicity, and AWS CLI offers operational simplicity without filesystem mounting. The choice must align with the specific requirements of each workload.</p>
<p>The complete infrastructure for this benchmark is available as a reusable <strong>OpenTofu</strong> module in <a href="https://github.com/paradigmadigital/aws-s3files-benchmark" target="_blank">this repository</a>, ready to deploy in any AWS account with minimal configuration.</p>
<p>Have you run similar benchmarks in your infrastructure? What strategy do you use to access S3 from your applications? Share your experience in the comments.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">References</h3>
<ul>
<li><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files.html" target="_blank">AWS S3 Files Documentation</a> — Complete service guide, architecture, synchronization, and performance.</li>
<li><a href="https://aws.amazon.com/blogs/aws/launching-s3-files-making-s3-buckets-accessible-as-file-systems/" target="_blank">AWS News Blog: S3 Files GA Announcement</a> — General availability announcement (April 7, 2026).</li>
<li><a href="https://github.com/hashicorp/terraform-provider-aws/releases/tag/v6.40.0" target="_blank">AWS Terraform provider: Release v6.40.0</a> - Terraform provider version with S3 Files support.</li>
<li><a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-files-performance.html" target="_blank">S3 Files Performance Specifications</a> — Throughput, latency, and limits specifications.</li>
<li><a href="https://aws.amazon.com/s3/pricing/" target="_blank">S3 Files Pricing</a> — Cache storage, data access, and synchronization costs.</li>
<li><a href="https://github.com/s3fs-fuse/s3fs-fuse" target="_blank">s3fs-fuse GitHub Repository</a> — s3fs-fuse documentation and mount options.</li>
<li><a href="https://fio.readthedocs.io/" target="_blank">fio — Flexible I/O Tester</a> — I/O benchmark tool used in the tests.</li>
<li><a href="https://tutorialsdojo.com/amazon-s3-files-object-storage-meets-file-performance/" target="_blank">Tutorials Dojo: Amazon S3 Files</a> — Conceptual analysis of the S3 Files architecture.</li>
</ul>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Vanessa Davo Parreño ]]>
        </dc:creator>
        <title>WCAG 3.0: How It Is Changing the Way We Understand Web Accessibility</title>
        <link>https://en.paradigmadigital.com/dev/wcag-3-0-how-changing-way-understand-web-accessibility/</link>
        <pubDate>Thu, 04 Jun 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/dev/wcag-3-0-how-changing-way-understand-web-accessibility/</guid>
        <description>WCAG has spent decades measuring web accessibility with a binary approach: either you comply or you don’t. Version 3.0 aims to change that with new levels, progressive scoring, and, above all, a stronger focus on people’s real experiences. In this post, we walk through the changes proposed by this new version.
</description>
        <content:encoded>
            <![CDATA[
                <p>The Web Content Accessibility Guidelines (WCAG) are the reference standard that defines how to create accessible web applications for everyone, regardless of their abilities or the context in which they browse.</p>
<p>We are currently on <a href="https://www.w3.org/TR/WCAG22/" target="_blank">WCAG 2.2</a>, published as a recommendation on October 5, 2023, and until now the approach behind these guidelines has remained fairly stable.</p>
<p>Up to this point, the model has been relatively straightforward to understand: on one hand, there was a set of technical criteria defining which aspects a website needed to meet in order to be accessible, and on the other, different <a href="https://www.w3.org/TR/WCAG22/#cc1" target="_blank">conformance levels</a> (A, AA, and AAA) indicating the degree of accessibility achieved.</p>
<p>But this is changing, and that is precisely why I wanted to write this article.</p>
<p>It has now been more than five years since the publication of the first draft of <a href="https://www.w3.org/TR/wcag-3.0/" target="_blank">WCAG 3.0</a>, and although it is still exactly that—a draft—the proposal is beginning to take shape and giving us a glimpse of <strong>where digital accessibility is heading</strong>.</p>
<p><em><em>Before continuing, I want to clarify that this is not yet an official standard and should not be used as a legal or compliance reference. For now, organizations should continue working with WCAG 2.2.</em></em></p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">How Accessibility Evaluation Changes in WCAG 3.0</h2>
<p>I think the best way to understand what I mean by <em>“this is changing”</em> is to analyze <strong>how accessibility will be evaluated in WCAG 3.0</strong>. Because beyond new criteria or small technical adjustments, what is truly changing is the <strong>way we understand accessibility</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Conformance</h3>
<p>From <a href="https://www.w3.org/TR/WAI-WEBCONTENT/" target="_blank">WCAG 1.0</a> through to WCAG 2.2, the system for determining whether a website was accessible has remained almost unchanged: there was a set of <strong>success criteria</strong>, and depending on which ones were met, a given conformance level was achieved.</p>
<p>These levels were:</p>
<ul>
<li><strong>A</strong>. This is the minimum conformance level and is achieved when the website complies with all Level A success criteria.</li>
<li><strong>AA</strong>. This level is the minimum legal requirement for most websites that are required to be accessible. It is achieved when all Level A and AA criteria are met.</li>
<li><strong>AAA</strong>. This is the highest accessibility level and is achieved when all A, AA, and AAA criteria are met.</li>
</ul>
<p>However, <strong>WCAG 3.0</strong> proposes abandoning this traditional model and replacing it with a <strong>new level system</strong>:</p>
<ul>
<li><strong>Bronze</strong>. This would become the <strong>minimum conformance level</strong>. To achieve it, all pages, views, and processes included within the evaluation scope must meet all core requirements plus a portion of the supplemental requirements and assertions defined within each <a href="https://www.w3.org/TR/wcag-3.0/#functional-performance-statements" target="_blank">Functional Performance Statement</a>.</li>
<li><strong>Silver</strong>. To achieve this level, all core requirements must be met along with a greater proportion of supplemental requirements and assertions than in Bronze.</li>
<li><strong>Gold</strong>. This would become the <strong>highest conformance level</strong> within WCAG 3.0. It would require meeting all core requirements and nearly all applicable supplemental requirements and assertions.</li>
</ul>
<p>You can read more about the <a href="https://www.w3.org/TR/wcag-3.0/#conformance-requirements" target="_blank">WCAG 3.0 conformance requirements in the draft</a>.</p>
<p>Later in this article I’ll explain in more detail <strong>what core requirements, supplemental requirements, and assertions mean in WCAG 3.0</strong>. For now, the important thing to understand is that the current model works in a binary way: <strong>a criterion either passes or fails</strong>.</p>
<p>However, this new version (WCAG 3.0) aims to move away from that approach and proposes a <strong>much more flexible and progressive system based on scoring, outcomes, and real accessibility experiences</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Functional Performance Statements</h3>
<p>This new version introduces the concept of <strong>Functional Performance Statements</strong>, which broaden the way accessibility is understood. You can <a href="https://www.w3.org/TR/wcag-3.0/#functional-performance-statements" target="_blank">read more about Functional Performance Statements in the draft</a>.</p>
<p>These statements are not technical criteria as in previous versions, but rather <strong>descriptions of how a person can interact with technology based on their functional capabilities</strong>, regardless of a specific disability.</p>
<p>The goal is not to produce a list of disabilities but to <strong>describe functional limitations</strong> that may <strong>occur in different contexts</strong> and may <strong>affect anyone</strong>, whether permanently, temporarily, or situationally.</p>
<p>For example, a person with a <strong>visual impairment</strong> may need “use without vision,” but someone using a <strong>mobile phone under bright sunlight with poor visibility</strong> may encounter a similar situation.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Types of Provisions</h3>
<p>Finally—at least within the scope of this article—version 3.0 also introduces a <a href="https://www.w3.org/TR/wcag-3.0/#types-of-provision" target="_blank">new concept called Types of Provisions</a>, which defines <strong>how different requirements are evaluated and weighted</strong> within the conformance model.</p>
<p>These provision types include:</p>
<ul>
<li><strong>Core requirements</strong>. These are the aspects considered <strong>essential</strong> for an accessible experience. If any of these requirements fail, conformance cannot be achieved regardless of the total score obtained.</li>
<li><strong>Supplemental requirements</strong>. These are aspects that <strong>enhance</strong> the accessibility experience but whose absence does not completely invalidate conformance. They help measure the overall quality of the accessible experience.</li>
<li><strong>Assertions</strong>. These are <strong>additional declarations</strong> made by the organization itself to demonstrate accessibility practices that cannot always be validated automatically.</li>
</ul>
<p>Each of these has a <strong>different weight and purpose</strong> within the new evaluation system proposed by WCAG 3.0.</p>
<figure class="block block-caption -link -inline-block -like-text-width -center"><a href="https://www.w3.org/TR/wcag-3.0/#accessibility-supported"  target="_blank"><img src="https://www.paradigmadigital.com/assets/img/defaults/lazy-load.svg"
          data-src="https://www.paradigmadigital.com/assets/img/resize/small/W3_C_WCAG_3_0_Working_Draft_0787cea51c.png"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/W3_C_WCAG_3_0_Working_Draft_0787cea51c.png 1920w,https://www.paradigmadigital.com/assets/img/resize/big/W3_C_WCAG_3_0_Working_Draft_0787cea51c.png 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/W3_C_WCAG_3_0_Working_Draft_0787cea51c.png 910w,https://www.paradigmadigital.com/assets/img/resize/small/W3_C_WCAG_3_0_Working_Draft_0787cea51c.png 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Source: W3C – WCAG 3.0 Working Draft" title="undefined"/><figcaption>Source: W3C – WCAG 3.0 Working Draft</figcaption></a></figure>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusions</h2>
<p>WCAG 3.0 is still in <strong>draft status</strong>, but it already points to an <strong>important shift</strong> in the way we understand digital accessibility.</p>
<p>Beyond new levels, new terminology, or new metrics, what truly changes is the <strong>approach</strong>: we move from a model based on strict technical compliance to a <strong>model more focused on outcomes, context, and real user experience</strong>.</p>
<p>This does not mean WCAG 2.2 becomes irrelevant—quite the opposite: it remains the current standard and the active reference for web accessibility. But understanding where WCAG 3.0 is heading helps us <strong>anticipate how digital product design and development will evolve</strong> over the coming years.</p>
<p>That said, I hope you enjoyed this article and that it helped you better understand what we can expect from the new version of WCAG. I’d love to hear your thoughts in the comments!</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Manuel Zaforas ]]>
        </dc:creator>
        <title>What is Organizational Debt and Why Does Your Company Need to Manage it Today?</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/what-organizational-debt-why-company-need-manage-today/</link>
        <pubDate>Tue, 02 Jun 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/what-organizational-debt-why-company-need-manage-today/</guid>
        <description>We measure, prioritize, and manage technical debt in every sprint.We measure, prioritize, and manage technical debt in every sprint. Organizational debt, which has an equally real impact on teams, gets ignored for years, and it's time to change that. In this post, we give you 4 concrete patterns to start managing it today
</description>
        <content:encoded>
            <![CDATA[
                <p>In the IT industry, we have internalized a fundamental concept for our survival: <strong>technical debt</strong>. We pay a lot of attention to it, measure it, discuss it in our retrospectives, and know perfectly well the toll it takes if we ignore it.</p>
<p>In engineering, we have reflected deeply and worried a great deal about <strong>how to properly manage and address this structural problem</strong>. Good technical debt management tends to make it emerge, be identified, and enable agile mechanisms to deal with it, so that <strong>it becomes sustainable over time and does not block our deployments</strong>.</p>
<p>However, there is another type of debt that has a much larger and deeper impact on organizations and, paradoxically, we talk about it much less: <strong>organizational debt</strong>.</p>
<p>While our technical teams refactor code and optimize infrastructures, our <strong>corporate structures</strong> often accumulate <strong>inefficiencies, obsolete processes, and departmental misalignments</strong> that threaten organizational health.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The Silent Origin: When the End Justifies the Means</h2>
<p>Just like financial debt, taking on debt can be a good thing when it serves a strategic purpose and, at the same time, we are able to build a reasonable framework over time to repay that debt. <strong>Accepting temporary friction in the organization to capture a market opportunity</strong> is a perfectly valid business decision.</p>
<p>Organizational debt occurs when there is a decision, whether explicit or implicit, that creates an <strong>unmanaged future cost</strong>. This debt accumulates and behaves like a small virus that gradually enters organizations and slowly spreads over time.</p>
<p>Sometimes it begins as a small decision justified by a greater good, whether operational efficiency, the unavoidable urgency of time to market, or the conscious choice of the lesser evil to save a critical milestone. And this is not necessarily wrong. Just as we must be able to generate and assume technical debt responsibly when developing a product, exactly the same must happen with organizational debt in business management.</p>
<p><strong>The problem comes when, at an organizational level, we are unable to identify the debt we are generating and tackle it continuously</strong>. That is when “temporary exceptions” crystallize and become the norm.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The Impact on Culture and Proactivity</h2>
<p><strong>Organizational debt can take many forms</strong>, and if you work in a large company, all of this will probably sound familiar.</p>
<p>It may be a <strong>workflow</strong> between departments that simply does not work and creates constant bottlenecks, a <strong>bureaucratic procedure</strong> that was defined with the best intentions but was never successfully implemented in operational reality, a <strong>lack of clear role and responsibility definition</strong> that leaves critical tasks orphaned, or even a way of <strong>organizing internal knowledge that is not structured</strong>, forcing us to reinvent the wheel in every new project.</p>
<p>You have probably seen these things a thousand times in every organization. And it is also very likely that, if you have tried to ask about them, you have received <strong>automatic responses</strong> such as: <em>“we’ve always done it this way,” “we all know it doesn’t work, but it doesn’t hurt anyone,”</em> or <em>“this is the usual way of doing things in our culture.”</em> <strong>These responses are a clear reflection of our cognitive biases</strong> applied to corporate inertia, where the mind prefers to maintain the familiar status quo <strong>rather than face the effort of restructuring</strong>.</p>
<p>Often, the most toxic aspect of this organizational debt is not the inefficiency of the process itself, but <strong>the example set by the fact that the debt is not managed and remains exposed</strong>, in front of everyone and visible every single day.</p>
<p>When it begins to spread, <strong>debt is like a poison that gradually paralyzes action, brave decision-making, and team proactivity</strong>. The underlying message implicitly being sent to employees is: <em>“it doesn’t matter if we don’t do things well.”</em> This creates rust that slowly settles into the gears of the company, eroding motivation and turning innovation into a path full of unnecessary friction.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Action Patterns for Sustainable Management</h2>
<p>In these situations of stagnation, the question we should ask ourselves is: <strong>what can we do from our side to help solve the problem of organizational debt?</strong></p>
<p>There are no magic solutions or infallible frameworks, since every company has its own context, maturity, and idiosyncrasies. But we can <strong>apply some patterns</strong>, inspired by principles of <a href="https://en.paradigmadigital.com/organizational-transformation-rev/process-optimization-training-roadmap/" target="_blank">process optimization</a>, Lean, and software engineering, that can help us move toward truly sustainable debt management. I propose the following <strong>four pillars</strong>:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">1 <span class="enum-header"></span> Identify Organizational Debt</h3>
<p>The first step in solving a problem is, invariably, <strong>bringing it to light</strong>.</p>
<p>Identifying and “declaring” that debt exists is, in itself, a <strong>vital statement of intent for company culture</strong>. First, because we give it a specific name and define a clear perimeter. Second, because we publicly acknowledge that there is an improvement area and that solving it matters to us.</p>
<p>This alone, which is fundamentally a matter of attitude and psychological safety, can represent a <strong>radical shift in the negative impact trend of organizational debt</strong>.</p>
<p>Ideally, there should be some kind of <strong>register or backlog</strong> (ideally public, transparent, and collaborative) for organizational debt, similar to how we manage user stories. Through this backlog, we can assign an owner, track progress, and measure impact. This can be done <strong>at the large department level, at the technical team level, or even at a personal level</strong> for day-to-day work management.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">2 <span class="enum-header"></span> Define Priority, a Preliminary Effort Estimate, and Expected Benefit</h3>
<p><strong>Not all debt has the same impact, nor does all of it need to be repaid with the same urgency</strong>. It is important to be able to size the volume of debt we have on the table in order to measure and identify the topics with the greatest direct impact on the business (the ROI of solving them) and on people’s well-being. Without this quantification, we risk wasting energy on organizational refactorings that do not generate real value.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">3 <span class="enum-header"></span> Establish an Action Plan with Realistic Time Boundaries</h3>
<p>Once prioritized, it is time to <strong>define the steps to follow</strong>.</p>
<p>When <strong>establishing this action plan</strong>, we must be extremely pragmatic and realistic, clearly identifying the pain points. How many times have we tried to solve a problem by reinventing the approach from scratch, without first analyzing what the real failure was, only to end up building a completely different new process that suffers from the same problems as the previous one?</p>
<p>The reasonable approach is to <strong>apply a progressive approximation</strong>, just as a wound heals little by little. Sometimes we may not be able to fully solve the systemic problem on the first attempt. And that is okay. What matters is that <strong>the plan we define can be executed, is viable, and helps us take tangible steps in the right direction</strong>. If we do not completely eliminate the debt but manage to mitigate it or reduce its daily impact, we have made progress and learned valuable lessons. In the next iteration, we will be able to take the next step with much more context.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">4 <span class="enum-header"></span> Reserve Organic Capacity to Manage Debt</h3>
<p>Finally, and perhaps most importantly for leadership: managing organizational debt should not be understood as an exceptional crisis situation, a one-off “audit,” or an exhaustive radical transformation process. <strong>It should be conceived as a continuous improvement activity embedded in our organizational DNA.</strong></p>
<p>Just as development and engineering teams proactively allocate a percentage of their capacity to managing technical debt in order to keep platforms sustainable, organizations must do exactly the same for organizational debt, <strong>in an orderly, systematic way and sponsored from the top</strong>.</p>
<p>For this to work, <strong>leadership must be involved</strong>. A CEO, just as they evaluate the profitability of a business line or the adoption of new innovations, should naturally ask in the quarterly Board meeting: <em>what organizational debt have we managed and resolved this quarter?</em></p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion</h2>
<p>Dealing with entropy is part of growth, but <strong>ignoring it is a risk that no innovative organization can afford in the long term</strong>.</p>
<p>What do you think of these recommendations? Do you see them as viable in your company? Tell us what measures you have tried and which ones have truly worked.</p>
<p>If you are not managing that debt yet, the best time to start is today. Identify it, estimate its cost, and define that first step to reduce it. And remember: if the challenge exceeds your team’s current capacity, seeking external support is a brave and strategic decision.</p>
<p>Leave us your thoughts in the comments!</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Raúl Martínez ]]>
        </dc:creator>
        <title>Save Time and Avoid Misunderstandings: How to Create an Efficient Backlog with AI</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/save-time-avoid-misunderstandings-create-efficient-backlog-ai/</link>
        <pubDate>Thu, 28 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/save-time-avoid-misunderstandings-create-efficient-backlog-ai/</guid>
        <description>No more misunderstandings caused by unclear requirements in projects. AI can transcribe customer meetings and help generate an accurate product backlog, saving time, reducing costs, and avoiding endless discussions. In this post, we’ll show you how to put it into practice.
</description>
        <content:encoded>
            <![CDATA[
                <p>Over the last few days, I’ve been wondering <strong>how AI can help throughout the entire product creation process, from requirements gathering to delivery</strong>.</p>
<p>In this post, I wanted to focus on something that always creates problems and drives up costs: customer requirements and building a product backlog with real substance.</p>
<p>I always remember one project where we received some initial guidelines and a few technical definitions, but without any real clarity about the intended outcome.</p>
<p>The goal was to build a website with a “modern” frontend and an API underneath to manage a certain type of order. Time passed, and once the client finally had a clear idea of what they wanted, they said: <em>“I want this in 3 weeks.”</em></p>
<p>Obviously, it wasn’t possible in 3 weeks. We had to do much more refinement work because, although they knew what they wanted, there were undefined use cases and the actual effort required was closer to 3 months (with all the extra pressure that created both for development and for managing the situation).</p>
<p>This also impacted project billing, leading to several misunderstandings based on <em>“you told me”</em>, <em>“I told you”</em>.</p>
<p>As we learn from everything, that experience completely changed the way I approach these kinds of situations and, reflecting on it now, I see AI as a huge opportunity.</p>
<h2 class="block block-header h--h30-15-400 left  ">What do teams really need? How can AI help them?</h2>
<p>To avoid situations like this, we need clear requirements and the inputs received by the team must be well defined. If that’s not possible (for whatever reason), there should at least be traceability so they can be refined later.</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/objetivos_equipos_e651f8039d.jpg"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/objetivos_equipos_e651f8039d.jpg 1920w,https://www.paradigmadigital.com/assets/img/resize/big/objetivos_equipos_e651f8039d.jpg 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/objetivos_equipos_e651f8039d.jpg 910w,https://www.paradigmadigital.com/assets/img/resize/small/objetivos_equipos_e651f8039d.jpg 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="The importance of setting clear objectives for work teams." title="undefined"/></article>
<p>So the question I ask myself (and I already suspected the answer was yes, but let’s see how far we can take it) is: <strong>Can AI generate a backlog from customer meetings? How?</strong></p>
<p>Yes. If you have AI attending customer meetings, listening and transcribing requirements, it can help generate a product backlog with:</p>
<ul>
<li><strong>Requirements identification</strong>. From transcripts, it can detect customer needs, expected functionalities, and technical or business constraints.</li>
<li><strong>User story generation</strong>. Transform detected requirements into user stories using the standard format:
<ul>
<li>As a [user type],</li>
<li>I want [functionality],</li>
<li>so that [benefit or goal].</li>
</ul>
</li>
<li><strong>Suggested prioritization</strong>. Propose an initial development order based on what the customer emphasizes, technical dependencies, or expected impact.</li>
<li><strong>Acceptance criteria inclusion</strong>. Include acceptance criteria or completion conditions when mentioned (or suggest them when implicit).</li>
<li><strong>Continuous updates after each meeting</strong>. As more meetings take place, it can keep the backlog updated, marking items as “ready for development,” “under review,” and so on.</li>
</ul>
<p>And the next question I ask myself is: <strong>Do we still need a Product Owner acting as an intermediary if AI generates the backlog, etc.?</strong></p>
<p><strong>The answer is YES.</strong> Even though AI can automate a lot of work, <strong>it does not replace the Product Owner (PO)</strong>, who:</p>
<ul>
<li><strong>Makes business decisions</strong>: the PO deeply understands business needs and prioritizes the backlog accordingly.</li>
<li><strong>Negotiates and communicates with stakeholders</strong>: makes decisions when priorities conflict or when ambiguities require human judgment.</li>
<li><strong>Knows the customer</strong>: interprets intentions beyond what is explicitly stated in meetings.</li>
<li><strong>Validates deliverables</strong>: accepts or rejects delivered functionality based on business value.</li>
<li><strong>Works closely with the agile team</strong>: helps clarify requirements during development and answers questions quickly.</li>
</ul>
<p>AI can process information quickly, organize requirements, draft user stories, detect inconsistencies or ambiguities in requirements, and help keep the backlog clean and organized. <strong>AI can collaborate with the PO, but it cannot replace their judgment and leadership</strong>.</p>
<p>In short: you can automate a large part of the PO’s mechanical work with AI (such as generating and updating the backlog), but <strong>you still need a human role providing leadership, judgment, and strategic vision</strong>.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Collaborative workflow between AI and the Product Owner</h2>
<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/flujo_trabajo_colaborativo_ia_product_owner_d95206bb0e.jpg"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/flujo_trabajo_colaborativo_ia_product_owner_d95206bb0e.jpg 1920w,https://www.paradigmadigital.com/assets/img/resize/big/flujo_trabajo_colaborativo_ia_product_owner_d95206bb0e.jpg 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/flujo_trabajo_colaborativo_ia_product_owner_d95206bb0e.jpg 910w,https://www.paradigmadigital.com/assets/img/resize/small/flujo_trabajo_colaborativo_ia_product_owner_d95206bb0e.jpg 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Collaborative workflow between AI and Product Owner" title="undefined"/></article>
<p>Here are some practical examples of how AI can work together with both the PO and the team, reducing repetitive tasks and saving time:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Before the customer meeting</h3>
<ul>
<li><strong>AI</strong>: prepares a smart agenda based on previous topics and pending items.</li>
<li><strong>PO</strong>: reviews the agenda and adjusts it according to the product’s strategic priorities.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">During the meeting</h3>
<p><strong>AI</strong>:</p>
<ul>
<li>Transcribes in real time.</li>
<li>Automatically detects and tags requirements, ideas, issues, dates, etc.</li>
<li>Suggests draft user stories.</li>
</ul>
<p><strong>PO</strong>:</p>
<ul>
<li>Facilitates the meeting.</li>
<li>Makes decisions when ambiguities or conflicting priorities arise.</li>
<li>Clarifies details with the customer when AI cannot infer them confidently.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">After the meeting</h3>
<p><strong>AI</strong>:</p>
<ul>
<li>Generates an executive summary.</li>
<li>Converts requirements into user stories with acceptance criteria.</li>
<li>Creates and/or updates the product backlog.</li>
<li>Suggests priorities and technical dependencies.</li>
</ul>
<p><strong>PO</strong>:</p>
<ul>
<li>Validates and adjusts user stories.</li>
<li>Refines the backlog with the development team if needed.</li>
<li>Communicates important changes to key stakeholders.</li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">During development</h3>
<p><strong>AI</strong>:</p>
<ul>
<li>Monitors backlog progress.</li>
<li>Suggests story refinement based on progress or blockers.</li>
<li>Summarizes team questions or feedback for the PO.</li>
</ul>
<p><strong>PO</strong>:</p>
<ul>
<li>Answers team questions.</li>
<li>Prioritizes tasks.</li>
<li>Accepts or rejects deliverables.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Tool integration architecture</h2>
<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/arquitectura_integracion_herramientas_4eaf0015d2.jpg"
          data-srcset="https://www.paradigmadigital.com/assets/img/resize/huge/arquitectura_integracion_herramientas_4eaf0015d2.jpg 1920w,https://www.paradigmadigital.com/assets/img/resize/big/arquitectura_integracion_herramientas_4eaf0015d2.jpg 1280w,https://www.paradigmadigital.com/assets/img/resize/medium/arquitectura_integracion_herramientas_4eaf0015d2.jpg 910w,https://www.paradigmadigital.com/assets/img/resize/small/arquitectura_integracion_herramientas_4eaf0015d2.jpg 455w"
          class="lazy-img"  
                  sizes="(max-width: 767px) 80vw, 75vw"
                  alt="Tool integration architecture" title="undefined"/></article>
<p>This is an example of how we could assemble this whole setup, keeping in mind that tools may vary.</p>
<ol>
<li><strong>Meeting capture:</strong></li>
</ol>
<ul>
<li>Zoom / Meet / Teams + Otter.ai or Fireflies.ai.</li>
</ul>
<ol start="2">
<li><strong>Automatic transcription:</strong></li>
</ol>
<ul>
<li>Otter.ai, Fireflies.ai, or Whisper.</li>
<li>Output: text or JSON.</li>
</ul>
<ol start="3">
<li><strong>AI processing:</strong></li>
</ol>
<ul>
<li>AI to transform transcripts into user stories.</li>
<li>Automation using Zapier, Make, or n8n.</li>
</ul>
<ol start="4">
<li><strong>Backlog updates:</strong></li>
</ol>
<ul>
<li>Jira / Trello / Azure DevOps (REST API).</li>
</ul>
<ol start="5">
<li><strong>Team communication:</strong></li>
</ol>
<ul>
<li>Slack / Teams / Discord for automated notifications.</li>
</ul>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Conclusion</h2>
<p><strong>AI promises to transform professional relationships between customers and providers</strong> by bringing more certainty, reducing misunderstandings, minimizing risks, and focusing efforts on what truly matters. <strong>Its ability to detect blockers and suggest priorities increases both efficiency and reliability in decision-making and collaboration</strong>.</p>
<p>Although we are still in an exploratory phase and widespread implementations are not yet common, <strong>its potential to become a turning point in this space is significant</strong>.</p>

            ]]>
        </content:encoded>
    </item><item>
        <dc:creator>
            <![CDATA[ Javier Herrera ]]>
        </dc:creator>
        <title>Leadership and Creativity: Two Sides of the Same Coin in the Digital Age</title>
        <link>https://en.paradigmadigital.com/organizational-transformation-rev/leadership-creativity-two-sides-same-coin-digital-age/</link>
        <pubDate>Tue, 26 May 2026 06:00:00 GMT</pubDate>
        <guid isPermaLink="true">https://en.paradigmadigital.com/organizational-transformation-rev/leadership-creativity-two-sides-same-coin-digital-age/</guid>
        <description>When we think about great leaders, we usually associate them with vision, determination, or the ability to inspire. And when we think about creativity, we imagine brilliant ideas, disruptive innovations, or individual genius. But in reality, creativity and leadership have never been separate: they are two sides of the same coin.
Pixar revolutionized animated filmmaking because its leaders, such as Ed Catmull, built an environment where “anyone could tell anyone else that their idea wasn’t…</description>
        <content:encoded>
            <![CDATA[
                <p>When we think about <strong>great leaders</strong>, we usually associate them with <strong>vision, determination, or the ability to inspire</strong>. And when we think about <strong>creativity</strong>, we imagine <strong>brilliant ideas, disruptive innovations, or individual genius</strong>. But in reality, creativity and leadership have never been separate: <strong>they are two sides of the same coin</strong>.</p>
<p>Pixar revolutionized animated filmmaking because its leaders, such as Ed Catmull, built an environment where <em>“anyone could tell anyone else that their idea wasn’t working”</em> without fear of repercussions.</p>
<p>NASA turned the Apollo 13 crisis into an extraordinary achievement because the flight director reframed the challenge through catalytic questions: <em>“What’s still working?”, “What do we need to bring them home alive?”, “How can we improvise with what’s available onboard?”</em> leading to the famous instruction: <em>“Find a way to fit a square peg into a round hole”</em>, in order to build CO₂ filters using the materials available.</p>
<p>And Apple, in its iconic recruiting campaign, connected purpose and creativity by appealing to transcendence: <em>“It’s not just a job, it’s leaving a mark on the world.”</em></p>
<p>In terms of <strong>creativity with organizational impact</strong>, these examples show that creativity drives innovation, but only <strong>with the support of leadership</strong> can it generate <strong>sustainable transformation</strong>.</p>
<p><em>“Creativity is just connecting things.” — Steve Jobs</em></p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The Enemies of Creative Leadership</h2>
<p>Creative leadership depends not only on <strong>what we do</strong>, but also on <strong>what we avoid doing</strong>. Marshall Goldsmith, in his book <em>What Got You Here Won’t Get You There</em>, explains that many successful leaders end up blocking their teams’ creativity through unconscious habits.</p>
<p>Among the most common are:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Wanting to Add Value to Every Idea</h3>
<p>A classic. Some leaders hear a proposal and, almost automatically, add their personal touch: <em>“That’s good, but do it this other way instead.”</em> Although it may seem helpful, <strong>the real effect is demotivating</strong>: the team feels that their ideas are never enough. As a result, people stop proposing ideas because they know their work will eventually be “improved.”</p>
<p>The <strong>antidote</strong>: acknowledge ideas without adding anything else.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Always Having the Last Word</h3>
<p>Some leaders believe their authority is reinforced by expressing an opinion at the end of every conversation. The problem is that this interrupts creative flow: the implicit message is that the decision is already made.</p>
<p>The <strong>antidote</strong>: practice active listening and create space for the team to close conversations with their own conclusions or next steps.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Holding On to Past Successes</h3>
<p><em>“We’ve always done it this way”</em> is one of the <strong>greatest enemies of innovation</strong>. Leaders who rely on past achievements <strong>tend to block disruptive ideas</strong> because they threaten the way of working that once made them successful.</p>
<p>The <strong>antidote</strong>: unlearn. Recognize that what brought us here will not necessarily take us into the future.</p>
<p>Overcoming these habits does not happen overnight, but it is possible. The first step is <strong>awareness</strong>; the second is replacing them with practices that activate <strong>motivation, creativity, and shared vision</strong>.</p>
<p>This is how the <strong>creative leadership cycle</strong> emerges: a continuous process that transforms intention into action and, like continuous improvement, is not a one-time event but an <strong>iterative journey</strong> where each step reinforces and enables the next.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">The Creative Leadership Cycle</h2>
<p>Creative leadership can be understood as a <strong>four-step cycle</strong> that continuously reinforces itself:</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">1 <span class="enum-header"></span> Motivate: The Hidden Engine of Innovation</h3>
<p>What makes someone wake up eager to work? It is not only salary, but also the passion they feel for what they do.</p>
<p>Psychologist Teresa Amabile summarizes it clearly:</p>
<p><em>“Intrinsic motivation is at the heart of creativity.”</em></p>
<p>In other words, although creativity also requires knowledge, skills, and an environment that stimulates new ideas, <strong>intrinsic motivation</strong> is the force that activates them.</p>
<p>Leaders who awaken passion and help people love what they do are <strong>leading through creativity</strong>. Pixar and IDEO demonstrate that creativity flourishes in environments where experimentation is encouraged and intrinsic motivation is protected.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">2 <span class="enum-header"></span> How Defining Problems Drives Innovation</h3>
<p>Creative leaders do not limit themselves to giving quick answers. Their greatest contribution is <strong>asking powerful questions</strong>.</p>
<p>Apollo 13 illustrates this perfectly: the famous <em>“Houston, we have a problem”</em> became more than an alarm—it became a <strong>clearly framed challenge</strong> that allowed the team to focus all of its creative energy on finding the <strong>solution</strong>.</p>
<p>IDEO, a global reference in innovation, insists that <em>“a well-defined problem is half solved.”</em></p>
<p>And if someone asked what exactly makes a good problem? As IDEO explains, <em>“it is one that invites the team to think creatively and connects innovation with real human needs”</em>—which means that, in a way, it is already halfway solved once it is properly framed.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">3 <span class="enum-header"></span> The Value of Self-Awareness in Leadership</h3>
<p>Creativity flourishes when leaders operate from their strengths and align with their values.</p>
<p>As Peter Drucker wrote in <em>Managing Oneself</em>:</p>
<p><em>“Most people think they know what they are good at. They are usually wrong.”</em></p>
<p>This is where personal reflection comes in: What legacy do I want to leave? What truly motivates me?</p>
<p>Stephen Covey proposes a powerful exercise: imagine your own funeral and think about what others would say about you. It may sound extreme, but it connects with something essential: <em>leading creatively means living and acting in alignment with the impact we want to leave.</em></p>
<p>Leaders should dedicate time to understanding themselves, exploring their <em>possible identities</em> (who they could become), and aligning their role with what truly gives them meaning. That self-awareness is what conveys authenticity and gives strength to leadership.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">4 <span class="enum-header"></span> Visions That Inspire and Mobilize</h3>
<p>Creativity needs <strong>collective direction</strong>.</p>
<p>Creative leaders not only define challenges and reinvent themselves—they also <strong>articulate a vision that brings people together</strong>.</p>
<p>Examples such as Apple’s campaign <em>“It’s not just a job, it’s leaving a mark on the world”</em> or Kennedy’s speech at Rice University <em>“We choose to do these things not because they are easy, but because they are hard”</em> show how shared vision ignites motivation and innovation.</p>
<p>To communicate that vision, both content and form matter: consistency between verbal and non-verbal language, clarity of message, and storytelling.</p>
<p><strong>A vision is not imposed—it inspires.</strong></p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Self-Management: The Root of Creative Leadership</h2>
<p>Peter Drucker warned that, in the knowledge economy, success depends less on the position we hold and more on our <strong>ability to manage ourselves internally</strong>.</p>
<p>Creative leaders who do not understand or manage themselves will struggle to inspire others.</p>
<p><em>“Success comes to those who understand their strengths, their values, and how they work best.” — Peter Drucker</em></p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Strengths and Values</h3>
<p>Creative leadership flourishes when practiced from our strengths and in alignment with our values.</p>
<p>Drucker proposed questions that remain relevant today:</p>
<ul>
<li><em>What can I contribute that others cannot?</em></li>
<li><em>Under what conditions do I perform best?</em></li>
<li><em>Are my decisions aligned with my core values?</em></li>
</ul>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">The Mirror Test</h3>
<p>Drucker recalled the story of a German diplomat who rejected an opportunity because he did not want to see himself as someone who compromised integrity or acted without ethics every time he looked in the mirror.</p>
<p>The lesson is clear: <strong>creative leadership is not only about innovating, but about doing so with ethics and personal coherence</strong>.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">From Self-Management to Inspiration</h3>
<p>Self-management also means asking the key question:</p>
<p><em>“What can I contribute?”</em></p>
<p>In digital transformation contexts, this question allows leaders to connect their individual contribution with collective purpose.</p>
<p>Only then does creativity become organizational impact.</p>
<h3 class="block block-header h--h20-175-500 left  add-last-dot">Vision: From Idea to Action</h3>
<p>Creativity generates ideas but, without a vision to guide them, those ideas fade.</p>
<p>Creative leaders do not simply accumulate proposals: their real role is to give them <strong>shared meaning and mobilize people toward a possible future</strong>.</p>
<p>Jobs captured this perfectly when he said:</p>
<p><em>“Innovation distinguishes between a leader and a follower.”</em></p>
<p>A vision is not merely an inspiring speech: it is a <strong>narrative that connects ideas with concrete objectives</strong> and transforms creative energy into coordinated action.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">AI as a Mirror of Creative Leadership</h2>
<p>Artificial intelligence has fully entered organizations.</p>
<p>It can generate solutions, analyze data, and automate processes. Even models like Google Gemini or OpenAI’s ChatGPT surprise us by generating text, images, or code that appears creative.</p>
<p>But what is truly at stake is not the ability to produce more content—it is the <strong>direction, purpose, and authenticity</strong> that only human leadership can provide.</p>
<p>AI opens possibilities, but only a leader can decide what is worth pursuing and with what purpose.</p>
<h2 class="block block-header h--h30-15-400 left  add-last-dot">Final Reflection</h2>
<p><em>“Innovation distinguishes between a leader and a follower.” — Steve Jobs</em></p>
<p>In a world accelerated by technology, only <strong>creative and inspiring leadership</strong> enables organizations not merely to survive, but to <strong>set the direction</strong>.</p>
<p>To achieve this, it is essential to <em>unlearn</em> habits that inhibit creativity and begin with deep <em>self-management and purpose</em>.</p>
<p>And if you would like to explore how creative leadership connects with real transformation, I invite you to read three essential analyses by Paradigma Digital developed by Carmen Portillo, José Antonio González, and Javier Navarro.</p>
<ul>
<li><em>People management processes: key to evolving toward adaptive organizations</em></li>
<li><em>Lead through coaching and achieve maximum performance</em></li>
<li><em>The power of effective leadership in technological transformation</em></li>
</ul>
<p>Leading today is not about managing what is already known—it is about <strong>connecting people, purpose, and transformation through creativity</strong>.</p>
<p><strong>Are you ready to do it?</strong></p>

            ]]>
        </content:encoded>
    </item><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>
</channel>
</rss>
