<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Nathan Lazo</title>
        <link>https://nathanlazo.website</link>
        <description>Nathan Lazo: ingeniero de software, emprendedor y DJ. Escribe sobre IA aplicada al desarrollo, agentes, WebGPU y 3D en la web, arquitectura T3, Web3 y cultura electrónica.</description>
        <lastBuildDate>Tue, 20 Oct 2026 02:44:17 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Nathan Lazo</title>
            <url>https://nathanlazo.website/favicon.ico</url>
            <link>https://nathanlazo.website</link>
        </image>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[GEO: cómo hice mi portafolio legible para agentes de IA]]></title>
            <link>https://nathanlazo.website/articles/geo-seo-para-agentes</link>
            <guid>https://nathanlazo.website/articles/geo-seo-para-agentes</guid>
            <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Generative Engine Optimization explicado con un caso real: llms.txt, JSON-LD, robots.txt para crawlers de IA, sitemap y contenido escrito para ser citado. La implementación exacta que usé en este sitio con Next.js.]]></description>
            <content:encoded><![CDATA[<p><strong>Respuesta corta:</strong> GEO (<em>Generative Engine Optimization</em>) es hacer que tu contenido sea fácil de <strong>encontrar, entender y citar</strong> para agentes de IA. En este sitio lo implementé con cinco piezas: <code>robots.txt</code> que permite explícitamente a los crawlers de IA, <code>sitemap.xml</code> generado en build, datos estructurados JSON-LD (Person, WebSite, BlogPosting, FAQPage, BreadcrumbList), <code>llms.txt</code> + <code>llms-full.txt</code>, y artículos escritos con respuesta directa al inicio y preguntas frecuentes al final.</p>
<p>Escribo para que el conocimiento circule. En 2026 una parte enorme de la gente ya no lee resultados de búsqueda: le pregunta a un agente. Si el agente no puede leerte, no existes en esa conversación.</p>
<h2>SEO vs GEO</h2>
<table><thead><tr><th></th><th>SEO clásico</th><th>GEO</th></tr></thead><tbody><tr><td>Lector principal</td><td>Crawler + humano en una SERP</td><td>LLM que sintetiza una respuesta</td></tr><tr><td>Unidad que compite</td><td>La página</td><td>El fragmento citable</td></tr><tr><td>Señales clave</td><td>Enlaces, rendimiento, keywords</td><td>Claridad, estructura, entidad del autor, acceso al texto</td></tr><tr><td>Éxito</td><td>Clic</td><td>Cita con enlace y atribución</td></tr></tbody></table>
<p>No se reemplazan: GEO <strong>se construye sobre</strong> un SEO técnico sano.</p>
<h2>1. robots.txt: invitar a los agentes</h2>
<p>Muchos sitios bloquean a los bots de IA por defecto. Si tu objetivo es compartir, haz lo contrario y sé explícito:</p>
<pre class="language-text"><code class="language-text">User-agent: GPTBot
User-agent: ClaudeBot
User-agent: PerplexityBot
User-agent: Google-Extended
Allow: /

Sitemap: https://nathanlazo.website/sitemap.xml
</code></pre>
<h2>2. Una entidad clara: quién escribe</h2>
<p>Los motores de respuesta razonan sobre <strong>entidades</strong>. Defino una sola entidad <code>Person</code> con <code>@id</code> estable, perfiles (<code>sameAs</code>) y temas (<code>knowsAbout</code>), y cada artículo la referencia como autor:</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
  <span class="token property">&quot;@type&quot;</span><span class="token operator">:</span> <span class="token string">&quot;BlogPosting&quot;</span><span class="token punctuation">,</span>
  <span class="token property">&quot;headline&quot;</span><span class="token operator">:</span> <span class="token string">&quot;GEO: cómo hice mi portafolio legible para agentes de IA&quot;</span><span class="token punctuation">,</span>
  <span class="token property">&quot;datePublished&quot;</span><span class="token operator">:</span> <span class="token string">&quot;2026-10-20&quot;</span><span class="token punctuation">,</span>
  <span class="token property">&quot;inLanguage&quot;</span><span class="token operator">:</span> <span class="token string">&quot;es&quot;</span><span class="token punctuation">,</span>
  <span class="token property">&quot;author&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">&quot;@id&quot;</span><span class="token operator">:</span> <span class="token string">&quot;https://nathanlazo.website/#person&quot;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Así cada post suma autoridad a la misma identidad en lugar de quedar huérfano.</p>
<h2>3. Una sola fuente de verdad para metadatos</h2>
<p>En Next.js (Pages Router) centralicé todo en dos piezas:</p>
<ul>
<li><code>src/lib/site.js</code>: URL, autor, perfiles, temas y rutas.</li>
<li><code>src/components/Seo.jsx</code>: título, descripción, canonical, Open Graph, Twitter y JSON-LD en un componente.</li>
</ul>
<p>Cada página declara solo lo suyo:</p>
<pre class="language-jsx"><code class="language-jsx"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Seo</span></span> <span class="token attr-name">title</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>Articles<span class="token punctuation">&quot;</span></span> <span class="token attr-name">description</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>Long-form writing on AI agents, WebGPU...<span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre>
<p>Menos lugares donde equivocarse = menos metadatos inconsistentes (en mi caso había descripciones heredadas de la plantilla con el nombre de otra persona).</p>
<h2>4. llms.txt y llms-full.txt generados en build</h2>
<p>Al compilar, el mismo paso que genera el RSS escribe tres archivos:</p>
<ul>
<li><code>sitemap.xml</code> con todas las rutas y fechas de los artículos.</li>
<li><code>llms.txt</code>: resumen del sitio, páginas clave y un índice de artículos con descripción.</li>
<li><code>llms-full.txt</code>: el texto completo de cada artículo en markdown limpio, con URL, autor y fecha.</li>
</ul>
<p>Un agente que llega al sitio puede entenderlo completo en una sola lectura, sin ejecutar JavaScript ni adivinar qué es navegación y qué es contenido.</p>
<h2>5. Escribir para ser citado</h2>
<p>La técnica más rentable no es técnica:</p>
<ul>
<li><strong>Respuesta directa en el primer párrafo.</strong> Lo que un agente cita es lo que responde la pregunta sin rodeos.</li>
<li><strong>Encabezados que son preguntas o conceptos.</strong> Facilitan extraer fragmentos.</li>
<li><strong>Definiciones explícitas.</strong> &quot;X es…&quot; es la frase más citable que existe.</li>
<li><strong>Tablas para comparaciones.</strong> Los modelos las resumen muy bien.</li>
<li><strong>FAQ al final</strong>, también expuesta como <code>FAQPage</code> en JSON-LD.</li>
<li><strong>Fechas y autor visibles.</strong> La frescura y la atribución importan.</li>
<li><strong>Enlaces internos</strong> entre artículos relacionados para que el grafo del sitio tenga sentido.</li>
</ul>
<h2>Checklist GEO</h2>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" disabled=""/> <code>robots.txt</code> permite a los crawlers de IA y apunta al sitemap.</li>
<li class="task-list-item"><input type="checkbox" disabled=""/> <code>sitemap.xml</code> actualizado en cada build.</li>
<li class="task-list-item"><input type="checkbox" disabled=""/> Canonical, Open Graph y Twitter en todas las páginas.</li>
<li class="task-list-item"><input type="checkbox" disabled=""/> JSON-LD: Person + WebSite global, BlogPosting y BreadcrumbList por artículo, FAQPage si aplica.</li>
<li class="task-list-item"><input type="checkbox" disabled=""/> <code>llms.txt</code> y <code>llms-full.txt</code> publicados.</li>
<li class="task-list-item"><input type="checkbox" disabled=""/> <code>lang</code> correcto por artículo.</li>
<li class="task-list-item"><input type="checkbox" disabled=""/> Respuesta directa al inicio y FAQ al final de cada post.</li>
</ul>
<h2>Cierre</h2>
<p>GEO no es engañar a un algoritmo; es <strong>ser la fuente más clara</strong> sobre lo que sabes. Si escribes para enseñar, haz que tu conocimiento sea legible para humanos y para máquinas. Es la forma más simple de devolverle algo a la comunidad que te enseñó.</p>
<p>Más del tema: <a href="/articles/como-construi-roger-arq">cómo construí Roger-arq</a> y <a href="/articles/webgpu-y-modelado-3d-en-la-web">WebGPU y modelado 3D en la web</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cómo construí Roger-arq: mi arquitectura convertida en una skill para agentes]]></title>
            <link>https://nathanlazo.website/articles/como-construi-roger-arq</link>
            <guid>https://nathanlazo.website/articles/como-construi-roger-arq</guid>
            <pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[La historia y la estructura de Roger-arq, la skill que convierte mis reglas de arquitectura T3 en un contrato que cualquier agente de IA sigue. Y una guía paso a paso para que construyas la tuya.]]></description>
            <content:encoded><![CDATA[<p><strong>Respuesta corta:</strong> Roger-arq es una <em>skill</em> —un archivo de instrucciones que un agente de IA carga antes de trabajar— donde escribí cómo construyo software: qué comandos nunca se ejecutan, cómo se separan las capas, cómo se nombran los archivos, cómo responde cada endpoint y cómo se autoriza cada fila. Nació de cansarme de repetir lo mismo en cada proyecto. Hoy es la diferencia entre un agente que escribe código <em>plausible</em> y uno que escribe código <strong>como yo lo escribiría</strong>.</p>
<p>Te cuento cómo la construí para que hagas la tuya.</p>
<h2>El problema: explicar lo mismo diez veces</h2>
<p>Trabajo en varios productos a la vez: un ERP, apps móviles, plataformas con pagos y facturación. Todos comparten stack (Next.js, tRPC, Prisma, Zod, Tailwind, shadcn) y, sobre todo, comparten <strong>decisiones</strong>: cómo se manejan errores, dónde vive la autorización, cuándo se abre una transacción.</p>
<p>Con agentes, cada sesión empezaba igual: &quot;no uses <code>any</code>&quot;, &quot;no hagas <code>db push</code>&quot;, &quot;el error es un código, no texto libre&quot;, &quot;filtra en el <code>where</code>, no después&quot;. Si una regla vive solo en mi cabeza, cada agente —y cada persona nueva— la va a romper.</p>
<h2>La estructura de Roger-arq</h2>
<p>Después de muchas iteraciones, la skill quedó organizada así, y el orden importa:</p>
<ol>
<li><strong>Reglas críticas (no negociables).</strong> Lo primero que el agente lee: no ejecutar builds que toquen la base de datos, no correr migraciones, no imprimir secretos. Pocas, absolutas y verificables.</li>
<li><strong>Prioridades.</strong> Cuando dos reglas chocan, cuál gana: correctitud y seguridad de datos, tipado estricto, separación por capas, módulos localizados, respuestas uniformes, cambios pequeños.</li>
<li><strong>Stack.</strong> Qué librerías se usan y cuáles no se agregan (una sola librería de animación, una de gráficas).</li>
<li><strong>Anatomía de módulo.</strong> Un árbol de carpetas concreto: <code>page.tsx</code> delgado, <code>_components</code> privados, servicio de dominio en servidor, reglas puras en <code>src/lib</code>, i18n y spec.</li>
<li><strong>Capas.</strong> UI → cliente tRPC → procedure → servicio → Prisma. Cada capa con una responsabilidad y prohibiciones claras.</li>
<li><strong>Autorización y alcance por fila.</strong> Una fila fuera del alcance responde 404, nunca 403. Toda escritura carga primero la fila dentro del alcance del usuario.</li>
<li><strong>Contrato tRPC.</strong> Toda procedure responde con la misma forma (<code>result</code>, <code>error</code>, <code>status</code>, <code>message</code>), construida solo con <code>ok</code>/<code>fail</code>, y el error siempre es un código de catálogo que la UI traduce.</li>
<li><strong>Datos, UI, tablas, dashboards, motion.</strong> Reglas de transacciones, serialización, shell, vistas de tabla y kits de diseño.</li>
<li><strong>Checklist final</strong> y anexos con skills complementarias y referencias a implementaciones reales.</li>
</ol>
<h2>Decisiones que la hicieron funcionar</h2>
<ul>
<li><strong>Reglas, no opiniones.</strong> &quot;Escribe código limpio&quot; no sirve. &quot;Prohibido <code>any</code>, <code>as any</code> y <code>@ts-ignore</code>&quot; sí: es verificable.</li>
<li><strong>Ejemplos reales, no inventados.</strong> Cada patrón apunta a un archivo de un proyecto mío donde ya funciona. El agente copia de algo probado.</li>
<li><strong>Fuente de verdad para cada kit.</strong> Mis kits de UI (shell, tablas, gráficas, chat de agente) se copian siempre desde un repo concreto, y toda mejora vuelve ahí. Sin esto, cinco proyectos terminan con cinco versiones divergentes.</li>
<li><strong>Lo que el agente NO debe hacer, explícito.</strong> Las prohibiciones evitan más daño que cualquier instrucción positiva. Un agente que corre <code>db push</code> en el proyecto equivocado te arruina la semana.</li>
<li><strong>Composición con otras skills.</strong> Roger-arq no intenta saberlo todo: delega diseño, motion, 3D y móvil a skills especializadas y declara que, si contradicen el contrato, gana el contrato. Para móvil tengo una variante hermana, Roger-arq-mobile.</li>
</ul>
<h2>Un ejemplo del contrato</h2>
<pre class="language-ts"><code class="language-ts">list<span class="token operator">:</span> salesProcedure<span class="token punctuation">.</span><span class="token method function property-access">input</span><span class="token punctuation">(</span>listSchema<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">query</span><span class="token punctuation">(</span><span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">{</span> ctx<span class="token punctuation">,</span> input <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">try</span> <span class="token punctuation">{</span>
    <span class="token keyword control-flow">return</span> <span class="token function">ok</span><span class="token punctuation">(</span><span class="token keyword control-flow">await</span> <span class="token function">listOrders</span><span class="token punctuation">(</span>ctx<span class="token punctuation">.</span><span class="token property-access">db</span><span class="token punctuation">,</span> <span class="token function">viewerFromSession</span><span class="token punctuation">(</span>ctx<span class="token punctuation">.</span><span class="token property-access">session</span><span class="token punctuation">)</span><span class="token punctuation">,</span> input<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">&#x27;OK&#x27;</span><span class="token punctuation">)</span>
  <span class="token punctuation">}</span> <span class="token keyword control-flow">catch</span> <span class="token punctuation">(</span>error<span class="token operator">:</span> <span class="token builtin">unknown</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> <span class="token punctuation">{</span> code<span class="token punctuation">,</span> status <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">normalizeError</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span>
    <span class="token keyword control-flow">return</span> <span class="token function">fail</span><span class="token punctuation">(</span>code<span class="token punctuation">,</span> status<span class="token punctuation">,</span> <span class="token string">&#x27;No se pudo listar&#x27;</span><span class="token punctuation">)</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</code></pre>
<p>Tres reglas en diez líneas: el servicio recibe el <em>viewer</em> (nunca lee la sesión), el error se normaliza a un código estable y nada interno llega al cliente.</p>
<h2>Cómo construir tu propia skill (paso a paso)</h2>
<ol>
<li><strong>Junta tus repeticiones.</strong> Revisa tus últimos 20 code reviews y prompts. Lo que corregiste más de dos veces es tu primer borrador.</li>
<li><strong>Crea el archivo.</strong> Un <code>SKILL.md</code> con frontmatter:</li>
</ol>
<pre class="language-md"><code class="language-md"><span class="token front-matter-block"><span class="token punctuation">---</span>
<span class="token front-matter yaml language-yaml">name: mi-arq
description: Contrato de arquitectura para proyectos X. Úsala al crear o modificar módulos, endpoints o modelos de datos.</span>
<span class="token punctuation">---</span></span>

<span class="token title important"><span class="token punctuation">#</span> Mi Arq</span>

<span class="token title important"><span class="token punctuation">##</span> 1. Reglas críticas</span>
<span class="token list punctuation">1.</span> Nunca ejecutes migraciones; entrega el comando al usuario.
<span class="token list punctuation">2.</span> ...
</code></pre>
<ol start="3">
<li><strong>Escribe primero lo no negociable</strong>, en imperativo y verificable.</li>
<li><strong>Añade la anatomía</strong>: un árbol de carpetas real vale más que tres párrafos.</li>
<li><strong>Apunta a ejemplos reales</strong> de tu código.</li>
<li><strong>Pruébala en una tarea real</strong> con un agente. Cada error del agente es una regla que falta o que está mal escrita.</li>
<li><strong>Versiónala</strong> y mejórala como cualquier otro código.</li>
</ol>
<p>La <code>description</code> es crítica: es lo que el agente lee para decidir si cargar la skill. Di <strong>qué hace y cuándo usarla</strong>.</p>
<h2>Por qué deberías hacerlo</h2>
<p>Una skill es tu experiencia en un formato que escala: la usan tus agentes, tu equipo y tu yo del futuro. Y si la compartes, ayudas a que la comunidad deje de aprender las mismas lecciones a golpes. Yo empecé con diez reglas escritas en una tarde; hoy es el contrato que siguen todos mis proyectos.</p>
<p>No necesitas una arquitectura perfecta para empezar. Necesitas <strong>escribir la que ya tienes</strong>.</p>
<p>Relacionado: <a href="/articles/el-flujo-de-desarrollo-ya-vive-en-la-nube">el flujo de desarrollo ya vive en la nube</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[WebGPU y modelado 3D con IA: la nueva forma de renderizar en la web]]></title>
            <link>https://nathanlazo.website/articles/webgpu-y-modelado-3d-en-la-web</link>
            <guid>https://nathanlazo.website/articles/webgpu-y-modelado-3d-en-la-web</guid>
            <pubDate>Sat, 10 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Qué es WebGPU, en qué se diferencia de WebGL, cómo usar el WebGPURenderer de Three.js con fallback, y mi pipeline actual: modelo generado con IA, optimización glTF y escena lista para producción en Next.js.]]></description>
            <content:encoded><![CDATA[<p><strong>Respuesta corta:</strong> WebGPU es la nueva API gráfica de la web. Da acceso a la GPU con un modelo moderno (el de Vulkan, Metal y D3D12) y añade <strong>compute shaders</strong>, algo que WebGL nunca tuvo. Con Three.js ya puedes usarla hoy sin perder compatibilidad: el <code>WebGPURenderer</code> cae automáticamente a WebGL 2. Combinado con modelos 3D generados por IA, el costo de llevar una idea 3D a producción se desplomó.</p>
<p>Empecé a programar a los 16 años con una app en Three.js. Diez años después, el 3D en la web cambió más en los últimos 18 meses que en toda esa década.</p>
<h2>WebGL vs WebGPU en una tabla</h2>
<table><thead><tr><th></th><th>WebGL 2</th><th>WebGPU</th></tr></thead><tbody><tr><td>Modelo</td><td>Máquina de estados (OpenGL ES)</td><td>Pipelines y bind groups explícitos</td></tr><tr><td>Lenguaje de shaders</td><td>GLSL</td><td>WGSL (o TSL en Three.js)</td></tr><tr><td>Compute shaders</td><td>No</td><td>Sí</td></tr><tr><td>Sobrecarga por draw call</td><td>Alta</td><td>Baja</td></tr><tr><td>Casos que habilita</td><td>Escenas clásicas</td><td>Partículas masivas, simulación, IA en GPU, post-proceso pesado</td></tr></tbody></table>
<p>La consecuencia práctica: cosas que antes requerían trucos (millones de partículas, físicas, instancing gigante, cálculos en texturas) ahora son <strong>código directo en la GPU</strong>.</p>
<h2>Three.js con WebGPU y fallback</h2>
<pre class="language-js"><code class="language-js"><span class="token keyword module">import</span> <span class="token operator">*</span> <span class="token keyword module">as</span> <span class="token constant">THREE</span> <span class="token keyword module">from</span> <span class="token string">&#x27;three/webgpu&#x27;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> color<span class="token punctuation">,</span> positionLocal<span class="token punctuation">,</span> sin<span class="token punctuation">,</span> time <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;three/tsl&#x27;</span>

<span class="token keyword">const</span> renderer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">THREE<span class="token punctuation">.</span>WebGPURenderer</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">antialias</span><span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token keyword control-flow">await</span> renderer<span class="token punctuation">.</span><span class="token method function property-access">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// usa WebGPU o cae a WebGL 2</span>

<span class="token keyword">const</span> material <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">THREE<span class="token punctuation">.</span>MeshStandardNodeMaterial</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment">// TSL: el mismo nodo compila a WGSL o GLSL según el backend</span>
material<span class="token punctuation">.</span><span class="token property-access">colorNode</span> <span class="token operator">=</span> <span class="token function">color</span><span class="token punctuation">(</span><span class="token number">0x6366f1</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">mul</span><span class="token punctuation">(</span><span class="token function">sin</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">mul</span><span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
material<span class="token punctuation">.</span><span class="token property-access">positionNode</span> <span class="token operator">=</span> positionLocal<span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span><span class="token function">sin</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span><span class="token method function property-access">add</span><span class="token punctuation">(</span>positionLocal<span class="token punctuation">.</span><span class="token property-access">y</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token method function property-access">mul</span><span class="token punctuation">(</span><span class="token number">0.05</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</code></pre>
<p><strong>TSL (Three Shading Language)</strong> es lo que hace que esto sea sostenible: escribes shaders como funciones de JavaScript componibles y Three.js los traduce al backend correcto. Se acabó mantener dos versiones de cada shader.</p>
<h2>Mi pipeline 3D actual</h2>
<ol>
<li><strong>Generar.</strong> Parto de una imagen o concepto y genero una malla GLB con un modelo de IA de imagen a 3D. Lo que antes eran días en Maya para un prop ahora es un primer borrador en minutos.</li>
<li><strong>Corregir.</strong> El modelo generado es un punto de partida: reviso topología, escala, pivote y materiales. El criterio de modelado sigue importando.</li>
<li><strong>Optimizar.</strong> Con <code>gltf-transform</code>: deduplicar, simplificar, comprimir geometría (meshopt o Draco) y texturas (KTX2/WebP). Un GLB de 40 MB baja fácilmente a 2–4 MB.</li>
<li><strong>Integrar.</strong> En Next.js, el canvas es un componente cliente cargado con <code>next/dynamic</code> y <code>ssr: false</code>, con un fallback estático (imagen) mientras carga.</li>
<li><strong>Cuidar.</strong> Liberar geometrías, materiales y texturas al desmontar (<code>dispose</code>), pausar el loop fuera de pantalla y respetar <code>prefers-reduced-motion</code>.</li>
</ol>
<pre class="language-jsx"><code class="language-jsx"><span class="token keyword module">import</span> <span class="token imports">dynamic</span> <span class="token keyword module">from</span> <span class="token string">&#x27;next/dynamic&#x27;</span>

<span class="token keyword">const</span> <span class="token maybe-class-name">Scene</span> <span class="token operator">=</span> <span class="token function">dynamic</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token keyword module">import</span><span class="token punctuation">(</span><span class="token string">&#x27;./scene&#x27;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
  <span class="token literal-property property">ssr</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>
  <span class="token function-variable function">loading</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>/hero-fallback.webp<span class="token punctuation">&quot;</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>Vista previa de la escena<span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
</code></pre>
<h2>Skills: cómo hago que un agente programe 3D bien</h2>
<p>El 3D es donde más se nota un agente sin contexto: crea renderers en cada render, olvida <code>dispose</code>, carga texturas sin comprimir. Por eso trabajo con un set de skills especializadas (fundamentos, geometría, materiales, iluminación, shaders, loaders, post-proceso, animación, interacción) que codifican esas reglas. El agente no &quot;sabe&quot; Three.js mejor por arte de magia: <strong>sigue las reglas que yo ya aprendí rompiendo cosas</strong>.</p>
<p>Las reglas base que meto en cualquier proyecto 3D:</p>
<ul>
<li>Componentes 3D siempre <code>&quot;use client&quot;</code> y sin SSR.</li>
<li>Un solo renderer por canvas; nada se instancia dentro del render de React.</li>
<li>Todo recurso creado se libera al desmontar.</li>
<li>Fallback estático y respeto a movimiento reducido.</li>
<li>Assets comprimidos antes de llegar a <code>public/</code>.</li>
</ul>
<h2>Lo nuevo que podemos hacer</h2>
<ul>
<li><strong>Configuradores de producto</strong> con materiales PBR reales y cambios en tiempo real.</li>
<li><strong>Héroes interactivos</strong> con millones de partículas animadas por compute shaders.</li>
<li><strong>Visualización de datos 3D</strong> que antes exigía una app nativa.</li>
<li><strong>Inferencia en GPU dentro del navegador</strong>: WebGPU también acelera modelos de IA locales, sin servidor.</li>
</ul>
<h2>Cierre</h2>
<p>WebGPU no es &quot;WebGL más rápido&quot;: es la GPU tratada como ciudadano de primera clase en la web. Sumado a generación de modelos con IA y agentes que siguen reglas de producción, el 3D dejó de ser un lujo de estudios grandes. Si sabes JavaScript, hoy puedes publicar experiencias que hace tres años requerían un equipo.</p>
<p>Lee también: <a href="/articles/el-flujo-de-desarrollo-ya-vive-en-la-nube">cómo el flujo de desarrollo se movió a la nube</a> y <a href="/articles/como-construi-roger-arq">cómo construí Roger-arq</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Finales de 2026: el flujo de desarrollo ya vive en la nube]]></title>
            <link>https://nathanlazo.website/articles/el-flujo-de-desarrollo-ya-vive-en-la-nube</link>
            <guid>https://nathanlazo.website/articles/el-flujo-de-desarrollo-ya-vive-en-la-nube</guid>
            <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sesiones de agentes en la nube, builds y CI delegados, PRs que se arreglan solos y desarrollo desde el teléfono. Qué cambió de verdad en el flujo de trabajo y qué sigue siendo trabajo humano.]]></description>
            <content:encoded><![CDATA[<p><strong>Respuesta corta:</strong> a finales de 2026 el flujo de desarrollo dejó de depender de una computadora local. El repositorio, las dependencias, el build, los tests y el CI corren en contenedores en la nube operados por agentes. Yo describo la tarea, el agente la ejecuta en una rama, abre el PR, vigila el CI y responde a la review. Mi trabajo se movió de <em>teclear</em> a <strong>definir contratos, revisar y decidir</strong>.</p>
<p>Este artículo es mi lectura de ese cambio desde la práctica: lo uso todos los días en mis proyectos (ERPs, apps móviles, plataformas T3 y experiencias 3D).</p>
<h2>Qué cambió exactamente</h2>
<p>Hace dos años un &quot;asistente de código&quot; autocompletaba líneas. Hoy una sesión de agente:</p>
<ol>
<li><strong>Clona el repo en un contenedor efímero</strong> con el entorno configurado (Node, pnpm, navegador headless, variables y red controladas).</li>
<li><strong>Lee las reglas del proyecto</strong> (<code>CLAUDE.md</code>, <code>AGENTS.md</code>, skills) antes de tocar código.</li>
<li><strong>Implementa, corre lint y typecheck</strong>, y hace commit en una rama dedicada.</li>
<li><strong>Abre el PR y se suscribe a sus eventos</strong>: si el CI falla, reproduce el error, lo corrige y vuelve a empujar; si un reviewer pide un cambio pequeño, lo aplica.</li>
<li><strong>Se despierta solo</strong> cuando llega un evento (CI, review, conflicto) en lugar de que yo esté refrescando la pestaña.</li>
</ol>
<p>Lo radical no es que el modelo escriba mejor código. Es que <strong>el ciclo completo</strong> —editar, compilar, probar, integrar— ya no necesita mi máquina ni mi atención continua.</p>
<h2>Tareas que ya no hago a mano</h2>
<ul>
<li><strong>Builds rotos.</strong> Antes: leer 300 líneas de log, encontrar el import circular. Ahora: el agente reproduce el fallo, aísla la causa y propone el parche con la prueba de que pasa.</li>
<li><strong>Manejo de sesiones y entornos.</strong> Ya no mantengo cinco terminales, tres versiones de Node y un <code>.env</code> por proyecto en mi laptop. Cada tarea arranca en un entorno limpio y reproducible.</li>
<li><strong>Rondas de review mecánicas.</strong> Renombrar, extraer una función, agregar un test pedido: se resuelve en la misma conversación del PR.</li>
<li><strong>Scaffolding con convenciones.</strong> Crear un módulo nuevo con su página, router, servicio, schema Zod, i18n y estados de carga sigue un patrón; un agente con la skill correcta lo hace igual que yo, pero en minutos.</li>
</ul>
<h2>Lo que la nube no reemplaza</h2>
<p>La velocidad aumentó tanto que el cuello de botella se movió de lugar. Ahora lo escaso es:</p>
<ul>
<li><strong>El contrato.</strong> Si no defines reglas (capas, errores, autorización, nombres), el agente produce código plausible pero inconsistente. Por eso escribí <a href="/articles/como-construi-roger-arq">Roger-arq</a>, mi skill de arquitectura.</li>
<li><strong>La revisión con criterio.</strong> Un diff limpio puede esconder un IDOR o una transacción con I/O externo dentro. Revisar es el nuevo trabajo de senior.</li>
<li><strong>Los límites de ejecución.</strong> Hay comandos que un agente no debe correr nunca: migraciones, <code>db push</code>, scripts que escriben datos. Eso se declara explícitamente y se respeta.</li>
</ul>
<h2>Mi flujo real, de punta a punta</h2>
<pre class="language-text"><code class="language-text">Idea (desde el teléfono)
  → sesión de agente en la nube, rama dedicada
  → skills del proyecto cargadas (arquitectura, UI, 3D)
  → implementación + lint + typecheck
  → PR + suscripción a CI y reviews
  → fixes automáticos hasta verde
  → yo reviso el diff, pruebo el preview y hago merge
</code></pre>
<p>Lo que hago yo: la primera línea y las dos últimas. Todo lo demás es delegable <strong>si el repositorio está preparado</strong> para que un agente lo entienda.</p>
<h2>Cómo preparar tu repo para este flujo</h2>
<ol>
<li><strong>Un archivo de contexto en la raíz</strong> (<code>CLAUDE.md</code> / <code>AGENTS.md</code>): stack, comandos, convenciones y qué no se ejecuta.</li>
<li><strong>Checks rápidos y locales</strong>: lint, typecheck y tests unitarios que corran en segundos. El agente los usa como señal de verdad.</li>
<li><strong>Skills para lo que repites</strong>: si explicas lo mismo en tres proyectos, eso es una skill.</li>
<li><strong>CI determinista</strong>: un CI que falla aleatoriamente entrena a todos —humanos y agentes— a ignorarlo.</li>
<li><strong>Entornos sin secretos en el repo</strong>: variables en el entorno de ejecución, nunca en archivos versionados.</li>
</ol>
<h2>Cierre</h2>
<p>La pregunta ya no es si la IA programa bien. Es <strong>qué tan bien defines el sistema en el que programa</strong>. En 2026 el ingeniero que rinde más no es el que escribe más rápido, sino el que convierte su criterio en reglas que una máquina puede seguir y otro humano puede auditar.</p>
<p>Si quieres ver cómo aplico esto al 3D, lee <a href="/articles/webgpu-y-modelado-3d-en-la-web">WebGPU y modelado 3D en la web</a>.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What 2025 and 2026 revealed]]></title>
            <link>https://nathanlazo.website/articles/what-2025-and-2026-revealed</link>
            <guid>https://nathanlazo.website/articles/what-2025-and-2026-revealed</guid>
            <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A cross-cut through software, music, on-chain culture, and internet creativity—what stayed fragile, what matured, and what we stopped pretending about.]]></description>
            <content:encoded><![CDATA[<p>If you squint, the last two years look like a single argument repeated in different dialects: <strong>abundance without a compass is not progress</strong>. We got faster at making things—code, memes, markets—and slower at agreeing what “good” means. That tension showed up everywhere, from release notes to festival lineups to the tone of public timelines.</p>
<h2>Software: speed became normal, judgment did not</h2>
<p>Shipping stopped being the applause line. Teams discovered that <strong>velocity without narrative</strong> produces a museum of half-finished experiments. The interesting split was not “AI vs no AI” but <strong>orchestration vs improvisation</strong>: who owned the system when the machine proposed the patch, and who owned the outcome when the patch was wrong.</p>
<p>What 2025 and 2026 revealed is that tooling plateaus are short. The durable skill is still <strong>editing</strong>: choosing constraints, naming trade-offs, and keeping a product legible to the humans who maintain it.</p>
<h2>Music: taste under algorithmic weather</h2>
<p>Electronic music in this stretch did not lack content; it lacked <strong>shared time</strong>. Scenes still formed, but they formed in smaller rooms—literal and digital—where curation mattered more than raw reach. The platforms kept optimizing for engagement; the artists kept searching for <strong>long arcs</strong>: sets that breathe, albums that assume attention, communities that remember last month’s night, not only tonight’s drop.</p>
<p>The lesson rhymes with software: when generation is cheap, <strong>sequence and context</strong> become the art.</p>
<h2>Blockchain and internet culture: fewer costumes, harder questions</h2>
<p>On-chain culture shed some costumes and kept the uncomfortable questions: <strong>what is being trusted, by whom, and at what cost?</strong> Speculation still exists, but the conversation in 2026 is more willing to say “this is infrastructure for a narrow case” than “this changes everything.” That honesty is boring and useful.</p>
<p>Internet culture, meanwhile, kept oscillating between <strong>irony as armor</strong> and sincerity as risk. The through-line is authenticity fatigue: audiences can smell performance, and they punish inconsistency faster than they reward novelty.</p>
<h2>Creativity as a discipline of limits</h2>
<p>Across domains, the revelation was the same in different fonts: creativity is not infinite generation. It is <strong>decision density</strong>—what you refuse, what you repeat, what you protect. The tools widened the river; someone still has to build the banks.</p>
<h2>Closing</h2>
<p>2025 and 2026 did not hand us a single future. They handed us <strong>mirrors</strong>: faster pipelines, thinner attention, and a quieter respect for systems that survive their own hype. The work ahead is not only to make more—it is to make <strong>coherent</strong> things in a world that rewards volume. That is the harder craft, and the one that still belongs to people.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Digital identity, ownership, and trust]]></title>
            <link>https://nathanlazo.website/articles/digital-identity-ownership-and-trust</link>
            <guid>https://nathanlazo.website/articles/digital-identity-ownership-and-trust</guid>
            <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Credentials, authenticity, and who gets to vouch for you online—why ownership of identity is as much about policy and recovery as it is about cryptography.]]></description>
            <content:encoded><![CDATA[<p>We talk about digital identity as if it were a file you carry. In practice it is a <strong>network of attestations</strong>: who issued what, whether it expired, and whether the verifier believes the issuer. Ownership is not only “holding keys”; it is <strong>negotiating survivability</strong>—what happens when you lose a device, change jobs, or need to prove something without oversharing.</p>
<h2>Credentials are contracts, not stickers</h2>
<p>A credential is a small contract between issuer, holder, and verifier. The technology—JWTs, passkeys, W3C verifiable credentials, or domain-bound certificates—matters less than the <strong>semantics</strong>: what is being claimed, under what policy, and with what liability if it is wrong. Teams that ship identity well spend more time on revocation and display rules than on the ceremony of minting a token.</p>
<h2>Authenticity in an age of synthetic media</h2>
<p>Authenticity used to mean “this file has not been edited.” Now it means <strong>provenance</strong>: where something came from, when it was captured, and which tools touched it. That shift pushes trust outward—from pixels to <strong>pipelines</strong>. We verify not only the artifact but the chain of custody: cameras, editors, and distribution platforms that each leave a trace someone can challenge.</p>
<p>The uncomfortable part is that authenticity is always partial. Perfect provenance is rare; <strong>useful</strong> provenance is selective, privacy-preserving, and honest about gaps.</p>
<h2>Digital trust is social infrastructure</h2>
<p>Trust is not a boolean. It is <strong>graded, contextual, and repairable</strong>. Recovery flows, dispute resolution, and rate limits on verification are as central as cryptography. When identity systems ignore the social layer, they produce technically correct outcomes that feel hostile to humans—locked accounts, brittle migrations, and “support” that cannot reason about edge cases.</p>
<h2>Closing</h2>
<p>Ownership of identity in 2026 is less about owning a username and more about <strong>owning your relationship to verification</strong>: who can speak for you, how you can rotate that authority, and what you can prove without becoming transparent. The hard problems are not only mathematical—they are <strong>policy, UX, and institutional memory</strong> dressed as login screens.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Construir productos en la era de la aceleración por IA]]></title>
            <link>https://nathanlazo.website/articles/building-products-in-the-ai-acceleration-era</link>
            <guid>https://nathanlazo.website/articles/building-products-in-the-ai-acceleration-era</guid>
            <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cuando código, diseño y contenido se mueven al mismo ritmo, el cuello de botella deja de ser la herramienta y pasa a ser el criterio y la coherencia del producto.]]></description>
            <content:encoded><![CDATA[<p>Hay una sensación extraña al construir productos cuando <strong>tres frentes aceleran a la vez</strong>: puedes bosquejar interfaces, redactar copy y generar prototipos de backend en la misma mañana. La euforia dura poco; enseguida aparece la pregunta incómoda: si todo es más rápido, <strong>¿qué es lo que todavía debe ser difícil?</strong></p>
<h2>Velocidad sincronizada y el riesgo del “todo encaja”</h2>
<p>Cuando diseño, ingeniería y marketing comparten herramientas de borrador rápido, el producto puede <strong>parecer</strong> cerrado antes de estarlo. Las pantallas se alinean visualmente, el texto suena convincente y el demo engaña incluso al equipo. El problema no es la velocidad sino la <strong>ilusión de integración</strong>: tres capas que coinciden en la superficie pero no en supuestos, métricas ni límites.</p>
<p>El antídoto más barato sigue siendo aburrido: <strong>definiciones compartidas</strong> de usuario, de éxito y de “no haremos esto en v1”. Sin eso, la IA solo acelera la dispersión.</p>
<h2>Criterio como recurso escaso</h2>
<p>Si las herramientas barren la fricción mecánica, lo que queda en escasez es <strong>criterio</strong>: qué problema merece existir, qué trade-off es aceptable, qué experiencia no negociamos por un lanzamiento apurado. Los equipos que han confundido velocidad con claridad han terminado lanzando más cosas y recordando menos por qué las lanzaron.</p>
<p>En la práctica, criterio se entrena con <strong>revisiones honestas</strong>: demos que muestran límites, no solo happy path; decisiones documentadas en una frase; métricas que contradicen narrativas bonitas.</p>
<h2>Coherencia entre código, diseño y narrativa</h2>
<p>Un producto creíble necesita que las tres capas <strong>cuenten la misma historia</strong>. Cuando cada disciplina itera en silos acelerados por IA, aparecen micro-incongruencias: el flujo promete simplicidad pero el código expone diez casos borde; el diseño asume datos que el backend no garantiza; el mensaje de marketing describe un superpoder que el producto solo insinúa.</p>
<p>La solución no es frenar a nadie, es <strong>sincronizar puntos de control</strong>: un mismo documento vivo de alcance, pruebas que atraviesan capas, y responsables claros cuando el texto y la implementación divergen.</p>
<h2>De la aceleración a la mantenibilidad</h2>
<p>Construir rápido sin dejar huellas es construir <strong>deuda con estética</strong>. Los equipos maduros invierten parte del tiempo ganado en <strong>higiene</strong>: nombres consistentes, pruebas que importan, logs que explican decisiones automáticas. La IA puede ayudar a redactar y refactorizar, pero alguien tiene que decidir qué merece sobrevivir al próximo sprint.</p>
<h2>Cierre</h2>
<p>La aceleración por IA no elimina el trabajo duro del producto; lo <strong>reubica</strong> en decisiones de foco, coherencia y confianza. La ventaja competitiva deja de ser “lo hicimos antes” y pasa a ser <strong>lo hicimos entendible, defendible y sostenible</strong> cuando el ritmo externo sigue subiendo.</p>
<hr/>
<h3>Autor</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The new role of technical founders]]></title>
            <link>https://nathanlazo.website/articles/the-new-role-of-technical-founders</link>
            <guid>https://nathanlazo.website/articles/the-new-role-of-technical-founders</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In AI-heavy startups, the founder who codes is less often the person who types the fastest—and more often the one who curates systems, sets decision boundaries, and keeps strategy legible.]]></description>
            <content:encoded><![CDATA[<p>When every function in the company can borrow speed from models and agents, the technical founder stops being defined by <strong>throughput</strong> and starts being defined by <strong>architecture of judgment</strong>. The uncomfortable truth is that “we ship faster” is no longer a differentiator if everyone ships faster; what remains scarce is <strong>coherence under acceleration</strong>.</p>
<h2>Strategy as curation, not heroics</h2>
<p>Early-stage technical leadership used to look like long nights and personal mastery of the stack. In 2026 it often looks like <strong>choosing what not to automate yet</strong>, which abstractions survive contact with customers, and which experiments get a budget of trust. Strategy becomes curation: picking the few bets that deserve deep context, instrumentation, and human review—while letting the rest stay deliberately shallow until the signal is real.</p>
<p>Founders who confuse curation with hesitation lose to founders who <strong>sequence</strong>—they know which layer of the product must be boring and reliable before the flashy layer earns the right to exist.</p>
<h2>Systems thinking beats tool fluency</h2>
<p>Tool fluency is table stakes. What compounds is <strong>systems thinking</strong>: how data flows between humans and machines, where failure modes cluster, and what “done” means when part of the pipeline is non-deterministic. Technical founders are increasingly judged on whether they can draw those boundaries clearly enough that a growing team does not need to re-derive them every sprint.</p>
<p>That means explicit interfaces between “human decides” and “machine proposes,” shared definitions of quality, and observability that answers <strong>why</strong> something happened—not only that it happened.</p>
<h2>Decision-making when the default is “ask the model”</h2>
<p>AI-heavy startups inherit a subtle risk: <strong>decision drift</strong>. When the path of least resistance is to generate another option, teams can churn through plausible answers without ever converging on a committed one. The founder’s job is to install decision hygiene: short written rationales, time-boxed exploration, and kill criteria that survive enthusiasm.</p>
<p>The best technical founders I have watched in this cycle are neither skeptics nor cheerleaders—they are <strong>editors</strong>. They know when speed is cheap and when it is expensive, and they protect the expensive moments.</p>
<h2>Closing</h2>
<p>The new role is not less technical; it is <strong>more architectural</strong>. Founders still need taste and craft, but the leverage moves upstream—to the systems that decide what is allowed, what is measured, and what stays human. In a world of abundant generation, <strong>the founder who curates well builds something that still makes sense a year later</strong>.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Música electrónica en 2026: comunidad, espectáculo y presencia digital]]></title>
            <link>https://nathanlazo.website/articles/electronic-music-in-2026</link>
            <guid>https://nathanlazo.website/articles/electronic-music-in-2026</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Reflexión sobre cómo la escena electrónica equilibra pertenencia en vivo, economía del creador y el ritmo del contenido corto sin perder identidad.]]></description>
            <content:encoded><![CDATA[<p>En 2026, hablar de “música electrónica” ya no es solo hablar de géneros o BPM. Es hablar de <strong>cómo se sostiene una comunidad</strong> cuando el escenario principal es a la vez físico y una sucesión de clips de quince segundos. La tensión no es nueva, pero la velocidad sí: el mismo fin de semana puede definir una tendencia, agotarla y dejar un residuo de ironía en los comentarios.</p>
<h2>Comunidad después del algoritmo</h2>
<p>La escena siempre fue tribal en el buen sentido: códigos, referencias, lugares. Hoy esas tribus se <strong>fragmentan en feeds</strong> que no comparten calendario ni contexto. Eso no borra la pertenencia, la <strong>redistribuye</strong>: parte ocurre en la fila, parte en el chat del after, parte en un directo que nadie archivó. Quien produce o cura tiene que asumir que la “comunidad” es un mosaico, no un solo grupo de WhatsApp.</p>
<p>Lo interesante es que, cuando algo funciona, suele ser porque alguien <strong>ancló un gesto repetible</strong>: un sonido, un visual, una frase que la gente puede llevarse sin explicación. No es manipulación barata; es diseño cultural mínimo viable.</p>
<h2>Espectáculo como contrato emocional</h2>
<p>El espectáculo grande no compite solo con otro festival; compite con <strong>la expectativa acumulada en pantalla</strong>. Si el público ya vio mil transiciones imposibles en TikTok, el escenario tiene que ofrecer otra clase de imposible: presencia, volumen físico, sincronía con extraños. La producción luminosa y el vídeo en vivo no son “decoración”; son la forma en que el evento <strong>cumple o rompe</strong> la promesa que se hizo online.</p>
<p>Reflexionar en frío: el riesgo del hiper-espectáculo es homogeneizar la emoción. Cuando todo brilla igual de fuerte, el recuerdo se vuelve genérico. Las noches que quedan suelen ser las que mezclaron <strong>imperfección legible</strong> con un pico bien colocado.</p>
<h2>Economía del creador y presión de formato</h2>
<p>La economía del creador alimentó a una generación de DJs y productores que también son <strong>editores, guionistas y community managers</strong>. Eso abrió ingresos y visibilidad, pero también introdujo una métrica paralela: no solo “¿funciona en la pista?” sino “¿funciona en el primer segundo?”. No todo lo bueno para el clip es bueno para el club, y viceversa.</p>
<p>En 2026, quien sobrevive con criterio suele <strong>separar canales</strong>: el short-form como puerta, el largo formato (sets, álbumes, newsletters) como profundidad. No es snobismo; es conservar <strong>autoría</strong> cuando la plataforma premia la variación constante.</p>
<h2>Presencia digital como extensión, no sustituto</h2>
<p>Tener presencia digital ya no es opcional, pero tampoco es reemplazar el contacto real. Es <strong>traducir</strong> lo que haces a idiomas que la gente ya habla: memes, loops, anuncios honestos. La paradoja es que la sobreexposición puede erosionar el misterio que antes vendía entradas. Por eso algunos proyectos recuperan <strong>silencios estratégicos</strong> o límites claros en qué se documenta y qué queda solo para quien estuvo ahí.</p>
<h2>Cierre</h2>
<p>La música electrónica en 2026 sigue siendo, en el fondo, un acuerdo colectivo: <strong>vibrar al mismo tiempo</strong>. Las herramientas cambian; el problema que permanece es cómo hacer que la gente siga sintiendo que pertenece a algo que vale la pena cuidar, tanto en la cabina como en el feed.</p>
<hr/>
<h3>Autor</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Por qué la tokenización sigue importando]]></title>
            <link>https://nathanlazo.website/articles/why-tokenization-still-matters</link>
            <guid>https://nathanlazo.website/articles/why-tokenization-still-matters</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Más allá del espectáculo de los mercados: cómo la tokenización modela acceso, incentivos y reglas operativas en sistemas que necesitan límites explícitos.]]></description>
            <content:encoded><![CDATA[<p>La palabra “token” quedó manchada por excesos, pero el <strong>patrón</strong> sigue siendo una herramienta de diseño: representar derechos, cupos o permisos de forma programable. En 2026, lo interesante no es repetir el discurso de “todo será un token”; es preguntar <strong>qué problema de coordinación</strong> se resuelve cuando las reglas pueden ejecutarse sin renegociar cada paso a mano.</p>
<h2>Tokenización para sistemas reales, no para teatro</h2>
<p>En sistemas reales, tokenizar es <strong>formalizar límites</strong>: quién puede entrar, cuántas veces, durante cuánto tiempo, y con qué obligaciones. Eso aparece en acceso a APIs, licencias de software, derechos de contenido y mercados secundarios regulados. La utilidad no está en el token como objeto mágico sino en que <strong>las reglas viajan con el permiso</strong> y pueden auditarse.</p>
<p>Los equipos que fracasan suelen confundir el mapa con el territorio: emiten un token y olvidan gobernanza, cumplimiento y soporte humano cuando algo sale mal.</p>
<h2>Acceso fino sin burocracia infinita</h2>
<p>La tokenización brilla cuando el acceso debe ser <strong>granular y revocable</strong>. Un pase de un solo uso, un rol temporal, un cupo que se transfiere con condiciones: esos patrones existían antes, pero costaban integraciones frágiles. Un diseño maduro combina tokens con <strong>políticas claras</strong>—límites de tasa, caducidad, y caminos de recuperación que no dependen de un héroe en un chat de soporte.</p>
<h2>Incentivos que alinean comportamiento</h2>
<p>Los incentivos mal diseñados convierten cualquier sistema en un juego perverso. La tokenización no arregla ética; solo <strong>hace explícitos</strong> los pagos, las recompensas y las penalizaciones. Cuando esos incentivos son legibles, es más fácil detectar externalidades: qué comportamiento se subsidia sin querer y quién paga el costo oculto.</p>
<h2>Diseño operativo: lo aburrido salva lo visible</h2>
<p>Lo que sostiene la tokenización útil no es el whitepaper sino la <strong>operación</strong>: monitoreo, incident response, actualización de políticas y comunicación con usuarios. Si el sistema no puede explicar en una frase qué representa un token, probablemente no debería existir todavía.</p>
<h2>Cierre</h2>
<p>La tokenización sigue importando porque <strong>algunos problemas son problemas de límites</strong>. Donde el acceso, la propiedad fraccionada o los incentivos necesitan reglas compartidas y verificables, el patrón vuelve a aparecer—con menos ruido y más ingeniería. El reto no es convencer a nadie de creer; es <strong>construir algo que funcione cuando el mercado no aplaude</strong>.</p>
<hr/>
<h3>Autor</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Frontend development after AI-native workflows]]></title>
            <link>https://nathanlazo.website/articles/frontend-development-after-ai-native-workflows</link>
            <guid>https://nathanlazo.website/articles/frontend-development-after-ai-native-workflows</guid>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[As implementation speeds up, frontend work recenters on interaction quality, systems thinking, and the craft that survives the first automated draft.]]></description>
            <content:encoded><![CDATA[<p>Frontend used to be sold, unfairly, as “the implementation layer.” In AI-native workflows, implementation is often the <strong>first thing to get automated</strong>. That does not erase frontend—it reframes it. The job stops being primarily “how fast can I type this component?” and becomes <strong>“what should this interaction feel like when the stakes are real?”</strong></p>
<h2>Roles: from pixel-pusher to interaction owner</h2>
<p>When boilerplate, layout drafts, and test scaffolds arrive in seconds, the differentiator is not raw output volume. It is <strong>taste under constraint</strong>: latency budgets, accessibility, motion that communicates state instead of decorating it, and error paths that respect the user’s time.</p>
<p>Teams still need people who can read the DOM like a score, but the title matters less than the responsibility: <strong>owning the quality bar</strong> for what ships in the browser, regardless of who—or what—wrote the first pass.</p>
<h2>Interaction quality as a moving target</h2>
<p>“Looks fine in Chrome on my machine” was never enough; now it is dangerously easy to generate <strong>plausible-looking UI</strong> that fails basic interaction hygiene. Focus order drifts, live regions are missing, loading states lie, and optimistic UI overshoots trust.</p>
<p>The craft shifts toward <strong>verification habits</strong>: keyboard runs, screen readers on a schedule, performance profiles on representative hardware. AI can suggest fixes, but someone must decide which failures are unacceptable before release—not after a viral complaint.</p>
<h2>Prototyping speed without prototype thinking</h2>
<p>Rapid prototyping is a gift when it tightens feedback loops. It is a trap when every experiment looks <strong>merge-ready</strong>. The discipline that separates exploration from production is unchanged: boundaries on scope, explicit assumptions, and a willingness to throw away the pretty draft that solved the wrong problem.</p>
<p>Useful pattern: treat AI-generated UI as <strong>disposable clay</strong>—shape fast, learn, then rebuild the slice you keep with clearer state modeling and tests that encode intent.</p>
<h2>Beyond implementation-only thinking</h2>
<p>Frontend engineers who thrived on speed alone may feel displaced. Those who think in <strong>systems</strong>—routing, caching, design tokens, data fetching contracts, edge behavior—gain leverage. The implementation is still there; it is just no longer the full story.</p>
<p>The mental model looks more like <strong>orchestration</strong>: coordinating design systems, API shapes, analytics hooks, and runtime constraints so the surface stays coherent when backends and copy change underneath.</p>
<h2>Closing</h2>
<p>AI-native workflows do not retire frontend; they <strong>raise the floor</strong> on how fast mediocre UI can be produced. The ceiling still belongs to people who care how software feels when it fails, when it waits, and when it wins. That is not nostalgia for hand-coded divs—it is recognition that <strong>speed without judgment</strong> is just faster noise.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why agents changed software in 2025]]></title>
            <link>https://nathanlazo.website/articles/why-agents-changed-software-in-2025</link>
            <guid>https://nathanlazo.website/articles/why-agents-changed-software-in-2025</guid>
            <pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Agents pushed the industry past one-off prompts toward orchestration, shared context, and thinking in systems—what that means for how we design and ship.]]></description>
            <content:encoded><![CDATA[<p>By late 2025, “agent” had stopped sounding like a sci-fi trailer and started sounding like <strong>plumbing</strong>: something you diagram, secure, and observe. The shift was not that language models became omniscient; it was that product teams finally had to answer a harder question—<strong>what is allowed to act on our behalf, with what context, and under what guardrails?</strong></p>
<h2>From prompts to orchestration</h2>
<p>A prompt is a moment. An agent is a <strong>policy wrapped in a loop</strong>: perceive, plan, act, verify (or fail loudly). Once software stopped being “call the model once and hope,” orchestration became the real design surface—queues, retries, tool permissions, human checkpoints.</p>
<p>That change rewards people who think like <strong>systems designers</strong>, not like clever typists. You sketch boundaries before you sketch UX copy: which tools exist, what credentials they carry, how state is shared across steps, and where the human must remain in the loop.</p>
<h2>Context as a first-class budget</h2>
<p>Agents exposed how expensive context really is—not only in tokens, but in <strong>trust</strong>. Feeding an agent everything is tempting and dangerous. The mature pattern looks more like curation: structured memory, retrieval with provenance, explicit “working set” files, and audit trails for decisions that touched production.</p>
<p>Developers who grew up optimizing CPU and memory now optimize <strong>attention surfaces</strong>: what the agent is allowed to see, when it refreshes, and how conflicts resolve when two sub-agents disagree.</p>
<h2>Security and blame lines</h2>
<p>When an agent can open tickets, edit code, or query internal APIs, security stops being “lock the repo” and becomes <strong>capability graphs</strong>. Who granted which scope? Can it be narrowed? What happens when a third-party tool misbehaves?</p>
<p>Late 2025’s lesson was blunt: the attack surface scales with <strong>autonomy</strong>. Teams that shipped agents without crisp blame lines learned quickly that “the model did it” is not an incident narrative anyone wants to read twice.</p>
<h2>Thinking in systems, not isolated tricks</h2>
<p>The cultural shift is easy to understate. Engineers began reasoning in <strong>graphs</strong>—dependencies between services, humans, and automated actors—rather than in linear scripts. Design reviews started asking: what is the failure mode if step three hallucinates a parameter? What is the rollback if the agent merges the wrong branch?</p>
<p>That mindset spills into non-agent code too. Once you habitually ask “who observes this?” and “what verifies it?”, you write <strong>smaller, inspectable units</strong> even when no LLM is involved.</p>
<h2>Outlook</h2>
<p>Agents did not replace developers in 2025. They <strong>re-centered</strong> the job on judgment: where to automate, what to verify, and how to keep software legible when more of the pipeline moves at machine speed. The winners were not the teams with the flashiest demos but the ones who treated agents as <strong>components</strong>—versioned, testable, and owned.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[El DJ moderno en la era de la IA]]></title>
            <link>https://nathanlazo.website/articles/the-modern-dj-in-the-age-of-ai</link>
            <guid>https://nathanlazo.website/articles/the-modern-dj-in-the-age-of-ai</guid>
            <pubDate>Sat, 08 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Edits, presión por contenido y herramientas con IA: qué cambia en el oficio del DJ y qué sigue siendo difícil de automatizar.]]></description>
            <content:encoded><![CDATA[<p>La figura del DJ ya llevaba décadas mutando: del selector al productor, del productor al creador de marca. La ola actual —<strong>herramientas de IA</strong>, plantillas instantáneas y una economía de atención hambrienta de clips —empuja otra vez la pregunta: ¿en qué consiste hoy el <strong>oficio</strong>?</p>
<h2>Edits, referencia y velocidad</h2>
<p>Hacer un edit viral o un mashup limpio dejó de ser, para muchos, un proyecto de fin de semana en solitario. Hay <strong>presión por cadencia</strong>: si no publicas, el algoritmo asume que no existes. Las IA y los DAW asistidos acortan el camino entre idea y archivo exportable. Eso democratiza la producción y, al mismo tiempo, <strong>sube el piso técnico</strong> mínimo que la audiencia asume como normal.</p>
<p>El riesgo no es solo “suena parecido”. Es que la <strong>referencia</strong> se vuelva circular: modelos entrenados con lo mismo que ya escuchas, optimizados para lo que ya funciona en redes. El DJ que quiere sonar distinto tiene que empujar contra esa inercia con criterio, no solo con más plugins.</p>
<h2>Herramientas que cambian el flujo, no la noche</h2>
<p>En cabina, la IA raramente reemplaza el gesto completo. Lo que cambia es el <strong>entorno previo</strong>: búsqueda de pistas, etiquetado, limpieza de stems, ideas de transición, versiones para practicar. Es trabajo invisible que antes consumía horas. Quien lo automatiza bien gana tiempo para <strong>escuchar</strong> y para ensayar decisiones bajo presión.</p>
<p>Lo que las herramientas no resuelven es el <strong>momento</strong>: leer una sala, ceder cuando la pista “correcta” mata el piso, o insistir cuando la teoría dice que no y el cuerpo de la gente dice que sí. Eso sigue siendo improvisación social.</p>
<h2>Identidad performática</h2>
<p>Ser DJ hoy incluye ser <strong>personaje público</strong>: historias, estética, coherencia entre lo que prometes online y lo que entregas en vivo. La IA puede ayudar a generar contenido, pero la <strong>confianza</strong> se gana cuando el set demuestra que entiendes contexto, historia y riesgo. La audiencia perdona un error humano antes que una noche que suena a playlist generada sin alma.</p>
<h2>Qué sigue teniendo valor</h2>
<p>Tres cosas, al menos, siguen siendo escasas:</p>
<ol>
<li><strong>Curaduría con criterio</strong> —no acumular, sino construir un arco que tenga intención.</li>
<li><strong>Presencia en tiempo real</strong> —reaccionar al espacio, no solo al plan del USB.</li>
<li><strong>Voz propia</strong> —una combinación de gustos, referencias y límites que no es copiable con un solo prompt.</li>
</ol>
<p>La IA no elimina al DJ; <strong>reordena</strong> qué trabajo es commodity y qué trabajo sigue siendo arte y oficio. El margen profesional se mueve hacia quien puede <strong>decidir</strong> mejor, no hacia quien solo produce más rápido.</p>
<hr/>
<h3>Autor</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Blockchain después del hype: dónde quedó lo útil]]></title>
            <link>https://nathanlazo.website/articles/blockchain-after-the-hype</link>
            <guid>https://nathanlazo.website/articles/blockchain-after-the-hype</guid>
            <pubDate>Wed, 08 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Más allá del ruido de los ciclos, la cadena de bloques sigue apareciendo donde la infraestructura de confianza y la auditoría valen más que el eslogan.]]></description>
            <content:encoded><![CDATA[<p>Cuando el mercado se enfrió, muchos actores empaquetaron la “revolución” y salieron del escenario. Eso fue saludable: <strong>separó el teatro del trabajo</strong>. En 2025, lo que quedó no fue un mantra universal sino un conjunto de problemas donde la cadena sigue siendo una respuesta incómoda pero honesta.</p>
<h2>Utilidad real: acuerdos que necesitan huella</h2>
<p>La utilidad persistente no es “hacer todo descentralizado”; es <strong>registrar hechos compartidos</strong> entre partes que no se confían por completo pero necesitan coordinarse: origen de activos, condiciones de liquidación, derechos reproducibles en software. Donde un PDF firmado ya no alcanza y un solo administrador genera fricción política, la infraestructura distribuida vuelve a entrar en la conversación—no como moda, sino como <strong>costo asumido a cambio de auditabilidad</strong>.</p>
<h2>Infraestructura silenciosa</h2>
<p>Lo más aburrido suele ser lo que sobrevive. Las integraciones B2B, los estándares de identidad y las capas de cumplimiento no generan titulares, pero <strong>sostienen mercados</strong>. Ahí el blockchain dejó de ser un personaje principal y pasó a ser cableado: APIs, oráculos, puentes con límites claros, y equipos que piensan en operación antes que en narrativa.</p>
<p>El hype prometía democratizar todo; la práctica madura <strong>delimita</strong> dónde la descentralización reduce riesgo sistémico y dónde solo añade latencia.</p>
<h2>Confianza como diseño, no como eslogan</h2>
<p>La confianza no nace de “estar en cadena”; nace de <strong>gobernanza</strong>, de claves bien custodiadas, de modelos de recuperación realistas y de transparencia sobre supuestos. Los proyectos que sobrevivieron el choque aprendieron a hablar menos de “inmutabilidad mágica” y más de <strong>límites explícitos</strong>: qué puede fallar, quién puede pausar qué, y cómo se audita un cambio.</p>
<h2>Cierre</h2>
<p>Blockchain después del hype no desapareció: se <strong>encogió al tamaño de sus mejores problemas</strong>. Donde la infraestructura de confianza vale el precio, sigue ahí. Donde solo había especulación con adjetivos, el vacío se notó de inmediato—y eso también cuenta como claridad.</p>
<hr/>
<h3>Autor</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lost Lands and the strength of bass culture]]></title>
            <link>https://nathanlazo.website/articles/lost-lands-and-the-strength-of-bass-culture</link>
            <guid>https://nathanlazo.website/articles/lost-lands-and-the-strength-of-bass-culture</guid>
            <pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[How a bass-heavy festival became a cultural symbol: niche identity, community resilience, and what growth means for a scene built on depth.]]></description>
            <content:encoded><![CDATA[<p>Some festivals grow by widening the tent until the tent is the brand. <strong>Lost Lands</strong> grew, in part, by doing the opposite for years: doubling down on <strong>bass music</strong>, prehistoric theming, and a crowd that treats low-end pressure as a feature, not a bug. That specificity is worth examining—not as hype, but as a case study in <strong>niche identity</strong> that still scales.</p>
<h2>Bass as culture, not just an EQ curve</h2>
<p>“Bass culture” is more than subwoofers. It is a set of <strong>listening habits</strong>, social signals, and shared references: the appreciation for sound system culture, the patience for long blends, the humor and memes that orbit certain artists and labels. A festival that centers that frequency range is aligning with a <strong>community grammar</strong> that mainstream pop EDM often smooths away. The result is cohesion: people know why they are there.</p>
<h2>Resilience through shared stakes</h2>
<p>Niche scenes survive touring economics, algorithm shifts, and platform churn because participants treat the scene as <strong>partially theirs</strong>. Grassroots labels, regional crews, and online archives create redundancy: if one node fails, others carry the memory. Large branded events plug into that resilience when they <strong>respect</strong> the sound’s history rather than treating it as a costume. The tension appears when scale demands accessibility that the core audience experiences as dilution.</p>
<h2>Growth as symbol</h2>
<p>When a specialized gathering expands, every choice is read symbolically. More stages can mean <strong>more room for sub-styles</strong>; it can also mean genre sprawl that tests the original promise. Lost Lands sits in that conversation as both a <strong>destination</strong> for bass heads and a <strong>beacon</strong> visible from outside the niche—proof that “heavy” electronic music can fill fields and headlines. Growth, here, is not only commercial; it is <strong>cultural visibility</strong> for a corner of dance music that rarely gets the default mainstream narrative.</p>
<h2>What the symbol costs</h2>
<p>No scene scales without tradeoffs: ticket prices, travel, environmental footprint, and the inevitable gap between <strong>OG memory</strong> and <strong>new arrival</strong> enthusiasm. The strength of bass culture has been its ability to argue for <strong>depth over polish</strong>. Festivals that inherit that argument inherit its scrutiny too.</p>
<p>Lost Lands works as a mirror: it shows how a <strong>tight aesthetic and sonic focus</strong> can become a rallying point—and how easily rallying points become brands. The interesting question is whether the brand can keep feeding the culture that named it.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI-assisted coding after the hype]]></title>
            <link>https://nathanlazo.website/articles/ai-assisted-coding-after-the-hype</link>
            <guid>https://nathanlazo.website/articles/ai-assisted-coding-after-the-hype</guid>
            <pubDate>Fri, 12 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[From novelty to habit: why disciplined review, small scopes, and honest boundaries matter more than whichever model launched last week.]]></description>
            <content:encoded><![CDATA[<p>The first wave of AI coding assistants felt like a superpower demo: instant boilerplate, plausible explanations, the occasional confident lie. A year or two later, the interesting question is not whether the tools work—it is <strong>how teams normalize them without normalizing sloppiness</strong>.</p>
<h2>When the novelty wears off</h2>
<p>Early usage often looks like improvisation: big prompts, vague goals, paste-and-pray. That can still unblock a solo developer on a Sunday. It scales poorly. Once AI assistance becomes daily infrastructure, the bottleneck moves from “can it generate code?” to <strong>“can we trust the diff?”</strong> and “who owns the architecture when everyone is pair-programming with the same generic partner?”</p>
<p>The shift is psychological as much as technical. You stop asking for magic and start asking for <strong>bounded tasks</strong>: a function, a test case, a refactor with explicit invariants.</p>
<h2>Workflow discipline beats model hype</h2>
<p>Models will keep improving. Your process should not depend on treating each release like a religious holiday. Practical discipline looks boring on paper:</p>
<ul>
<li><strong>Scope the ask</strong> so the model cannot hide ambiguity in a fifty-line patch.</li>
<li><strong>Keep context local</strong>: point it at the files and conventions that actually govern the change.</li>
<li><strong>Treat output as a proposal</strong>, not a merge-ready artifact—especially for security, data handling, and anything that touches money or identity.</li>
</ul>
<p>None of that requires heroics. It requires treating AI like a fast intern with infinite stamina and <strong>finite accountability</strong>.</p>
<h2>Review quality is the real product</h2>
<p>If your team’s review culture was already shallow—rubber-stamp approvals, “LGTM” without reading—AI will pour gasoline on it. Generated code can look polished while violating invariants only your senior engineers remember.</p>
<p>Strong review is not gatekeeping; it is <strong>compression of organizational memory</strong> into a few sharp questions: What breaks if this input is hostile? What happens on partial failure? Does this match how we name things, log things, and test things?</p>
<p>The teams that benefit most from AI coding are often the ones that were already serious about review. The tool amplifies throughput; <strong>culture decides whether that throughput is progress or debt</strong>.</p>
<h2>Practical usage that survives contact with reality</h2>
<p>What tends to work in production settings:</p>
<ul>
<li><strong>Spikes and throwaways</strong>: explore with AI, then rewrite the slice you keep so it matches house style.</li>
<li><strong>Tests as contracts</strong>: let the model draft tests, but treat failing tests as non-negotiable signals, not annoyances to “fix” by weakening assertions.</li>
<li><strong>Documentation that earns its keep</strong>: use assistants to draft, but have a human verify procedures against the actual repo state.</li>
</ul>
<p>What tends to fail: asking for “the whole feature” and merging because it compiles.</p>
<h2>Closing thought</h2>
<p>AI-assisted coding is settling into the same category as search, formatters, and linters—<strong>infrastructure you forget until it misbehaves</strong>. The competitive edge is not who toggles autocomplete fastest; it is who can integrate assistance into a workflow that still produces software people can maintain when the hype graph flattens.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The evolution of artificial intelligence]]></title>
            <link>https://nathanlazo.website/articles/ai-agents-and-mcp</link>
            <guid>https://nathanlazo.website/articles/ai-agents-and-mcp</guid>
            <pubDate>Wed, 07 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A journey from the ChatGPT boom to Model Context Protocols, exploring the revolution in language models and content creation tools.]]></description>
            <content:encoded><![CDATA[<h2>The evolution of LLM models: from ChatGPT to the multi-agent era</h2>
<p>In November 2022, OpenAI launched GPT-3. It was a revolution. LLM (Large Language Models) offered a conversational interface that anyone could use. However, their true evolution began with GPT-4 in 2023, which introduced deeper language understanding, greater reasoning capacity, and multimodality (text and image).</p>
<p>By 2024 and 2025, models were not only more intelligent but also more integrable. Now they can be customized through tools like OpenAI Assistants or programmatic functions. Additionally, multi-agent environments have emerged where several models collaborate to solve complex problems, such as agents that analyze data, generate reports, and execute actions together.</p>
<img alt="Abstract illustration of the evolution of language models from GPT-3.5 to multi-agent systems in 2025" loading="lazy" width="2912" height="1632" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ffuturistic_ai.46267289.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ffuturistic_ai.46267289.png&amp;w=3840&amp;q=75"/>
<hr/>
<h2>Content creation tools: the creator&#x27;s new studio</h2>
<p>Before, making a reel, an article, or a design required mastering multiple platforms. Today, AI-powered tools allow generating videos with text, synthesizing voices, writing scripts, and even editing images in seconds.</p>
<p>In my work, we have integrated these tools into projects for multimedia content, generating ideas, or even generating audio through AI. From Cursor, v0, and Midjourney to AI-powered automations, the creative flow has become continuous, iterative, and more accessible.</p>
<img alt="Conceptual image of a creative AI workspace: screens with text, video, voice, and code generated by artificial intelligence" loading="lazy" width="2912" height="1632" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcopilot_ai.826a202c.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcopilot_ai.826a202c.png&amp;w=3840&amp;q=75"/>
<hr/>
<h2>Introduction to Model Context Protocols (MCPs)</h2>
<p>One of the most promising advances of the present is the development of MCPs (Model Context Protocols), a standardization proposal to allow multiple language models (LLMs) to share context, collaborate, and execute tasks securely and interoperably.</p>
<p>Imagine an ecosystem where you can connect a model specialized in law, another in financial analysis, and another in creativity, all working under a common protocol. That&#x27;s what MCPs propose. Beyond the typical &quot;prompt,&quot; identities, roles, objectives, and resources are now defined in multi-agent environments. This is the gateway to a new way of building software: not just interfaces, but <strong>digital societies of intelligent agents</strong>.</p>
<img alt="Conceptual diagram of an MCP environment with multiple agents collaborating under a common protocol" loading="lazy" width="2912" height="1632" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fagents.6de9daff.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fagents.6de9daff.png&amp;w=3840&amp;q=75"/>
<p>For more details, you can explore the <a href="https://modelcontextprotocol.io/introduction">official introduction to MCPs</a>.</p>
<hr/>
<h2>Conclusion: designing with intelligence</h2>
<p>Artificial intelligence has ceased to be an auxiliary tool to become an essential layer of digital design. As a developer and CTO of The Noro, my focus has shifted from simply building interfaces to <strong>orchestrating flows of intelligence between humans and machines</strong>.</p>
<p>From 2022 to 2025, we have seen unprecedented acceleration: more intelligent LLMs, more powerful creation tools, and now, protocols that enable collaboration between intelligences. In the coming years, the challenge will not just be using AI, but <strong>designing experiences where intelligence is distributed ethically, creatively, and with purpose.</strong></p>
<img alt="Conceptual image of a future where interaction takes place in a digital environment" loading="lazy" width="2912" height="1632" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fai_interfaces.3f774530.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fai_interfaces.3f774530.png&amp;w=3840&amp;q=75"/>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tomorrowland and the future of festival storytelling]]></title>
            <link>https://nathanlazo.website/articles/tomorrowland-and-the-future-of-festival-storytelling</link>
            <guid>https://nathanlazo.website/articles/tomorrowland-and-the-future-of-festival-storytelling</guid>
            <pubDate>Sat, 22 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Worldbuilding, stage design, and fantasy narratives as product design: how a festival sells a coherent universe, not just a lineup.]]></description>
            <content:encoded><![CDATA[<p><strong>Tomorrowland</strong> is often discussed as a production benchmark. Less often, it is framed as what it actually is at scale: a <strong>story-first product</strong> where stages, naming, lore, and seasonal campaigns behave like chapters in a serial fiction. The lineup matters, but the <strong>through-line</strong> is the fantasy Belgium becomes for a weekend—and for everyone watching online.</p>
<h2>Worldbuilding as infrastructure</h2>
<p>A festival that invests in recurring motifs (characters, “realms,” mythic language) is not merely decorating tents. It is building <strong>narrative infrastructure</strong>: assets that can travel across years, trailers, collaborations, and merchandise. That continuity turns each edition into a sequel rather than a reset. From a design perspective, the question is not “how big can the stage be?” but <strong>what world does this stage imply</strong>, and can the audience enter it without a manual.</p>
<h2>Stage design as plot device</h2>
<p>Main stages at this level function like <strong>set pieces in a film</strong>. Lighting, pyro, LED architecture, and pacing are not garnish; they are the grammar of escalation. Drops read louder when the visual arc has already told you a story of ascent. This is why criticism of “too much production” often misses the point: for many attendees, the production <strong>is</strong> the narrative—especially when the music is shared across dozens of festivals worldwide.</p>
<h2>Fantasy and the economics of belonging</h2>
<p>Fantasy narratives at festivals do emotional work. They offer <strong>permission</strong> to dress up, to speak in shorthand with strangers, to suspend ordinary social rules. They also bundle identity: “I am the kind of person who belongs in this story.” Product designers in tech talk about onboarding; festival storytelling is a form of <strong>cultural onboarding</strong> with costumes instead of tooltips.</p>
<h2>Where festival storytelling is heading</h2>
<p>Streaming and short-form video have made the <strong>off-season</strong> as visible as the event. The future of festival storytelling is less a single climax weekend and more a <strong>distributed canon</strong>: clips, artist spotlights, and ambient lore that keep the world warm between gates. The risk is sameness—when every fantasy realm starts to look like the same CGI trailer. The opportunity is specificity: worlds that feel authored rather than generated.</p>
<p>Tomorrowland sits at the intersection of <strong>live spectacle</strong> and <strong>franchise logic</strong>. Whether that excites or exhausts you, it is a useful lens for any large gathering that wants loyalty beyond the last kick drum.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[EDC y la nueva identidad global del rave]]></title>
            <link>https://nathanlazo.website/articles/edc-and-the-global-rave-brand</link>
            <guid>https://nathanlazo.website/articles/edc-and-the-global-rave-brand</guid>
            <pubDate>Sat, 18 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Cómo un festival se convierte en marca planetaria: espectáculo, comunidad y cultura digital detrás del “rave” como producto cultural.]]></description>
            <content:encoded><![CDATA[<p>Cuando alguien dice “EDC” fuera de Las Vegas, muchas veces no está nombrando solo un evento: está nombrando un <strong>estilo de fiesta</strong> reconocible al instante. Neón, personajes, escenarios masivos y una promesa repetida: que la noche sea un universo aparte. Esa transición —de festival local a <strong>identidad global</strong>— es menos sobre la música en sí y más sobre cómo se empaqueta la experiencia para millones de pantallas y cuerpos a la vez.</p>
<h2>Marca como atmósfera</h2>
<p>La fuerza de marcas como Electric Daisy Carnival no está solo en el cartel. Está en la <strong>coherencia visual y emocional</strong>: un lenguaje que funciona en TikTok, en el recinto y en la memoria colectiva. El “rave” deja de ser un género difuso y se vuelve algo que puedes <strong>reconocer</strong> aunque nunca hayas estado en el desierto. Eso es diseño de identidad aplicado a la escala del espectáculo: tipografías, mascotas, colores y ritmos de reveal que convierten la anticipación en parte del producto.</p>
<h2>Espectáculo y comunidad en tensión</h2>
<p>Hay una paradoja honesta en los mega-festivales. Por un lado, el show busca <strong>singularidad</strong> —“esta noche es irrepetible”—. Por otro, depende de <strong>repetición industrial</strong>: circuitos, tours, formatos que se replican entre ciudades. La comunidad no nace solo del escenario; nace de los grupos de chat, los aftermovies, los memes y las discusiones sobre “cómo estuvo” versus “cómo se vio”. La cultura digital <strong>amplifica</strong> la marca: cada clip es un embajador involuntario.</p>
<h2>El rave como símbolo exportable</h2>
<p>Hoy “ir de rave” puede significar cosas distintas según el país, pero ciertos festivales han logrado que su nombre funcione como <strong>atajo semántico</strong> para una fiesta grande, colorida y electrónica. Eso tiene costos: la homogeneización estética, la presión por contenido siempre “instagrammable”, la sensación de que el underground original queda narrado desde arriba. Aun así, el fenómeno muestra cómo la <strong>música dance</strong> se articula con capital simbólico y con plataformas que premian la legibilidad instantánea.</p>
<h2>Lectura desde afuera</h2>
<p>No hace falta haber vivido cada edición para observar el patrón: un festival que escala convierte la <strong>experiencia en marca</strong>, la marca en historia compartida y la historia en motor de la siguiente temporada. Preguntarse por EDC es preguntarse qué versión del “nosotros” del dance floor se está vendiendo —y qué espacio queda para lo local, lo ruidoso y lo que no cabe en un trailer de dos minutos.</p>
<hr/>
<h3>Autor</h3>
<ul>
<li>Nathan Lazo [<a href="https://nathan-lazo.com">nathan-lazo.com</a>] [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Server Components(RSC)]]></title>
            <link>https://nathanlazo.website/articles/react-server-components</link>
            <guid>https://nathanlazo.website/articles/react-server-components</guid>
            <pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Understanding Server and Client Components in Next.js 13, best practices, and patterns.]]></description>
            <content:encoded><![CDATA[<p>When building applications with Next.js, it&#x27;s important to grasp the concepts of Server Components and Client Components. These components allow developers to create applications that combine the interactivity of client-side apps with the performance benefits of server rendering.</p>
<img alt="react comoponents image" loading="lazy" width="880" height="495" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Freactcomponents.a97628a4.png&amp;w=1080&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Freactcomponents.a97628a4.png&amp;w=1920&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Freactcomponents.a97628a4.png&amp;w=1920&amp;q=75"/>
<h2>Server Components: Leveraging Server Infrastructure</h2>
<p>Server Components offer several advantages over Client Components. They enable developers to leverage server infrastructure more effectively. By moving data fetching closer to the server and keeping large dependencies on the server, Server Components improve overall performance. They provide the flexibility to write React applications that feel akin to frameworks like PHP or Ruby on Rails, while still benefiting from the power and flexibility of React&#x27;s component model for UI templating.</p>
<p>With Server Components, the initial page load is faster, and the client-side JavaScript bundle size is reduced. The base client-side runtime remains cacheable and predictable in size, regardless of application growth. Additional JavaScript is only added when client-side interactivity, through the use of Client Components, is required.</p>
<h2>Client Components: Adding Interactivity</h2>
<p>Client Components allow developers to incorporate client-side interactivity into their applications. In Next.js, these components are pre-rendered on the server and then hydrated on the client side. You can think of Client Components as similar to components in the Pages Router, providing a familiar approach to building interactive UI elements.</p>
<h2>The &quot;use client&quot; Directive: Defining the Component Boundary</h2>
<p>The &quot;use client&quot; directive serves as a convention for declaring the boundary between Server and Client Components. Placed at the top of a file, above imports, it marks the transition point from server-only to client code. Once defined in a file, all modules imported into it, including child components, become part of the client bundle.</p>
<p>It&#x27;s important to note the following regarding the &quot;use client&quot; directive:</p>
<ul>
<li>Components in the Server Component module graph are rendered exclusively on the server.</li>
<li>Components in the Client Component module graph are primarily rendered on the client side, but Next.js allows them to be pre-rendered on the server and hydrated on the client.</li>
<li>The &quot;use client&quot; directive must be defined at the top of a file before any imports.</li>
<li>It only needs to be defined once, typically at the entry point of your application, to encompass all subsequently imported modules as Client Components.</li>
</ul>
<pre class="language-typescript"><code class="language-typescript"><span class="token string">&#x27;use client&#x27;</span>

<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> useState <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;react&#x27;</span>

<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">Counter</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">[</span>count<span class="token punctuation">,</span> setCount<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>

  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>
      <span class="token operator">&lt;</span>p<span class="token operator">&gt;</span><span class="token maybe-class-name">You</span> clicked <span class="token punctuation">{</span>count<span class="token punctuation">}</span> times<span class="token operator">&lt;</span><span class="token operator">/</span>p<span class="token operator">&gt;</span>
      <span class="token operator">&lt;</span>button onClick<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token function">setCount</span><span class="token punctuation">(</span>count <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token operator">&gt;</span><span class="token maybe-class-name">Click</span> me<span class="token operator">&lt;</span><span class="token operator">/</span>button<span class="token operator">&gt;</span>
    <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<img alt="useclient image" loading="lazy" width="1600" height="1325" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fuse-client-directive.9e75cdbb.avif&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fuse-client-directive.9e75cdbb.avif&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fuse-client-directive.9e75cdbb.avif&amp;w=3840&amp;q=75"/>
<h2>Choosing Between Server and Client Components</h2>
<p>To simplify the decision-making process, it is recommended to use Server Components (the default in the app directory) unless there is a specific use case for a Client Component. Server Components offer benefits such as improved performance, reduced client-side JavaScript, and optimized server infrastructure utilization.</p>
<h2>Patterns: Moving and Composing Components</h2>
<p>Two patterns worth noting are moving Client Components to the leaves of the component tree and composing Server and Client Components.</p>
<p>Moving Client Components to the leaves involves separating interactive logic from static elements, keeping the layout as a Server Component and moving the interactive logic to a Client Component. This optimization reduces the amount of component JavaScript sent to the client.</p>
<p>Composing Server and Client Components allows you to combine both types of components within the same component tree. React handles the rendering process, merging the server and client work seamlessly to produce a faster initial page load.</p>
<p>It&#x27;s important to be aware of the restriction on importing Server Components into Client Components. This pattern requires an additional server round trip and is not supported.</p>
<hr/>
<p><strong>Good to know:</strong> In Next.js, during the initial page load, both the rendered result of Server Components from the above step and Client Components are pre-rendered on the server as HTML to produce a faster initial page load.</p>
<hr/>
<h3>Unsupported Pattern: Importing Server Components into Client Components</h3>
<p>The following pattern is not supported. You cannot import a Server Component into a Client Component:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token string">&#x27;use client&#x27;</span>

<span class="token comment">// This pattern will **not** work!</span>
<span class="token comment">// You cannot import a Server Component into a Client Component.</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">ExampleServerComponent</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;./example-server-component&#x27;</span>

<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">ExampleClientComponent</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  children<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token operator">:</span> <span class="token punctuation">{</span>
  children<span class="token operator">:</span> <span class="token maybe-class-name">React</span><span class="token punctuation">.</span><span class="token property-access"><span class="token maybe-class-name">ReactNode</span></span>
<span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">[</span>count<span class="token punctuation">,</span> setCount<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>

  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">onClick</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token function">setCount</span><span class="token punctuation">(</span>count <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>count<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">

      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">ExampleServerComponent</span></span> <span class="token punctuation">/&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span></span><span class="token punctuation">&gt;</span></span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<h2>Recommended Pattern: Passing Server Components to Client Components as Props</h2>
<p>Instead, when designing Client Components you can use React props to mark &quot;holes&quot; for Server Components. The Server Component will be rendered on the server, and when the Client Component is rendered on the client, the &quot;hole&quot; will be filled in with the rendered result of the Server Component.</p>
<p>A common pattern is to use the React children prop to create the &quot;hole&quot;. We can refactor <code>&lt;ExampleClientComponent&gt;</code> to accept a generic children prop and move the import and explicit nesting of <code>&lt;ExampleServerComponent&gt;</code> up to a parent component.</p>
<pre class="language-ts"><code class="language-ts"><span class="token string">&#x27;use client&#x27;</span>

<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> useState <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;react&#x27;</span>

<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">ExampleClientComponent</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span>
  children<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token operator">:</span> <span class="token punctuation">{</span>
  children<span class="token operator">:</span> <span class="token maybe-class-name">React</span><span class="token punctuation">.</span><span class="token property-access"><span class="token maybe-class-name">ReactNode</span></span>
<span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">[</span>count<span class="token punctuation">,</span> setCount<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>

  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token operator">&lt;</span><span class="token operator">&gt;</span>
      <span class="token operator">&lt;</span>button onClick<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> <span class="token function">setCount</span><span class="token punctuation">(</span>count <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token operator">&gt;</span><span class="token punctuation">{</span>count<span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>button<span class="token operator">&gt;</span>

      <span class="token punctuation">{</span>children<span class="token punctuation">}</span>
    <span class="token operator">&lt;</span><span class="token operator">/</span><span class="token operator">&gt;</span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Now, <code>&lt;ExampleClientComponent&gt;</code> has no knowledge of what children is. In fact, from its perspective, it doesn&#x27;t even know that children will eventually be filled in by the result of a Server Component. The only responsibility ExampleClientComponent has is to decide where whatever children will eventually be should be placed.</p>
<p>In a parent Server Component, you can import both the <code>&lt;ExampleClientComponent&gt;</code> and <code>&lt;ExampleServerComponent&gt;</code> and pass <code>&lt;ExampleServerComponent&gt;</code> as a child of <code>&lt;ExampleClientComponent&gt;</code>:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// This pattern works:</span>
<span class="token comment">// You can pass a Server Component as a child or prop of a</span>
<span class="token comment">// Client Component.</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">ExampleClientComponent</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;./example-client-component&#x27;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">ExampleServerComponent</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;./example-server-component&#x27;</span>

<span class="token comment">// Pages in Next.js are Server Components by default</span>
<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">Page</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">ExampleClientComponent</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">ExampleServerComponent</span></span> <span class="token punctuation">/&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">ExampleClientComponent</span></span><span class="token punctuation">&gt;</span></span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>With this approach, the rendering of <code>&lt;ExampleClientComponent&gt;</code> and <code>&lt;ExampleServerComponent&gt;</code> are decoupled and can be rendered independently - aligning with Server Components, which are rendered on the server before Client Components.</p>
<p><strong>Good to know</strong></p>
<ul>
<li>This pattern is already applied in layouts and pages with the children prop, so you don&#x27;t have to create an additional wrapper component.</li>
<li>Passing React components (JSX) to other components is not a new concept and has always been part of the React composition model.</li>
<li>This composition strategy works across Server and Client Components because the component that receives the prop has no knowledge of what the prop is. It is only responsible for where the thing that it is passed should be placed.</li>
<li>This allows the passed prop to be rendered independently, in this case, on the server, well before the Client Component is rendered on the client.</li>
<li>The very same strategy of &quot;lifting content up&quot; has been used to avoid state changes in a parent component re-rendering an imported nested child component.</li>
<li>You&#x27;re not limited to the children prop. You can use any prop to pass JSX.</li>
<li>Passing props from Server to Client Components (Serialization)</li>
<li>Props passed from the Server to Client Components need to be serializable. This means that values such as functions, Dates, etc, cannot be passed directly to Client Components.</li>
</ul>
<p>Where is the Network Boundary?</p>
<p>In the App Router, the network boundary is between Server Components and Client Components. This is different from the Pages where the boundary is between getStaticProps/getServerSideProps and Page Components. Data fetched inside Server Components do not need to be serialized as it doesn&#x27;t cross the network boundary unless it is passed to a Client Component. Learn more about data fetching with Server Components.</p>
<p>Keeping Server-Only Code out of Client Components (Poisoning)</p>
<p>Since JavaScript modules can be shared between both Server and Client Components, it&#x27;s possible for code that was only ever intended to be run on the server to sneak its way into the client.</p>
<p>For example, take the following data-fetching function:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// lib/data.ts</span>

<span class="token keyword module">export</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">getData</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword control-flow">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">&#x27;https://external-service.com/data&#x27;</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
    headers<span class="token operator">:</span> <span class="token punctuation">{</span>
      authorization<span class="token operator">:</span> process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">.</span><span class="token constant">API_KEY</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span>

  <span class="token keyword control-flow">return</span> res<span class="token punctuation">.</span><span class="token method function property-access">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>At first glance, it appears that <code>getData</code> works on both the server and the client. But because the environment variable <code>API_KEY</code> is not prefixed with <code>NEXT_PUBLIC</code>, it&#x27;s a private variable that can only be accessed on the server. Next.js replaces private environment variables with the empty string in client code to prevent leaking secure information.</p>
<p>As a result, even though <code>getData()</code> can be imported and executed on the client, it won&#x27;t work as expected. And while making the variable public would make the function work on the client, it would leak sensitive information.</p>
<p>So, this function was written with the intention that it would only ever be executed on the server.</p>
<p>The &quot;server only&quot; package
To prevent this sort of unintended client usage of server code, we can use the <code>server-only</code> package to give other developers a build-time error if they ever accidentally import one of these modules into a Client Component.</p>
<p>To use <code>server-only</code>, first install the package:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> server-only
</code></pre>
<p>Then import the package into any module that contains server-only code:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// lib/data.js</span>

<span class="token keyword module">import</span> <span class="token string">&#x27;server-only&#x27;</span>

<span class="token keyword module">export</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">getData</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> res <span class="token operator">=</span> <span class="token keyword control-flow">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">&#x27;https://external-service.com/data&#x27;</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
    headers<span class="token operator">:</span> <span class="token punctuation">{</span>
      authorization<span class="token operator">:</span> process<span class="token punctuation">.</span><span class="token property-access">env</span><span class="token punctuation">.</span><span class="token constant">API_KEY</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span>

  <span class="token keyword control-flow">return</span> res<span class="token punctuation">.</span><span class="token method function property-access">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Now, any Client Component that imports <code>getData()</code> will receive a build-time error explaining that this module can only be used on the server.</p>
<p>The corresponding package client-only can be used to mark modules that contain <code>client-only</code> code – for example, code that accesses the <code>window</code> object.</p>
<p>Third-Party Packages and Compatibility with Server Components
Not all third-party packages have been updated to support Server Components. Some packages may rely on client-only features and lack the &quot;use client&quot; directive required for Server Components. In such cases, these packages won&#x27;t work within Server Components.</p>
<p>To address this, you can create wrapper components for third-party packages, marking them as Client Components and enabling their usage within Server Components.</p>
<p>As the ecosystem around Server Components continues to evolve, more third-party packages are expected to incorporate the &quot;use client&quot; directive, providing seamless support for Server Components.</p>
<p><em><strong>Note:</strong> The code examples provided are for illustrative purposes and may not represent the exact implementation in your project. Please adapt the code to your specific use case.</em></p>
<h2>Using Context in Client Components</h2>
<p>Context is a powerful feature in React that allows for sharing data between components. In Next.js 13, context is fully supported within Client Components. You can create context using <code>createContext</code> and consume it using <code>useContext</code>. For example:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token string">&#x27;use client&#x27;</span>
 
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> createContext<span class="token punctuation">,</span> useContext<span class="token punctuation">,</span> useState <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;react&#x27;</span>
 
<span class="token keyword">const</span> <span class="token maybe-class-name">SidebarContext</span> <span class="token operator">=</span> <span class="token function">createContext</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
 
<span class="token keyword module">export</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">Sidebar</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">[</span>isOpen<span class="token punctuation">,</span> setIsOpen<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
 
  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">SidebarContext.Provider</span></span> <span class="token attr-name">value</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">{</span> isOpen <span class="token punctuation">}</span><span class="token punctuation">}</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">SidebarNav</span></span> <span class="token punctuation">/&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">SidebarContext.Provider</span></span><span class="token punctuation">&gt;</span></span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<pre class="language-tsx"><code class="language-tsx"><span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">SidebarNav</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">let</span> <span class="token punctuation">{</span> isOpen <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">useContext</span><span class="token punctuation">(</span><span class="token maybe-class-name">SidebarContext</span><span class="token punctuation">)</span>

<span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">Home</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">

    </span><span class="token punctuation">{</span>isOpen <span class="token operator">&amp;&amp;</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Subnav</span></span> <span class="token punctuation">/&gt;</span></span><span class="token punctuation">}</span><span class="token plain-text">
  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>
<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<h2>Rendering Context Providers in Server Components</h2>
<p>Creating context directly at the root level in Server Components is not supported. To overcome this, you can create your context within a Client Component and render it in your Server Component. For example:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// theme-provider.tsx</span>
<span class="token string">&#x27;use client&#x27;</span>
 
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> createContext <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;react&#x27;</span>
 
<span class="token keyword module">export</span> <span class="token keyword">const</span> <span class="token maybe-class-name">ThemeContext</span> <span class="token operator">=</span> <span class="token function">createContext</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
 
<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">ThemeProvider</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span> children <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">ThemeContext.Provider</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">&quot;</span>dark<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>children<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">ThemeContext.Provider</span></span><span class="token punctuation">&gt;</span></span>
<span class="token punctuation">}</span>
</code></pre>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// layout.tsx</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token maybe-class-name">ThemeProvider</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;./theme-provider&#x27;</span>

<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">RootLayout</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span>
children<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token operator">:</span> <span class="token punctuation">{</span>
children<span class="token operator">:</span> <span class="token maybe-class-name">React</span><span class="token punctuation">.</span><span class="token property-access"><span class="token maybe-class-name">ReactNode</span></span>
<span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">ThemeProvider</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>children<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">ThemeProvider</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">&gt;</span></span>
<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>This way, you can consume the context in other Client Components throughout your application.</p>
<h2>Rendering Third-Party Context Providers in Server Components</h2>
<p>Rendering third-party context providers directly in Server Components may cause errors if they haven&#x27;t implemented support for Server Components. To resolve this, you can wrap third-party providers in your own Client Component and render it in your Server Component. For example:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// providers.js</span>
<span class="token string">&#x27;use client&#x27;</span>
 
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">ThemeProvider</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;acme-theme&#x27;</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">AuthProvider</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;acme-auth&#x27;</span>
 
<span class="token keyword module">export</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">Providers</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span> children <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">ThemeProvider</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">AuthProvider</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>children<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">AuthProvider</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">ThemeProvider</span></span><span class="token punctuation">&gt;</span></span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// layout.js</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> <span class="token maybe-class-name">Providers</span> <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;./providers&#x27;</span>
 
<span class="token keyword module">export</span> <span class="token keyword module">default</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">RootLayout</span></span><span class="token punctuation">(</span><span class="token punctuation">{</span> children <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword control-flow">return</span> <span class="token punctuation">(</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
        </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Providers</span></span><span class="token punctuation">&gt;</span></span><span class="token punctuation">{</span>children<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">Providers</span></span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">
    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">&gt;</span></span>
  <span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<p>This ensures that the third-party providers work as expected within your Server Components.</p>
<h2>Sharing Data Between Server Components</h2>
<p>Since Server Components are not interactive and do not rely on React state, you don&#x27;t need React context to share data between them. Instead, you can use native JavaScript patterns for data sharing. For example, you can create a module to share a database connection across multiple components:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// utils/database.ts</span>
<span class="token keyword module">export</span> <span class="token keyword">const</span> db <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name"><span class="token maybe-class-name">DatabaseConnection</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre>
<p>Then, you can import and use this module in your Server Components:</p>
<pre class="language-tsx"><code class="language-tsx"><span class="token comment">// users/layout.tsx</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> db <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;@utils/database&#x27;</span>
 
<span class="token keyword module">export</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">UsersLayout</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">let</span> users <span class="token operator">=</span> <span class="token keyword control-flow">await</span> db<span class="token punctuation">.</span><span class="token method function property-access">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  <span class="token comment">// ...</span>
<span class="token punctuation">}</span>

<span class="token comment">// users/[id]/page.tsx</span>
<span class="token keyword module">import</span> <span class="token imports"><span class="token punctuation">{</span> db <span class="token punctuation">}</span></span> <span class="token keyword module">from</span> <span class="token string">&#x27;@utils/database&#x27;</span>
 
<span class="token keyword module">export</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function"><span class="token maybe-class-name">DashboardPage</span></span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">let</span> user <span class="token operator">=</span> <span class="token keyword control-flow">await</span> db<span class="token punctuation">.</span><span class="token method function property-access">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
  <span class="token comment">// ...</span>
<span class="token punctuation">}</span>
</code></pre>
<p>By importing the <code>@utils/database</code>module, both components can access the shared database connection. This approach is known as global singletons.</p>
<p>Sharing Fetch Requests Between Server Components
When fetching data in Server Components, you may want to share the fetched result between a page or layout and its child components. Instead of passing props back and forth, it&#x27;s recommended to colocate data fetching alongside the component that consumes the data. Next.js automatically deduplicates fetch requests in Server Components, so each component can request the specific data it needs without worrying about duplicate requests. Next.js will read the same value from the fetch cache.</p>
<p><em><strong>Note:</strong> the code examples provided are for illustration purposes and may require adaptation to fit your specific use case.</em></p>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>
<h3>References</h3>
<ul>
<li>React Tutorial (<a href="https://reactjs.org/tutorial/">https://reactjs.org/tutorial/</a>)</li>
<li>Thinking in React (<a href="https://reactjs.org/docs/thinking-in-react.html">https://reactjs.org/docs/thinking-in-react.html</a>)</li>
<li>Learn React (<a href="https://reactjs.org/docs/hello-world.html">https://reactjs.org/docs/hello-world.html</a>)</li>
<li>Next.js Documentation (<a href="https://nextjs.org/docs/getting-started">https://nextjs.org/docs/getting-started</a>)</li>
</ul>
<p><em>Remember to consult the official Nextjs documentation for the most up-to-date information on React.</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mastering GitHub Copilot: Best Practices for Prompt Crafting]]></title>
            <link>https://nathanlazo.website/articles/github-copilot</link>
            <guid>https://nathanlazo.website/articles/github-copilot</guid>
            <pubDate>Tue, 20 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[
      GitHub Copilot, the AI coding assistant, has revolutionized the way developers approach coding tasks. 
      Its generative AI capabilities help accelerate coding workflows. However, communicating with Copilot 
      is crucial to get the desired output. 
  ]]></description>
            <content:encoded><![CDATA[<p>GitHub Copilot, the AI coding assistant, has revolutionized the way developers approach coding tasks. Its generative AI capabilities help accelerate coding workflows by providing code suggestions. However, effectively communicating with Copilot is crucial to get the desired output. In this comprehensive guide, we will share prompt crafting best practices and tips to help you maximize your productivity when using GitHub Copilot. Whether you are a beginner or an experienced developer, these insights will empower you to generate accurate and relevant code suggestions.</p>
<p><strong>Understanding Prompt Engineering -</strong>
Before delving into prompt crafting, let&#x27;s understand the concept of prompt engineering. In the context of generative AI coding tools, prompts are code blocks, individual lines of code, or natural language comments that developers write to generate specific suggestions from GitHub Copilot. Prompt engineering involves providing instructions or comments in the IDE to guide Copilot in generating coding suggestions that align with the desired output.</p>
<img alt="copilot image" loading="lazy" width="1200" height="630" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcopilot.ffe91c94.png&amp;w=1200&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcopilot.ffe91c94.png&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcopilot.ffe91c94.png&amp;w=3840&amp;q=75"/>
<h2>Best Practices for Prompt Crafting</h2>
<h3>Set the Stage with a High-Level Goal</h3>
<p>When starting a new coding task, it&#x27;s helpful to set the stage by providing Copilot with a high-level goal. Imagine having a conversation with a programming partner. Break down the problem and discuss how you would approach it together. By describing the big picture and the desired outcome, Copilot gains a clear understanding of what you want to achieve. This sets the context and primes Copilot to generate code snippets that align with your intentions.</p>
<p>For example, when building a markdown editor in Next.js, you can write a comment like this:</p>
<pre><code>/*
Create a basic markdown editor in Next.js with the following features:

Use react hooks
Create state for markdown with default text &quot;type markdown here&quot;
A text area where users can write markdown
Show a live preview of the markdown text as I type
Support for basic markdown syntax like headers, bold, italics
Use React markdown npm package
The markdown text and resulting HTML should be saved in the component&#x27;s state and updated in real time
*/
</code></pre>
<p>This prompt will guide Copilot to generate code for a simple, unstyled, but functional markdown editor in less than 30 seconds. You can then focus on styling the component while having a solid starting point.</p>
<h3>Make Your Ask Simple and Specific</h3>
<p>To improve the accuracy of Copilot&#x27;s suggestions, break down your request into simple and specific steps. Instead of asking for a large chunk of code all at once, articulate the logic and steps required to achieve your goal. By providing incremental instructions, Copilot can better understand your intentions and generate code after each step. This approach is akin to following a recipe, where each cooking step is described individually.</p>
<p>For example, if you want to reverse a function, you can provide Copilot with step-by-step instructions like this:</p>
<pre><code>// Given a function &quot;reverseString&quot; that takes a string parameter and returns the reversed string
// Step 1: Convert the string into an array of characters
// Step 2: Reverse the array of characters
// Step 3: Convert the reversed array back into a string
// Step 4: Return the reversed string
</code></pre>
<p>By breaking down the logic into separate steps, Copilot can generate code for each step, leading to a comprehensive and accurate solution.</p>
<h3>Give GitHub Copilot Examples to Learn From</h3>
<p>Just like humans, Copilot learns from examples. Providing relevant examples helps Copilot understand the desired outcome more effectively. When giving Copilot an example, make sure it reflects the specific behavior or result you expect. By showcasing the desired output, Copilot can generate code that aligns with your expectations.</p>
<p>For instance, suppose you have an array of data and want to extract the names and store them in a new array. Providing an example helps Copilot generate the correct code:</p>
<pre class="language-javascript"><code class="language-javascript"><span class="token comment">// Map through an array of arrays of objects to transform data</span>
<span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token punctuation">[</span>
  <span class="token punctuation">[</span>
    <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">&#x27;John&#x27;</span><span class="token punctuation">,</span> <span class="token literal-property property">age</span><span class="token operator">:</span> <span class="token number">25</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">&#x27;Jane&#x27;</span><span class="token punctuation">,</span> <span class="token literal-property property">age</span><span class="token operator">:</span> <span class="token number">30</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
  <span class="token punctuation">[</span><span class="token punctuation">{</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">&#x27;Bob&#x27;</span><span class="token punctuation">,</span> <span class="token literal-property property">age</span><span class="token operator">:</span> <span class="token number">40</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span>

<span class="token comment">// Extract names from the data array</span>
<span class="token comment">// Desired outcome: [&#x27;John&#x27;, &#x27;Jane&#x27;, &#x27;Bob&#x27;]</span>
<span class="token keyword">const</span> mappedData <span class="token operator">=</span> data<span class="token punctuation">.</span><span class="token method function property-access">flatMap</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">sublist</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span>
  sublist<span class="token punctuation">.</span><span class="token method function property-access">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">person</span><span class="token punctuation">)</span> <span class="token arrow operator">=&gt;</span> person<span class="token punctuation">.</span><span class="token property-access">name</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span>
<span class="token console class-name">console</span><span class="token punctuation">.</span><span class="token method function property-access">log</span><span class="token punctuation">(</span>mappedData<span class="token punctuation">)</span>
</code></pre>
<p>By demonstrating the desired outcome and providing clear instructions, Copilot generates the correct code to extract the names from the array.</p>
<p>Additional Tips for Prompt Crafting
Experiment with Your Prompts
Prompt crafting is more of an art than a science. Experimentation is key to finding the most effective prompts for your coding tasks. By trying different approaches, you can discover patterns that resonate well with Copilot. Keep refining and adjusting your prompts based on the results you get. Through iterative experimentation, you&#x27;ll improve your prompt crafting skills and achieve better outcomes.</p>
<p>Use Contextual Information
Copilot leverages contextual information to generate accurate suggestions. It takes into account the code you&#x27;ve written before and after the cursor, as well as data from your open files. Utilize this contextual information by providing relevant code snippets and comments in your prompts. This helps Copilot understand the desired behavior more accurately and generate code that aligns with the context.</p>
<p>Collaborate with the Community
The GitHub Copilot community is a valuable resource for learning and sharing prompt crafting techniques. Engage with other developers, share your experiences, and learn from their insights. By collaborating and exchanging ideas, you can collectively accelerate the growth and adoption of AI-powered software development practices.</p>
<img alt="github image" loading="lazy" width="1600" height="850" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgithub.44da2866.webp&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgithub.44da2866.webp&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fgithub.44da2866.webp&amp;w=3840&amp;q=75"/>
<h3>Summary</h3>
<p>Mastering prompt crafting is essential to effectively utilize the power of GitHub Copilot. By following the best practices and tips shared in this guide, you can communicate your coding intentions more effectively and generate accurate and relevant code suggestions. Remember to experiment, provide clear examples, and leverage contextual information to enhance Copilot&#x27;s understanding of your desired outcomes. With practice and collaboration, you can unlock the full potential of GitHub Copilot and revolutionize your software development process.</p>
<p>We hope this comprehensive guide has provided you with valuable insights into prompt crafting with GitHub Copilot. Happy coding!</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The GraphQL killer]]></title>
            <link>https://nathanlazo.website/articles/the-GraphQL-killer</link>
            <guid>https://nathanlazo.website/articles/the-GraphQL-killer</guid>
            <pubDate>Mon, 19 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing tRPC v10: Empowering Full-Stack TypeScript Development. Move Fast and Break Nothing. End-to-end typesafe APIs made easy.]]></description>
            <content:encoded><![CDATA[<p>Welcome to the world of tRPC v10, where full-stack TypeScript development reaches new heights. In this blog post, we will explore the exciting features and improvements that tRPC v10 brings to the table. Whether you&#x27;re a seasoned developer or just getting started with tRPC, this release is bound to enhance your developer experience and boost productivity.</p>
<img alt="trpc image" loading="lazy" width="1024" height="538" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fconnection.6ade44c3.jpg&amp;w=1080&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fconnection.6ade44c3.jpg&amp;w=2048&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fconnection.6ade44c3.jpg&amp;w=2048&amp;q=75"/>
<p>tRPC is a game-changing library that transforms the way APIs are built in TypeScript. It offers developers a powerful and intuitive solution to create end-to-end typesafe APIs without the hassle of code generation or complex schema definitions. With tRPC, you can seamlessly ensure type safety across all layers of your application, from the server to the client, enabling a robust and reliable development process.</p>
<p>One of the standout features of tRPC is its deep integration with TypeScript, leveraging its static typing capabilities to enforce type bindings throughout your codebase. This means that you can catch potential errors and inconsistencies at compile time, reducing the likelihood of runtime issues and enhancing the overall stability of your application.</p>
<p>In tRPC v10, your favorite IDE becomes your best friend. They have introduced features that make your development workflow smoother and more efficient. Let&#x27;s take a closer look at some of the enhancements:</p>
<img alt="trpc image" loading="lazy" width="2954" height="1408" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ftrpc.33432956.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ftrpc.33432956.png&amp;w=3840&amp;q=75"/>
<ul>
<li>
<p><strong>&quot;Go to Definition&quot;</strong>: Jump straight from your frontend consumer to your backend procedure. This feature allows you to navigate seamlessly between the frontend and backend code, saving you time and effort [1].</p>
</li>
<li>
<p><strong>&quot;Rename Symbol&quot;</strong>: Easily rename input arguments or procedures across your entire application. With a single action, you can propagate changes throughout your codebase, ensuring consistency and reducing the chances of introducing errors [1].</p>
</li>
<li>
<p><strong>Easier Type Inference</strong>: Infer types effortlessly when you want to utilize your tRPC types manually in your application. This improvement simplifies the process of working with tRPC types, making it more intuitive and convenient for developers [1].</p>
</li>
<li>
<p><strong>End-to-End Type Safety</strong>: One of the core strengths of tRPC is its ability to provide
end-to-end type safety from your server to your client, without the need for explicit
type declarations [3]. By following a simple convention, you can ensure that your
backend returns data in a function, and on the frontend, you can consume that data
based on the endpoint name [3]. This approach eliminates the hassle of maintaining
separate schemas and facilitates seamless collaboration between frontend and backend
teams.</p>
</li>
<li>
<p><strong>Validator Integration</strong>:
tRPC v10 comes equipped with a comprehensive set of input and output validators [4]. These validators not only enable you to define validation logic for your procedures but also play a crucial role in inferring the types of inputs and outputs [4]. The framework provides first-class support for popular validators and allows seamless integration with others, ensuring your API contracts remain robust and error-free.</p>
</li>
</ul>
<img alt="trpc image" loading="lazy" width="1574" height="770" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fvisual-trpc.8b02f5cd.png&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fvisual-trpc.8b02f5cd.png&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fvisual-trpc.8b02f5cd.png&amp;w=3840&amp;q=75"/>
<p><em>With tRPC v10, the world of full-stack TypeScript development has reached new heights. The improved developer experience, end-to-end type safety, and seamless validator integration empower you to build fully typesafe APIs without the need for schemas or code generation [5]. Whether you&#x27;re a seasoned tRPC user or new to the framework, this release opens up new possibilities for building high-quality, efficient, and maintainable applications. Embrace the power of tRPC v10 and elevate your TypeScript development to new horizons.</em></p>
<h2>tRPC vs GraphQL: A Comparative Analysis</h2>
<p>In the world of modern web development, there are various options available for building typesafe APIs. Two popular choices are tRPC and GraphQL. Here is a comparison between these two technologies to help you understand their strengths, differences, and use cases. Whether you&#x27;re deciding which technology to adopt for your project or simply exploring new possibilities, this analysis will provide valuable insights.</p>
<ol>
<li>
<p>Approach to Typesafety:
tRPC focuses on end-to-end typesafety by leveraging TypeScript&#x27;s static typing capabilities. It ensures that the client and server communicate using shared types, minimizing the risk of runtime errors and providing a seamless development experience [5]. On the other hand, GraphQL relies on a schema definition language (SDL) to define the shape of the API and its types. While GraphQL provides strong typesafety within the GraphQL ecosystem, integrating it with the broader TypeScript ecosystem may require additional tooling and code generation [5].</p>
</li>
<li>
<p>Flexibility and Query Control:
GraphQL offers fine-grained query control, allowing clients to specify exactly what data they need. This reduces the problem of over-fetching and under-fetching commonly associated with RESTful APIs. Clients can retrieve nested and related data in a single request, enhancing performance and reducing network round trips. In contrast, tRPC follows a convention-based approach, where clients consume data based on the endpoint name. While tRPC doesn&#x27;t provide the same level of flexibility as GraphQL, it offers simplicity and ease of use, especially in scenarios where the API structure is well-defined and stable [3].</p>
</li>
<li>
<p>Ecosystem and Tooling:
GraphQL has a mature and extensive ecosystem with a wide range of tools, libraries, and community support. This includes powerful tools for schema management, caching, client generation, and debugging. GraphQL&#x27;s introspection capabilities make it highly adaptable and enable the automatic generation of documentation, IDE integrations, and more. tRPC, being a newer framework, has a growing ecosystem and a smaller community but provides lightweight and efficient solutions for full-stack TypeScript developers without the need for additional code generation or build pipelines [1].</p>
</li>
</ol>
<table><thead><tr><th>Aspect</th><th>tRPC</th><th>GraphQL</th></tr></thead><tbody><tr><td>Approach to Typesafety</td><td>Leverages TypeScript&#x27;s static typing</td><td>Relies on a schema definition language</td></tr><tr><td>Query Control</td><td>Convention-based consumption of data</td><td>Fine-grained control over requested data</td></tr><tr><td>Flexibility</td><td>Simplified and well-defined API structure</td><td>Highly flexible with nested data retrieval</td></tr><tr><td>Ecosystem and Tooling</td><td>Growing ecosystem, lightweight solution</td><td>Mature ecosystem with extensive tooling</td></tr></tbody></table>
<p>In summary, tRPC and GraphQL are both powerful options for building typesafe APIs. tRPC focuses on end-to-end typesafety with a TypeScript-first approach, providing simplicity and a seamless development experience. GraphQL offers fine-grained query control and flexibility, making it ideal for projects requiring advanced data retrieval capabilities. Consider your project requirements and team expertise when choosing between the two.</p>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>
<h3>References:</h3>
<ul>
<li>[1.] Announcing tRPC v10 | tRPC. Retrieved from <a href="https://trpc.io/blog/announcing-trpc-10">here</a></li>
<li>[2.] Blog | tRPC. Retrieved from <a href="https://trpc.io/blog">here</a></li>
<li>[3.] Introducing tRPC | tRPC. Retrieved from <a href="https://trpc.io/blog/introducing-trpc">here</a></li>
<li>[4.] tRPC server documentation | tRPC. Retrieved from <a href="https://trpc.io/docs/server/introduction">here</a></li>
<li>[5.] tRPC | tRPC. Retrieved from <a href="https://trpc.io/docs/">here</a></li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Blockchain for business and companies]]></title>
            <link>https://nathanlazo.website/articles/blockchain-for-business-and-companies</link>
            <guid>https://nathanlazo.website/articles/blockchain-for-business-and-companies</guid>
            <pubDate>Sun, 18 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Blockchain technology has gained immense popularity in recent years, and its potential 
  applications for businesses and companies are limitless.]]></description>
            <content:encoded><![CDATA[<p>Blockchain technology has gained immense popularity in recent years, and its potential applications for businesses and companies are limitless. The technology&#x27;s decentralized nature, transparency, and immutability make it an ideal solution for organizations looking to accelerate, decentralize, and innovate their processes</p>
<p>One of the most significant advantages of blockchain technology is its ability to create a tamper-proof and secure database. This feature is particularly useful for businesses that require secure and transparent record-keeping, such as financial institutions, supply chain management, and healthcare providers. The blockchain technology allows businesses to create a permanent, verifiable record of all transactions that cannot be altered or deleted by any one entity, ensuring that all data is accurate and immutable. This increased security and transparency are essential for businesses to maintain their reputation and build trust with their customers.</p>
<img alt="blockchain image" loading="lazy" width="1200" height="675" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fblockchain.20ad036c.jpg&amp;w=1200&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fblockchain.20ad036c.jpg&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fblockchain.20ad036c.jpg&amp;w=3840&amp;q=75"/>
<p>Another benefit of blockchain technology is its ability to automate complex processes, reducing the cost and time required for manual intervention. For instance, smart contracts can automate the execution of a contract&#x27;s terms, ensuring that all parties comply with the agreed-upon conditions. This automation can streamline business operations, reducing the risk of errors and increasing efficiency. The blockchain technology also allows businesses to track the progress of transactions in real-time, providing greater visibility and control over their operations.</p>
<p>Blockchain technology also enables businesses to create decentralized applications that run on a peer-to-peer network. This feature eliminates the need for intermediaries, reducing the cost and time required for transactions. Decentralized applications are particularly useful for businesses that require a high level of security and transparency, such as voting systems and digital identity management. For example, blockchain technology can be used to create a secure and transparent voting system, where each vote is recorded on a blockchain and cannot be altered or deleted.</p>
<img alt="business image" loading="lazy" width="1000" height="647" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fbusiness.5405878a.jpg&amp;w=1080&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fbusiness.5405878a.jpg&amp;w=2048&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fbusiness.5405878a.jpg&amp;w=2048&amp;q=75"/>
<p>Blockchain offers a range of benefits for businesses and companies looking to accelerate, decentralize, and innovate their processes. Its tamper-proof and secure nature, ability to automate complex processes, and support for decentralized applications make it an ideal solution for organizations looking to enhance their efficiency, transparency, and security. As the technology continues to evolve, businesses will have even more opportunities to leverage the benefits of blockchain technology to improve their operations and stay ahead of the competition.</p>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Revolutionizing Industries with Immersive Technologies]]></title>
            <link>https://nathanlazo.website/articles/metaverse-and-mixed-reality</link>
            <guid>https://nathanlazo.website/articles/metaverse-and-mixed-reality</guid>
            <pubDate>Sat, 17 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The world of technology is constantly evolving, and one of the most exciting developments in recent years is the emergence of the metaverse and mixed reality. In this article, we will delve into the concepts of mixed reality and the metaverse, exploring their potential impact on various industries and how companies can leverage them.]]></description>
            <content:encoded><![CDATA[<p>The concept of a metaverse has been around for decades, but with the recent rise of virtual and augmented reality technologies, it is finally becoming a reality. In this blog post, we will explore the metaverse, mixed reality, and their potential impact on various industries.</p>
<p>The metaverse is a universal mixed reality world facilitated by virtual and augmented reality headsets. It has gained significant attention in recent years as companies envision a future where individuals can coexist in immersive virtual settings. The metaverse has the potential to revolutionize industries, transforming the way we collaborate, design, and make decisions.</p>
<img alt="metaverse image" loading="lazy" width="1600" height="815" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmetaverse.5a7c63ca.jpg&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmetaverse.5a7c63ca.jpg&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmetaverse.5a7c63ca.jpg&amp;w=3840&amp;q=75"/>
<h2>Mixed Reality: Merging Real and Virtual Worlds</h2>
<p>Mixed Reality (MR) is at the core of the metaverse. It refers to the merging of real and virtual worlds, combining Physical Reality (PR), Augmented Reality (AR), Diminished Reality (DR), Augmented Virtuality (AV), and Virtual Reality (VR) <sup><a href="#user-content-fn-1%5E" id="user-content-fnref-1%5E" data-footnote-ref="true" aria-describedby="footnote-label">1</a></sup>.</p>
<p>In Physical Reality (PR), we experience the real world around us. On the other end of the spectrum, Virtual Reality (VR) generates a completely computer-generated reality. Augmented Reality (AR) enhances the real world by overlaying computer-generated information onto real-world objects. Diminished Reality (DR) involves removing or diminishing information from the real world, while Augmented Virtuality (AV) augments virtual environments with real-world objects or people <sup><a href="#user-content-fn-1%5E" id="user-content-fnref-1%5E-2" data-footnote-ref="true" aria-describedby="footnote-label">1</a></sup>.</p>
<p>The applications of mixed reality are diverse. In industries such as education and training, Virtual Reality (VR) is utilized to simulate real-world scenarios and provide immersive learning experiences. For example, VR can be used to train crane operators to manipulate heavy loads in adverse conditions, offering a safe and controlled environment for skill development <sup><a href="#user-content-fn-1%5E" id="user-content-fnref-1%5E-3" data-footnote-ref="true" aria-describedby="footnote-label">1</a></sup>.</p>
<h2>Understanding the Metaverse</h2>
<p>The term &quot;metaverse&quot; originated from Neal Stephenson&#x27;s science fiction novel &quot;Snow Crash&quot; and refers to a universal mixed reality world beyond our physical reality. It is a comprehensive virtual space that transcends our current limitations <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<p>Companies like Microsoft, Accenture, and Meta (formerly Facebook) are actively exploring the metaverse&#x27;s potential. They envision a future where individuals can coexist in virtual settings as avatars or holograms, enabling immersive experiences and collaboration. Microsoft&#x27;s Mesh for Teams application, for example, aims to provide access to virtual settings through mixed-reality headsets, smartphones, and laptops <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-2" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<h2>Digital Twins and the Metaverse</h2>
<p>Digital twins play a crucial role in the metaverse. They are real-time digital counterparts of physical objects, processes, or systems. By building metaverses, companies create virtual spaces where employees and consumers can interact through their digital twins <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-3" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<p>Automotive and aerospace companies, for instance, are leveraging digital twins to enhance collaboration and decision-making. Employees can virtually collaborate using their digital twins through various communication channels, including chats, emails, video calls, and face-to-face meetings. This virtual collaboration enables seamless interaction and unlocks new possibilities for remote work and global cooperation <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-4" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<h2>Powering the Metaverse: Fundamental Technologies</h2>
<p>Building and operating the metaverse require a range of fundamental technologies. These technologies can be categorized into five groups <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-5" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>:</p>
<ol>
<li>
<p><strong>Communications and Computing Infrastructure:</strong> The metaverse relies on robust communication networks and powerful computing infrastructure to perform large-scale, compute-intensive tasks and access extensive databases that merge the real and virtual worlds.</p>
</li>
<li>
<p><strong>Management Technology:</strong> Effective management technology is necessary to govern virtual spaces, facilitate user access and permissions, and manage content creation and moderation.</p>
</li>
<li>
<p><strong>Artificial Intelligence (AI) and Spatio-Temporal Consistency:</strong> Artificial Intelligence (AI) and spatio-temporal consistency are fundamental technologies that underpin the metaverse. AI enables intelligent interactions and simulations within the metaverse, while spatio-temporal consistency ensures consistency and synchronization across the real and virtual worlds.</p>
</li>
<li>
<p><strong>Virtual Reality Object Connection:</strong> Establishing 1:1 connections between real-world objects and their virtual counterparts is essential for the metaverse. Technologies like blockchain and identity modeling facilitate secure and seamless integration between the real and virtual worlds.</p>
</li>
<li>
<p><strong>Virtual Reality Space Convergence:</strong> The metaverse demands a new medium for interaction. Technologies such as Physical Reality (PR), Augmented Reality (AR), Diminished Reality (DR), Augmented Virtuality (AV), brain-computer interfaces (BCIs), and gaming technologies enable users to engage with the metaverse in immersive and interactive ways.</p>
</li>
</ol>
<img alt="holo lens image" loading="lazy" width="1920" height="1080" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fhololens.5b5f9a86.jpeg&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fhololens.5b5f9a86.jpeg&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fhololens.5b5f9a86.jpeg&amp;w=3840&amp;q=75"/>
<h2>Applications of the Metaverse in Various Industries</h2>
<p>The metaverse holds immense potential for transforming industries across the board. Let&#x27;s explore some examples:</p>
<h3>Automotive Industry</h3>
<p>In the automotive industry, the metaverse offers opportunities for optimizing production planning and accelerating design processes. Digital twins and virtual simulations enable automotive design teams to run complex simulations on virtual models, identifying optimizations that may be difficult to detect in the physical environment alone. By leveraging the power of simulation, automotive companies can make better business decisions and improve overall production efficiency <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-6" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<h3>Aerospace Industry</h3>
<p>Similar to the automotive industry, the aerospace sector can benefit from the metaverse&#x27;s capabilities. Design teams can utilize digital twins and simulation technologies to enhance design processes and improve product performance. The metaverse enables collaborative design reviews, virtual testing, and optimization, leading to accelerated innovation and increased efficiency in aerospace manufacturing <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-7" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<h3>Manufacturing Industry</h3>
<p>The manufacturing industry can leverage the metaverse to enhance production efficiency and accuracy. By creating virtual replicas of manufacturing processes, companies can simulate and optimize production lines, identify bottlenecks, and make informed decisions to streamline operations. The metaverse&#x27;s immersive nature allows manufacturers to visualize and analyze complex systems, leading to cost savings and improved quality <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-8" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<h3>Consumer-Packaged Goods Industry</h3>
<p>Consumer-packaged goods companies can utilize the metaverse to enhance product development, marketing, and consumer experiences. Virtual simulations and digital twins can aid in product design, testing, and optimization, ensuring better alignment with customer preferences. Additionally, the metaverse enables immersive virtual shopping experiences, allowing consumers to explore and interact with products in a virtual environment <sup><a href="#user-content-fn-2%5E" id="user-content-fnref-2%5E-9" data-footnote-ref="true" aria-describedby="footnote-label">2</a></sup>.</p>
<h2>Conclusion</h2>
<p>The metaverse and mixed reality technologies are poised to revolutionize industries by enabling immersive experiences, enhanced collaboration, and data-driven decision-making. As companies embrace digital twins, simulation technologies, and immersive reality solutions, they unlock new possibilities for innovation and efficiency. The metaverse represents a paradigm shift in how we interact with the digital world, bridging the gap between physical and virtual realities.</p>
<p>In the coming years, the metaverse will continue to evolve, offering limitless opportunities for industries to thrive in a new era of connectivity and innovation.</p>
<hr/>
<h3>Author</h3>
<ul>
<li>Nathan Lazo [<a href="https://github.com/NathanLazo">github</a>]</li>
</ul>
<p><strong>References:</strong></p>
<section data-footnotes="true" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1%5E">
<p>Meta.com. &quot;The Metaverse.&quot; Retrieved from <a href="https://about.meta.com/ltam/metaverse/">https://about.meta.com/ltam/metaverse/</a>. <a href="#user-content-fnref-1%5E" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩</a> <a href="#user-content-fnref-1%5E-2" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>2</sup></a> <a href="#user-content-fnref-1%5E-3" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>3</sup></a></p>
</li>
<li id="user-content-fn-2%5E">
<p>Wired. &quot;What Is the Metaverse?&quot; Retrieved from <a href="https://www.wired.com/story/what-is-the-metaverse/">https://www.wired.com/story/what-is-the-metaverse/</a>. <a href="#user-content-fnref-2%5E" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩</a> <a href="#user-content-fnref-2%5E-2" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>2</sup></a> <a href="#user-content-fnref-2%5E-3" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>3</sup></a> <a href="#user-content-fnref-2%5E-4" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>4</sup></a> <a href="#user-content-fnref-2%5E-5" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>5</sup></a> <a href="#user-content-fnref-2%5E-6" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>6</sup></a> <a href="#user-content-fnref-2%5E-7" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>7</sup></a> <a href="#user-content-fnref-2%5E-8" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>8</sup></a> <a href="#user-content-fnref-2%5E-9" data-footnote-backref="true" class="data-footnote-backref" aria-label="Back to content">↩<sup>9</sup></a></p>
</li>
</ol>
</section>]]></content:encoded>
        </item>
    </channel>
</rss>