<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[estebanrfp]]></title><description><![CDATA[Full Stack Developer — dWEB R&amp;D. Building distributed systems, P2P databases, and virtual worlds with pure JavaScript.]]></description><link>https://estebanrfp.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 00:31:40 GMT</lastBuildDate><atom:link href="https://estebanrfp.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Crypto Glossary: Essential Terms Every Developer Should Know]]></title><description><![CDATA[Crypto moves fast. New terms appear every cycle, and old ones get redefined. Whether you're building on blockchain, investing, or just trying to follow the conversation, you need a solid foundation.
This is not a "top 500 crypto terms" listicle. It's...]]></description><link>https://estebanrfp.com/crypto-glossary-developers</link><guid isPermaLink="true">https://estebanrfp.com/crypto-glossary-developers</guid><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 22:24:49 GMT</pubDate><enclosure url="https://i.imgur.com/uGyYFbO.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Crypto moves fast. New terms appear every cycle, and old ones get redefined. Whether you're building on blockchain, investing, or just trying to follow the conversation, you need a solid foundation.</p>
<p>This is not a "top 500 crypto terms" listicle. It's a curated glossary of the concepts that actually matter — the ones you'll encounter in real codebases, whitepapers, and technical discussions.</p>
<h2 id="heading-blockchain-fundamentals">Blockchain Fundamentals</h2>
<p><strong>Blockchain</strong> — A distributed ledger where data is stored in blocks, cryptographically linked in sequence. Each block references the hash of the previous one, making the chain tamper-evident. Not every distributed database is a blockchain, and not every blockchain is decentralized.</p>
<p><strong>Block</strong> — A container of transactions. Each block includes a timestamp, a reference to the previous block (hash), and a merkle root of all transactions it contains.</p>
<p><strong>Hash</strong> — A fixed-length fingerprint of data produced by a cryptographic function (SHA-256, Keccak-256). Change one bit of input, and the entire hash changes. Hashing is one-way: you can't reverse it.</p>
<p><strong>Merkle Tree</strong> — A binary tree of hashes used to efficiently verify data integrity. The root hash represents all transactions in a block. You can prove a transaction exists without downloading the entire block.</p>
<p><strong>Node</strong> — A computer running blockchain software. Full nodes validate every transaction and store the complete chain. Light nodes verify headers only.</p>
<p><strong>Consensus</strong> — The mechanism by which nodes agree on the state of the ledger. Without consensus, distributed systems can't function.</p>
<h2 id="heading-consensus-mechanisms">Consensus Mechanisms</h2>
<p><strong>Proof of Work (PoW)</strong> — Miners compete to solve a cryptographic puzzle. The first to find a valid hash earns the right to propose the next block and receives a reward. Energy-intensive by design — the cost of attacking the network must exceed the reward.</p>
<p><strong>Proof of Stake (PoS)</strong> — Validators lock up tokens as collateral ("staking"). The protocol selects validators based on their stake to propose and validate blocks. Slashing punishes dishonest validators by burning their stake.</p>
<p><strong>Delegated Proof of Stake (DPoS)</strong> — Token holders vote for delegates who validate on their behalf. Faster consensus, but more centralized.</p>
<h2 id="heading-cryptography">Cryptography</h2>
<p><strong>Public Key</strong> — Your address. Derived from your private key using elliptic curve cryptography. Safe to share.</p>
<p><strong>Private Key</strong> — Your password. Whoever has this controls the funds. Lose it, and your assets are gone forever. There is no "forgot password."</p>
<p><strong>Seed Phrase (Mnemonic)</strong> — A human-readable representation of your private key. Usually 12 or 24 words following the BIP-39 standard. Write it on paper. Never store it digitally.</p>
<p><strong>Digital Signature</strong> — Proof that a transaction was authorized by the holder of the private key, without revealing the key itself. Every transaction on every blockchain uses digital signatures.</p>
<p><strong>Zero-Knowledge Proof (ZKP)</strong> — A method to prove you know something without revealing what you know. Used in privacy coins (Zcash) and Layer 2 scaling (zkSync, StarkNet).</p>
<h2 id="heading-tokens-and-standards">Tokens and Standards</h2>
<p><strong>Fungible Token</strong> — Interchangeable units. One ETH equals any other ETH. ERC-20 is the standard on Ethereum.</p>
<p><strong>Non-Fungible Token (NFT)</strong> — Unique tokens representing ownership of a specific asset. ERC-721 on Ethereum. The hype died; the technology is sound.</p>
<p><strong>ERC-20</strong> — The standard interface for fungible tokens on Ethereum. Defines <code>transfer</code>, <code>approve</code>, <code>balanceOf</code>, and other functions that wallets and exchanges expect.</p>
<p><strong>ERC-721</strong> — The standard for non-fungible tokens. Each token has a unique ID.</p>
<p><strong>ERC-1155</strong> — A multi-token standard that supports both fungible and non-fungible tokens in a single contract. More gas-efficient for batch operations.</p>
<p><strong>Gas</strong> — The unit measuring computational effort on Ethereum. Every operation (transfer, contract call, storage write) costs gas. Gas price fluctuates with network demand.</p>
<p><strong>Wei</strong> — The smallest unit of ETH. 1 ETH = 10^18 Wei. Like satoshis to Bitcoin.</p>
<h2 id="heading-defi-decentralized-finance">DeFi (Decentralized Finance)</h2>
<p><strong>DEX (Decentralized Exchange)</strong> — A trading platform that operates through smart contracts instead of a central authority. Uniswap, SushiSwap, PancakeSwap. No KYC, no custody, no downtime.</p>
<p><strong>AMM (Automated Market Maker)</strong> — The algorithm that DEXs use instead of order books. Liquidity providers deposit token pairs into pools. Price is determined by the ratio of tokens in the pool (constant product formula: x * y = k).</p>
<p><strong>Liquidity Pool</strong> — A smart contract holding token pairs that traders swap against. Providers earn fees proportional to their share of the pool.</p>
<p><strong>Impermanent Loss</strong> — The difference between holding tokens in a liquidity pool vs. holding them in a wallet. When prices diverge, pool providers lose relative value. It's "impermanent" only if prices return to the original ratio — which they often don't.</p>
<p><strong>Yield Farming</strong> — Moving assets between protocols to maximize returns. High APY often means high risk, token inflation, or both.</p>
<p><strong>TVL (Total Value Locked)</strong> — The total value of assets deposited in a DeFi protocol. A rough measure of trust and adoption.</p>
<p><strong>Flash Loan</strong> — An uncollateralized loan that must be borrowed and repaid within a single transaction. If repayment fails, the entire transaction reverts. Used for arbitrage, liquidations, and exploits.</p>
<h2 id="heading-wallets">Wallets</h2>
<p><strong>Hot Wallet</strong> — Connected to the internet. Convenient, but vulnerable. MetaMask, Trust Wallet.</p>
<p><strong>Cold Wallet</strong> — Offline. Hardware wallets (Ledger, Trezor) or paper wallets. Secure, but less convenient.</p>
<p><strong>Custodial Wallet</strong> — A third party holds your keys. Exchanges like Coinbase, Binance. "Not your keys, not your coins."</p>
<p><strong>Non-Custodial Wallet</strong> — You control your keys. MetaMask, Ledger. Full ownership, full responsibility.</p>
<h2 id="heading-scaling">Scaling</h2>
<p><strong>Layer 1 (L1)</strong> — The base blockchain. Bitcoin, Ethereum, Solana. Where final settlement happens.</p>
<p><strong>Layer 2 (L2)</strong> — Protocols built on top of L1 to increase throughput and reduce fees. Transactions execute on L2 and settle on L1. Polygon, Arbitrum, Optimism, zkSync.</p>
<p><strong>Rollup</strong> — An L2 scaling technique that bundles multiple transactions into a single L1 transaction. Two types: optimistic (assumes valid, challenged if disputed) and ZK (proves validity with zero-knowledge proofs).</p>
<p><strong>Sidechain</strong> — A separate blockchain connected to the main chain via a bridge. Processes transactions independently but can transfer assets to/from the main chain.</p>
<p><strong>Sharding</strong> — Splitting the blockchain into parallel segments (shards) that process transactions simultaneously. Ethereum's long-term scaling strategy.</p>
<h2 id="heading-security">Security</h2>
<p><strong>51% Attack</strong> — If an entity controls more than half the network's mining/staking power, they can rewrite transaction history. Expensive on large networks, feasible on small ones.</p>
<p><strong>Rug Pull</strong> — Developers drain liquidity or abandon a project after raising funds. Common in DeFi and NFT projects with anonymous teams.</p>
<p><strong>Reentrancy Attack</strong> — A smart contract vulnerability where a malicious contract calls back into the victim contract before the first execution completes. The DAO hack (2016, $60M) was a reentrancy attack.</p>
<p><strong>Front-Running</strong> — Inserting a transaction ahead of a known pending transaction to profit from the price impact. Bots monitor the mempool and pay higher gas to get priority.</p>
<p><strong>MEV (Miner/Maximal Extractable Value)</strong> — The profit that miners/validators can extract by reordering, inserting, or censoring transactions. A fundamental challenge in blockchain fairness.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Crypto's vocabulary is dense, but it maps to real computer science and economics concepts. Understanding these terms isn't about following trends — it's about understanding the infrastructure being built.</p>
<p><strong>The technology survives every crash. Learn the fundamentals, not the hype.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[Smart Contracts: What They Are, How They Work, and Why They Matter]]></title><description><![CDATA[A smart contract is a program that executes automatically when predefined conditions are met. No intermediaries, no manual approval, no trust required. The code runs on a blockchain, which means it's transparent, immutable, and decentralized.
The con...]]></description><link>https://estebanrfp.com/smart-contracts-explained</link><guid isPermaLink="true">https://estebanrfp.com/smart-contracts-explained</guid><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 22:23:47 GMT</pubDate><enclosure url="https://i.imgur.com/xycVIqI.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A smart contract is a program that executes automatically when predefined conditions are met. No intermediaries, no manual approval, no trust required. The code runs on a blockchain, which means it's transparent, immutable, and decentralized.</p>
<p>The concept isn't new. Nick Szabo described it in <strong>1997</strong> — a decade before Bitcoin existed. But it took blockchain technology to make it practical.</p>
<h2 id="heading-how-smart-contracts-work">How Smart Contracts Work</h2>
<p>A smart contract is deployed to a blockchain as bytecode. Once deployed, it has its own address and can:</p>
<ul>
<li><strong>Receive and hold funds</strong></li>
<li><strong>Execute logic</strong> when triggered by a transaction</li>
<li><strong>Interact with other contracts</strong></li>
<li><strong>Emit events</strong> that external systems can listen to</li>
</ul>
<p>The key properties:</p>
<ol>
<li><strong>Immutable</strong> — once deployed, the code cannot be changed (unless designed with upgrade patterns)</li>
<li><strong>Transparent</strong> — anyone can inspect the bytecode and verify what it does</li>
<li><strong>Deterministic</strong> — given the same inputs, every node produces the same output</li>
<li><strong>Trustless</strong> — execution is guaranteed by the network, not by any party</li>
</ol>
<h2 id="heading-a-simple-example">A Simple Example</h2>
<p>Here's a basic escrow contract in Solidity (Ethereum's smart contract language):</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">SimpleEscrow</span> </span>{
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> buyer;
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> seller;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> amount;
    <span class="hljs-keyword">bool</span> <span class="hljs-keyword">public</span> released;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _seller</span>) <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        buyer <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
        seller <span class="hljs-operator">=</span> _seller;
        amount <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">release</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> buyer, <span class="hljs-string">"Only buyer can release"</span>);
        <span class="hljs-built_in">require</span>(<span class="hljs-operator">!</span>released, <span class="hljs-string">"Already released"</span>);
        released <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
        <span class="hljs-keyword">payable</span>(seller).<span class="hljs-built_in">transfer</span>(amount);
    }
}
</code></pre>
<p>No bank. No escrow service. No lawyer. The buyer deposits funds, and only the buyer can release them to the seller. The blockchain enforces the rules.</p>
<h2 id="heading-platforms">Platforms</h2>
<h3 id="heading-ethereum">Ethereum</h3>
<p>The first and most established smart contract platform. Uses Solidity as its primary language. The largest ecosystem of DeFi, NFTs, and DAOs.</p>
<p><strong>Strengths:</strong> Largest developer community, most battle-tested, extensive tooling.
<strong>Weaknesses:</strong> High gas fees during congestion, slower transaction speed.</p>
<h3 id="heading-polygon">Polygon</h3>
<p>A Layer 2 scaling solution for Ethereum. Smart contracts are compatible with Ethereum but execute on a faster, cheaper network.</p>
<p><strong>Strengths:</strong> Low fees, fast finality, Ethereum compatibility.
<strong>Weaknesses:</strong> Depends on Ethereum for security guarantees.</p>
<h3 id="heading-solana">Solana</h3>
<p>High-throughput blockchain using Rust for smart contracts. Designed for speed — up to 65,000 transactions per second.</p>
<p><strong>Strengths:</strong> Speed, low fees, growing ecosystem.
<strong>Weaknesses:</strong> Higher complexity, network stability incidents.</p>
<h3 id="heading-bitcoin">Bitcoin</h3>
<p>Bitcoin's scripting language supports basic smart contracts — multi-signature wallets, time-locked transactions, hash-locked payments. Limited compared to Ethereum, but more secure by design.</p>
<p>With <strong>Taproot</strong> (2021), Bitcoin gained more expressive scripting capabilities while maintaining privacy.</p>
<h2 id="heading-real-world-applications">Real-World Applications</h2>
<h3 id="heading-defi-decentralized-finance">DeFi (Decentralized Finance)</h3>
<p>Lending, borrowing, trading, and yield farming — all without banks. Protocols like Aave, Uniswap, and Compound run entirely on smart contracts.</p>
<p>Total value locked (TVL) in DeFi contracts: <strong>$100B+</strong> as of 2025.</p>
<h3 id="heading-daos-decentralized-autonomous-organizations">DAOs (Decentralized Autonomous Organizations)</h3>
<p>Organizations governed by smart contracts instead of boards of directors. Token holders vote on proposals, and the contract executes the decisions automatically.</p>
<h3 id="heading-supply-chain">Supply Chain</h3>
<p>Tracking goods from manufacturer to consumer. Each transfer is recorded on-chain, creating an immutable audit trail.</p>
<h3 id="heading-insurance">Insurance</h3>
<p>Parametric insurance contracts that pay out automatically based on data feeds. Flight delayed by 3 hours? The contract pays the claim without filing paperwork.</p>
<h3 id="heading-digital-identity">Digital Identity</h3>
<p>Self-sovereign identity systems where users control their own credentials, verified by smart contracts without centralized authorities.</p>
<h2 id="heading-the-risks">The Risks</h2>
<h3 id="heading-code-is-law-for-better-and-worse">Code Is Law (For Better and Worse)</h3>
<p>If the contract has a bug, the bug executes. The DAO hack of 2016 exploited a reentrancy vulnerability and drained $60M. The code worked exactly as written — it was just written wrong.</p>
<h3 id="heading-immutability-cuts-both-ways">Immutability Cuts Both Ways</h3>
<p>You can't patch a deployed contract. Upgrade patterns exist (proxy contracts), but they add complexity and reintroduce trust assumptions.</p>
<h3 id="heading-oracle-problem">Oracle Problem</h3>
<p>Smart contracts can't access external data directly. They need <strong>oracles</strong> — services like Chainlink that feed real-world data to the blockchain. The oracle becomes a trust point.</p>
<h3 id="heading-gas-costs">Gas Costs</h3>
<p>On Ethereum, every operation costs gas. Complex contracts can become expensive to execute, limiting their practical use for micro-transactions.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Smart contracts remove intermediaries by replacing trust with code. They're not perfect — bugs are irreversible, oracles introduce trust points, and gas costs can be prohibitive.</p>
<p>But for financial agreements, governance, and any process where trust is expensive or impossible, smart contracts offer something no traditional system can: <strong>execution that no single party can prevent, alter, or reverse.</strong></p>
<p><strong>Don't trust. Verify. Or better yet — let the code verify for you.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[TDD, BDD, and ATDD: What They Are, How They Differ, and When to Use Each]]></title><description><![CDATA[Testing methodologies are one of those topics where everyone has an opinion but few have clarity. TDD, BDD, and ATDD are often conflated, misunderstood, or dismissed as "the same thing with different names."
They're not. Each solves a different probl...]]></description><link>https://estebanrfp.com/tdd-bdd-atdd-testing</link><guid isPermaLink="true">https://estebanrfp.com/tdd-bdd-atdd-testing</guid><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 22:23:18 GMT</pubDate><enclosure url="https://i.imgur.com/nSRUqSw.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Testing methodologies are one of those topics where everyone has an opinion but few have clarity. TDD, BDD, and ATDD are often conflated, misunderstood, or dismissed as "the same thing with different names."</p>
<p>They're not. Each solves a different problem, involves different people, and produces different results.</p>
<h2 id="heading-tdd-test-driven-development">TDD — Test Driven Development</h2>
<p><strong>Who:</strong> Developers.
<strong>Focus:</strong> Code correctness at the unit level.</p>
<p>TDD follows a strict cycle:</p>
<ol>
<li><strong>Red</strong> — Write a test for functionality that doesn't exist yet. It fails.</li>
<li><strong>Green</strong> — Write the minimum code to make the test pass.</li>
<li><strong>Refactor</strong> — Clean up the code while keeping tests green.</li>
</ol>
<pre><code class="lang-js"><span class="hljs-comment">// Red: test first</span>
test(<span class="hljs-string">'add returns sum of two numbers'</span>, <span class="hljs-function">() =&gt;</span> {
  expect(add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>)).toBe(<span class="hljs-number">5</span>);
});

<span class="hljs-comment">// Green: minimal implementation</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span>(<span class="hljs-params">a, b</span>) </span>{
  <span class="hljs-keyword">return</span> a + b;
}

<span class="hljs-comment">// Refactor: nothing to refactor here — it's already clean</span>
</code></pre>
<h3 id="heading-why-tdd-works">Why TDD Works</h3>
<ul>
<li><strong>Forces design thinking.</strong> Writing the test first means you think about the interface before the implementation.</li>
<li><strong>Catches regressions immediately.</strong> Every change runs against the full test suite.</li>
<li><strong>Produces testable code.</strong> Code written to pass tests is inherently modular and decoupled.</li>
</ul>
<h3 id="heading-the-common-mistake">The Common Mistake</h3>
<p>Most teams that "do TDD" actually write tests after the code. That's not TDD — that's just testing. The order matters. Writing the test first changes how you think about the problem.</p>
<h2 id="heading-bdd-behavior-driven-development">BDD — Behavior Driven Development</h2>
<p><strong>Who:</strong> Developers, QA, product managers — together.
<strong>Focus:</strong> System behavior described in human-readable language.</p>
<p>BDD extends TDD by expressing tests in natural language using the <strong>Given-When-Then</strong> format:</p>
<pre><code class="lang-gherkin">Feature: User login

  Scenario: Successful login with valid credentials
    Given the user is on the login page
    When they enter valid credentials
    Then they should be redirected to the dashboard
    And they should see a welcome message

  Scenario: Failed login with wrong password
    Given the user is on the login page
    When they enter an invalid password
    Then they should see an error message
    And they should remain on the login page
</code></pre>
<h3 id="heading-why-bdd-works">Why BDD Works</h3>
<ul>
<li><strong>Shared language.</strong> Non-technical stakeholders can read and validate the specifications.</li>
<li><strong>Living documentation.</strong> The tests <em>are</em> the documentation. When they pass, the documentation is accurate.</li>
<li><strong>Catches misunderstandings early.</strong> When the product manager reads the scenario and says "that's not what I meant," you've saved a sprint of wasted work.</li>
</ul>
<h3 id="heading-tools">Tools</h3>
<ul>
<li><strong>Cucumber</strong> (JavaScript, Ruby, Java) — the most popular BDD framework</li>
<li><strong>Jest + Gherkin</strong> — for JavaScript-native BDD</li>
<li><strong>Behave</strong> (Python)</li>
</ul>
<h2 id="heading-atdd-acceptance-test-driven-development">ATDD — Acceptance Test Driven Development</h2>
<p><strong>Who:</strong> The entire team — developers, QA, product, and stakeholders.
<strong>Focus:</strong> Acceptance criteria defined before development begins.</p>
<p>ATDD is similar to BDD in structure, but the emphasis is different. While BDD focuses on behavior specification, ATDD focuses on <strong>acceptance criteria</strong> — the conditions that must be met for a feature to be considered done.</p>
<p>The process:</p>
<ol>
<li><strong>Discuss</strong> — The team defines acceptance criteria collaboratively.</li>
<li><strong>Distill</strong> — Criteria are written as executable tests.</li>
<li><strong>Develop</strong> — Code is written to satisfy the acceptance tests.</li>
<li><strong>Demo</strong> — The passing tests demonstrate that the feature meets requirements.</li>
</ol>
<h3 id="heading-the-key-difference-from-bdd">The Key Difference from BDD</h3>
<p>BDD is bottom-up: behaviors define the system.
ATDD is top-down: business requirements define the acceptance criteria.</p>
<p>In practice, many teams blend both — using BDD-style syntax (Given-When-Then) to express ATDD acceptance criteria.</p>
<h2 id="heading-comparison">Comparison</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>TDD</td><td>BDD</td><td>ATDD</td></tr>
</thead>
<tbody>
<tr>
<td>Primary audience</td><td>Developers</td><td>Dev + QA + Product</td><td>Entire team + stakeholders</td></tr>
<tr>
<td>Test level</td><td>Unit</td><td>Behavior / Integration</td><td>Acceptance</td></tr>
<tr>
<td>Language</td><td>Code</td><td>Natural language (Gherkin)</td><td>Natural language</td></tr>
<tr>
<td>Focus</td><td>Code correctness</td><td>System behavior</td><td>Business requirements</td></tr>
<tr>
<td>Written by</td><td>Developers</td><td>Developers + QA</td><td>Team collaboratively</td></tr>
<tr>
<td>When tests are written</td><td>Before each unit</td><td>Before feature development</td><td>Before sprint/iteration</td></tr>
</tbody>
</table>
</div><h2 id="heading-which-should-you-use">Which Should You Use?</h2>
<p><strong>Use TDD when:</strong></p>
<ul>
<li>You're writing library code, utilities, or algorithms</li>
<li>You want confidence that individual functions work correctly</li>
<li>You're refactoring existing code</li>
</ul>
<p><strong>Use BDD when:</strong></p>
<ul>
<li>You need shared understanding between technical and non-technical team members</li>
<li>You want tests that serve as living documentation</li>
<li>Your application has complex user-facing behaviors</li>
</ul>
<p><strong>Use ATDD when:</strong></p>
<ul>
<li>You need stakeholder sign-off before development</li>
<li>You're working in regulated industries where acceptance criteria must be documented</li>
<li>You want to prevent scope creep by locking down acceptance criteria early</li>
</ul>
<p><strong>Use all three when:</strong></p>
<ul>
<li>You're building a complex system where unit correctness (TDD), behavior specification (BDD), and business acceptance (ATDD) all matter</li>
</ul>
<p>They're not competing methodologies. They're complementary layers.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>The best teams don't argue about TDD vs BDD. They use the right approach at the right level:</p>
<ul>
<li><strong>TDD</strong> for the code</li>
<li><strong>BDD</strong> for the features</li>
<li><strong>ATDD</strong> for the business</li>
</ul>
<p><strong>Tests aren't about proving your code works. They're about proving you built the right thing.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[Unstoppable Domains: Blockchain Domains That No One Can Take Down]]></title><description><![CDATA[Unstoppable Domains: Blockchain Domains That No One Can Take Down
Traditional domains (.com, .net, .org) are rented. You pay a registrar annually, and if you stop paying — or if the registrar, ICANN, or a government decides to — your domain disappear...]]></description><link>https://estebanrfp.com/unstoppable-domains</link><guid isPermaLink="true">https://estebanrfp.com/unstoppable-domains</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[#domains]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:35:04 GMT</pubDate><enclosure url="https://i.imgur.com/uGyYFbO.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-unstoppable-domains-blockchain-domains-that-no-one-can-take-down">Unstoppable Domains: Blockchain Domains That No One Can Take Down</h1>
<p>Traditional domains (<code>.com</code>, <code>.net</code>, <code>.org</code>) are rented. You pay a registrar annually, and if you stop paying — or if the registrar, ICANN, or a government decides to — your domain disappears. You don't own it. You lease it.</p>
<p><strong>Unstoppable Domains</strong> flips this model. You buy a domain once, it's stored on a blockchain, and it's yours forever. No renewal fees. No central authority. No one can seize, censor, or transfer it without your private key.</p>
<h2 id="heading-how-it-works">How It Works</h2>
<p>Unstoppable Domains are <strong>NFTs</strong> (Non-Fungible Tokens) minted on the Polygon blockchain. When you register a domain:</p>
<ol>
<li>A smart contract mints an NFT representing your domain</li>
<li>The NFT is sent to your wallet address</li>
<li>You own the domain as long as you hold the NFT</li>
<li>No one — not Unstoppable Domains, not any government — can modify or revoke it</li>
</ol>
<p>Available extensions include <code>.crypto</code>, <code>.nft</code>, <code>.x</code>, <code>.wallet</code>, <code>.blockchain</code>, <code>.bitcoin</code>, <code>.dao</code>, and <code>.888</code>.</p>
<h2 id="heading-what-you-can-do-with-them">What You Can Do With Them</h2>
<h3 id="heading-decentralized-websites">Decentralized Websites</h3>
<p>Point your Unstoppable Domain to an IPFS hash and host a website that no one can take down. The domain resolves through browser extensions or compatible browsers (Brave supports this natively).</p>
<pre><code>mysite.crypto → IPFS hash → decentralized website
</code></pre><p>No hosting provider to pressure. No DNS to hijack. No single point of failure.</p>
<h3 id="heading-crypto-payments">Crypto Payments</h3>
<p>Replace long wallet addresses with human-readable names:</p>
<p>Instead of: <code>0x1a2b3c4d5e6f7890abcdef1234567890abcdef12</code>
Use: <code>esteban.crypto</code></p>
<p>Supported by 110+ wallets and exchanges. Send Bitcoin, Ethereum, Polygon, and dozens of other cryptocurrencies to a single domain name.</p>
<h3 id="heading-digital-identity">Digital Identity</h3>
<p>Your Unstoppable Domain can serve as a portable digital identity:</p>
<ul>
<li><strong>Login</strong> to Web3 apps without passwords (like "Sign in with Google" but decentralized)</li>
<li><strong>Profile</strong> that aggregates your wallet addresses, social links, and avatar</li>
<li><strong>Reputation</strong> that follows you across platforms</li>
</ul>
<h2 id="heading-unstoppable-domains-vs-ens">Unstoppable Domains vs ENS</h2>
<p>Both provide blockchain-based domain names, but they differ in important ways:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Feature</td><td>Unstoppable Domains</td><td>ENS (.eth)</td></tr>
</thead>
<tbody>
<tr>
<td>Blockchain</td><td>Polygon</td><td>Ethereum</td></tr>
<tr>
<td>Pricing</td><td>One-time purchase</td><td>Annual renewal</td></tr>
<tr>
<td>Ownership</td><td>Permanent (NFT)</td><td>Lease (expires)</td></tr>
<tr>
<td>Extensions</td><td>.crypto, .nft, .x, .wallet...</td><td>.eth</td></tr>
<tr>
<td>Gas fees</td><td>Low (Polygon)</td><td>High (Ethereum L1)</td></tr>
<tr>
<td>Browser support</td><td>Brave, Opera, extensions</td><td>Brave, browser extensions</td></tr>
<tr>
<td>Adoption</td><td>4M+ domains registered</td><td>2M+ domains registered</td></tr>
</tbody>
</table>
</div><p><strong>ENS</strong> is more established in the Ethereum ecosystem and widely recognized. <strong>.eth</strong> domains have cultural cachet in crypto.</p>
<p><strong>Unstoppable Domains</strong> wins on economics: buy once, own forever, low gas fees. No risk of losing your domain because you forgot to renew.</p>
<h2 id="heading-the-technical-stack">The Technical Stack</h2>
<h3 id="heading-resolution">Resolution</h3>
<p>Unstoppable Domains resolve through:</p>
<ol>
<li><strong>Browser extensions</strong> — Install the Unstoppable Domains extension for Chrome/Firefox</li>
<li><strong>Native support</strong> — Brave and Opera resolve <code>.crypto</code> domains natively</li>
<li><strong>DNS-over-HTTPS proxies</strong> — Some services translate blockchain domains to traditional DNS</li>
<li><strong>Direct smart contract queries</strong> — Developers can resolve domains by reading the blockchain</li>
</ol>
<h3 id="heading-smart-contract-architecture">Smart Contract Architecture</h3>
<p>The domain registry is a set of smart contracts on Polygon:</p>
<ul>
<li><strong>Registry</strong> — Maps domain names to owner addresses</li>
<li><strong>Resolver</strong> — Maps domains to records (IPFS hashes, wallet addresses, metadata)</li>
<li><strong>Minting</strong> — Handles new domain registration and NFT creation</li>
</ul>
<p>All contracts are open source and verifiable on-chain.</p>
<h3 id="heading-hosting-a-website">Hosting a Website</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># 1. Build your static site</span>
<span class="hljs-comment"># 2. Upload to IPFS</span>
ipfs add -r ./my-website
<span class="hljs-comment"># Returns: QmHash...</span>

<span class="hljs-comment"># 3. Set the IPFS hash in your Unstoppable Domain</span>
<span class="hljs-comment"># Via the Unstoppable Domains web app:</span>
<span class="hljs-comment"># My Domains → Select domain → Website → Enter IPFS hash → Confirm</span>

<span class="hljs-comment"># 4. Access via Brave browser</span>
<span class="hljs-comment"># Navigate to: mysite.crypto</span>
</code></pre>
<h2 id="heading-the-limitations">The Limitations</h2>
<h3 id="heading-browser-support">Browser Support</h3>
<p>Most browsers don't resolve blockchain domains natively. Users need extensions or specific browsers. This is the biggest adoption barrier.</p>
<h3 id="heading-content-moderation">Content Moderation</h3>
<p>Censorship resistance is a double-edged sword. The same technology that protects activists also protects malicious actors. Unstoppable Domains has a limited ability to police content on domains it has sold.</p>
<h3 id="heading-ipfs-dependency">IPFS Dependency</h3>
<p>Decentralized websites require IPFS (or similar) hosting. IPFS content needs active pinning to stay available. The domain is permanent, but the content requires maintenance.</p>
<h3 id="heading-legal-gray-area">Legal Gray Area</h3>
<p>Governments are still figuring out how to handle blockchain domains. Trademark disputes, illegal content, and sanctions compliance are unresolved questions.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Unstoppable Domains solves a real problem: <strong>true ownership of your online identity</strong>. No annual fees, no central authority, no single point of failure.</p>
<p>The technology works today. The limitation is adoption — most of the internet still runs on traditional DNS, and most browsers don't resolve blockchain domains. But as Web3 infrastructure matures, the one-time-purchase, truly-owned domain model will look increasingly obvious.</p>
<p><strong>Your domain should be as permanent as your name. Unstoppable Domains makes that possible.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[IPFS: The Distributed File System That's Replacing HTTP]]></title><description><![CDATA[IPFS: The Distributed File System That's Replacing HTTP
The web as we know it is centralized. Every website lives on a server. If that server goes down, the content disappears. If a government blocks the server's IP, the content is censored. If the c...]]></description><link>https://estebanrfp.com/ipfs-distributed-file-system</link><guid isPermaLink="true">https://estebanrfp.com/ipfs-distributed-file-system</guid><category><![CDATA[decentralization]]></category><category><![CDATA[ipfs]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:35:01 GMT</pubDate><enclosure url="https://i.imgur.com/xycVIqI.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-ipfs-the-distributed-file-system-thats-replacing-http">IPFS: The Distributed File System That's Replacing HTTP</h1>
<p>The web as we know it is centralized. Every website lives on a server. If that server goes down, the content disappears. If a government blocks the server's IP, the content is censored. If the company behind the server goes bankrupt, the content is gone forever.</p>
<p><strong>IPFS (InterPlanetary File System)</strong> is a protocol designed to fix this. Instead of addressing content by <em>where it lives</em> (a server URL), IPFS addresses content by <em>what it is</em> (a cryptographic hash). The same file always has the same address, regardless of who hosts it or where.</p>
<h2 id="heading-how-ipfs-works">How IPFS Works</h2>
<h3 id="heading-content-addressing">Content Addressing</h3>
<p>Traditional web: <code>https://example.com/photo.jpg</code> — you're asking a specific server for a file.</p>
<p>IPFS: <code>QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco</code> — you're asking the network for content matching this hash. Anyone who has it can serve it.</p>
<p>This changes everything:</p>
<ul>
<li><strong>No single point of failure</strong> — If one node goes offline, others still have the content</li>
<li><strong>No censorship</strong> — There's no single server to block</li>
<li><strong>No duplication waste</strong> — Identical files share the same hash and storage</li>
<li><strong>Built-in integrity</strong> — The hash <em>is</em> the verification. If the content changes, the hash changes.</li>
</ul>
<h3 id="heading-how-files-are-stored">How Files Are Stored</h3>
<p>When you add a file to IPFS:</p>
<ol>
<li>The file is split into <strong>chunks</strong> (typically 256KB)</li>
<li>Each chunk gets a <strong>CID</strong> (Content Identifier) — its cryptographic hash</li>
<li>A <strong>Merkle DAG</strong> (Directed Acyclic Graph) links chunks together</li>
<li>The file's root CID represents the entire file</li>
<li>Your node announces to the <strong>DHT</strong> (Distributed Hash Table) that it has these chunks</li>
</ol>
<p>When someone requests a file:</p>
<ol>
<li>They ask the DHT: "Who has CID <code>Qm...</code>?"</li>
<li>The DHT returns nodes that have the content</li>
<li>Chunks are downloaded from the nearest/fastest nodes</li>
<li>The client verifies each chunk's hash matches the CID</li>
<li>Chunks are reassembled into the original file</li>
</ol>
<h3 id="heading-pinning">Pinning</h3>
<p>IPFS nodes garbage-collect content they don't need. If you want content to stay available, you <strong>pin</strong> it — telling your node to keep it permanently. Pinning services (Pinata, Infura, Web3.Storage) offer persistent hosting.</p>
<h2 id="heading-getting-started">Getting Started</h2>
<h3 id="heading-installation">Installation</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># macOS</span>
brew install ipfs

<span class="hljs-comment"># Linux</span>
wget https://dist.ipfs.tech/kubo/v0.24.0/kubo_v0.24.0_linux-amd64.tar.gz
tar xvf kubo_v0.24.0_linux-amd64.tar.gz
<span class="hljs-built_in">cd</span> kubo &amp;&amp; sudo ./install.sh

<span class="hljs-comment"># Initialize your node</span>
ipfs init

<span class="hljs-comment"># Start the daemon</span>
ipfs daemon
</code></pre>
<h3 id="heading-basic-commands">Basic Commands</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># Add a file to IPFS</span>
ipfs add myfile.txt
<span class="hljs-comment"># Returns: added QmHash myfile.txt</span>

<span class="hljs-comment"># Retrieve a file</span>
ipfs cat QmHash

<span class="hljs-comment"># Add a directory</span>
ipfs add -r ./my-folder

<span class="hljs-comment"># Pin content (keep it available)</span>
ipfs pin add QmHash

<span class="hljs-comment"># Check connected peers</span>
ipfs swarm peers

<span class="hljs-comment"># Check your node's identity</span>
ipfs id
</code></pre>
<h3 id="heading-accessing-ipfs-content-from-the-browser">Accessing IPFS Content from the Browser</h3>
<p>You don't need to run a node to view IPFS content. Public gateways provide HTTP access:</p>
<pre><code>https:<span class="hljs-comment">//ipfs.io/ipfs/QmHash</span>
https:<span class="hljs-comment">//gateway.pinata.cloud/ipfs/QmHash</span>
https:<span class="hljs-comment">//cloudflare-ipfs.com/ipfs/QmHash</span>
</code></pre><h2 id="heading-ipfs-vs-traditional-hosting">IPFS vs Traditional Hosting</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>HTTP (Traditional)</td><td>IPFS</td></tr>
</thead>
<tbody>
<tr>
<td>Addressing</td><td>Location-based (URL)</td><td>Content-based (CID)</td></tr>
<tr>
<td>Redundancy</td><td>Single server (unless CDN)</td><td>Distributed across nodes</td></tr>
<tr>
<td>Censorship</td><td>Block the server, block the content</td><td>No single point to block</td></tr>
<tr>
<td>Integrity</td><td>Trust the server</td><td>Verify the hash</td></tr>
<tr>
<td>Deduplication</td><td>Same file stored multiple times</td><td>Same content = same hash</td></tr>
<tr>
<td>Offline access</td><td>No server = no content</td><td>Cached content works offline</td></tr>
<tr>
<td>Speed</td><td>Depends on server location</td><td>Fetches from nearest node</td></tr>
</tbody>
</table>
</div><h2 id="heading-real-world-use-cases">Real-World Use Cases</h2>
<h3 id="heading-decentralized-websites">Decentralized Websites</h3>
<p>Host a static website on IPFS and link it to an ENS domain (<code>.eth</code>) or Unstoppable Domain. The site can't be taken down by any single entity.</p>
<h3 id="heading-nft-metadata">NFT Metadata</h3>
<p>Most NFTs don't store images on-chain — they store an IPFS CID that points to the image. This ensures the artwork persists even if the NFT marketplace disappears.</p>
<h3 id="heading-scientific-data">Scientific Data</h3>
<p>Researchers use IPFS to distribute large datasets. The content-addressing guarantees data integrity, and distributed hosting ensures availability.</p>
<h3 id="heading-package-distribution">Package Distribution</h3>
<p>Some package managers are exploring IPFS for distributing packages — faster downloads from nearby nodes and built-in integrity verification.</p>
<h2 id="heading-the-limitations">The Limitations</h2>
<h3 id="heading-content-availability">Content Availability</h3>
<p>If nobody pins your content, it eventually disappears. IPFS is not permanent storage by default — it's a distribution protocol. Permanence requires active pinning or services like Filecoin (IPFS's incentive layer).</p>
<h3 id="heading-performance">Performance</h3>
<p>Initial content resolution can be slow. Finding which nodes have specific content via the DHT takes time — especially for rarely-accessed files. Caching and popular content are fast; obscure content can take seconds.</p>
<h3 id="heading-mutability">Mutability</h3>
<p>CIDs are immutable — the same content always produces the same hash. For dynamic content (websites that update), you need <strong>IPNS</strong> (InterPlanetary Name System), which maps a mutable name to a CID that can be updated.</p>
<h3 id="heading-adoption">Adoption</h3>
<p>The average user doesn't know what IPFS is, and most browsers don't support it natively (except Brave). Mainstream adoption requires better tooling and seamless integration.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>IPFS doesn't replace HTTP overnight. But it provides something HTTP fundamentally can't: <strong>content that doesn't depend on any single server, company, or government.</strong></p>
<p>For archival, censorship resistance, data integrity, and decentralized applications, IPFS is already the best tool available. As the protocol matures and tooling improves, the question isn't whether the web will become more distributed — it's how fast.</p>
<p><strong>The web was designed to be decentralized. IPFS is bringing it back to that original vision.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[AGI: What It Is, Why It Matters, and What Comes After]]></title><description><![CDATA[AGI: What It Is, Why It Matters, and What Comes After
Artificial General Intelligence (AGI) is the most ambitious goal in computer science: a system that can understand, learn, and apply knowledge across any domain — the way humans do.
We don't have ...]]></description><link>https://estebanrfp.com/agi-artificial-general-intelligence</link><guid isPermaLink="true">https://estebanrfp.com/agi-artificial-general-intelligence</guid><category><![CDATA[agi]]></category><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Machine Learning]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:34:58 GMT</pubDate><enclosure url="https://i.imgur.com/UGmIGUv.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-agi-what-it-is-why-it-matters-and-what-comes-after">AGI: What It Is, Why It Matters, and What Comes After</h1>
<p>Artificial General Intelligence (AGI) is the most ambitious goal in computer science: a system that can understand, learn, and apply knowledge across any domain — the way humans do.</p>
<p>We don't have AGI yet. What we have are increasingly capable narrow AI systems (LLMs, vision models, robotics) that excel at specific tasks but can't transfer knowledge between domains without explicit training. GPT-4 can write poetry and solve math, but it can't learn to ride a bike from watching a video.</p>
<p>The gap between what we have and AGI is not just technical — it's philosophical. And the implications of closing that gap touch every aspect of human civilization.</p>
<h2 id="heading-what-agi-actually-means">What AGI Actually Means</h2>
<p>Current AI is <strong>narrow</strong>: trained for specific tasks, unable to generalize. A chess engine that beats grandmasters can't play tic-tac-toe unless specifically programmed to do so.</p>
<p>AGI would be <strong>general</strong>: capable of learning any intellectual task a human can perform. Not by having every skill pre-programmed, but by understanding underlying principles and applying them to new situations.</p>
<p>The key capabilities that define AGI:</p>
<ul>
<li><strong>Transfer learning</strong> — Apply knowledge from one domain to another</li>
<li><strong>Abstract reasoning</strong> — Understand concepts, not just patterns</li>
<li><strong>Common sense</strong> — Know that water is wet without being told</li>
<li><strong>Self-directed learning</strong> — Decide what to learn next based on goals</li>
<li><strong>Natural communication</strong> — Understand context, nuance, and intent</li>
</ul>
<h2 id="heading-the-three-levels-of-ai">The Three Levels of AI</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Level</td><td>Name</td><td>Description</td><td>Status</td></tr>
</thead>
<tbody>
<tr>
<td>ANI</td><td>Artificial Narrow Intelligence</td><td>Excels at specific tasks</td><td>✅ Current</td></tr>
<tr>
<td>AGI</td><td>Artificial General Intelligence</td><td>Human-level across all domains</td><td>🔄 In progress</td></tr>
<tr>
<td>ASI</td><td>Artificial Superintelligence</td><td>Surpasses human intelligence</td><td>❓ Theoretical</td></tr>
</tbody>
</table>
</div><h3 id="heading-ani-where-we-are">ANI (Where We Are)</h3>
<p>Every AI system in production today is narrow AI. Siri, ChatGPT, AlphaFold, Tesla Autopilot, DALL-E — all remarkable at their specific domain, all incapable of true generalization.</p>
<p>The trend, however, is toward broader capability. GPT-4 handles text, code, images, and reasoning. Gemini processes text, audio, images, and video. The boundaries between narrow systems are blurring.</p>
<h3 id="heading-agi-the-goal">AGI (The Goal)</h3>
<p>No one agrees on when AGI will arrive. Predictions range from 2027 (optimists at OpenAI) to 2075 (conservative researchers) to "never" (skeptics who argue silicon can't replicate consciousness).</p>
<p>What most researchers agree on: the path to AGI likely involves:</p>
<ol>
<li><strong>Multimodal integration</strong> — Processing all types of data simultaneously</li>
<li><strong>World models</strong> — Internal representations of how reality works</li>
<li><strong>Agentic behavior</strong> — Acting on goals, not just responding to prompts</li>
<li><strong>Continual learning</strong> — Improving from experience without full retraining</li>
</ol>
<h3 id="heading-asi-what-comes-after">ASI (What Comes After)</h3>
<p>Artificial Superintelligence — intelligence that surpasses human capability in every dimension: creativity, reasoning, emotional understanding, scientific discovery.</p>
<p>ASI is where the conversation shifts from engineering to philosophy:</p>
<ul>
<li>Would an ASI be conscious?</li>
<li>Could we understand its reasoning?</li>
<li>Would it have goals of its own?</li>
<li>Could we maintain meaningful control?</li>
</ul>
<p>Nick Bostrom's <em>Superintelligence</em> (2014) and Stuart Russell's <em>Human Compatible</em> (2019) are the essential readings here. The consensus: if ASI is possible, getting the alignment right isn't optional — it's existential.</p>
<h2 id="heading-impact-by-sector">Impact by Sector</h2>
<h3 id="heading-medicine">Medicine</h3>
<p>AGI could analyze a patient's complete medical history, genomic data, lifestyle factors, and current symptoms — then produce a diagnosis and treatment plan personalized to that specific individual. Not a statistical average. A plan for <em>you</em>.</p>
<p>Drug discovery, currently a 10-15 year process, could compress to months. AGI could simulate molecular interactions, predict side effects, and design clinical trials optimally.</p>
<h3 id="heading-education">Education</h3>
<p>Imagine a tutor that understands not just the subject, but the student — their learning style, knowledge gaps, emotional state, and optimal challenge level. AGI could provide truly personalized education at scale, potentially the most equalizing technology in human history.</p>
<h3 id="heading-science">Science</h3>
<p>AGI could read every paper ever published, identify connections humans miss, and propose experiments that advance multiple fields simultaneously. The scientific method wouldn't change — but the speed of discovery would be unrecognizable.</p>
<h3 id="heading-economics">Economics</h3>
<p>Automation of cognitive labor at scale. Unlike previous industrial revolutions that displaced physical labor, AGI would displace intellectual labor. Every knowledge worker — lawyers, analysts, programmers, designers — would need to adapt.</p>
<p>The economic disruption would be unprecedented. The opportunity, equally so.</p>
<h2 id="heading-the-ethics-we-cant-ignore">The Ethics We Can't Ignore</h2>
<h3 id="heading-alignment">Alignment</h3>
<p>The alignment problem: how do you ensure an AGI does what humanity <em>actually wants</em>, not just what it was <em>told to do</em>? Every parent knows the difference between following instructions and understanding intent. Teaching that to a machine is an unsolved problem.</p>
<h3 id="heading-autonomy-vs-control">Autonomy vs Control</h3>
<p>How much independence should an AGI have? Too little, and you lose the benefits. Too much, and you lose control. The balance point isn't obvious, and the stakes are absolute.</p>
<h3 id="heading-bias-and-fairness">Bias and Fairness</h3>
<p>AGI trained on human data inherits human biases. But unlike narrow AI, where bias affects a specific task, AGI bias would affect <em>everything</em>. Ensuring fairness in a general intelligence system requires solving fairness itself — a problem humans haven't solved in millennia.</p>
<h3 id="heading-employment">Employment</h3>
<p>If AGI can do any intellectual task, what do humans do? This isn't a new question — every technological revolution has raised it. But AGI is different in scale. Previous revolutions displaced hands. AGI displaces minds.</p>
<p>The answer probably involves redefining work, universal basic income, and finding meaning in creativity, relationships, and experiences rather than productivity. But "probably" isn't a plan.</p>
<h3 id="heading-access-and-power">Access and Power</h3>
<p>Who controls AGI? A corporation? A government? Open source? The entity that achieves AGI first gains an asymmetric advantage over every other entity on Earth. The geopolitics of AGI is already driving national AI strategies in the US, China, EU, and UK.</p>
<h2 id="heading-the-honest-timeline">The Honest Timeline</h2>
<p>As of 2026:</p>
<ul>
<li><strong>We have</strong> multimodal models that blur the line between narrow and general</li>
<li><strong>We have</strong> agentic systems that can plan and execute multi-step tasks</li>
<li><strong>We don't have</strong> systems that truly generalize across all domains</li>
<li><strong>We don't have</strong> systems that learn from experience the way humans do</li>
<li><strong>We don't know</strong> if current architectures (transformers) can reach AGI</li>
</ul>
<p>The honest answer is: AGI might be 5 years away or 50 years away. Anyone who gives you a confident date is selling something.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>AGI isn't just another technology upgrade. It's a potential phase transition for civilization — comparable to language, writing, or the internet. The difference is speed: those transitions took centuries or decades. AGI could transform everything in years.</p>
<p>The question isn't whether to pursue AGI. It's being pursued. The question is whether we'll be ready.</p>
<p><strong>The most important technology we'll ever build is the one that's smarter than us. Getting it right isn't optional.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[Crypto Glossary: Essential Terms Every Developer and Investor Should Know]]></title><description><![CDATA[Crypto Glossary: Essential Terms Every Developer and Investor Should Know
The cryptocurrency space is full of jargon. Some terms are technical, some are cultural, and some were invented on Twitter at 3 AM. This glossary cuts through the noise with cl...]]></description><link>https://estebanrfp.com/crypto-glossary</link><guid isPermaLink="true">https://estebanrfp.com/crypto-glossary</guid><category><![CDATA[Bitcoin]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Cryptocurrency]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:22:18 GMT</pubDate><enclosure url="https://i.imgur.com/uGyYFbO.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-crypto-glossary-essential-terms-every-developer-and-investor-should-know">Crypto Glossary: Essential Terms Every Developer and Investor Should Know</h1>
<p>The cryptocurrency space is full of jargon. Some terms are technical, some are cultural, and some were invented on Twitter at 3 AM. This glossary cuts through the noise with clear, accurate definitions — organized alphabetically for quick reference.</p>
<h2 id="heading-a">A</h2>
<p><strong>Altcoin</strong> — Any cryptocurrency that isn't Bitcoin. Ethereum, Solana, Polygon — all altcoins. The term is becoming less useful as the ecosystem matures.</p>
<p><strong>ASIC</strong> — Application-Specific Integrated Circuit. Hardware designed exclusively for mining a specific cryptocurrency. ASICs for Bitcoin (SHA-256) are thousands of times more efficient than GPUs.</p>
<p><strong>ATH</strong> — All-Time High. The highest price a cryptocurrency has ever reached. Often followed by "when ATH?" in every crypto group chat.</p>
<p><strong>Arbitrage</strong> — Exploiting price differences between exchanges. Buy BTC at $60,000 on Exchange A, sell at $60,100 on Exchange B. Profit: $100 minus fees. Automated bots dominate this space.</p>
<h2 id="heading-b">B</h2>
<p><strong>Bagholder</strong> — Someone holding a token that has dropped significantly, hoping it will recover. Sometimes it does. Usually it doesn't.</p>
<p><strong>Bear / Bearish</strong> — Expecting prices to fall. A bear market is a sustained downtrend — typically 20%+ from recent highs.</p>
<p><strong>Block</strong> — A batch of transactions grouped together and added to the blockchain. Bitcoin creates a new block approximately every 10 minutes.</p>
<p><strong>Blockchain</strong> — A distributed, append-only ledger where each block references the hash of the previous block. Immutable by design — changing one block invalidates every block after it.</p>
<p><strong>Bull / Bullish</strong> — Expecting prices to rise. A bull market is a sustained uptrend with increasing confidence and volume.</p>
<p><strong>BTD (Buy The Dip)</strong> — Strategy of buying when prices drop significantly. Works in bull markets. Devastating in bear markets.</p>
<h2 id="heading-c">C</h2>
<p><strong>CEX</strong> — Centralized Exchange. Binance, Coinbase, Kraken. They hold your funds (custodial). Convenient but introduces counterparty risk.</p>
<p><strong>Cold Wallet</strong> — A wallet not connected to the internet. Hardware wallets (Ledger, Trezor) and paper wallets. Maximum security for long-term holding.</p>
<p><strong>Consensus Mechanism</strong> — The algorithm a blockchain uses to agree on the current state. Proof of Work (Bitcoin), Proof of Stake (Ethereum 2.0), Delegated Proof of Stake (Solana).</p>
<h2 id="heading-d">D</h2>
<p><strong>DAO</strong> — Decentralized Autonomous Organization. An organization governed by smart contracts and token-holder votes instead of a board of directors.</p>
<p><strong>DApp</strong> — Decentralized Application. An application where the backend runs on a blockchain instead of a centralized server.</p>
<p><strong>Dead Cat Bounce</strong> — A temporary price recovery during a downtrend. The name comes from the morbid joke that "even a dead cat bounces if you drop it from high enough."</p>
<p><strong>DeFi</strong> — Decentralized Finance. Financial services (lending, borrowing, trading) built on smart contracts without traditional intermediaries.</p>
<p><strong>DEX</strong> — Decentralized Exchange. Uniswap, SushiSwap, Jupiter. Non-custodial — you trade directly from your wallet.</p>
<p><strong>DYOR</strong> — Do Your Own Research. The most important and most ignored advice in crypto.</p>
<h2 id="heading-f">F</h2>
<p><strong>FOMO</strong> — Fear Of Missing Out. The emotional driver behind buying at the top. Responsible for more losses than any hack.</p>
<p><strong>FUD</strong> — Fear, Uncertainty, and Doubt. Negative information (real or fabricated) spread to drive prices down.</p>
<p><strong>Full Node</strong> — A computer that maintains a complete copy of the blockchain and validates every transaction independently.</p>
<h2 id="heading-g">G</h2>
<p><strong>Gas</strong> — The fee paid to execute operations on Ethereum. Measured in Gwei (1 Gwei = 0.000000001 ETH). High demand = high gas prices.</p>
<p><strong>Genesis Block</strong> — The first block in a blockchain. Bitcoin's genesis block was mined on January 3, 2009, with the embedded message: "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks."</p>
<h2 id="heading-h">H</h2>
<p><strong>Halving</strong> — Bitcoin's block reward is cut in half approximately every 4 years (210,000 blocks). 50 → 25 → 12.5 → 6.25 → 3.125 (2024). Historically precedes bull markets.</p>
<p><strong>Hash</strong> — A fixed-length string produced by a cryptographic function. The same input always produces the same hash. Different inputs produce completely different hashes. The backbone of blockchain security.</p>
<p><strong>HODL</strong> — "Hold On for Dear Life." Originally a typo on a Bitcoin forum in 2013, now the defining philosophy of long-term crypto investors.</p>
<p><strong>Hot Wallet</strong> — A wallet connected to the internet. MetaMask, Trust Wallet. Convenient for daily use, higher risk than cold storage.</p>
<h2 id="heading-l">L</h2>
<p><strong>Liquidity</strong> — How easily an asset can be bought or sold without affecting its price. High liquidity = stable prices, tight spreads.</p>
<p><strong>Liquidity Pool</strong> — A smart contract holding paired tokens that enables decentralized trading. Liquidity providers earn fees from every swap.</p>
<h2 id="heading-m">M</h2>
<p><strong>Market Cap</strong> — Price × Circulating Supply. A rough measure of a cryptocurrency's total value. Bitcoin's market cap: ~$1.2 trillion (2025).</p>
<p><strong>Mempool</strong> — The waiting room for unconfirmed transactions. Miners/validators pick transactions from the mempool to include in the next block.</p>
<p><strong>Mining</strong> — Using computational power to validate transactions and create new blocks. Bitcoin uses Proof of Work mining. Ethereum switched to Proof of Stake in 2022.</p>
<h2 id="heading-n">N</h2>
<p><strong>Node</strong> — Any computer participating in a blockchain network. Full nodes validate everything. Light nodes trust full nodes for some data.</p>
<p><strong>Nonce</strong> — A number miners iterate to find a valid block hash. The nonce that produces a hash below the target difficulty "solves" the block.</p>
<h2 id="heading-p">P</h2>
<p><strong>Private Key</strong> — The secret key that controls a blockchain address. Lose it, and you lose access to your funds. Forever. No recovery. No customer support.</p>
<p><strong>Proof of Stake (PoS)</strong> — Validators lock (stake) tokens as collateral. Misbehavior = slashed stake. More energy-efficient than Proof of Work.</p>
<p><strong>Proof of Work (PoW)</strong> — Miners compete to solve computational puzzles. The winner proposes the next block and earns the reward. Bitcoin's consensus mechanism.</p>
<h2 id="heading-s">S</h2>
<p><strong>Seed Phrase</strong> — A 12 or 24-word recovery phrase that generates your private keys. Write it down. Store it offline. Never share it. Never screenshot it.</p>
<p><strong>Slippage</strong> — The difference between the expected price and the execution price. Occurs in low-liquidity markets or during high volatility.</p>
<p><strong>Smart Contract</strong> — A self-executing program on a blockchain. Code is law — the contract does exactly what it's programmed to do, for better or worse.</p>
<p><strong>Staking</strong> — Locking tokens in a Proof of Stake network to help validate transactions. In return, you earn rewards (typically 3-12% annually).</p>
<h2 id="heading-t">T</h2>
<p><strong>Token</strong> — A digital asset built on an existing blockchain (e.g., ERC-20 tokens on Ethereum). Different from coins, which are native to their own blockchain.</p>
<p><strong>TVL</strong> — Total Value Locked. The amount of assets deposited in DeFi protocols. A key metric for measuring DeFi adoption.</p>
<h2 id="heading-w">W</h2>
<p><strong>Wallet</strong> — Software or hardware that stores your private keys and lets you interact with a blockchain. Not your keys, not your coins.</p>
<p><strong>Whale</strong> — An entity holding a large amount of cryptocurrency. Whale movements (large transfers) can significantly impact prices.</p>
<p><strong>Whitepaper</strong> — The technical document describing a cryptocurrency project's purpose, technology, and tokenomics. Bitcoin's whitepaper by Satoshi Nakamoto is 9 pages long.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Crypto moves fast. New terms appear every cycle. But the fundamentals — blockchain, consensus, keys, wallets, smart contracts — remain constant.</p>
<p><strong>Learn the vocabulary, but more importantly, understand the technology behind it.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[Smart Contracts: What They Are, How They Work, and Why They Matter]]></title><description><![CDATA[Smart Contracts: What They Are, How They Work, and Why They Matter
A smart contract is a program that executes automatically when predefined conditions are met. No intermediaries, no manual approval, no trust required. The code runs on a blockchain, ...]]></description><link>https://estebanrfp.com/smart-contracts</link><guid isPermaLink="true">https://estebanrfp.com/smart-contracts</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[Smart Contracts]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:22:15 GMT</pubDate><enclosure url="https://i.imgur.com/xycVIqI.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-smart-contracts-what-they-are-how-they-work-and-why-they-matter">Smart Contracts: What They Are, How They Work, and Why They Matter</h1>
<p>A smart contract is a program that executes automatically when predefined conditions are met. No intermediaries, no manual approval, no trust required. The code runs on a blockchain, which means it's transparent, immutable, and decentralized.</p>
<p>The concept isn't new. Nick Szabo described it in <strong>1997</strong> — a decade before Bitcoin existed. But it took blockchain technology to make it practical.</p>
<h2 id="heading-how-smart-contracts-work">How Smart Contracts Work</h2>
<p>A smart contract is deployed to a blockchain as bytecode. Once deployed, it has its own address and can:</p>
<ul>
<li><strong>Receive and hold funds</strong></li>
<li><strong>Execute logic</strong> when triggered by a transaction</li>
<li><strong>Interact with other contracts</strong></li>
<li><strong>Emit events</strong> that external systems can listen to</li>
</ul>
<p>The key properties:</p>
<ol>
<li><strong>Immutable</strong> — once deployed, the code cannot be changed (unless designed with upgrade patterns)</li>
<li><strong>Transparent</strong> — anyone can inspect the bytecode and verify what it does</li>
<li><strong>Deterministic</strong> — given the same inputs, every node produces the same output</li>
<li><strong>Trustless</strong> — execution is guaranteed by the network, not by any party</li>
</ol>
<h2 id="heading-a-simple-example">A Simple Example</h2>
<p>Here's a basic escrow contract in Solidity (Ethereum's smart contract language):</p>
<pre><code class="lang-solidity"><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">SimpleEscrow</span> </span>{
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> buyer;
    <span class="hljs-keyword">address</span> <span class="hljs-keyword">public</span> seller;
    <span class="hljs-keyword">uint</span> <span class="hljs-keyword">public</span> amount;
    <span class="hljs-keyword">bool</span> <span class="hljs-keyword">public</span> released;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> _seller</span>) <span class="hljs-title"><span class="hljs-keyword">payable</span></span> </span>{
        buyer <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span>;
        seller <span class="hljs-operator">=</span> _seller;
        amount <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>.<span class="hljs-built_in">value</span>;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">release</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-built_in">require</span>(<span class="hljs-built_in">msg</span>.<span class="hljs-built_in">sender</span> <span class="hljs-operator">=</span><span class="hljs-operator">=</span> buyer, <span class="hljs-string">"Only buyer can release"</span>);
        <span class="hljs-built_in">require</span>(<span class="hljs-operator">!</span>released, <span class="hljs-string">"Already released"</span>);
        released <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
        <span class="hljs-keyword">payable</span>(seller).<span class="hljs-built_in">transfer</span>(amount);
    }
}
</code></pre>
<p>No bank. No escrow service. No lawyer. The buyer deposits funds, and only the buyer can release them to the seller. The blockchain enforces the rules.</p>
<h2 id="heading-platforms">Platforms</h2>
<h3 id="heading-ethereum">Ethereum</h3>
<p>The first and most established smart contract platform. Uses Solidity as its primary language. The largest ecosystem of DeFi, NFTs, and DAOs.</p>
<p><strong>Strengths:</strong> Largest developer community, most battle-tested, extensive tooling.
<strong>Weaknesses:</strong> High gas fees during congestion, slower transaction speed.</p>
<h3 id="heading-polygon">Polygon</h3>
<p>A Layer 2 scaling solution for Ethereum. Smart contracts are compatible with Ethereum but execute on a faster, cheaper network.</p>
<p><strong>Strengths:</strong> Low fees, fast finality, Ethereum compatibility.
<strong>Weaknesses:</strong> Depends on Ethereum for security guarantees.</p>
<h3 id="heading-solana">Solana</h3>
<p>High-throughput blockchain using Rust for smart contracts. Designed for speed — up to 65,000 transactions per second.</p>
<p><strong>Strengths:</strong> Speed, low fees, growing ecosystem.
<strong>Weaknesses:</strong> Higher complexity, network stability incidents.</p>
<h3 id="heading-bitcoin">Bitcoin</h3>
<p>Bitcoin's scripting language supports basic smart contracts — multi-signature wallets, time-locked transactions, hash-locked payments. Limited compared to Ethereum, but more secure by design.</p>
<p>With <strong>Taproot</strong> (2021), Bitcoin gained more expressive scripting capabilities while maintaining privacy.</p>
<h2 id="heading-real-world-applications">Real-World Applications</h2>
<h3 id="heading-defi-decentralized-finance">DeFi (Decentralized Finance)</h3>
<p>Lending, borrowing, trading, and yield farming — all without banks. Protocols like Aave, Uniswap, and Compound run entirely on smart contracts.</p>
<p>Total value locked (TVL) in DeFi contracts: <strong>$100B+</strong> as of 2025.</p>
<h3 id="heading-daos-decentralized-autonomous-organizations">DAOs (Decentralized Autonomous Organizations)</h3>
<p>Organizations governed by smart contracts instead of boards of directors. Token holders vote on proposals, and the contract executes the decisions automatically.</p>
<h3 id="heading-supply-chain">Supply Chain</h3>
<p>Tracking goods from manufacturer to consumer. Each transfer is recorded on-chain, creating an immutable audit trail.</p>
<h3 id="heading-insurance">Insurance</h3>
<p>Parametric insurance contracts that pay out automatically based on data feeds. Flight delayed by 3 hours? The contract pays the claim without filing paperwork.</p>
<h3 id="heading-digital-identity">Digital Identity</h3>
<p>Self-sovereign identity systems where users control their own credentials, verified by smart contracts without centralized authorities.</p>
<h2 id="heading-the-risks">The Risks</h2>
<h3 id="heading-code-is-law-for-better-and-worse">Code Is Law (For Better and Worse)</h3>
<p>If the contract has a bug, the bug executes. The DAO hack of 2016 exploited a reentrancy vulnerability and drained $60M. The code worked exactly as written — it was just written wrong.</p>
<h3 id="heading-immutability-cuts-both-ways">Immutability Cuts Both Ways</h3>
<p>You can't patch a deployed contract. Upgrade patterns exist (proxy contracts), but they add complexity and reintroduce trust assumptions.</p>
<h3 id="heading-oracle-problem">Oracle Problem</h3>
<p>Smart contracts can't access external data directly. They need <strong>oracles</strong> — services like Chainlink that feed real-world data to the blockchain. The oracle becomes a trust point.</p>
<h3 id="heading-gas-costs">Gas Costs</h3>
<p>On Ethereum, every operation costs gas. Complex contracts can become expensive to execute, limiting their practical use for micro-transactions.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Smart contracts remove intermediaries by replacing trust with code. They're not perfect — bugs are irreversible, oracles introduce trust points, and gas costs can be prohibitive.</p>
<p>But for financial agreements, governance, and any process where trust is expensive or impossible, smart contracts offer something no traditional system can: <strong>execution that no single party can prevent, alter, or reverse.</strong></p>
<p><strong>Don't trust. Verify. Or better yet — let the code verify for you.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[TDD, BDD, and ATDD: What They Are, How They Differ, and When to Use Each]]></title><description><![CDATA[TDD, BDD, and ATDD: What They Are, How They Differ, and When to Use Each
Testing methodologies are one of those topics where everyone has an opinion but few have clarity. TDD, BDD, and ATDD are often conflated, misunderstood, or dismissed as "the sam...]]></description><link>https://estebanrfp.com/tdd-bdd-atdd</link><guid isPermaLink="true">https://estebanrfp.com/tdd-bdd-atdd</guid><category><![CDATA[software development]]></category><category><![CDATA[TDD (Test-driven development)]]></category><category><![CDATA[Testing]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:22:13 GMT</pubDate><enclosure url="https://i.imgur.com/nSRUqSw.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-tdd-bdd-and-atdd-what-they-are-how-they-differ-and-when-to-use-each">TDD, BDD, and ATDD: What They Are, How They Differ, and When to Use Each</h1>
<p>Testing methodologies are one of those topics where everyone has an opinion but few have clarity. TDD, BDD, and ATDD are often conflated, misunderstood, or dismissed as "the same thing with different names."</p>
<p>They're not. Each solves a different problem, involves different people, and produces different results.</p>
<h2 id="heading-tdd-test-driven-development">TDD — Test Driven Development</h2>
<p><strong>Who:</strong> Developers.
<strong>Focus:</strong> Code correctness at the unit level.</p>
<p>TDD follows a strict cycle:</p>
<ol>
<li><strong>Red</strong> — Write a test for functionality that doesn't exist yet. It fails.</li>
<li><strong>Green</strong> — Write the minimum code to make the test pass.</li>
<li><strong>Refactor</strong> — Clean up the code while keeping tests green.</li>
</ol>
<pre><code class="lang-js"><span class="hljs-comment">// Red: test first</span>
test(<span class="hljs-string">'add returns sum of two numbers'</span>, <span class="hljs-function">() =&gt;</span> {
  expect(add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>)).toBe(<span class="hljs-number">5</span>);
});

<span class="hljs-comment">// Green: minimal implementation</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">add</span>(<span class="hljs-params">a, b</span>) </span>{
  <span class="hljs-keyword">return</span> a + b;
}

<span class="hljs-comment">// Refactor: nothing to refactor here — it's already clean</span>
</code></pre>
<h3 id="heading-why-tdd-works">Why TDD Works</h3>
<ul>
<li><strong>Forces design thinking.</strong> Writing the test first means you think about the interface before the implementation.</li>
<li><strong>Catches regressions immediately.</strong> Every change runs against the full test suite.</li>
<li><strong>Produces testable code.</strong> Code written to pass tests is inherently modular and decoupled.</li>
</ul>
<h3 id="heading-the-common-mistake">The Common Mistake</h3>
<p>Most teams that "do TDD" actually write tests after the code. That's not TDD — that's just testing. The order matters. Writing the test first changes how you think about the problem.</p>
<h2 id="heading-bdd-behavior-driven-development">BDD — Behavior Driven Development</h2>
<p><strong>Who:</strong> Developers, QA, product managers — together.
<strong>Focus:</strong> System behavior described in human-readable language.</p>
<p>BDD extends TDD by expressing tests in natural language using the <strong>Given-When-Then</strong> format:</p>
<pre><code class="lang-gherkin">Feature: User login

  Scenario: Successful login with valid credentials
    Given the user is on the login page
    When they enter valid credentials
    Then they should be redirected to the dashboard
    And they should see a welcome message

  Scenario: Failed login with wrong password
    Given the user is on the login page
    When they enter an invalid password
    Then they should see an error message
    And they should remain on the login page
</code></pre>
<h3 id="heading-why-bdd-works">Why BDD Works</h3>
<ul>
<li><strong>Shared language.</strong> Non-technical stakeholders can read and validate the specifications.</li>
<li><strong>Living documentation.</strong> The tests <em>are</em> the documentation. When they pass, the documentation is accurate.</li>
<li><strong>Catches misunderstandings early.</strong> When the product manager reads the scenario and says "that's not what I meant," you've saved a sprint of wasted work.</li>
</ul>
<h3 id="heading-tools">Tools</h3>
<ul>
<li><strong>Cucumber</strong> (JavaScript, Ruby, Java) — the most popular BDD framework</li>
<li><strong>Jest + Gherkin</strong> — for JavaScript-native BDD</li>
<li><strong>Behave</strong> (Python)</li>
</ul>
<h2 id="heading-atdd-acceptance-test-driven-development">ATDD — Acceptance Test Driven Development</h2>
<p><strong>Who:</strong> The entire team — developers, QA, product, and stakeholders.
<strong>Focus:</strong> Acceptance criteria defined before development begins.</p>
<p>ATDD is similar to BDD in structure, but the emphasis is different. While BDD focuses on behavior specification, ATDD focuses on <strong>acceptance criteria</strong> — the conditions that must be met for a feature to be considered done.</p>
<p>The process:</p>
<ol>
<li><strong>Discuss</strong> — The team defines acceptance criteria collaboratively.</li>
<li><strong>Distill</strong> — Criteria are written as executable tests.</li>
<li><strong>Develop</strong> — Code is written to satisfy the acceptance tests.</li>
<li><strong>Demo</strong> — The passing tests demonstrate that the feature meets requirements.</li>
</ol>
<h3 id="heading-the-key-difference-from-bdd">The Key Difference from BDD</h3>
<p>BDD is bottom-up: behaviors define the system.
ATDD is top-down: business requirements define the acceptance criteria.</p>
<p>In practice, many teams blend both — using BDD-style syntax (Given-When-Then) to express ATDD acceptance criteria.</p>
<h2 id="heading-comparison">Comparison</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>TDD</td><td>BDD</td><td>ATDD</td></tr>
</thead>
<tbody>
<tr>
<td>Primary audience</td><td>Developers</td><td>Dev + QA + Product</td><td>Entire team + stakeholders</td></tr>
<tr>
<td>Test level</td><td>Unit</td><td>Behavior / Integration</td><td>Acceptance</td></tr>
<tr>
<td>Language</td><td>Code</td><td>Natural language (Gherkin)</td><td>Natural language</td></tr>
<tr>
<td>Focus</td><td>Code correctness</td><td>System behavior</td><td>Business requirements</td></tr>
<tr>
<td>Written by</td><td>Developers</td><td>Developers + QA</td><td>Team collaboratively</td></tr>
<tr>
<td>When tests are written</td><td>Before each unit</td><td>Before feature development</td><td>Before sprint/iteration</td></tr>
</tbody>
</table>
</div><h2 id="heading-which-should-you-use">Which Should You Use?</h2>
<p><strong>Use TDD when:</strong></p>
<ul>
<li>You're writing library code, utilities, or algorithms</li>
<li>You want confidence that individual functions work correctly</li>
<li>You're refactoring existing code</li>
</ul>
<p><strong>Use BDD when:</strong></p>
<ul>
<li>You need shared understanding between technical and non-technical team members</li>
<li>You want tests that serve as living documentation</li>
<li>Your application has complex user-facing behaviors</li>
</ul>
<p><strong>Use ATDD when:</strong></p>
<ul>
<li>You need stakeholder sign-off before development</li>
<li>You're working in regulated industries where acceptance criteria must be documented</li>
<li>You want to prevent scope creep by locking down acceptance criteria early</li>
</ul>
<p><strong>Use all three when:</strong></p>
<ul>
<li>You're building a complex system where unit correctness (TDD), behavior specification (BDD), and business acceptance (ATDD) all matter</li>
</ul>
<p>They're not competing methodologies. They're complementary layers.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>The best teams don't argue about TDD vs BDD. They use the right approach at the right level:</p>
<ul>
<li><strong>TDD</strong> for the code</li>
<li><strong>BDD</strong> for the features</li>
<li><strong>ATDD</strong> for the business</li>
</ul>
<p><strong>Tests aren't about proving your code works. They're about proving you built the right thing.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[Vibe Coding: The Revolution That's Changing How We Build Software]]></title><description><![CDATA[Vibe Coding: The Revolution That's Changing How We Build Software
In early 2025, Andrej Karpathy — former director of AI at Tesla and co-founder of OpenAI — coined the term "vibe coding." The concept is simple: instead of writing code line by line, y...]]></description><link>https://estebanrfp.com/vibe-coding</link><guid isPermaLink="true">https://estebanrfp.com/vibe-coding</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[General Programming]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:19:51 GMT</pubDate><enclosure url="https://i.imgur.com/3iAKmCd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-vibe-coding-the-revolution-thats-changing-how-we-build-software">Vibe Coding: The Revolution That's Changing How We Build Software</h1>
<p>In early 2025, Andrej Karpathy — former director of AI at Tesla and co-founder of OpenAI — coined the term <strong>"vibe coding."</strong> The concept is simple: instead of writing code line by line, you describe what you want in natural language, and an AI generates the code for you. You don't read every line. You don't debug manually. You just... vibe.</p>
<p>The reaction was immediate and polarized. Some called it the future of programming. Others called it the death of software quality.</p>
<p>Both are partially right.</p>
<h2 id="heading-what-is-vibe-coding">What Is Vibe Coding</h2>
<p>Vibe coding is AI-assisted development where the developer acts more as a <strong>director</strong> than a <strong>writer</strong>. You describe the intent — "build a REST API with authentication" — and the AI produces the implementation. You test it, adjust the prompt, iterate.</p>
<p>Tools that enable this workflow:</p>
<ul>
<li><strong>Cursor</strong> — AI-native code editor with inline generation</li>
<li><strong>GitHub Copilot</strong> — autocomplete on steroids</li>
<li><strong>Claude Code / Codex CLI</strong> — terminal-based AI coding agents</li>
<li><strong>Windsurf / Trae</strong> — full-IDE AI integration</li>
<li><strong>v0, Bolt, Replit Agent</strong> — generate entire apps from prompts</li>
</ul>
<p>The common thread: the developer spends more time <em>thinking about what to build</em> and less time <em>writing the syntax to build it</em>.</p>
<h2 id="heading-why-it-works">Why It Works</h2>
<h3 id="heading-speed">Speed</h3>
<p>What took hours now takes minutes. Boilerplate, CRUD operations, configuration files, test scaffolding — these are patterns that AI can generate reliably. A developer who vibe-codes through the boring parts can focus creative energy on architecture and design decisions.</p>
<h3 id="heading-accessibility">Accessibility</h3>
<p>People who aren't professional developers can now build functional prototypes. Designers, product managers, entrepreneurs — anyone who can describe what they want clearly can produce working software. The barrier to entry has dropped dramatically.</p>
<h3 id="heading-iteration-speed">Iteration Speed</h3>
<p>Instead of write → compile → test → debug → rewrite, the loop becomes: describe → generate → test → refine the description. The feedback cycle is tighter, and the cost of experimentation is lower.</p>
<h2 id="heading-the-risks-nobody-wants-to-talk-about">The Risks Nobody Wants to Talk About</h2>
<h3 id="heading-you-cant-debug-what-you-dont-understand">You Can't Debug What You Don't Understand</h3>
<p>This is the core problem. If you didn't write the code and you didn't read the code, you don't know what it does. When it breaks — and it will — you're stuck. You can't fix what you can't comprehend.</p>
<p>Karpathy himself acknowledged this: "I just see things, say 'that looks about right,' and hit accept." That's fine for a weekend project. It's dangerous for production systems handling real data.</p>
<h3 id="heading-security-blind-spots">Security Blind Spots</h3>
<p>AI-generated code often looks correct but contains subtle vulnerabilities:</p>
<ul>
<li>SQL injection in generated queries</li>
<li>Missing input validation</li>
<li>Hardcoded secrets in configuration</li>
<li>Insecure default permissions</li>
</ul>
<p>The AI optimizes for "works" not "works securely." A developer who doesn't review the output inherits every vulnerability the model introduces.</p>
<h3 id="heading-the-illusion-of-productivity">The Illusion of Productivity</h3>
<p>Generating code fast isn't the same as building software well. A vibe-coded project can accumulate technical debt at an alarming rate — duplicated logic, inconsistent patterns, unnecessary dependencies. The speed advantage disappears when you hit maintenance.</p>
<h3 id="heading-dependency-on-the-model">Dependency on the Model</h3>
<p>If your workflow depends entirely on AI generation, you're coupled to the model's capabilities and limitations. Models hallucinate. They generate deprecated APIs. They mix patterns from different frameworks. Without the knowledge to evaluate their output, you can't course-correct.</p>
<h2 id="heading-the-balanced-view">The Balanced View</h2>
<p>Vibe coding isn't inherently good or bad. It's a tool, and like all tools, its value depends on who uses it and how.</p>
<p><strong>Vibe coding works well when:</strong></p>
<ul>
<li>You understand the language and can review the output</li>
<li>You're prototyping or exploring ideas</li>
<li>You're automating boilerplate you've written hundreds of times</li>
<li>You use it to learn — reading generated code as examples</li>
</ul>
<p><strong>Vibe coding is dangerous when:</strong></p>
<ul>
<li>You accept code you don't understand</li>
<li>You skip testing because "the AI got it right"</li>
<li>You build production systems without reviewing security</li>
<li>You replace understanding with prompting</li>
</ul>
<h2 id="heading-my-take">My Take</h2>
<p>The developers who will thrive in the AI era aren't the ones who can write the fastest prompts. They're the ones who understand the fundamentals deeply enough to <strong>evaluate, correct, and improve</strong> what AI generates.</p>
<p>Vibe coding accelerates the capable. It creates a false sense of competence in the unprepared.</p>
<p>The answer isn't to reject AI-assisted development — that ship has sailed. The answer is to <strong>master the fundamentals first</strong>. Know the language. Understand the platform. Then use AI to amplify what you already know.</p>
<p><strong>AI writes the code. You own the decisions.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[LLM vs LAM: From Language Models to Action Models]]></title><description><![CDATA[LLM vs LAM: From Language Models to Action Models
The AI industry has spent the last few years obsessed with LLMs — Large Language Models. GPT-4, Claude, Gemini, LLaMA. They generate text, answer questions, write code, and translate languages. They'r...]]></description><link>https://estebanrfp.com/llm-vs-lam</link><guid isPermaLink="true">https://estebanrfp.com/llm-vs-lam</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[llm]]></category><category><![CDATA[Machine Learning]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:19:05 GMT</pubDate><enclosure url="https://i.imgur.com/UGmIGUv.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-llm-vs-lam-from-language-models-to-action-models">LLM vs LAM: From Language Models to Action Models</h1>
<p>The AI industry has spent the last few years obsessed with LLMs — Large Language Models. GPT-4, Claude, Gemini, LLaMA. They generate text, answer questions, write code, and translate languages. They're impressive, and they've reshaped how we interact with technology.</p>
<p>But LLMs have a fundamental limitation: <strong>they only understand words.</strong></p>
<p>Large Action Models (LAMs) represent the next evolutionary step — AI systems that don't just process language, but perceive, reason across modalities, and <strong>act</strong> in the real world.</p>
<h2 id="heading-what-are-llms-good-at">What Are LLMs Good At</h2>
<p>Large Language Models are trained on massive text corpora. They excel at:</p>
<ul>
<li><strong>Text generation</strong> — articles, emails, creative writing, code</li>
<li><strong>Comprehension</strong> — answering questions, summarizing documents</li>
<li><strong>Translation</strong> — between natural languages and between formats</li>
<li><strong>Reasoning</strong> — logical chains, math, structured thinking</li>
</ul>
<p>But everything an LLM does flows through text. Show it a photo and it needs a caption. Play it audio and it needs a transcript. Its entire world is linguistic — powerful, but one-dimensional.</p>
<h2 id="heading-what-lams-change">What LAMs Change</h2>
<p>Large Action Models are <strong>multimodal and agentic</strong>. They don't just generate text — they interpret images, audio, video, and sensor data, and then they <strong>take action</strong> based on that understanding.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Capability</td><td>LLM</td><td>LAM</td></tr>
</thead>
<tbody>
<tr>
<td>Input types</td><td>Text only</td><td>Text, images, audio, video, sensors</td></tr>
<tr>
<td>Output types</td><td>Text, code</td><td>Text, code, API calls, physical actions</td></tr>
<tr>
<td>World model</td><td>Linguistic</td><td>Multimodal</td></tr>
<tr>
<td>Agency</td><td>Passive (responds)</td><td>Active (decides and acts)</td></tr>
<tr>
<td>Interaction</td><td>Conversational</td><td>Environmental</td></tr>
</tbody>
</table>
</div><h3 id="heading-multimodal-understanding">Multimodal Understanding</h3>
<p>An LLM reads a radiology report. A LAM looks at the X-ray, reads the report, listens to the doctor's voice notes, and cross-references with patient history — all simultaneously.</p>
<p>This isn't hypothetical. Google's Gemini, OpenAI's GPT-4V, and Meta's ImageBind are already processing multiple modalities in a single model.</p>
<h3 id="heading-agentic-behavior">Agentic Behavior</h3>
<p>The biggest difference is <strong>agency</strong>. LLMs wait for a prompt and generate a response. LAMs can:</p>
<ul>
<li>Browse the web and interact with applications</li>
<li>Execute multi-step workflows autonomously</li>
<li>Manipulate physical environments through robotics</li>
<li>Make decisions based on real-time sensor data</li>
</ul>
<p>OpenAI's "Operator," Anthropic's "Computer Use," and Google's "Project Mariner" are early examples of this shift — AI that doesn't just talk about actions, but performs them.</p>
<h2 id="heading-why-this-matters-for-developers">Why This Matters for Developers</h2>
<p>If you're building applications today, this evolution changes what's possible:</p>
<p><strong>With LLMs:</strong> You build chatbots, text processors, code assistants. The AI is a text-in, text-out function.</p>
<p><strong>With LAMs:</strong> You build autonomous agents that can navigate interfaces, process multimedia, and execute complex workflows. The AI becomes a collaborator, not just a responder.</p>
<h3 id="heading-the-api-shift">The API Shift</h3>
<p>LLM APIs are simple: send text, receive text.</p>
<p>LAM APIs will be richer: send a goal, receive a plan. Send an environment, receive actions. The interface between developer and AI becomes less about prompting and more about delegating.</p>
<h2 id="heading-the-road-to-agi">The Road to AGI</h2>
<p>LLMs solved language. LAMs are solving perception and action. The path looks like this:</p>
<ol>
<li><strong>LLMs</strong> — Understand and generate text ✅</li>
<li><strong>Multimodal models</strong> — Understand text, images, audio, video ✅ (emerging)</li>
<li><strong>LAMs</strong> — Understand, reason, and act across modalities 🔄 (in progress)</li>
<li><strong>AGI</strong> — General intelligence across all domains ❓ (future)</li>
</ol>
<p>Each step requires not just more data, but fundamentally different architectures. LLMs use transformer-based attention on token sequences. LAMs need architectures that fuse information across modalities and plan actions over time.</p>
<h2 id="heading-the-practical-reality">The Practical Reality</h2>
<p>As of 2026, pure LAMs are still experimental. What we have are <strong>LLMs with multimodal capabilities and tool use</strong> — hybrid systems that can see images, call APIs, and execute code, but still rely on language as their primary reasoning medium.</p>
<p>The distinction matters because the marketing often outpaces the technology. When a company says "our AI can act," ask:</p>
<ul>
<li>Can it handle genuinely novel situations?</li>
<li>Does it plan multi-step actions or just execute single commands?</li>
<li>Does it actually perceive the environment or just process pre-labeled data?</li>
</ul>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>LLMs gave us AI that can <strong>think in words</strong>. LAMs are giving us AI that can <strong>think and act in the world</strong>. The transition isn't instant — it's gradual, messy, and full of marketing hype.</p>
<p>But the direction is clear. The future of AI isn't a chatbot that answers your questions. It's an agent that understands your environment, anticipates your needs, and takes action on your behalf.</p>
<p><strong>The shift from language to action is the shift from tools to collaborators.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[The Safe Assignment Operator (?=) in JavaScript — No More try-catch]]></title><description><![CDATA[The Safe Assignment Operator (?=) in JavaScript — No More try-catch
Error handling in JavaScript has always been verbose. The try-catch pattern works, but it produces deeply nested code, makes control flow harder to follow, and scales poorly when mul...]]></description><link>https://estebanrfp.com/javascript-safe-assignment-operator</link><guid isPermaLink="true">https://estebanrfp.com/javascript-safe-assignment-operator</guid><category><![CDATA[error handling]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:18:10 GMT</pubDate><enclosure url="https://i.imgur.com/VdnPu8H.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-the-safe-assignment-operator-in-javascript-no-more-try-catch">The Safe Assignment Operator (?=) in JavaScript — No More try-catch</h1>
<p>Error handling in JavaScript has always been verbose. The <code>try-catch</code> pattern works, but it produces deeply nested code, makes control flow harder to follow, and scales poorly when multiple async operations need independent error handling.</p>
<p>The <strong>Safe Assignment Operator (<code>?=</code>)</strong> is a <a target="_blank" href="https://github.com/arthurfiorette/proposal-safe-assignment-operator">TC39 proposal</a> that aims to fix this by bringing Go-style error handling to JavaScript.</p>
<h2 id="heading-the-problem-with-try-catch">The Problem with try-catch</h2>
<p>Consider a typical async operation:</p>
<pre><code class="lang-js"><span class="hljs-keyword">try</span> {
  <span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> fetch(<span class="hljs-string">'https://api.example.com/data'</span>);
  <span class="hljs-keyword">const</span> data = <span class="hljs-keyword">await</span> response.json();
  <span class="hljs-built_in">console</span>.log(data);
} <span class="hljs-keyword">catch</span> (err) {
  <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Something failed:'</span>, err);
}
</code></pre>
<p>This looks fine for one operation. But real-world code chains multiple async calls, each of which can fail independently:</p>
<pre><code class="lang-js"><span class="hljs-keyword">try</span> {
  <span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> fetch(<span class="hljs-string">'https://api.example.com/users'</span>);
  <span class="hljs-keyword">const</span> users = <span class="hljs-keyword">await</span> response.json();

  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">const</span> response2 = <span class="hljs-keyword">await</span> fetch(<span class="hljs-string">`https://api.example.com/users/<span class="hljs-subst">${users[<span class="hljs-number">0</span>].id}</span>/posts`</span>);
    <span class="hljs-keyword">const</span> posts = <span class="hljs-keyword">await</span> response2.json();

    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">await</span> saveToDatabase(posts);
    } <span class="hljs-keyword">catch</span> (err) {
      <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Database error:'</span>, err);
    }
  } <span class="hljs-keyword">catch</span> (err) {
    <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Posts fetch error:'</span>, err);
  }
} <span class="hljs-keyword">catch</span> (err) {
  <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Users fetch error:'</span>, err);
}
</code></pre>
<p>Three levels deep. Each <code>try-catch</code> adds indentation, obscures the happy path, and makes the code harder to maintain. This is sometimes called the <strong>"try-catch pyramid of doom."</strong></p>
<h2 id="heading-how-works">How ?= Works</h2>
<p>The Safe Assignment Operator destructures the result of an expression into a tuple <code>[error, value]</code>:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> [err, response] ?= <span class="hljs-keyword">await</span> fetch(<span class="hljs-string">'https://api.example.com/data'</span>);

<span class="hljs-keyword">if</span> (err) {
  <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Fetch failed:'</span>, err);
  <span class="hljs-keyword">return</span>;
}

<span class="hljs-keyword">const</span> [parseErr, data] ?= <span class="hljs-keyword">await</span> response.json();

<span class="hljs-keyword">if</span> (parseErr) {
  <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Parse failed:'</span>, parseErr);
  <span class="hljs-keyword">return</span>;
}

<span class="hljs-built_in">console</span>.log(data);
</code></pre>
<p>No nesting. No indentation creep. Each operation handles its own error inline. The control flow reads top to bottom — exactly how the code executes.</p>
<h2 id="heading-why-this-matters">Why This Matters</h2>
<h3 id="heading-flat-error-handling">Flat Error Handling</h3>
<p>The <code>?=</code> operator eliminates nesting. Every async call returns a consistent <code>[error, result]</code> tuple, and you handle it immediately. The happy path stays at the top level.</p>
<h3 id="heading-explicit-error-granularity">Explicit Error Granularity</h3>
<p>With <code>try-catch</code>, a single block catches errors from multiple statements. You often don't know <em>which</em> operation failed without additional logic. With <code>?=</code>, each operation has its own error variable.</p>
<h3 id="heading-cleaner-async-pipelines">Cleaner Async Pipelines</h3>
<p>When chaining multiple operations that can each fail:</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> [fetchErr, response] ?= <span class="hljs-keyword">await</span> fetch(url);
<span class="hljs-keyword">if</span> (fetchErr) <span class="hljs-keyword">return</span> handleError(fetchErr);

<span class="hljs-keyword">const</span> [parseErr, data] ?= <span class="hljs-keyword">await</span> response.json();
<span class="hljs-keyword">if</span> (parseErr) <span class="hljs-keyword">return</span> handleError(parseErr);

<span class="hljs-keyword">const</span> [saveErr] ?= <span class="hljs-keyword">await</span> db.save(data);
<span class="hljs-keyword">if</span> (saveErr) <span class="hljs-keyword">return</span> handleError(saveErr);

<span class="hljs-keyword">return</span> { <span class="hljs-attr">success</span>: <span class="hljs-literal">true</span>, data };
</code></pre>
<p>This pattern scales linearly. Ten operations? Ten flat checks. No pyramid.</p>
<h2 id="heading-inspiration-from-go">Inspiration from Go</h2>
<p>If this looks familiar, it's because Go has used this pattern since its inception:</p>
<pre><code class="lang-go">data, err := ioutil.ReadFile(<span class="hljs-string">"file.txt"</span>)
<span class="hljs-keyword">if</span> err != <span class="hljs-literal">nil</span> {
    log.Fatal(err)
}
</code></pre>
<p>Go's approach has been praised for making error handling explicit and impossible to accidentally ignore. The <code>?=</code> operator brings the same discipline to JavaScript.</p>
<h2 id="heading-the-pattern-you-can-use-today">The Pattern You Can Use Today</h2>
<p>While <code>?=</code> is still a proposal (not yet part of the ECMAScript standard), you can achieve the same pattern with a simple utility function:</p>
<pre><code class="lang-js"><span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">safe</span>(<span class="hljs-params">promise</span>) </span>{
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">const</span> result = <span class="hljs-keyword">await</span> promise;
    <span class="hljs-keyword">return</span> [<span class="hljs-literal">null</span>, result];
  } <span class="hljs-keyword">catch</span> (err) {
    <span class="hljs-keyword">return</span> [err, <span class="hljs-literal">null</span>];
  }
}

<span class="hljs-comment">// Usage</span>
<span class="hljs-keyword">const</span> [err, response] = <span class="hljs-keyword">await</span> safe(fetch(<span class="hljs-string">'https://api.example.com/data'</span>));

<span class="hljs-keyword">if</span> (err) {
  <span class="hljs-built_in">console</span>.error(err);
  <span class="hljs-keyword">return</span>;
}

<span class="hljs-built_in">console</span>.log(response);
</code></pre>
<p>Five lines of code. No dependencies. Works everywhere today. When <code>?=</code> eventually ships in browsers, migrating is a one-line search-and-replace.</p>
<h2 id="heading-current-status">Current Status</h2>
<p>The Safe Assignment Operator is a <strong>Stage 1 TC39 proposal</strong> as of 2024. This means:</p>
<ul>
<li>It has a formal specification document.</li>
<li>It's being actively discussed by the committee.</li>
<li>It could change significantly before reaching Stage 3/4.</li>
<li>No browser or runtime supports it natively yet.</li>
</ul>
<p>Track the progress on <a target="_blank" href="https://github.com/arthurfiorette/proposal-safe-assignment-operator">GitHub</a>.</p>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>Error handling should be simple, explicit, and flat. The <code>?=</code> operator doesn't add new capability — you can already handle errors with <code>try-catch</code>. But it changes the <em>ergonomics</em> of error handling in a way that makes code cleaner, more readable, and easier to maintain.</p>
<p>In the meantime, the <code>safe()</code> utility function gives you the same pattern today — zero dependencies, five lines, works everywhere.</p>
<p><strong>Better error handling isn't about catching more errors. It's about making error paths as readable as success paths.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item><item><title><![CDATA[What Is Vanilla JavaScript — and Why It Still Wins]]></title><description><![CDATA[What Is Vanilla JavaScript — and Why It Still Wins
Vanilla JavaScript is just JavaScript. No frameworks, no libraries, no build tools, no transpilers. You write code using the language itself — the DOM API, Fetch, ES Modules, Web Workers — without Re...]]></description><link>https://estebanrfp.com/vanilla-javascript</link><guid isPermaLink="true">https://estebanrfp.com/vanilla-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Vanilla JS]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Esteban Fuster Pozzi (estebanrfp)]]></dc:creator><pubDate>Tue, 17 Feb 2026 19:14:55 GMT</pubDate><enclosure url="https://i.imgur.com/bsro2rK.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-what-is-vanilla-javascript-and-why-it-still-wins">What Is Vanilla JavaScript — and Why It Still Wins</h1>
<p>Vanilla JavaScript is just JavaScript. No frameworks, no libraries, no build tools, no transpilers. You write code using the language itself — the DOM API, Fetch, ES Modules, Web Workers — without React, Vue, Angular, or jQuery sitting in between.</p>
<p>The term started as a joke. Someone even made a fake website (<a target="_blank" href="http://vanilla-js.com">vanilla-js.com</a>) presenting "Vanilla JS" as a framework, complete with download buttons and benchmarks. The punchline: you already have it. Every browser ships with it.</p>
<p>But behind the joke, there's a serious engineering philosophy — one that the industry is slowly rediscovering.</p>
<h2 id="heading-the-framework-dependency-problem">The Framework Dependency Problem</h2>
<p>The JavaScript ecosystem has a dependency addiction. The average React project pulls in 200+ packages before a single line of business logic is written. Each package is a trust decision, a maintenance burden, and a potential attack surface.</p>
<p>This isn't theoretical:</p>
<ul>
<li><strong>left-pad (2016):</strong> One developer unpublished an 11-line package and broke thousands of builds worldwide.</li>
<li><strong>colors.js (2022):</strong> The maintainer deliberately sabotaged his own package, affecting millions of downloads.</li>
<li><strong>event-stream (2018):</strong> A malicious actor gained commit access and injected cryptocurrency-stealing code.</li>
</ul>
<p>Every <code>npm install</code> is a bet. Vanilla JS has zero dependencies, zero supply chain risk, and zero <code>node_modules</code>.</p>
<h2 id="heading-why-vanilla-js-produces-better-engineers">Why Vanilla JS Produces Better Engineers</h2>
<h3 id="heading-you-learn-the-platform-not-the-abstraction">You Learn the Platform, Not the Abstraction</h3>
<p>Most developers today learn React before they learn JavaScript. They know <code>useState</code> but not <code>addEventListener</code>. They know JSX but not <code>document.createElement</code>. They know <code>useEffect</code> but not <code>MutationObserver</code>.</p>
<p>This creates a generation of developers who can assemble components but can't debug them. When the abstraction leaks — and it always does — they're lost.</p>
<pre><code class="lang-js"><span class="hljs-comment">// Direct DOM manipulation — no virtual DOM, no reconciliation</span>
<span class="hljs-keyword">const</span> list = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">'ul'</span>);
<span class="hljs-keyword">const</span> item = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'li'</span>);
item.textContent = <span class="hljs-string">'New item'</span>;
list.appendChild(item);
</code></pre>
<p>This isn't "old-fashioned." This is the API that every framework calls internally. Understanding it makes you better at using frameworks too.</p>
<h3 id="heading-you-ship-less-code">You Ship Less Code</h3>
<p>A typical React + bundler setup produces 150-300KB of JavaScript before your application logic. For a to-do list. For a landing page. For a form.</p>
<p>Vanilla JS ships exactly what you write. Nothing more.</p>
<pre><code class="lang-js"><span class="hljs-comment">// HTTP request — no Axios, no dependencies, no polyfills</span>
<span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> fetch(<span class="hljs-string">'https://api.example.com/data'</span>);
<span class="hljs-keyword">const</span> data = <span class="hljs-keyword">await</span> response.json();
</code></pre>
<p>In an era where <a target="_blank" href="https://web.dev/vitals/">Core Web Vitals</a> directly affect search rankings, every kilobyte matters. Google penalizes slow sites. Vanilla JS is fast by default.</p>
<h3 id="heading-you-own-your-architecture">You Own Your Architecture</h3>
<p>Frameworks impose opinions: component trees, unidirectional data flow, virtual DOM diffing, hydration cycles. These are solutions to specific problems — but they become constraints when your problem is different.</p>
<p>Vanilla JS imposes nothing. You choose the patterns that fit your domain.</p>
<pre><code class="lang-js"><span class="hljs-comment">// Custom animation — using the browser's native API</span>
<span class="hljs-keyword">const</span> el = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'box'</span>);
<span class="hljs-keyword">let</span> pos = <span class="hljs-number">0</span>;

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">frame</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">if</span> (pos &gt;= <span class="hljs-number">350</span>) <span class="hljs-keyword">return</span>;
  pos++;
  el.style.transform = <span class="hljs-string">`translateX(<span class="hljs-subst">${pos}</span>px)`</span>;
  requestAnimationFrame(frame);
}

requestAnimationFrame(frame);
</code></pre>
<p>No animation library. No CSS-in-JS. Just the platform doing what it was designed to do.</p>
<h2 id="heading-the-web-platform-is-more-powerful-than-you-think">The Web Platform Is More Powerful Than You Think</h2>
<p>Modern browsers ship with APIs that eliminate the need for most utility libraries:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>What you need</td><td>Library you don't need</td><td>Native API</td></tr>
</thead>
<tbody>
<tr>
<td>HTTP requests</td><td>Axios</td><td><code>fetch()</code></td></tr>
<tr>
<td>State observation</td><td>MobX, Redux</td><td><code>Proxy</code>, <code>EventTarget</code></td></tr>
<tr>
<td>DOM observation</td><td>jQuery</td><td><code>MutationObserver</code></td></tr>
<tr>
<td>Lazy loading</td><td>lazysizes</td><td><code>IntersectionObserver</code></td></tr>
<tr>
<td>Local storage</td><td>localForage</td><td><code>IndexedDB</code>, <code>OPFS</code></td></tr>
<tr>
<td>Parallel processing</td><td>—</td><td><code>Web Workers</code></td></tr>
<tr>
<td>Real-time communication</td><td>Socket.io</td><td><code>WebRTC</code>, <code>WebSocket</code></td></tr>
<tr>
<td>Biometric auth</td><td>—</td><td><code>WebAuthn</code></td></tr>
</tbody>
</table>
</div><p>Most of these APIs didn't exist five years ago. The platform caught up. The ecosystem hasn't noticed yet.</p>
<h2 id="heading-when-frameworks-make-sense">When Frameworks Make Sense</h2>
<p>Vanilla JS isn't always the answer. There are legitimate cases for frameworks:</p>
<ul>
<li><strong>Large teams</strong> that need enforced conventions and shared patterns.</li>
<li><strong>Complex SPAs</strong> with deep state trees and many interdependent views.</li>
<li><strong>Server-side rendering</strong> where frameworks provide optimized hydration.</li>
<li><strong>Rapid prototyping</strong> where speed-to-market outweighs long-term architecture.</li>
</ul>
<p>The point isn't "never use frameworks." The point is: <strong>understand what you're abstracting away</strong>. If you can build it without the framework, you'll know exactly when you need one — and when you don't.</p>
<h2 id="heading-real-world-vanilla-js-at-scale">Real-World Vanilla JS at Scale</h2>
<p>This philosophy scales beyond toy projects. <a target="_blank" href="https://genosdb.com">GenosDB</a>, a distributed peer-to-peer graph database, is built entirely in Vanilla JavaScript — no frameworks, no transpilers, no build step. It runs in the browser and in Node.js with the same codebase, using only native APIs:</p>
<ul>
<li><strong>OPFS</strong> for persistent storage via Web Workers</li>
<li><strong>WebRTC</strong> for peer-to-peer data channels</li>
<li><strong>WebAuthn</strong> for biometric authentication</li>
<li><strong>ES Modules</strong> for zero-config imports</li>
</ul>
<p>A complete database engine — storage, networking, encryption, access control — in pure JavaScript. No bundler required. Import it with one line:</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> { gdb } <span class="hljs-keyword">from</span> <span class="hljs-string">"https://cdn.jsdelivr.net/npm/genosdb@latest/dist/index.min.js"</span>;
</code></pre>
<p>That's what happens when you master the platform instead of depending on abstractions.</p>
<h2 id="heading-how-to-strengthen-your-vanilla-js-skills">How to Strengthen Your Vanilla JS Skills</h2>
<ol>
<li><strong>Build one project without npm.</strong> A to-do list, a chat widget, a drawing tool. One HTML file. No build step.</li>
<li><strong>Read the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript">MDN Web Docs</a>.</strong> Not tutorials — the actual documentation. It's the best JavaScript reference ever written.</li>
<li><strong>Explore the Web APIs.</strong> <code>IntersectionObserver</code>, <code>Web Workers</code>, <code>OPFS</code>, <code>Streams API</code>. These are more powerful than most developers realize.</li>
<li><strong>Read framework source code.</strong> Seeing how React implements reconciliation or how Vue implements reactivity teaches you what the platform can do — and what the framework is doing on your behalf.</li>
<li><strong>Question every dependency.</strong> Before adding a package, ask: can I write this in 20 lines of Vanilla JS? Often, the answer is yes.</li>
</ol>
<h2 id="heading-the-bottom-line">The Bottom Line</h2>
<p>The best JavaScript developers aren't the ones who know the most frameworks. They're the ones who understand the language underneath.</p>
<p>Frameworks come and go. jQuery dominated, then Angular, then React. Something will replace React too. But <code>document.querySelector</code> will still work. <code>fetch</code> will still work. <code>addEventListener</code> will still work.</p>
<p><strong>The platform is the only framework that never gets deprecated.</strong></p>
<hr />
<p><em>By <a target="_blank" href="https://estebanrfp.com">estebanrfp</a> — Full Stack Developer, dWEB R&amp;D</em></p>
]]></content:encoded></item></channel></rss>