<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Herramientas de desarrollo on KnightLi Blog</title>
        <link>https://knightli.com/es/categories/development-tools/</link>
        <description>Recent content in Herramientas de desarrollo on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Thu, 21 May 2026 08:02:32 +0800</lastBuildDate><atom:link href="https://knightli.com/es/categories/development-tools/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Graphify resuelve la mayor limitación de Claude Code: convertir un codebase en un grafo consultable por IA</title>
        <link>https://knightli.com/es/2026/05/21/safishamsi-graphify-ai-code-knowledge-graph/</link>
        <pubDate>Thu, 21 May 2026 08:02:32 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/21/safishamsi-graphify-ai-code-knowledge-graph/</guid>
        <description>&lt;p&gt;&lt;code&gt;safishamsi/graphify&lt;/code&gt; es una herramienta de grafo de conocimiento para asistentes de programación con IA. Su objetivo es directo: tomar el código, documentación, SQL schemas, scripts, papers, imágenes, video y audio dentro de una carpeta de proyecto, convertirlos en un grafo consultable y evitar que los asistentes de IA dependan solo de &lt;code&gt;grep&lt;/code&gt;, lectura completa de archivos o búsquedas improvisadas para entender el proyecto.&lt;/p&gt;
&lt;p&gt;Proyecto: &lt;a class=&#34;link&#34; href=&#34;https://github.com/safishamsi/graphify&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;safishamsi/graphify&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En el momento de preparar este artículo, la página de GitHub muestra unas 50.2k stars y 5.4k forks, con licencia MIT. El README lo describe así: escribe &lt;code&gt;/graphify&lt;/code&gt; en tu asistente de programación con IA y mapeará todo el proyecto como un grafo de conocimiento consultable.&lt;/p&gt;
&lt;h2 id=&#34;el-problema-central-que-resuelve&#34;&gt;El problema central que resuelve
&lt;/h2&gt;&lt;p&gt;Los asistentes de programación con IA son cada vez más potentes, pero en codebases reales todavía encuentran varios problemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No saben cómo se conectan los módulos clave.&lt;/li&gt;
&lt;li&gt;Leen muchos archivos, pero no forman un mapa general de arquitectura.&lt;/li&gt;
&lt;li&gt;La búsqueda encuentra texto, pero no dependencias aguas arriba y aguas abajo.&lt;/li&gt;
&lt;li&gt;Código, database schema, documentación e infraestructura están dispersos.&lt;/li&gt;
&lt;li&gt;En colaboración de equipo, cada persona puede tener un modelo mental distinto de la estructura del proyecto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Graphify intenta añadir una &amp;ldquo;capa de memoria&amp;rdquo; al proyecto. Conecta entidades de código, conceptos documentales, tablas de base de datos, configuración, notas de diseño y relaciones entre archivos para que el asistente de IA pueda consultar el grafo en lugar de escanear archivos desde cero cada vez.&lt;/p&gt;
&lt;h2 id=&#34;uso-mínimo&#34;&gt;Uso mínimo
&lt;/h2&gt;&lt;p&gt;El uso mínimo de Graphify es muy simple. Tras instalarlo, escribe esto en tu asistente de programación con IA:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En PowerShell, el &lt;code&gt;/&lt;/code&gt; inicial se interpreta como separador de ruta, así que en Windows PowerShell usa:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Después de ejecutarlo, genera el directorio &lt;code&gt;graphify-out/&lt;/code&gt; con tres archivos principales:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify-out/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── graph.html
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── GRAPH_REPORT.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── graph.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Cada archivo cumple una función:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;graph.html&lt;/code&gt;: grafo interactivo que se abre en el navegador, con nodos clicables, filtros y búsqueda.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GRAPH_REPORT.md&lt;/code&gt;: puntos destacados del proyecto, conceptos clave, conexiones inesperadas y preguntas sugeridas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;graph.json&lt;/code&gt;: grafo completo, consultable después sin volver a leer todos los archivos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para generar una página de arquitectura más legible con diagramas Mermaid de flujo de llamadas, ejecuta:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; callflow-html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;instalación-y-soporte-de-plataformas&#34;&gt;Instalación y soporte de plataformas
&lt;/h2&gt;&lt;p&gt;El paquete de Graphify en PyPI se llama &lt;code&gt;graphifyy&lt;/code&gt;, con doble &lt;code&gt;y&lt;/code&gt;. El README advierte que otros paquetes &lt;code&gt;graphify*&lt;/code&gt; en PyPI no están afiliados al proyecto, aunque el comando CLI sigue siendo &lt;code&gt;graphify&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La instalación recomendada es:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv tool install graphifyy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También puedes usar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pipx install graphifyy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install graphifyy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Después, regístralo con tu asistente de IA:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El proyecto soporta muchas plataformas, incluidas Claude Code, Codex, OpenCode, GitHub Copilot CLI, VS Code Copilot Chat, Aider, Cursor, Gemini CLI, Kimi Code, Kiro y Google Antigravity. Cada plataforma puede usar comandos distintos, por ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify install --platform codex
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify install --platform gemini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify cursor install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify antigravity install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Los usuarios de Codex también deben añadir esto bajo &lt;code&gt;[features]&lt;/code&gt; en &lt;code&gt;~/.codex/config.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;multi_agent&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El README también indica que Codex usa &lt;code&gt;$graphify&lt;/code&gt;, no &lt;code&gt;/graphify&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;qué-archivos-puede-procesar&#34;&gt;Qué archivos puede procesar
&lt;/h2&gt;&lt;p&gt;Graphify cubre muchos tipos de entrada.&lt;/p&gt;
&lt;p&gt;En código, soporta 31 lenguajes, incluidos Python, TypeScript, JavaScript, Go, Rust, Java, C/C++, Ruby, C#, Kotlin, Scala, PHP, Swift, Lua, Zig, PowerShell, SQL, Shell, JSON y más.&lt;/p&gt;
&lt;p&gt;En documentación, soporta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.mdx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.qmd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.rst&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;También puede ampliarse con dependencias opcionales:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[pdf]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[office]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[video]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[mcp]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[neo4j]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[sql]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install &lt;span class=&#34;s2&#34;&gt;&amp;#34;graphifyy[all]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;pdf&lt;/code&gt; sirve para extracción PDF, &lt;code&gt;office&lt;/code&gt; para &lt;code&gt;.docx&lt;/code&gt; y &lt;code&gt;.xlsx&lt;/code&gt;, &lt;code&gt;video&lt;/code&gt; para transcripción de video y audio, &lt;code&gt;mcp&lt;/code&gt; para MCP stdio server, &lt;code&gt;neo4j&lt;/code&gt; para enviar a Neo4j, y &lt;code&gt;sql&lt;/code&gt; para extracción de SQL schema.&lt;/p&gt;
&lt;h2 id=&#34;qué-valor-tiene-el-informe-generado&#34;&gt;Qué valor tiene el informe generado
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GRAPH_REPORT.md&lt;/code&gt; no es un resumen normal. Selecciona relaciones del proyecto que son especialmente útiles para asistentes de IA.&lt;/p&gt;
&lt;p&gt;El README menciona contenidos como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;God nodes&lt;/code&gt;: los conceptos centrales más conectados del proyecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Surprising connections&lt;/code&gt;: enlaces inesperados entre archivos o módulos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;The why&lt;/code&gt;: razones de diseño extraídas de comentarios, docstrings y documentos de diseño.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Suggested questions&lt;/code&gt;: preguntas que el grafo está especialmente preparado para responder.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Confidence tags&lt;/code&gt;: cada relación se marca como &lt;code&gt;EXTRACTED&lt;/code&gt;, &lt;code&gt;INFERRED&lt;/code&gt; o &lt;code&gt;AMBIGUOUS&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto es importante. Una búsqueda normal solo dice &amp;ldquo;dónde aparece esta palabra&amp;rdquo;. Un grafo puede responder &amp;ldquo;con qué módulos, configuraciones, tablas y documentos se conecta este concepto&amp;rdquo;. En codebases grandes, eso se acerca más a entender la arquitectura que una simple búsqueda de texto completo.&lt;/p&gt;
&lt;h2 id=&#34;comandos-comunes&#34;&gt;Comandos comunes
&lt;/h2&gt;&lt;p&gt;Comandos comunes de Graphify:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify ./docs --update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify . --cluster-only
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify . --no-viz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify . --wiki
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; callflow-html
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify query &lt;span class=&#34;s2&#34;&gt;&amp;#34;what connects auth to the database?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify path &lt;span class=&#34;s2&#34;&gt;&amp;#34;UserService&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DatabasePool&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify explain &lt;span class=&#34;s2&#34;&gt;&amp;#34;RateLimiter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También puedes añadir un paper o video al grafo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify add https://arxiv.org/abs/1706.03762
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify add &amp;lt;youtube-url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para análisis asistido de PR:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify prs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify prs &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify prs --triage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify prs --conflicts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Estos comandos encajan con revisiones de código: ver qué comunidades del grafo afecta un PR, si hay riesgo de conflicto con otros PRs y qué review queue conviene priorizar.&lt;/p&gt;
&lt;h2 id=&#34;relación-con-mcp-neo4j-y-ci&#34;&gt;Relación con MCP, Neo4j y CI
&lt;/h2&gt;&lt;p&gt;Graphify no solo genera un grafo HTML. También puede exponer el grafo a asistentes de IA para uso repetido.&lt;/p&gt;
&lt;p&gt;Por ejemplo, puedes iniciar un MCP server:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -m graphify.serve graphify-out/graph.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El MCP server ofrece capacidades como &lt;code&gt;query_graph&lt;/code&gt;, &lt;code&gt;get_node&lt;/code&gt;, &lt;code&gt;get_neighbors&lt;/code&gt;, &lt;code&gt;shortest_path&lt;/code&gt;, &lt;code&gt;list_prs&lt;/code&gt;, &lt;code&gt;get_pr_impact&lt;/code&gt; y &lt;code&gt;triage_prs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;También soporta exportación o push a Neo4j:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify ./raw --neo4j
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/graphify ./raw --neo4j-push bolt://localhost:7687
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para trabajo en equipo, el README recomienda poder commitear &lt;code&gt;graphify-out/&lt;/code&gt;, de modo que todos empiecen con el mismo mapa del proyecto. También puedes ejecutar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;graphify hook install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Así el grafo se reconstruye automáticamente después de cada git commit y se configura un merge driver para evitar que &lt;code&gt;graph.json&lt;/code&gt; quede con marcadores de conflicto cuando varias personas commitean en paralelo.&lt;/p&gt;
&lt;h2 id=&#34;privacidad-y-coste&#34;&gt;Privacidad y coste
&lt;/h2&gt;&lt;p&gt;El README de Graphify explica bastante bien los límites de privacidad.&lt;/p&gt;
&lt;p&gt;Los archivos de código se parsean localmente con tree-sitter y no generan llamadas API. Video y audio pueden transcribirse localmente con faster-whisper. Docs, PDFs e imágenes para extracción semántica pasan por la API del modelo usado por tu asistente de IA.&lt;/p&gt;
&lt;p&gt;Si usas headless &lt;code&gt;graphify extract&lt;/code&gt;, puede que necesites estas variables de entorno:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ANTHROPIC_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GEMINI_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GOOGLE_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OPENAI_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DEEPSEEK_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MOONSHOT_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OLLAMA_BASE_URL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También pueden usarse backends como Ollama local, AWS Bedrock o Claude Code CLI. El README indica además que el proyecto no tiene telemetry, usage tracking ni analytics.&lt;/p&gt;
&lt;p&gt;En la práctica, conviene recordar que parsear código localmente no significa que todo se quede offline. Si intervienen docs, PDFs, imágenes o modelos cloud, hay que revisar backend, API keys, cumplimiento empresarial y límites de datos.&lt;/p&gt;
&lt;h2 id=&#34;escenarios-adecuados&#34;&gt;Escenarios adecuados
&lt;/h2&gt;&lt;p&gt;Graphify encaja con varios tipos de usuarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Desarrolladores que quieren que Claude Code, Codex, Cursor y Gemini CLI entiendan mejor la estructura del proyecto.&lt;/li&gt;
&lt;li&gt;Personas que necesitan comprender rápido un codebase grande y desconocido.&lt;/li&gt;
&lt;li&gt;Equipos que quieren analizar juntos código, SQL schema, documentación y configuración.&lt;/li&gt;
&lt;li&gt;Personas que hacen revisión de arquitectura, PR review o análisis de impacto de refactors.&lt;/li&gt;
&lt;li&gt;Equipos que quieren exponer conocimiento del proyecto como herramienta MCP para Agents.&lt;/li&gt;
&lt;li&gt;Líderes técnicos que quieren conservar un &amp;ldquo;mapa del proyecto&amp;rdquo; para el equipo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No es necesario para todos los proyectos. En scripts pequeños, demos puntuales o repositorios muy simples, una búsqueda normal y el README quizá basten. El valor de Graphify aparece con más claridad en proyectos con muchos módulos, mucha documentación, mucha colaboración y uso frecuente de asistentes de IA.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Graphify importa porque mueve el contexto de los asistentes de programación con IA desde &amp;ldquo;leer archivos temporalmente&amp;rdquo; hacia &amp;ldquo;un grafo de conocimiento del proyecto consultable y persistente&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Para desarrolladores, no reemplaza el IDE, la búsqueda o el LSP. Añade una capa de memoria estructurada para asistentes de IA: qué módulos importan, qué conceptos están muy conectados, qué documentos explican decisiones de diseño y qué comunidades puede afectar un PR. A medida que herramientas Agent como Codex, Claude Code, Gemini CLI y Antigravity se vuelvan más comunes, esta capa de grafo del proyecto será cada vez más útil.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/safishamsi/graphify&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub: safishamsi/graphify&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Qué es Vercel AI SDK: un toolkit unificado para desarrolladores TypeScript que crean apps de IA</title>
        <link>https://knightli.com/es/2026/05/17/vercel-ai-sdk-typescript-agent-toolkit/</link>
        <pubDate>Sun, 17 May 2026 23:07:38 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/17/vercel-ai-sdk-typescript-agent-toolkit/</guid>
        <description>&lt;p&gt;&lt;code&gt;vercel/ai&lt;/code&gt; es el AI SDK open source mantenido por Vercel.&lt;/p&gt;
&lt;p&gt;Su posicionamiento es claro: ofrece a los desarrolladores TypeScript un conjunto de herramientas unificado para crear aplicaciones de IA y AI Agents. Viene del equipo detrás de Next.js, pero no se limita a Next.js. También soporta React, Svelte, Vue, Angular y runtimes como Node.js.&lt;/p&gt;
&lt;p&gt;Repositorio del proyecto: &lt;a class=&#34;link&#34; href=&#34;https://github.com/vercel/ai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/vercel/ai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si estás creando una app de chat, una herramienta de escritura con IA, una aplicación RAG, un Agent con tool calling, una interfaz con salida en streaming, o un producto que debe conectar varios proveedores de modelos en la misma aplicación, Vercel AI SDK merece atención.&lt;/p&gt;
&lt;h2 id=&#34;el-problema-central-que-resuelve&#34;&gt;El problema central que resuelve
&lt;/h2&gt;&lt;p&gt;Hoy, al crear aplicaciones de IA, uno de los mayores problemas no es &amp;ldquo;si se puede llamar a un modelo&amp;rdquo;, sino que cada proveedor tiene APIs, formatos de streaming, convenciones de tool calling, manejo de errores y necesidades de estado en frontend distintas.&lt;/p&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI tiene su propio SDK y formatos de respuesta.&lt;/li&gt;
&lt;li&gt;Anthropic tiene su propia estructura de mensajes.&lt;/li&gt;
&lt;li&gt;Google, xAI, Mistral, DeepSeek, Groq y otros también difieren.&lt;/li&gt;
&lt;li&gt;La salida en streaming requiere manejar chunks.&lt;/li&gt;
&lt;li&gt;El tool calling requiere procesar solicitudes estructuradas iniciadas por el modelo.&lt;/li&gt;
&lt;li&gt;La UI de chat también debe gestionar mensajes, estados de carga, cancelación, reintentos y errores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si escribes un adaptador manual para cada proveedor, el proyecto se vuelve complejo muy rápido.&lt;/p&gt;
&lt;p&gt;La idea de Vercel AI SDK es reunir esas diferencias detrás de una API unificada. El desarrollador escribe la aplicación contra una sola interfaz y conecta distintos modelos mediante Providers.&lt;/p&gt;
&lt;h2 id=&#34;arquitectura-unificada-de-providers&#34;&gt;Arquitectura unificada de Providers
&lt;/h2&gt;&lt;p&gt;Una característica clave de Vercel AI SDK es que es provider-agnostic, es decir, no está atado a un único proveedor de modelos.&lt;/p&gt;
&lt;p&gt;Puede acceder a OpenAI, Anthropic, Google y otros proveedores mediante una API unificada. El README del proyecto también indica que AI SDK usa Vercel AI Gateway de forma predeterminada, lo que facilita acceder a varios providers principales.&lt;/p&gt;
&lt;p&gt;Esto es útil en proyectos reales.&lt;/p&gt;
&lt;p&gt;Muchos productos de IA terminan usando más de un modelo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Algunas tareas necesitan modelos de razonamiento fuerte.&lt;/li&gt;
&lt;li&gt;Algunas tareas necesitan modelos rápidos y baratos.&lt;/li&gt;
&lt;li&gt;Algunas tareas requieren multimodalidad.&lt;/li&gt;
&lt;li&gt;Algunas tareas requieren contexto largo.&lt;/li&gt;
&lt;li&gt;Algunas tareas necesitan modelos locales o privados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una arquitectura unificada de Providers facilita el cambio de modelo, las pruebas graduales, el control de costos y las estrategias de fallback.&lt;/p&gt;
&lt;h2 id=&#34;el-streaming-es-clave-para-la-experiencia-frontend&#34;&gt;El streaming es clave para la experiencia frontend
&lt;/h2&gt;&lt;p&gt;Una gran diferencia entre las apps de IA y las APIs tradicionales es que las respuestas pueden ser largas.&lt;/p&gt;
&lt;p&gt;Si el usuario debe esperar a que vuelva toda la respuesta, las herramientas de chat, escritura y programación se sienten lentas. La salida en streaming permite mostrar texto de forma progresiva, para que el usuario vea avance antes.&lt;/p&gt;
&lt;p&gt;Vercel AI SDK encapsula bastante bien la generación en streaming. El desarrollador no necesita manejar desde cero eventos de bajo nivel, sino usar las APIs de generación y streaming del SDK para conectar la salida del modelo con la UI.&lt;/p&gt;
&lt;p&gt;Esto resulta especialmente cómodo en aplicaciones Next.js / React.&lt;/p&gt;
&lt;p&gt;Una interfaz de chat con IA parece simple, pero en realidad debe manejar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lista de mensajes.&lt;/li&gt;
&lt;li&gt;Entrada del usuario.&lt;/li&gt;
&lt;li&gt;Solicitudes al servidor.&lt;/li&gt;
&lt;li&gt;Visualización de tokens en streaming.&lt;/li&gt;
&lt;li&gt;Estado de carga.&lt;/li&gt;
&lt;li&gt;Estado de error.&lt;/li&gt;
&lt;li&gt;Cancelación de generación.&lt;/li&gt;
&lt;li&gt;Regeneración.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas son las tareas repetitivas que AI SDK intenta reducir.&lt;/p&gt;
&lt;h2 id=&#34;tool-calling-y-escenarios-de-agent&#34;&gt;Tool calling y escenarios de Agent
&lt;/h2&gt;&lt;p&gt;A medida que las aplicaciones de IA pasan de &amp;ldquo;chatear&amp;rdquo; a &amp;ldquo;hacer cosas&amp;rdquo;, el tool calling se vuelve cada vez más importante.&lt;/p&gt;
&lt;p&gt;El modelo no solo devuelve lenguaje natural; también puede necesitar llamar funciones externas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consultar una base de datos.&lt;/li&gt;
&lt;li&gt;Buscar documentos.&lt;/li&gt;
&lt;li&gt;Llamar APIs de negocio.&lt;/li&gt;
&lt;li&gt;Leer el estado de un pedido.&lt;/li&gt;
&lt;li&gt;Generar gráficos.&lt;/li&gt;
&lt;li&gt;Crear eventos de calendario.&lt;/li&gt;
&lt;li&gt;Modificar archivos de proyecto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vercel AI SDK soporta capacidades de tool calling, para que el desarrollador defina herramientas, parámetros y lógica de ejecución, y el modelo pueda solicitar esas herramientas cuando corresponda.&lt;/p&gt;
&lt;p&gt;Esta es una de las razones por las que pasó de ser un &amp;ldquo;SDK de UI de chat&amp;rdquo; a un toolkit más amplio para aplicaciones de IA y Agents.&lt;/p&gt;
&lt;p&gt;Pero añadir tool calling no lo resuelve todo. En proyectos reales también hay que considerar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validación de parámetros.&lt;/li&gt;
&lt;li&gt;Límites de permisos.&lt;/li&gt;
&lt;li&gt;Logs de llamadas a herramientas.&lt;/li&gt;
&lt;li&gt;Idempotencia.&lt;/li&gt;
&lt;li&gt;Timeouts y reintentos.&lt;/li&gt;
&lt;li&gt;Confirmación humana.&lt;/li&gt;
&lt;li&gt;Restricciones para acciones sensibles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI SDK puede ayudar con interfaces y flujo, pero los límites de seguridad los debe diseñar el desarrollador.&lt;/p&gt;
&lt;h2 id=&#34;integración-de-ui&#34;&gt;Integración de UI
&lt;/h2&gt;&lt;p&gt;Vercel AI SDK es amigable con frameworks frontend.&lt;/p&gt;
&lt;p&gt;No solo ofrece APIs centrales de generación; también abstrae chat, completions, estado de mensajes y UI en streaming. Para equipos que usan Next.js y React, esto puede reducir mucho código repetitivo.&lt;/p&gt;
&lt;p&gt;Pero no sirve únicamente para despliegues en Vercel.&lt;/p&gt;
&lt;p&gt;Si tu proyecto usa TypeScript, o tu backend corre en Node.js, AI SDK puede funcionar como capa de llamada a modelos y procesamiento de streaming. Desplegar o no en Vercel depende de la arquitectura, hábitos del equipo e infraestructura.&lt;/p&gt;
&lt;h2 id=&#34;skill-for-coding-agents&#34;&gt;Skill for Coding Agents
&lt;/h2&gt;&lt;p&gt;El README de &lt;code&gt;vercel/ai&lt;/code&gt; incluye una sugerencia interesante: si usas coding agents como Claude Code o Cursor, puedes añadir el skill de AI SDK al repositorio.&lt;/p&gt;
&lt;p&gt;El comando de ejemplo es:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx skills add vercel/ai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto muestra que Vercel entiende que los usuarios de AI SDK no son solo desarrolladores humanos, sino también coding agents.&lt;/p&gt;
&lt;p&gt;Cuando un agent modifica un proyecto que usa AI SDK, un skill dedicado en el repositorio puede ayudarle a entender convenciones del SDK, APIs frecuentes, estructura del proyecto y buenas prácticas, reduciendo la probabilidad de cambios desordenados.&lt;/p&gt;
&lt;p&gt;Esta dirección merece seguimiento.&lt;/p&gt;
&lt;p&gt;En el futuro, los proyectos open source quizá no solo ofrezcan README y documentación, sino también instrucciones estructuradas para AI coding agents. En SDKs complejos, eso puede convertirse en una nueva puerta de entrada a la experiencia de desarrollo.&lt;/p&gt;
&lt;h2 id=&#34;proyectos-para-los-que-encaja&#34;&gt;Proyectos para los que encaja
&lt;/h2&gt;&lt;p&gt;Vercel AI SDK encaja en estos escenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apps de chat con IA basadas en Next.js / React.&lt;/li&gt;
&lt;li&gt;Herramientas de escritura, preguntas y respuestas, soporte y asistentes de código que necesitan streaming.&lt;/li&gt;
&lt;li&gt;Productos de IA que deben conectar varios model providers.&lt;/li&gt;
&lt;li&gt;Equipos que quieren crear prototipos RAG o de preguntas sobre documentos rápidamente.&lt;/li&gt;
&lt;li&gt;Apps que necesitan tool calling, function calling o capacidades ligeras de Agent.&lt;/li&gt;
&lt;li&gt;Equipos que ya usan TypeScript / Node.js.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es especialmente útil para desarrolladores frontend y full-stack. En muchas apps de IA, la dificultad no es solo llamar al modelo, sino convertir la salida del modelo en una experiencia estable, fluida e interactiva.&lt;/p&gt;
&lt;h2 id=&#34;para-qué-no-encaja-tanto&#34;&gt;Para qué no encaja tanto
&lt;/h2&gt;&lt;p&gt;Si tu proyecto es principalmente un backend Python, entrenamiento de deep learning, fine-tuning de modelos o servicio de inferencia de bajo nivel, Vercel AI SDK quizá no sea la herramienta central.&lt;/p&gt;
&lt;p&gt;Está más cerca de la capa de aplicación que de un framework de entrenamiento.&lt;/p&gt;
&lt;p&gt;Si necesitas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Entrenar tu propio modelo.&lt;/li&gt;
&lt;li&gt;Gestionar clusters de inferencia con GPU.&lt;/li&gt;
&lt;li&gt;Hacer batch inference de bajo nivel.&lt;/li&gt;
&lt;li&gt;Controlar profundamente tokenizer, KV cache, cuantización y motores de inferencia.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conviene mirar PyTorch, vLLM, SGLang, TensorRT-LLM, llama.cpp o servicios cloud de inferencia.&lt;/p&gt;
&lt;p&gt;Vercel AI SDK se parece más a la capa que conecta capacidades de modelos con productos.&lt;/p&gt;
&lt;h2 id=&#34;qué-tener-en-cuenta-al-usarlo&#34;&gt;Qué tener en cuenta al usarlo
&lt;/h2&gt;&lt;p&gt;Primero, no interpretes una API unificada como ausencia total de diferencias.&lt;/p&gt;
&lt;p&gt;Los distintos model providers siguen variando en capacidades, longitud de contexto, formatos de tool calling, detalles de streaming, tipos de error y precios. Un SDK unificado reduce fricción de ingeniería, pero no elimina las diferencias entre modelos.&lt;/p&gt;
&lt;p&gt;Segundo, controla costos.&lt;/p&gt;
&lt;p&gt;Cuando una app de IA sale a producción, el chat en streaming, los reintentos, tool calls, recuperación RAG y fallbacks multi-modelo pueden aumentar costos. Hace falta rate limiting, caché, logs y monitoreo de presupuesto.&lt;/p&gt;
&lt;p&gt;Tercero, diseña límites de seguridad.&lt;/p&gt;
&lt;p&gt;Si el modelo puede llamar herramientas, debes limitar qué pueden hacer esas herramientas. No dejes que el modelo ejecute directamente acciones de alto riesgo, ni expongas secretos, permisos de escritura en bases de datos u operaciones de producción sin controles.&lt;/p&gt;
&lt;p&gt;Cuarto, conserva observabilidad.&lt;/p&gt;
&lt;p&gt;Cuando una app de IA falla, no basta con mirar el error del frontend. Necesitas saber entrada del usuario, modelo elegido, llamadas a herramientas, tiempo de respuesta, consumo de tokens, tipo de error y salida final.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;vercel/ai&lt;/code&gt; no es un modelo nuevo, ni solo un componente de chat.&lt;/p&gt;
&lt;p&gt;Se parece más a infraestructura para desarrollar aplicaciones de IA con TypeScript: Providers unificados, salida en streaming, tool calling, gestión de estado frontend y escenarios de Agent dentro de un SDK open source.&lt;/p&gt;
&lt;p&gt;Para equipos que ya usan Next.js, React, TypeScript y Node.js, puede reducir mucho el costo de ingeniería entre &amp;ldquo;la API del modelo funciona&amp;rdquo; y &amp;ldquo;la experiencia de producto es usable&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Pero no es una capa universal. La elección de modelos, permisos, control de costos, logs, monitoreo y seguridad de negocio siguen siendo responsabilidad del desarrollador.&lt;/p&gt;
&lt;p&gt;Si quieres crear aplicaciones de IA, no entrenar modelos, Vercel AI SDK es un toolkit que vale la pena probar temprano.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/vercel/ai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Repositorio GitHub de vercel/ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ai-sdk.dev/docs/introduction&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AI SDK Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://vercel.com/blog/introducing-the-vercel-ai-sdk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vercel: Introducing the Vercel AI SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Bun: runtime, gestor de paquetes, pruebas y bundler de JavaScript en una sola herramienta</title>
        <link>https://knightli.com/es/2026/05/17/bun-javascript-toolkit/</link>
        <pubDate>Sun, 17 May 2026 17:42:25 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/17/bun-javascript-toolkit/</guid>
        <description>&lt;p&gt;Bun es una toolchain open source todo en uno para JavaScript / TypeScript creada por oven-sh.&lt;/p&gt;
&lt;p&gt;No quiere ser solo un reemplazo más rápido de Node.js. Reúne runtime, gestor de paquetes, runner de scripts, test runner y bundler bajo el mismo comando &lt;code&gt;bun&lt;/code&gt;. Para desarrolladores frontend y Node.js, su atractivo es claro: menos herramientas, menos espera en instalación y build, y muchas tareas comunes con un solo comando.&lt;/p&gt;
&lt;p&gt;Proyecto: &lt;a class=&#34;link&#34; href=&#34;https://github.com/oven-sh/bun&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/oven-sh/bun&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;conclusión-rápida&#34;&gt;Conclusión rápida
&lt;/h2&gt;&lt;p&gt;Bun encaja mejor con quienes quieren simplificar la toolchain JavaScript.&lt;/p&gt;
&lt;p&gt;Puede:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ejecutar JavaScript, TypeScript, JSX y TSX.&lt;/li&gt;
&lt;li&gt;Funcionar como runtime compatible con Node.js.&lt;/li&gt;
&lt;li&gt;Reemplazar npm / yarn / pnpm para gestionar paquetes.&lt;/li&gt;
&lt;li&gt;Ejecutar scripts de &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar pruebas.&lt;/li&gt;
&lt;li&gt;Empaquetar código frontend o backend.&lt;/li&gt;
&lt;li&gt;Usar &lt;code&gt;bunx&lt;/code&gt; para ejecutar comandos de paquetes npm.&lt;/li&gt;
&lt;li&gt;Ofrecer API integradas como &lt;code&gt;Bun.serve&lt;/code&gt;, &lt;code&gt;bun:sqlite&lt;/code&gt;, &lt;code&gt;Bun.sql&lt;/code&gt;, &lt;code&gt;Bun.redis&lt;/code&gt; y &lt;code&gt;Bun.s3&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Su valor más visible es la experiencia de desarrollo: instalaciones rápidas, arranque rápido, comandos unificados y TypeScript / JSX listos para usar.&lt;/p&gt;
&lt;p&gt;Pero Bun no es algo que todos los proyectos deban adoptar de inmediato. Aplicaciones Node.js grandes, proyectos con muchas extensiones nativas y servicios de producción con requisitos altos de estabilidad necesitan validar compatibilidad, build, pruebas y despliegue.&lt;/p&gt;
&lt;h2 id=&#34;qué-es-bun&#34;&gt;Qué es Bun
&lt;/h2&gt;&lt;p&gt;Según el README oficial, Bun es un toolkit todo en uno para aplicaciones JavaScript y TypeScript. Se distribuye como un único ejecutable llamado &lt;code&gt;bun&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Su núcleo es Bun runtime: un runtime JavaScript rápido que busca actuar como drop-in replacement de Node.js. Bun está escrito en Zig, se basa en JavaScriptCore y optimiza arranque y uso de memoria.&lt;/p&gt;
&lt;p&gt;Puedes ejecutar directamente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run index.tsx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;TypeScript y JSX funcionan sin configuración adicional.&lt;/p&gt;
&lt;p&gt;El mismo comando &lt;code&gt;bun&lt;/code&gt; incluye test runner, script runner, gestor de paquetes compatible con Node.js, bundler y package runner.&lt;/p&gt;
&lt;p&gt;Comandos frecuentes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install &amp;lt;pkg&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bunx cowsay &lt;span class=&#34;s1&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Un proyecto típico puede acabar con &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;pnpm&lt;/code&gt;, &lt;code&gt;tsx&lt;/code&gt;, &lt;code&gt;jest&lt;/code&gt;, &lt;code&gt;vitest&lt;/code&gt;, &lt;code&gt;webpack&lt;/code&gt;, &lt;code&gt;esbuild&lt;/code&gt; y &lt;code&gt;ts-node&lt;/code&gt;. Bun intenta absorber muchas rutas frecuentes en una sola herramienta.&lt;/p&gt;
&lt;h2 id=&#34;instalación&#34;&gt;Instalación
&lt;/h2&gt;&lt;p&gt;Bun soporta Linux, macOS y Windows en x64 y arm64.&lt;/p&gt;
&lt;p&gt;Script oficial:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://bun.com/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm bun.sh/install.ps1 | iex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También se puede instalar con npm:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g bun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;macOS Homebrew:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew tap oven-sh/bun
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install bun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Docker:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker pull oven/bun
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm --init --ulimit &lt;span class=&#34;nv&#34;&gt;memlock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;-1:-1 oven/bun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En Linux hay que mirar la versión del kernel. El README recomienda Linux kernel &lt;code&gt;5.6&lt;/code&gt; o superior, con &lt;code&gt;5.1&lt;/code&gt; como mínimo.&lt;/p&gt;
&lt;p&gt;Actualizar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Actualizar a canary:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun upgrade --canary
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Canary no suele ser buena opción para producción salvo que estés validando una función nueva o investigando un bug concreto.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-bun-es-rápido&#34;&gt;Por qué Bun es rápido
&lt;/h2&gt;&lt;p&gt;La velocidad de Bun viene de varias capas.&lt;/p&gt;
&lt;p&gt;Primero, el arranque del runtime es rápido. Muchas herramientas CLI y scripts de desarrollo no están limitados por CPU sostenida, sino por arranque de proceso, carga de módulos, transpilación TypeScript y resolución de dependencias. Bun optimiza esas rutas.&lt;/p&gt;
&lt;p&gt;Segundo, la gestión de paquetes es rápida. &lt;code&gt;bun install&lt;/code&gt; busca reemplazar los flujos de instalación de npm / yarn / pnpm. Usa caché global y su propio lockfile, lo que puede reducir mucho la espera con muchas dependencias.&lt;/p&gt;
&lt;p&gt;Tercero, TypeScript / JSX funcionan sin configuración. Muchos proyectos solo quieren ejecutar un &lt;code&gt;.ts&lt;/code&gt; o &lt;code&gt;.tsx&lt;/code&gt;; con Node.js tradicional se añaden &lt;code&gt;tsx&lt;/code&gt;, &lt;code&gt;ts-node&lt;/code&gt;, Babel o un build. Bun puede ejecutarlos directamente.&lt;/p&gt;
&lt;p&gt;Cuarto, las herramientas integradas reducen cambios de proceso y configuración. Pruebas, scripts, bundling y ejecución viven en la misma herramienta.&lt;/p&gt;
&lt;p&gt;Aun así, “Bun es rápido” no significa que todo proyecto vaya a ser más rápido. Depende de dependencias, lógica de scripts, framework de pruebas, build, uso de API Node.js y caché de CI.&lt;/p&gt;
&lt;h2 id=&#34;gestión-de-paquetes-reemplazar-npm--yarn--pnpm&#34;&gt;Gestión de paquetes: reemplazar npm / yarn / pnpm
&lt;/h2&gt;&lt;p&gt;Bun instala dependencias directamente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Añadir dependencia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun add react
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Añadir dependencia de desarrollo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun add -d typescript
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Eliminar dependencia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun remove react
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ver por qué existe una dependencia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun why react
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Auditoría de seguridad:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun audit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si migras desde npm o pnpm, revisa si &lt;code&gt;bun.lock&lt;/code&gt; entra en control de versiones, si CI usa &lt;code&gt;bun install --frozen-lockfile&lt;/code&gt;, si private registries y &lt;code&gt;.npmrc&lt;/code&gt; son compatibles, si workspace se comporta como esperas, si lifecycle scripts introducen riesgo y si un monorepo dependiente de pnpm puede migrar sin fricción.&lt;/p&gt;
&lt;p&gt;Los proyectos pequeños pueden probarlo directamente. En monorepos grandes, empieza por un package o un job de CI no bloqueante.&lt;/p&gt;
&lt;h2 id=&#34;ejecutar-scripts-y-typescript&#34;&gt;Ejecutar scripts y TypeScript
&lt;/h2&gt;&lt;p&gt;Bun ejecuta scripts de &lt;code&gt;package.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También ejecuta archivos directamente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run index.ts
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run index.tsx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Es útil para scripts como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scripts/build.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/seed.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/migrate.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scripts/check.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con Node.js, muchas veces hay que resolver loader TypeScript o precompilación. Bun reduce ese pegamento.&lt;/p&gt;
&lt;p&gt;Si un script depende de detalles de Node.js, como loaders, frontera ESM/CJS, módulos nativos, child process, file watching o API de borde, sigue necesitando pruebas.&lt;/p&gt;
&lt;h2 id=&#34;test-runner&#34;&gt;Test runner
&lt;/h2&gt;&lt;p&gt;Bun incluye test runner:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Encaja en proyectos pequeños que quieren menos configuración Jest / Vitest, y también para mover algunas pruebas unitarias, de herramientas o de librerías a un runner más ligero.&lt;/p&gt;
&lt;p&gt;Al migrar pruebas, mira diferencias en &lt;code&gt;expect&lt;/code&gt;, mock API, snapshots, entorno DOM, reglas de descubrimiento, cobertura y reportes de CI.&lt;/p&gt;
&lt;p&gt;Si el proyecto depende profundamente de Jest, con matchers propios, mocks complejos, jsdom, babel-jest o ts-jest, no conviene migrar deprisa. Puedes usar &lt;code&gt;bun test&lt;/code&gt; en módulos nuevos y conservar el framework anterior para lo existente.&lt;/p&gt;
&lt;h2 id=&#34;bundling-y-build&#34;&gt;Bundling y build
&lt;/h2&gt;&lt;p&gt;Bun ofrece bundler:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun build ./src/index.ts --outdir ./dist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Puede usarse para bundles frontend, scripts backend, CLI y librerías. La documentación cubre loaders, plugins, macros, CSS, HTML, HMR, minifier y single-file executable.&lt;/p&gt;
&lt;p&gt;Buenos candidatos iniciales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Herramientas frontend pequeñas.&lt;/li&gt;
&lt;li&gt;CLI Node.js.&lt;/li&gt;
&lt;li&gt;Scripts internos.&lt;/li&gt;
&lt;li&gt;Servicios de un solo archivo.&lt;/li&gt;
&lt;li&gt;Proyectos sin loaders webpack complejos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ten cuidado con cadenas webpack complejas, muchos plugins Vite, transformaciones Babel profundas, pipelines CSS / assets especiales, micro-frontends, module federation y proyectos con requisitos finos de hash, chunks y compatibilidad.&lt;/p&gt;
&lt;p&gt;El bundler de Bun es atractivo, pero migrar build suele ser más arriesgado que cambiar el gestor de paquetes. Valídalo por separado.&lt;/p&gt;
&lt;h2 id=&#34;ejecutar-servicios-http&#34;&gt;Ejecutar servicios HTTP
&lt;/h2&gt;&lt;p&gt;Bun ofrece &lt;code&gt;Bun.serve&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Bun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;serve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt;: &lt;span class=&#34;kt&#34;&gt;3000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello from Bun&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Es práctico para API pequeñas, servicios internos, webhook receivers y servicios con estilo edge. Bun también incluye WebSockets, Workers, Streams, SQLite, PostgreSQL, Redis, S3 y TCP/UDP sockets.&lt;/p&gt;
&lt;p&gt;Si ya usas Express, Fastify, NestJS, Next.js, Hono, Elysia u otro framework, revisa primero su compatibilidad con Bun. No hace falta reescribir un servicio solo para usar Bun.&lt;/p&gt;
&lt;p&gt;Una ruta realista es usar Bun primero para scripts y paquetes, después para pruebas, y al final evaluar si el runtime de producción debe cambiar. La migración del runtime exige más cuidado porque afecta directamente el comportamiento en producción.&lt;/p&gt;
&lt;h2 id=&#34;relación-con-nodejs&#34;&gt;Relación con Node.js
&lt;/h2&gt;&lt;p&gt;Uno de los objetivos de Bun es ser un drop-in replacement de Node.js, pero compatibilidad no significa equivalencia completa.&lt;/p&gt;
&lt;p&gt;El ecosistema Node.js acumula muchos detalles: interoperabilidad CJS / ESM, módulos internos, extensiones nativas, lifecycle scripts de npm, comportamiento de filesystem, stream y Buffer, worker / child_process, debugging y profiling.&lt;/p&gt;
&lt;p&gt;Bun mejora rápido, pero la migración a producción debe juzgarse por pruebas.&lt;/p&gt;
&lt;p&gt;Preguntas prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;¿Tus pruebas pasan con Bun?&lt;/li&gt;
&lt;li&gt;¿Las dependencias clave soportan Bun?&lt;/li&gt;
&lt;li&gt;¿Los artefactos de build son equivalentes?&lt;/li&gt;
&lt;li&gt;¿CI y local se comportan igual?&lt;/li&gt;
&lt;li&gt;¿Hay monitorización y rollback en producción?&lt;/li&gt;
&lt;li&gt;¿Docker y despliegue son estables?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cambiar solo el gestor de paquetes tiene menos riesgo. Cambiar el runtime de producción tiene mucho más.&lt;/p&gt;
&lt;h2 id=&#34;proyectos-adecuados&#34;&gt;Proyectos adecuados
&lt;/h2&gt;&lt;p&gt;Bun encaja bien con proyectos pequeños nuevos en JavaScript / TypeScript, herramientas internas, CLI, CI que necesita instalaciones rápidas, frontend que quiere reducir complejidad, scripts o servicios sensibles al arranque y desarrolladores que quieren TypeScript listo para ejecutar.&lt;/p&gt;
&lt;p&gt;Conviene ir con más cautela en monorepos enormes, proyectos atados a pnpm workspace, servicios con muchas extensiones nativas Node.js, builds frontend muy personalizados, backends con exigencias fuertes de consistencia en runtime y suites de pruebas muy dependientes de Jest.&lt;/p&gt;
&lt;p&gt;Una estrategia conservadora y útil es usar Bun primero como herramienta de desarrollo, no como sustituto inmediato de todos los runtimes de producción.&lt;/p&gt;
&lt;h2 id=&#34;consejos-de-migración&#34;&gt;Consejos de migración
&lt;/h2&gt;&lt;p&gt;Para probar Bun en un proyecto existente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instala Bun localmente.&lt;/li&gt;
&lt;li&gt;Ejecuta &lt;code&gt;bun install&lt;/code&gt; y revisa el resultado.&lt;/li&gt;
&lt;li&gt;Conserva o commitea &lt;code&gt;bun.lock&lt;/code&gt; para evitar confusión con lockfiles.&lt;/li&gt;
&lt;li&gt;Prueba &lt;code&gt;bun run &amp;lt;script&amp;gt;&lt;/code&gt; con scripts comunes.&lt;/li&gt;
&lt;li&gt;Migra pocas pruebas con &lt;code&gt;bun test&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Añade un job Bun no bloqueante en CI.&lt;/li&gt;
&lt;li&gt;Si no hay problemas, evalúa cambiar el flujo principal de instalación.&lt;/li&gt;
&lt;li&gt;Evalúa la migración del runtime de producción al final.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En equipos, conserva una ruta de rollback. Mantén el flujo npm / pnpm / yarn durante la migración, ejecuta ambos en CI un tiempo, no cambies runtime, gestor, framework de pruebas y bundler en la misma modificación, y divide el proceso en pasos pequeños verificables.&lt;/p&gt;
&lt;h2 id=&#34;comandos-frecuentes&#34;&gt;Comandos frecuentes
&lt;/h2&gt;&lt;p&gt;Instalar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://bun.com/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Actualizar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Instalar dependencias:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Añadir dependencia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun add lodash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejecutar script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejecutar TypeScript directamente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun run scripts/build.ts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pruebas:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bundle:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bun build ./src/index.ts --outdir ./dist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejecutar comando de paquete:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bunx cowsay &lt;span class=&#34;s1&#34;&gt;&amp;#39;Hello, world!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;El valor de Bun no es solo ser “más rápido que Node.js”. Lo importante es que reúne muchas herramientas dispersas del desarrollo JavaScript / TypeScript en un solo comando &lt;code&gt;bun&lt;/code&gt;: runtime, gestor de paquetes, runner de scripts, test runner y bundler.&lt;/p&gt;
&lt;p&gt;Para proyectos nuevos y herramientas internas, la experiencia integrada puede ser cómoda: instalaciones rápidas, arranque rápido, menos configuración y TypeScript / JSX directos. En proyectos grandes ya existentes, es mejor introducir Bun primero en áreas de bajo riesgo, como instalación, scripts y algunas pruebas, antes de validar build y runtime.&lt;/p&gt;
&lt;p&gt;Si la velocidad de instalación, los fragmentos de configuración y el arranque lento de pruebas de la toolchain Node.js te molestan a menudo, Bun merece una prueba seria. Pero la migración de producción vuelve a lo básico: pruebas, compatibilidad, CI estable y rollback.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/oven-sh/bun&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;oven-sh/bun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.com/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.com/docs/installation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bun.com/docs/runtime/nodejs-compat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bun Node.js compatibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Guía de inicio en desarrollo de juegos con Godot: de nodos y escenas a tu primer juego 2D</title>
        <link>https://knightli.com/es/2026/05/17/godot-game-development-beginner-guide/</link>
        <pubDate>Sun, 17 May 2026 12:37:30 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/17/godot-game-development-beginner-guide/</guid>
        <description>&lt;p&gt;Godot es un motor de juegos open source adecuado para juegos 2D, prototipos indie y proyectos 3D medianos.&lt;/p&gt;
&lt;p&gt;Sus puntos fuertes son que es ligero, abierto, rápido de iniciar y usa un sistema claro de nodos y escenas. Para principiantes suele ser más accesible que Unity, y para desarrolladores independientes permite mantener proyectos pequeños y controlados.&lt;/p&gt;
&lt;h2 id=&#34;conclusión-rápida&#34;&gt;Conclusión rápida
&lt;/h2&gt;&lt;p&gt;No intentes aprender todo el motor desde el primer día.&lt;/p&gt;
&lt;p&gt;Una ruta mejor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Empieza por 2D, no por 3D.&lt;/li&gt;
&lt;li&gt;Entiende nodos y escenas antes de diseñar arquitecturas complejas.&lt;/li&gt;
&lt;li&gt;Aprende primero GDScript.&lt;/li&gt;
&lt;li&gt;Crea un juego pequeño que pueda empezar, fallar y reiniciarse.&lt;/li&gt;
&lt;li&gt;Luego añade animación, audio, UI, niveles y exportación.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Completar un juego pequeño enseña más que ver muchos tutoriales sueltos.&lt;/p&gt;
&lt;h2 id=&#34;para-quién-sirve-godot&#34;&gt;Para quién sirve Godot
&lt;/h2&gt;&lt;p&gt;Godot encaja bien si quieres aprender desarrollo de juegos desde cero, crear juegos 2D indie, prototipar rápido, evitar toolchains pesadas o entender cómo se organizan los objetos dentro de un motor.&lt;/p&gt;
&lt;p&gt;Unity y Unreal siguen siendo más fuertes para pipelines comerciales grandes, tiendas de assets, SDKs de monetización móvil o gráficos 3D de alto nivel. Pero para aprender y crear tus propios juegos, Godot es una gran entrada.&lt;/p&gt;
&lt;h2 id=&#34;instalación-y-proyecto&#34;&gt;Instalación y proyecto
&lt;/h2&gt;&lt;p&gt;Descarga Godot desde la web oficial, descomprime y ejecuta.&lt;/p&gt;
&lt;p&gt;Para el primer proyecto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa el renderer por defecto.&lt;/li&gt;
&lt;li&gt;Usa un nombre en inglés.&lt;/li&gt;
&lt;li&gt;Evita rutas complicadas.&lt;/li&gt;
&lt;li&gt;Usa Git desde el inicio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;first-godot-game
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Familiarízate con Scene, FileSystem, Inspector, Script y las vistas 2D / 3D.&lt;/p&gt;
&lt;h2 id=&#34;nodos-y-escenas&#34;&gt;Nodos y escenas
&lt;/h2&gt;&lt;p&gt;Los conceptos centrales son nodos y escenas.&lt;/p&gt;
&lt;p&gt;Nodos comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Node2D&lt;/code&gt;: objeto base 2D.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sprite2D&lt;/code&gt;: muestra una imagen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;: forma de colisión.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt;: personaje controlable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Camera2D&lt;/code&gt;: cámara 2D.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AudioStreamPlayer&lt;/code&gt;: reproduce audio.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Label&lt;/code&gt;: muestra texto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una escena es un grupo reutilizable de nodos. Un jugador, un enemigo o un nivel pueden ser escenas.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Player (CharacterBody2D)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Sprite2D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── CollisionShape2D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Camera2D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;primer-proyecto-recomendado&#34;&gt;Primer proyecto recomendado
&lt;/h2&gt;&lt;p&gt;Haz un juego 2D de esquivar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El jugador se mueve arriba, abajo, izquierda y derecha.&lt;/li&gt;
&lt;li&gt;Los enemigos aparecen desde los bordes.&lt;/li&gt;
&lt;li&gt;Tocar un enemigo significa perder.&lt;/li&gt;
&lt;li&gt;El tiempo de supervivencia es la puntuación.&lt;/li&gt;
&lt;li&gt;Hay pantalla inicial, game over y reinicio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto cubre movimiento, input, colisiones, spawning, UI, timers, audio y recarga de escena.&lt;/p&gt;
&lt;h2 id=&#34;movimiento-del-jugador&#34;&gt;Movimiento del jugador
&lt;/h2&gt;&lt;p&gt;Usa &lt;code&gt;CharacterBody2D&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;CharacterBody2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@export&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;speed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;300.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_physics_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Vector2&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ZERO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_axis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;move_right&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get_axis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;move_up&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;move_down&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;normalized&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;velocity&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;direction&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;move_and_slide&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Define acciones de entrada:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_left  -&amp;gt; A / Left
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_right -&amp;gt; D / Right
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_up    -&amp;gt; W / Up
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;move_down  -&amp;gt; S / Down
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Usa actions en vez de teclas codificadas. Así será más fácil soportar mando, táctil o remapeo.&lt;/p&gt;
&lt;h2 id=&#34;colisiones-y-física&#34;&gt;Colisiones y física
&lt;/h2&gt;&lt;p&gt;Nodos comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CollisionShape2D&lt;/code&gt;: define colisión.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Area2D&lt;/code&gt;: detecta solapamientos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CharacterBody2D&lt;/code&gt;: jugador o personaje controlado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RigidBody2D&lt;/code&gt;: objeto físico.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StaticBody2D&lt;/code&gt;: paredes o suelo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para empezar: usa &lt;code&gt;CharacterBody2D&lt;/code&gt; si controlas el movimiento, y &lt;code&gt;Area2D&lt;/code&gt; si solo necesitas detectar contacto.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_on_body_entered&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Player&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;get_tree&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;reload_current_scene&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;instanciar-enemigos&#34;&gt;Instanciar enemigos
&lt;/h2&gt;&lt;p&gt;Las escenas funcionan como prefabs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@export&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy_scene&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PackedScene&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;spawn_enemy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enemy_scene&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;instantiate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;position&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Vector2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;randf_range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;550&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;add_child&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;enemy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con un &lt;code&gt;Timer&lt;/code&gt;, puedes crear enemigos cada cierto tiempo.&lt;/p&gt;
&lt;h2 id=&#34;ui-puntuación-y-audio&#34;&gt;UI, puntuación y audio
&lt;/h2&gt;&lt;p&gt;La UI usa nodos &lt;code&gt;Control&lt;/code&gt;: &lt;code&gt;CanvasLayer&lt;/code&gt;, &lt;code&gt;Label&lt;/code&gt;, &lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;Panel&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puntuación simple:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;score&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;$CanvasLayer/ScoreLabel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;score&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Audio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript&#34; data-lang=&#34;gdscript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;$HitSound&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;play&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Un juego necesita feedback: sonidos, parpadeos, estados de botón, vibración o shake. La función por sí sola no basta.&lt;/p&gt;
&lt;h2 id=&#34;organización-del-proyecto&#34;&gt;Organización del proyecto
&lt;/h2&gt;&lt;p&gt;Desde el inicio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;res://
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── scenes/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── assets/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── ui/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Escenas en &lt;code&gt;scenes/&lt;/code&gt;, scripts en &lt;code&gt;scripts/&lt;/code&gt;, imágenes y audio en &lt;code&gt;assets/&lt;/code&gt;, UI en &lt;code&gt;ui/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;errores-comunes&#34;&gt;Errores comunes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Elegir mal el tipo de nodo.&lt;/li&gt;
&lt;li&gt;Olvidar &lt;code&gt;CollisionShape2D&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Codificar teclas directamente.&lt;/li&gt;
&lt;li&gt;Meter jugador, enemigos, UI y nivel en un solo script.&lt;/li&gt;
&lt;li&gt;Empezar con un proyecto demasiado grande.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un juego pequeño terminado vale más que una gran idea abandonada.&lt;/p&gt;
&lt;h2 id=&#34;ruta-de-aprendizaje&#34;&gt;Ruta de aprendizaje
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Editor.&lt;/li&gt;
&lt;li&gt;Nodos y escenas.&lt;/li&gt;
&lt;li&gt;GDScript.&lt;/li&gt;
&lt;li&gt;Input actions.&lt;/li&gt;
&lt;li&gt;Movimiento 2D.&lt;/li&gt;
&lt;li&gt;Colisiones y &lt;code&gt;Area2D&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Timer&lt;/code&gt; y spawning.&lt;/li&gt;
&lt;li&gt;UI y puntuación.&lt;/li&gt;
&lt;li&gt;Audio y animación.&lt;/li&gt;
&lt;li&gt;Exportación a desktop o web.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La entrada a Godot no consiste en memorizar todas sus funciones, sino en entender cómo organiza juegos: nodos forman escenas, escenas forman juegos, scripts dan comportamiento y signals conectan eventos.&lt;/p&gt;
&lt;p&gt;Empieza con un juego 2D pequeño. Cuando ya tengas movimiento, colisión, UI, audio y reinicio, avanza a TileMap, guardado, máquinas de estado, 3D, shaders y optimización de exportación.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Lectura rápida de la documentación de Ghostty: instalación, configuración y uso diario</title>
        <link>https://knightli.com/es/2026/05/15/ghostty-docs-install-config-usage-guide/</link>
        <pubDate>Fri, 15 May 2026 14:50:11 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/15/ghostty-docs-install-config-usage-guide/</guid>
        <description>&lt;p&gt;Ghostty es un nuevo emulador de terminal, pero no es simplemente &amp;ldquo;otra terminal más rápida&amp;rdquo;. Según su documentación oficial, intenta equilibrar tres direcciones al mismo tiempo: velocidad, funciones y una experiencia de escritorio nativa. Es decir, busca aceleración por GPU y buen rendimiento de renderizado, pero también quiere sentirse como una aplicación local real en macOS y Linux, no como una interfaz completamente dibujada a mano.&lt;/p&gt;
&lt;p&gt;Si hoy usas iTerm2, Kitty, Alacritty, WezTerm o la terminal del sistema, lo más interesante de Ghostty no es una función aislada. Es la combinación entre &amp;ldquo;funciona desde el primer arranque&amp;rdquo; y &amp;ldquo;se puede configurar en profundidad&amp;rdquo;. La configuración predeterminada ya es usable; cuando quieres ajustar más, la documentación ofrece entradas completas para archivos de configuración, temas, atajos, fuentes, integración con Shell y secuencias de control de terminal.&lt;/p&gt;
&lt;h2 id=&#34;primero-el-posicionamiento&#34;&gt;Primero, el posicionamiento
&lt;/h2&gt;&lt;p&gt;El posicionamiento central de Ghostty se puede resumir en tres puntos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Es un emulador de terminal multiplataforma, con foco actual en macOS y Linux.&lt;/li&gt;
&lt;li&gt;Usa UI nativa de cada plataforma: Swift, AppKit y SwiftUI en macOS; Zig y GTK4 en Linux.&lt;/li&gt;
&lt;li&gt;Su núcleo de terminal es &lt;code&gt;libghostty&lt;/code&gt;, y las aplicaciones GUI se construyen alrededor de este núcleo compartido.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este diseño afecta la experiencia diaria. Pestañas, divisiones, mensajes de error, restauración del estado de ventanas y atajos del sistema no son simples componentes que &amp;ldquo;parecen una aplicación de escritorio&amp;rdquo;; intentan acercarse a los hábitos de interacción de cada sistema. Los atajos predeterminados de macOS y Linux también se diferencian según las convenciones de cada plataforma.&lt;/p&gt;
&lt;h2 id=&#34;instalación-directa-en-macos-dependiente-de-la-distribución-en-linux&#34;&gt;Instalación: directa en macOS, dependiente de la distribución en Linux
&lt;/h2&gt;&lt;p&gt;Los binarios precompilados oficiales apuntan principalmente a macOS. La forma más común de instalarlo es descargar el &lt;code&gt;.dmg&lt;/code&gt;, abrirlo y arrastrar Ghostty al directorio Applications. Los usuarios de Homebrew también pueden usar el cask mantenido por la comunidad:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install --cask ghostty
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En Linux la situación está más fragmentada. La documentación de Ghostty separa administradores de paquetes, binarios comunitarios y compilación desde código fuente para distintas distribuciones. Arch, Alpine, Gentoo, NixOS, Snap, Solus, Void y otras tienen rutas propias. Si una distribución no tiene un repositorio oficial o confiable, la documentación tiende a recomendar compilar desde el código fuente antes que instalar binarios de terceros sin revisar.&lt;/p&gt;
&lt;p&gt;Esto es especialmente importante en servidores y estaciones de trabajo: un emulador de terminal maneja mucha entrada y salida, portapapeles, enlaces, sesiones SSH y rutas de archivos locales. Conviene ser conservador con la fuente de instalación y priorizar el paquete oficial de macOS, los repositorios de la distribución o un proceso de compilación cuyo origen puedas auditar.&lt;/p&gt;
&lt;h2 id=&#34;configuración-no-copies-una-configuración-gigante-de-dotfiles-al-principio&#34;&gt;Configuración: no copies una configuración gigante de dotfiles al principio
&lt;/h2&gt;&lt;p&gt;La filosofía de configuración de Ghostty es &amp;ldquo;usable con cero configuración&amp;rdquo;. La fuente predeterminada incluye JetBrains Mono y soporte de Nerd Font, así que la mayoría de usuarios puede trabajar normalmente al abrirlo por primera vez. La documentación incluso sugiere que, si necesitas cambiar una opción no subjetiva para sentirte cómodo, quizá esa conducta debería ser la predeterminada.&lt;/p&gt;
&lt;p&gt;Cuando realmente necesitas personalizar, Ghostty usa un archivo de configuración de texto. El nombre actual es &lt;code&gt;config.ghostty&lt;/code&gt;, aunque versiones antiguas también soportan &lt;code&gt;config&lt;/code&gt;. Las rutas comunes incluyen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$XDG_CONFIG_HOME/ghostty/config.ghostty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$XDG_CONFIG_HOME/ghostty/config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/.config/ghostty/config.ghostty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/.config/ghostty/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En macOS también lee:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/Library/Application Support/com.mitchellh.ghostty/config.ghostty
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$HOME/Library/Application Support/com.mitchellh.ghostty/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La sintaxis es muy directa: &lt;code&gt;key = value&lt;/code&gt;. Por ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;font-family = JetBrains Mono
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;font-size = 14
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;theme = light:Rose Pine Dawn,dark:Rose Pine
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;keybind = ctrl+shift+t=new_tab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Un consejo práctico: no empieces copiando la configuración completa de otra persona. Es más estable usarlo unos días sin cambios y modificar solo tres cosas al principio: fuente, tamaño de fuente y tema. Cuando de verdad notes fricción con atajos, divisiones, ventanas o integración con Shell, agrega esas opciones una por una.&lt;/p&gt;
&lt;h2 id=&#34;consulta-de-documentación-también-hay-referencia-completa-local&#34;&gt;Consulta de documentación: también hay referencia completa local
&lt;/h2&gt;&lt;p&gt;Ghostty tiene muchas opciones de configuración, y la documentación oficial las reúne en Option Reference. Además de la página web, después de instalarlo puedes consultar la referencia localmente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +show-config --default --docs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este comando imprime la configuración predeterminada y la documentación en la salida estándar, útil para enviarlo a un paginador:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +show-config --default --docs &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; less
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para ver fuentes disponibles:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +list-fonts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para ver temas incorporados y disponibles:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +list-themes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para ver los atajos predeterminados:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghostty +list-keybinds --default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Estos comandos son más confiables que copiar fragmentos de internet, porque vienen de la versión de Ghostty instalada en tu máquina.&lt;/p&gt;
&lt;h2 id=&#34;atajos-piensa-en-acciones-como-concepto-central&#34;&gt;Atajos: piensa en &amp;ldquo;acciones&amp;rdquo; como concepto central
&lt;/h2&gt;&lt;p&gt;El formato de configuración de atajos de Ghostty es:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;keybind = trigger=action
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;trigger&lt;/code&gt; es la forma de activar una tecla o combinación, y &lt;code&gt;action&lt;/code&gt; es la operación que ejecuta Ghostty. Crear una pestaña, cerrar la surface actual, recargar configuración o saltar a un prompt son acciones. El modelo es claro: no estás &amp;ldquo;cambiando una opción de menú&amp;rdquo;, sino vinculando una secuencia de entrada a una acción.&lt;/p&gt;
&lt;p&gt;Después de cambiar la configuración, puedes recargarla en tiempo de ejecución. El atajo predeterminado es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux: &lt;code&gt;ctrl+shift+,&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;macOS: &lt;code&gt;cmd+shift+,&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No todas las opciones se aplican de inmediato. Algunas solo afectan terminales nuevas, y otras requieren reiniciar completamente. Si &amp;ldquo;la configuración está escrita pero no cambia nada&amp;rdquo;, revisa primero la explicación de esa opción; suele ahorrar más tiempo que sospechar de la sintaxis una y otra vez.&lt;/p&gt;
&lt;h2 id=&#34;temas-y-fuentes-usa-primero-lo-incorporado-y-luego-ajusta&#34;&gt;Temas y fuentes: usa primero lo incorporado y luego ajusta
&lt;/h2&gt;&lt;p&gt;Ghostty incluye muchos temas y soporta cambiar entre temas según el modo claro u oscuro del sistema:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;theme = light:Rose Pine Dawn,dark:Rose Pine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Los temas también pueden venir de archivos personalizados. La documentación lo advierte con claridad: un archivo de tema es, en esencia, un archivo de configuración de Ghostty y puede definir muchas opciones, así que no conviene usar temas de fuentes no confiables.&lt;/p&gt;
&lt;p&gt;En fuentes, &lt;code&gt;font-family&lt;/code&gt; se puede repetir varias veces para especificar fuentes fallback. Es útil en entornos multilingües: la fuente principal puede cubrir inglés y símbolos, mientras las siguientes cubren chino, japonés u otros caracteres. Si aparecen detalles de visualización con emoji, negrita, cursiva o ligaduras, basta con revisar la opción correspondiente en Option Reference.&lt;/p&gt;
&lt;h2 id=&#34;integración-con-shell-especialmente-importante-para-usuarios-de-ssh&#34;&gt;Integración con Shell: especialmente importante para usuarios de SSH
&lt;/h2&gt;&lt;p&gt;Ghostty soporta inyección automática de shell integration para &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;elvish&lt;/code&gt;, &lt;code&gt;fish&lt;/code&gt;, &lt;code&gt;nushell&lt;/code&gt; y &lt;code&gt;zsh&lt;/code&gt;. Al activarla, varias experiencias se vuelven más naturales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las terminales nuevas pueden abrirse en el directorio de trabajo de la terminal anterior.&lt;/li&gt;
&lt;li&gt;Los prompts complejos pueden redibujarse al cambiar tamaño en lugar de reacomodarse mal.&lt;/li&gt;
&lt;li&gt;Puedes saltar entre salidas de comandos mediante marcadores de prompt.&lt;/li&gt;
&lt;li&gt;El comportamiento del cursor en el prompt se ajusta mejor a hábitos de edición.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si no quieres inyección automática, desactívala en la configuración:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shell-integration = none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;SSH merece atención extra. Ghostty usa &lt;code&gt;xterm-ghostty&lt;/code&gt; como &lt;code&gt;TERM&lt;/code&gt;, pero muchos hosts remotos todavía no tienen el terminfo correspondiente. La documentación ofrece dos funciones de shell integration, &lt;code&gt;ssh-env&lt;/code&gt; y &lt;code&gt;ssh-terminfo&lt;/code&gt;, desactivadas por defecto y activables según necesidad:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shell-integration-features = ssh-env,ssh-terminfo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si te conectas a menudo a servidores antiguos, contenedores, bastiones o entornos de producción con gestión estricta, conviene leer primero la documentación oficial de Terminfo y Shell Integration antes de activar estas funciones. La negociación de capacidades de terminal parece menor, pero cuando falla puede producir colores anómalos, atajos rotos o programas de pantalla completa desordenados.&lt;/p&gt;
&lt;h2 id=&#34;mi-orden-de-prueba&#34;&gt;Mi orden de prueba
&lt;/h2&gt;&lt;p&gt;Si solo quieres decidir si Ghostty encaja contigo, puedes probarlo en este orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instálalo y úsalo un día sin escribir configuración.&lt;/li&gt;
&lt;li&gt;Ajusta solo &lt;code&gt;font-family&lt;/code&gt;, &lt;code&gt;font-size&lt;/code&gt; y &lt;code&gt;theme&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;ghostty +list-keybinds --default&lt;/code&gt; para ver los atajos predeterminados, en lugar de importar primero la tabla de otra persona.&lt;/li&gt;
&lt;li&gt;Si usas SSH con frecuencia, revisa primero la compatibilidad de terminfo en hosts remotos.&lt;/li&gt;
&lt;li&gt;Al final ajusta divisiones, ventanas, transparencia, barra de título, imagen de fondo y preferencias visuales o de flujo de trabajo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La documentación de Ghostty está escrita con un enfoque bastante ingenieril. Conviene leerla como un manual de referencia de configuración, no como una página promocional. Para la mayoría de usuarios, el criterio real es simple: si la experiencia predeterminada ya resulta cómoda y tus flujos diarios con editor, Shell, SSH, tmux o Zellij son estables. Si esas piezas funcionan bien, Ghostty merece entrar en tu lista de terminales candidatas a largo plazo.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ghostty Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/about&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;About Ghostty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/config&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/config/keybind&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Custom Keybindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/install/binary&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Prebuilt Ghostty Binaries and Packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ghostty.org/docs/features/shell-integration&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Shell Integration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Cómo cambiar el idioma de la interfaz de VS Code: chino, inglés y otros idiomas</title>
        <link>https://knightli.com/es/2026/05/08/vscode-switch-display-language/</link>
        <pubDate>Fri, 08 May 2026 13:18:57 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/08/vscode-switch-display-language/</guid>
        <description>&lt;p&gt;VS Code admite muchos idiomas de interfaz. Lo habitual es instalar primero el paquete de idioma correspondiente y luego elegir el idioma de visualización desde la paleta de comandos. Si necesitas fijar VS Code a un idioma concreto, también puedes modificar manualmente el valor &lt;code&gt;locale&lt;/code&gt; en &lt;code&gt;argv.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Este método no solo sirve para chino simplificado; también funciona con inglés, chino tradicional, japonés, coreano, francés, alemán, español y otros idiomas.&lt;/p&gt;
&lt;h2 id=&#34;instalar-el-paquete-de-idioma-correspondiente&#34;&gt;Instalar el paquete de idioma correspondiente
&lt;/h2&gt;&lt;p&gt;Si quieres cambiar a una interfaz que no sea inglés, normalmente debes instalar primero un paquete de idioma.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abre el panel de extensiones de VS Code en la barra lateral izquierda, o usa el atajo &lt;code&gt;Ctrl+Shift+X&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;En el cuadro de búsqueda, escribe el idioma objetivo, por ejemplo &lt;code&gt;Chinese&lt;/code&gt;, &lt;code&gt;Japanese&lt;/code&gt;, &lt;code&gt;Korean&lt;/code&gt; o &lt;code&gt;French&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Selecciona el paquete de idioma correspondiente y haz clic en &lt;code&gt;Install&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cuando termine la instalación, reinicia VS Code si se te solicita.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Para chino simplificado, el paquete habitual es &lt;code&gt;Chinese (Simplified)&lt;/code&gt;. Para chino tradicional, usa &lt;code&gt;Chinese (Traditional)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;cambiar-el-idioma-desde-la-paleta-de-comandos&#34;&gt;Cambiar el idioma desde la paleta de comandos
&lt;/h2&gt;&lt;p&gt;Este es el método recomendado para la mayoría de los usuarios.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abre la paleta de comandos: &lt;code&gt;Ctrl+Shift+P&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Escribe &lt;code&gt;Configure Display Language&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Selecciona el comando &lt;code&gt;Configure Display Language&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Elige en la lista el idioma que quieres usar.&lt;/li&gt;
&lt;li&gt;Reinicia VS Code si se te solicita.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Después del reinicio, los menús, las páginas de configuración y los mensajes habituales usarán el idioma seleccionado. Si el idioma objetivo no aparece en la lista, instala antes su paquete desde el panel de extensiones.&lt;/p&gt;
&lt;h2 id=&#34;especificar-el-idioma-manualmente-en-argvjson&#34;&gt;Especificar el idioma manualmente en argv.json
&lt;/h2&gt;&lt;p&gt;Si el cambio desde la paleta de comandos no funciona, o si quieres fijar explícitamente el idioma de visualización, puedes editar directamente el archivo de argumentos de ejecución de VS Code.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abre la paleta de comandos: &lt;code&gt;Ctrl+Shift+P&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Escribe y selecciona &lt;code&gt;Preferences: Configure Runtime Arguments&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Busca o agrega la opción &lt;code&gt;locale&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cambia su valor por el código del idioma objetivo.&lt;/li&gt;
&lt;li&gt;Guarda el archivo y reinicia VS Code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Por ejemplo, para cambiar a inglés:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para cambiar a chino simplificado:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para cambiar a japonés:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;locale&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;argv.json&lt;/code&gt; es un archivo JSON, así que presta atención a las comas y las comillas. Si la configuración no es válida, VS Code puede no leer correctamente el idioma configurado.&lt;/p&gt;
&lt;h2 id=&#34;códigos-de-idioma-de-interfaz-comunes&#34;&gt;Códigos de idioma de interfaz comunes
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Idioma de visualización&lt;/th&gt;
          &lt;th&gt;locale&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;English (US)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;en&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Chino simplificado&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;zh-cn&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Chino tradicional&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;zh-tw&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;French&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;fr&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;German&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;de&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Italian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;it&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Spanish&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;es&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Japanese&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ja&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Korean&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ko&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Russian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ru&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Portuguese (Brazil)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pt-br&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Turkish&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;tr&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Bulgarian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;bg&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Hungarian&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;hu&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;qué-hacer-si-el-idioma-no-cambia&#34;&gt;Qué hacer si el idioma no cambia
&lt;/h2&gt;&lt;p&gt;Revisa estos puntos en orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Confirma que el paquete del idioma objetivo está instalado.&lt;/li&gt;
&lt;li&gt;Confirma que &lt;code&gt;locale&lt;/code&gt; usa el código correcto. Por ejemplo, chino simplificado es &lt;code&gt;zh-cn&lt;/code&gt;, no &lt;code&gt;zh-CN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cierra VS Code por completo y vuelve a abrirlo después de cambiar el idioma.&lt;/li&gt;
&lt;li&gt;Si editaste &lt;code&gt;argv.json&lt;/code&gt; manualmente, comprueba que la sintaxis JSON sea válida.&lt;/li&gt;
&lt;li&gt;Si la configuración está desordenada, elimina la entrada &lt;code&gt;locale&lt;/code&gt; y vuelve a elegir el idioma mediante &lt;code&gt;Configure Display Language&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En la mayoría de los casos, &lt;code&gt;Configure Display Language&lt;/code&gt; es la opción más sencilla. Edita &lt;code&gt;argv.json&lt;/code&gt; solo cuando necesites forzar un idioma concreto o cuando el cambio desde la paleta de comandos no surta efecto.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.csdn.net/mighty13/article/details/114420578&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;VScode: cambiar el idioma de la interfaz de VS Code a chino simplificado y alternar el idioma de visualización&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>opencode, Claude Code y Codex: diferencias y guía de herramientas open source de programación con IA</title>
        <link>https://knightli.com/es/2026/05/08/opencode-open-source-ai-coding-agent/</link>
        <pubDate>Fri, 08 May 2026 08:33:37 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/08/opencode-open-source-ai-coding-agent/</guid>
        <description>&lt;p&gt;&lt;code&gt;opencode&lt;/code&gt; es un AI Coding Agent open source de anomalyco. Su posicionamiento es directo: dar a los desarrolladores un asistente de código programable, extensible y capaz de conectarse a varios proveedores de modelos dentro de la terminal.&lt;/p&gt;
&lt;p&gt;Si lo comparamos con &lt;code&gt;Claude Code&lt;/code&gt; y &lt;code&gt;Codex&lt;/code&gt;, los tres resuelven una misma clase de problema: llevar la IA a bases de código reales para entender contexto, modificar archivos, ejecutar comandos y correr pruebas. Pero su orientación de producto es distinta.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;opencode&lt;/code&gt; pone más énfasis en open source, soporte de múltiples modelos y TUI de terminal. &lt;code&gt;Claude Code&lt;/code&gt; enfatiza el ecosistema de modelos de Anthropic y la colaboración de ingeniería local. &lt;code&gt;Codex&lt;/code&gt; es el AI coding agent de OpenAI, disponible desde la terminal, IDEs, Codex app y tareas en la nube.&lt;/p&gt;
&lt;h2 id=&#34;para-quién-es-opencode&#34;&gt;Para quién es opencode
&lt;/h2&gt;&lt;p&gt;opencode encaja mejor con estos tipos de desarrolladores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quienes quieren completar cambios de código, análisis de proyectos y tareas de ingeniería desde la terminal.&lt;/li&gt;
&lt;li&gt;Quienes no quieren que su AI Coding Agent dependa de un único proveedor de modelos.&lt;/li&gt;
&lt;li&gt;Quienes prefieren herramientas open source y quieren auditarlas, ampliarlas o construir sobre ellas.&lt;/li&gt;
&lt;li&gt;Quienes ya están cómodos con Neovim, TUI y flujos de línea de comandos.&lt;/li&gt;
&lt;li&gt;Quienes quieren controlar en el futuro el mismo agente de programación desde una app de escritorio, móvil u otros clientes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Su objetivo no es crear otra ventana de chat, sino poner capacidades de programación con IA dentro de la terminal y los directorios de proyecto que los desarrolladores ya usan.&lt;/p&gt;
&lt;h2 id=&#34;instalación&#34;&gt;Instalación
&lt;/h2&gt;&lt;p&gt;El README oficial ofrece varias formas de instalación.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Instalación directa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://opencode.ai/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm i -g opencode-ai@latest
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scoop install opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;choco install opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macOS y Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install anomalyco/tap/opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Arch Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pacman -S opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;paru -S opencode-bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Otros métodos&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mise use -g opencode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nix run nixpkgs#opencode
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El README oficial también recomienda eliminar versiones anteriores a 0.1.x antes de instalar, para evitar problemas causados por restos de versiones antiguas.&lt;/p&gt;
&lt;p&gt;El script de instalación elige el directorio de instalación con esta prioridad:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$OPENCODE_INSTALL_DIR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$XDG_BIN_DIR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$HOME/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$HOME/.opencode/bin&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si necesitas especificar una ruta, puedes usar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OPENCODE_INSTALL_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/bin curl -fsSL https://opencode.ai/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;XDG_BIN_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.local/bin curl -fsSL https://opencode.ai/install &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;la-app-de-escritorio-sigue-en-beta&#34;&gt;La app de escritorio sigue en Beta
&lt;/h2&gt;&lt;p&gt;Además de la herramienta de línea de comandos, opencode también ofrece una app de escritorio, actualmente marcada como Beta. Se puede descargar desde GitHub Releases o &lt;code&gt;opencode.ai/download&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La versión de escritorio cubre estas plataformas:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Plataforma&lt;/th&gt;
          &lt;th&gt;Archivo&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS Apple Silicon&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;opencode-desktop-mac-arm64.dmg&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS Intel&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;opencode-desktop-mac-x64.dmg&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Windows&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;opencode-desktop-windows-x64.exe&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Linux&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;.deb&lt;/code&gt;, &lt;code&gt;.rpm&lt;/code&gt; o &lt;code&gt;.AppImage&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;En macOS y Windows también se puede instalar la app de escritorio con gestores de paquetes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install --cask opencode-desktop
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scoop bucket add extras
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scoop install extras/opencode-desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;dos-modos-agent-integrados&#34;&gt;Dos modos Agent integrados
&lt;/h2&gt;&lt;p&gt;opencode incluye dos Agent integrados, que se pueden cambiar con la tecla &lt;code&gt;Tab&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;build&lt;/code&gt; es el modo predeterminado. Tiene permisos completos de desarrollo y sirve para editar código directamente, ejecutar comandos y avanzar en tareas de ingeniería.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;plan&lt;/code&gt; es el modo de solo lectura. Es más adecuado para analizar bases de código desconocidas, entender la estructura del proyecto y preparar un plan de cambios. Por defecto rechaza ediciones de archivos y pregunta antes de ejecutar comandos bash.&lt;/p&gt;
&lt;p&gt;Además, opencode incluye un sub-Agent &lt;code&gt;general&lt;/code&gt; para búsquedas complejas y tareas de varios pasos. Los usuarios pueden invocarlo escribiendo &lt;code&gt;@general&lt;/code&gt; en un mensaje.&lt;/p&gt;
&lt;p&gt;Este diseño es bastante práctico: antes de actuar, usa &lt;code&gt;plan&lt;/code&gt; para entender el proyecto; cuando haga falta cambiar código, cambia a &lt;code&gt;build&lt;/code&gt;. En repositorios grandes, separar permisos de lectura y escritura ayuda a reducir errores.&lt;/p&gt;
&lt;h2 id=&#34;qué-es-codex&#34;&gt;Qué es Codex
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Codex&lt;/code&gt; es el AI coding agent de OpenAI para ayudar a desarrolladores a escribir código, revisar código, corregir bugs y entregar tareas de ingeniería.&lt;/p&gt;
&lt;p&gt;A diferencia de una herramienta simple de autocompletado, Codex se parece más a un Agent capaz de operar sobre una base de código. Puede trabajar contigo en herramientas locales y también puede recibir tareas delegadas para ejecutarlas en la nube. Los materiales oficiales de OpenAI describen Codex como disponible desde varias superficies, incluyendo CLI, IDEs, Codex app y flujos en la nube de ChatGPT/Codex.&lt;/p&gt;
&lt;p&gt;Para desarrolladores, Codex tiene varios puntos importantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Puede leer bases de código, editar archivos, ejecutar comandos y correr pruebas.&lt;/li&gt;
&lt;li&gt;Soporta varias interfaces, incluyendo terminal, IDE, app y nube.&lt;/li&gt;
&lt;li&gt;Encaja con corrección de bugs, desarrollo de funciones, refactorización, migraciones, revisión de código y generación de pruebas.&lt;/li&gt;
&lt;li&gt;Está más ligado a cuentas, modelos y ecosistema de producto de OpenAI.&lt;/li&gt;
&lt;li&gt;Las tareas en la nube sirven para ejecutar en paralelo varias tareas de ingeniería relativamente bien definidas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si opencode se parece más a un framework abierto de agente en terminal, Codex se parece más a un banco de trabajo completo de programación con IA ofrecido por OpenAI: colaboración local, delegación en la nube y flujos de ingeniería más largos para equipos.&lt;/p&gt;
&lt;h2 id=&#34;diferencias-principales&#34;&gt;Diferencias principales
&lt;/h2&gt;&lt;p&gt;opencode, Claude Code y Codex son herramientas de programación con IA, pero la elección se entiende mejor mirando estas dimensiones.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Herramienta&lt;/th&gt;
          &lt;th&gt;Posicionamiento central&lt;/th&gt;
          &lt;th&gt;Ventajas principales&lt;/th&gt;
          &lt;th&gt;Mejor para&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;opencode&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;AI Coding Agent open source&lt;/td&gt;
          &lt;td&gt;Open source, múltiples modelos, TUI, arquitectura cliente/servidor&lt;/td&gt;
          &lt;td&gt;Desarrolladores que quieren una cadena de herramientas abierta, modelos reemplazables y un flujo centrado en terminal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Claude Code&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Herramienta de programación de línea de comandos de Anthropic&lt;/td&gt;
          &lt;td&gt;Experiencia con modelos Claude, comprensión de código, contexto largo, colaboración en tareas de ingeniería&lt;/td&gt;
          &lt;td&gt;Desarrolladores que ya usan el ecosistema Claude/Anthropic y quieren avanzar tareas de código locales&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Codex&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;AI coding agent de OpenAI&lt;/td&gt;
          &lt;td&gt;CLI, IDE, Codex app, tareas en la nube, flujos multi-Agent&lt;/td&gt;
          &lt;td&gt;Equipos que ya usan ChatGPT/OpenAI y quieren combinar colaboración local con delegación en la nube&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;En resumen, las palabras clave de opencode son &amp;ldquo;apertura y reemplazabilidad&amp;rdquo;; las de Claude Code son &amp;ldquo;ecosistema Claude y agente local de ingeniería&amp;rdquo;; y las de Codex son &amp;ldquo;ecosistema OpenAI y colaboración desde múltiples entradas&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;diferencias-con-claude-code&#34;&gt;Diferencias con Claude Code
&lt;/h2&gt;&lt;p&gt;El FAQ oficial de opencode lo compara directamente con Claude Code. Ambos son muy parecidos en capacidad, pero las diferencias principales son estas.&lt;/p&gt;
&lt;p&gt;Primero, opencode es un proyecto 100% open source, alojado en GitHub y publicado con MIT license.&lt;/p&gt;
&lt;p&gt;Segundo, opencode no depende de un único proveedor de modelos. Recomienda los modelos ofrecidos a través de OpenCode Zen, pero también puede trabajar con Claude, OpenAI, Google o modelos locales. Para desarrolladores, esto significa que cuando cambien el costo, la capacidad o la disponibilidad de los modelos, no quedarán atados a una sola plataforma.&lt;/p&gt;
&lt;p&gt;Tercero, opencode incluye soporte LSP opcional. Para autocompletado, navegación, diagnósticos y comprensión del proyecto, LSP es una base muy importante.&lt;/p&gt;
&lt;p&gt;Cuarto, opencode pone más énfasis en TUI. Está creado por usuarios de Neovim y los creadores de terminal.shop, así que el foco del producto está claramente en la experiencia de terminal.&lt;/p&gt;
&lt;p&gt;Quinto, opencode usa una arquitectura cliente/servidor. Esto significa que opencode puede ejecutarse en tu computadora y, en el futuro, controlarse desde una TUI, una app de escritorio, una app móvil u otros clientes. La TUI es solo una de las posibles interfaces.&lt;/p&gt;
&lt;h2 id=&#34;cuándo-elegir-opencode-claude-code-o-codex&#34;&gt;Cuándo elegir opencode, Claude Code o Codex
&lt;/h2&gt;&lt;p&gt;Si ya usas Claude Code o Codex, opencode no tiene por qué reemplazarlos de inmediato. Una forma más razonable de verlo es que ofrece una opción abierta, con modelos reemplazables y orientada a la terminal.&lt;/p&gt;
&lt;p&gt;Conviene considerar primero opencode cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quieres que tu herramienta de programación con IA sea lo más open source posible.&lt;/li&gt;
&lt;li&gt;No quieres atar tu flujo de trabajo a un proveedor de modelos.&lt;/li&gt;
&lt;li&gt;Quieres probar Claude, OpenAI, Google o modelos locales con la misma herramienta.&lt;/li&gt;
&lt;li&gt;Te gustan los flujos TUI y no quieres que una app de escritorio o web interrumpa tu flujo principal.&lt;/li&gt;
&lt;li&gt;Te interesa el potencial de control remoto de una arquitectura cliente/servidor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conviene considerar primero Claude Code cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usas principalmente modelos Claude.&lt;/li&gt;
&lt;li&gt;Te importan el contexto largo, la comprensión de código y la colaboración en tareas de ingeniería complejas.&lt;/li&gt;
&lt;li&gt;Quieres avanzar cambios, pruebas y refactorizaciones dentro de un repositorio local.&lt;/li&gt;
&lt;li&gt;Confías más en la experiencia predeterminada de Claude Code diseñada por Anthropic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conviene considerar primero Codex cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ya usas ChatGPT o el ecosistema de cuentas de OpenAI.&lt;/li&gt;
&lt;li&gt;Quieres un mismo coding agent en terminal, IDE, app de escritorio y tareas en la nube.&lt;/li&gt;
&lt;li&gt;Quieres delegar en la nube correcciones de bugs, desarrollo de funciones, migraciones o generación de pruebas relativamente claras, en paralelo.&lt;/li&gt;
&lt;li&gt;Necesitas revisión de código, tareas en segundo plano, colaboración de equipo y flujos multi-Agent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si priorizas una experiencia oficial de extremo a extremo, configuración predeterminada de modelos, administración empresarial e integraciones listas, Claude Code o Codex pueden ser más cómodos. Si priorizas control, apertura y enfoque provider-agnostic, opencode merece atención.&lt;/p&gt;
&lt;h2 id=&#34;puntos-a-tener-en-cuenta&#34;&gt;Puntos a tener en cuenta
&lt;/h2&gt;&lt;p&gt;opencode, Claude Code y Codex avanzan rápido. Los releases de GitHub, comandos de instalación, nombres de archivos de escritorio, disponibilidad de modelos y permisos de planes pueden cambiar. Antes de instalar o elegir, conviene revisar directamente el README, la documentación y las páginas de releases oficiales de cada herramienta.&lt;/p&gt;
&lt;p&gt;Además, la app de escritorio de opencode sigue marcada como Beta, así que no conviene tratarla por defecto como una herramienta estable de producción. Para tareas de ingeniería diarias, la versión de terminal sigue siendo la entrada principal.&lt;/p&gt;
&lt;p&gt;Visto como tendencia de herramientas, opencode representa la dirección de cadena de herramientas abierta para AI Coding Agents: modelos reemplazables, clientes reemplazables y una capacidad central de agente lo más abierta posible. Codex y Claude Code se parecen más a modelos convertidos por sus empresas en superficies de producto completas para coding agents. Para desarrolladores, ambas rutas probablemente coexistirán durante mucho tiempo.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;opencode GitHub: &lt;a class=&#34;link&#34; href=&#34;https://github.com/anomalyco/opencode&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anomalyco/opencode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;sitio oficial de opencode: &lt;a class=&#34;link&#34; href=&#34;https://opencode.ai&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://opencode.ai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;documentación de opencode: &lt;a class=&#34;link&#34; href=&#34;https://opencode.ai/docs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://opencode.ai/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;opencode Releases: &lt;a class=&#34;link&#34; href=&#34;https://github.com/anomalyco/opencode/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anomalyco/opencode/releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI Codex: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/codex/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/codex/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using Codex with your ChatGPT plan: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-codex-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11369540-codex-in-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAI Codex CLI Getting Started: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11096431-openai-codex-ci-getting-started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11096431-openai-codex-ci-getting-started&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Guía de instalación de uv: cómo elegir entre macOS, Linux, Windows, pipx, Homebrew y WinGet</title>
        <link>https://knightli.com/es/2026/05/07/uv-installation-guide/</link>
        <pubDate>Thu, 07 May 2026 23:23:58 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/uv-installation-guide/</guid>
        <description>&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; es un gestor de toolchain de Python creado por Astral. Sirve para gestionar versiones de Python, entornos virtuales, dependencias, scripts, proyectos y herramientas. Tiene muchas formas de instalación. La documentación oficial ofrece instaladores independientes y también admite PyPI, Homebrew, WinGet, Scoop, Docker, GitHub Releases y Cargo.&lt;/p&gt;
&lt;p&gt;Si solo quieres instalarlo rápido, da prioridad al instalador independiente oficial. Si prefieres mantener la versión mediante el gestor de paquetes del sistema, usa Homebrew, WinGet o Scoop. Si ya acostumbras instalar herramientas de Python en entornos aislados, puedes usar &lt;code&gt;pipx&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;elección-rápida&#34;&gt;Elección rápida
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Escenario&lt;/th&gt;
          &lt;th&gt;Método recomendado&lt;/th&gt;
          &lt;th&gt;Comando&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Instalación rápida en macOS / Linux&lt;/td&gt;
          &lt;td&gt;Instalador independiente oficial&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;macOS / Linux sin curl&lt;/td&gt;
          &lt;td&gt;Script oficial + wget&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;wget -qO- https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Instalación rápida en Windows&lt;/td&gt;
          &lt;td&gt;Instalador de PowerShell&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;powershell -ExecutionPolicy ByPass -c &amp;quot;irm https://astral.sh/uv/install.ps1 | iex&amp;quot;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Instalación aislada de herramientas Python&lt;/td&gt;
          &lt;td&gt;pipx&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pipx install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Instalación temporal o tradicional de Python&lt;/td&gt;
          &lt;td&gt;pip&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;pip install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Gestión de paquetes en macOS&lt;/td&gt;
          &lt;td&gt;Homebrew&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;brew install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Usuarios de MacPorts en macOS&lt;/td&gt;
          &lt;td&gt;MacPorts&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;sudo port install uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Gestión de paquetes en Windows&lt;/td&gt;
          &lt;td&gt;WinGet&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;winget install --id=astral-sh.uv -e&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Usuarios de Scoop en Windows&lt;/td&gt;
          &lt;td&gt;Scoop&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;scoop install main/uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Usuarios de Rust&lt;/td&gt;
          &lt;td&gt;Cargo&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;cargo install --locked uv&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Las opciones generales más recomendables son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS / Linux: instalador independiente oficial;&lt;/li&gt;
&lt;li&gt;Windows: instalador oficial de PowerShell o WinGet;&lt;/li&gt;
&lt;li&gt;si ya gestionas herramientas CLI de Python con &lt;code&gt;pipx&lt;/code&gt;: &lt;code&gt;pipx install uv&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;macos-y-linux-instalador-oficial&#34;&gt;macOS y Linux: instalador oficial
&lt;/h2&gt;&lt;p&gt;El método oficial más directo consiste en descargar el script con &lt;code&gt;curl&lt;/code&gt; y ejecutarlo con &lt;code&gt;sh&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -LsSf https://astral.sh/uv/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si el sistema no tiene &lt;code&gt;curl&lt;/code&gt;, puedes usar &lt;code&gt;wget&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget -qO- https://astral.sh/uv/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si quieres instalar una versión concreta, coloca el número de versión en la URL. Por ejemplo, el ejemplo oficial usa &lt;code&gt;0.11.11&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -LsSf https://astral.sh/uv/0.11.11/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este método encaja con la mayoría de entornos personales de desarrollo. Es simple, multiplataforma y funciona mejor con el mecanismo oficial de actualización de uv.&lt;/p&gt;
&lt;p&gt;El instalador coloca binarios como &lt;code&gt;uv&lt;/code&gt; y &lt;code&gt;uvx&lt;/code&gt; bajo el directorio del usuario, y puede modificar el shell profile para que los comandos puedan usarse directamente desde la terminal. Si no quieres que el instalador modifique PATH, revisa las opciones oficiales del installer, por ejemplo configurando &lt;code&gt;UV_NO_MODIFY_PATH=1&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;windows-instalador-de-powershell&#34;&gt;Windows: instalador de PowerShell
&lt;/h2&gt;&lt;p&gt;El método oficial en Windows es ejecutar el script de instalación con PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ByPass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/install.ps1 | iex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para instalar una versión concreta, también puedes poner el número de versión en la URL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ByPass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/0.11.11/install.ps1 | iex&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Aquí &lt;code&gt;ExecutionPolicy ByPass&lt;/code&gt; permite obtener y ejecutar el script de instalación desde internet. Como hábito de seguridad, puedes revisar el contenido del script antes de ejecutarlo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;powershell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;irm https://astral.sh/uv/install.ps1 | more&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si estás acostumbrado a gestores de paquetes de Windows, también puedes priorizar WinGet o Scoop.&lt;/p&gt;
&lt;h2 id=&#34;instalar-con-pipx&#34;&gt;Instalar con pipx
&lt;/h2&gt;&lt;p&gt;La documentación oficial indica que uv se publica en PyPI. Si lo instalas desde PyPI, se recomienda ponerlo en un entorno aislado, por ejemplo con &lt;code&gt;pipx&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pipx install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este método es adecuado si ya usas &lt;code&gt;pipx&lt;/code&gt; como gestor de herramientas CLI de Python. Evita mezclar uv con el entorno del proyecto actual.&lt;/p&gt;
&lt;p&gt;Si no tienes &lt;code&gt;pipx&lt;/code&gt;, también puedes usar &lt;code&gt;pip&lt;/code&gt; directamente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pero ten en cuenta que uv ofrece wheels precompilados en muchas plataformas. Si una plataforma no tiene un wheel compatible, se construirá desde código fuente, y en ese caso necesitarás una toolchain de Rust.&lt;/p&gt;
&lt;p&gt;Mi recomendación: en una máquina personal, &lt;code&gt;pipx install uv&lt;/code&gt; es más limpio que &lt;code&gt;pip install uv&lt;/code&gt;; dentro de un entorno de proyecto, no recomiendo instalar uv como dependencia del proyecto.&lt;/p&gt;
&lt;h2 id=&#34;homebrew-macports-winget-y-scoop&#34;&gt;Homebrew, MacPorts, WinGet y Scoop
&lt;/h2&gt;&lt;p&gt;Si prefieres gestores de paquetes del sistema, uv también admite canales comunes.&lt;/p&gt;
&lt;p&gt;En macOS, usa Homebrew:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Los usuarios de MacPorts pueden usar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo port install uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En Windows, usa WinGet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;winget&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;astral-sh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;uv&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Los usuarios de Scoop pueden usar:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;scoop&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La ventaja de estos métodos es que delegan el mantenimiento en el gestor de paquetes del sistema. La desventaja es que el ritmo de actualización depende del origen de paquetes correspondiente, no del instalador oficial de uv.&lt;/p&gt;
&lt;h2 id=&#34;docker-github-releases-y-cargo&#34;&gt;Docker, GitHub Releases y Cargo
&lt;/h2&gt;&lt;p&gt;uv también ofrece imágenes Docker en GitHub Container Registry:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ghcr.io/astral-sh/uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto sirve para CI, Dockerfiles, creación de imágenes y entornos temporales de ejecución. En uso real, conviene revisar también la documentación oficial de integración con Docker.&lt;/p&gt;
&lt;p&gt;Si quieres descargar binarios manualmente, puedes hacerlo desde GitHub Releases. Cada página de release suele incluir binarios para las plataformas compatibles y explicar cómo llamar al instalador independiente usando una URL de GitHub.&lt;/p&gt;
&lt;p&gt;Los usuarios de Rust también pueden instalar desde crates.io:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo install --locked uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pero este método compila desde código fuente y requiere una toolchain de Rust compatible. A menos que necesites instalarlo explícitamente desde el ecosistema Rust, los usuarios normales no tienen por qué elegir Cargo primero.&lt;/p&gt;
&lt;h2 id=&#34;actualizar-uv&#34;&gt;Actualizar uv
&lt;/h2&gt;&lt;p&gt;Si uv se instaló mediante el instalador independiente oficial, puedes usar el comando de autoactualización:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv self update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La documentación oficial indica que actualizar uv vuelve a ejecutar el instalador y puede modificar el shell profile. Si no quieres que la actualización modifique PATH, configura:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;UV_NO_MODIFY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si lo instalaste de otra forma, debes actualizarlo con el gestor correspondiente. Por ejemplo, si lo instalaste con &lt;code&gt;pip&lt;/code&gt;, usa:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install --upgrade uv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Homebrew, WinGet, Scoop y MacPorts también deben usar sus propios comandos de actualización.&lt;/p&gt;
&lt;h2 id=&#34;activar-autocompletado-de-shell&#34;&gt;Activar autocompletado de shell
&lt;/h2&gt;&lt;p&gt;uv admite autocompletado de shell. La documentación oficial recomienda comprobar primero cuál es tu shell actual:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$SHELL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uv generate-shell-completion bash)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Zsh:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uv generate-shell-completion zsh)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;fish:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;uv generate-shell-completion fish | source&amp;#39;&lt;/span&gt; &amp;gt; ~/.config/fish/completions/uv.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;New-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ItemType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Add-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Value&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;(&amp;amp; uv generate-shell-completion powershell) | Out-String | Invoke-Expression&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si también usas &lt;code&gt;uvx&lt;/code&gt; con frecuencia, puedes activar el autocompletado de &lt;code&gt;uvx&lt;/code&gt; por separado.&lt;/p&gt;
&lt;p&gt;Bash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uvx --generate-shell-completion bash)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Zsh:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;eval &amp;#34;$(uvx --generate-shell-completion zsh)&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;fish:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;uvx --generate-shell-completion fish | source&amp;#39;&lt;/span&gt; &amp;gt; ~/.config/fish/completions/uvx.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;PowerShell:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(!(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Test-Path&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;New-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-ItemType&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;File&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Add-Content&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$PROFILE&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-Value&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;(&amp;amp; uvx --generate-shell-completion powershell) | Out-String | Invoke-Expression&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Después de configurarlo, reinicia el shell o recarga el archivo de configuración correspondiente.&lt;/p&gt;
&lt;h2 id=&#34;desinstalar-uv&#34;&gt;Desinstalar uv
&lt;/h2&gt;&lt;p&gt;Para desinstalar uv, primero puedes limpiar la caché y los datos gestionados por uv:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv cache clean
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uv python dir&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;uv tool dir&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Después elimina los binarios.&lt;/p&gt;
&lt;p&gt;macOS / Linux:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm ~/.local/bin/uv ~/.local/bin/uvx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;rm &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;rm &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uvx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;rm &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;local&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;uvw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La documentación oficial también recuerda que antes de &lt;code&gt;0.5.0&lt;/code&gt;, uv se instalaba en &lt;code&gt;~/.cargo/bin&lt;/code&gt;. Si actualizaste desde una versión antigua, es posible que los binarios viejos sigan allí y debas eliminarlos manualmente.&lt;/p&gt;
&lt;h2 id=&#34;qué-hacer-después-de-instalar&#34;&gt;Qué hacer después de instalar
&lt;/h2&gt;&lt;p&gt;Después de instalar, conviene confirmar primero la versión:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Luego puedes empezar con algunas tareas comunes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv python install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv venv
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uv pip install requests
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uvx ruff --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si es un proyecto nuevo, puedes seguir aprendiendo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv init&lt;/code&gt;: inicializar un proyecto;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv add&lt;/code&gt;: añadir dependencias;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv sync&lt;/code&gt;: sincronizar el entorno;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv run&lt;/code&gt;: ejecutar comandos dentro del entorno del proyecto;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uvx&lt;/code&gt;: ejecutar temporalmente herramientas CLI de Python.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;mi-recomendación&#34;&gt;Mi recomendación
&lt;/h2&gt;&lt;p&gt;En una máquina personal de desarrollo, prioriza el instalador independiente oficial, porque es el método más alineado con la documentación oficial de uv y admite &lt;code&gt;uv self update&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si usas Windows y no quieres ejecutar un script remoto, puedes usar WinGet o Scoop. Si usas macOS y prefieres que todas tus herramientas las gestione Homebrew, puedes usar directamente &lt;code&gt;brew install uv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Quienes ya gestionan herramientas CLI de Python con &lt;code&gt;pipx&lt;/code&gt; pueden usar &lt;code&gt;pipx install uv&lt;/code&gt;. Pero no recomiendo ejecutar &lt;code&gt;pip install uv&lt;/code&gt; dentro del entorno virtual de un proyecto concreto, porque eso mezcla la toolchain con las dependencias del proyecto.&lt;/p&gt;
&lt;p&gt;Si se trata de CI o construcción de contenedores, revisa primero Docker y GitHub Releases, y fija la versión según el flujo de creación de la imagen.&lt;/p&gt;
&lt;h2 id=&#34;enlaces-relacionados&#34;&gt;Enlaces relacionados
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Documentación de instalación de uv: &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/getting-started/installation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.astral.sh/uv/getting-started/installation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uv First steps: &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/getting-started/first-steps/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.astral.sh/uv/getting-started/first-steps/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Integración de uv con Docker: &lt;a class=&#34;link&#34; href=&#34;https://docs.astral.sh/uv/guides/integration/docker/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.astral.sh/uv/guides/integration/docker/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;uv GitHub Releases: &lt;a class=&#34;link&#34; href=&#34;https://github.com/astral-sh/uv/releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/astral-sh/uv/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Awesome Codex Skills: un catalogo comunitario para ampliar Codex CLI</title>
        <link>https://knightli.com/es/2026/05/07/awesome-codex-skills-composio/</link>
        <pubDate>Thu, 07 May 2026 20:19:15 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/awesome-codex-skills-composio/</guid>
        <description>&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ComposioHQ/awesome-codex-skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;awesome-codex-skills&lt;/a&gt;, de ComposioHQ, es un catalogo comunitario de skills para Codex CLI. Su valor no esta en ser otra pila de plantillas de prompts, sino en ofrecer una forma de empaquetar flujos repetibles como Skills instalables, reutilizables y mantenibles.&lt;/p&gt;
&lt;p&gt;Si ya usas Codex como parte del desarrollo diario, este tipo de repositorio resulta util de inmediato: reglas, comandos, materiales de referencia y pasos operativos que antes tenias que explicar una y otra vez pueden escribirse una vez y reutilizarse cada vez que se invoque la Skill correspondiente.&lt;/p&gt;
&lt;h2 id=&#34;que-resuelve-este-repositorio&#34;&gt;Que resuelve este repositorio
&lt;/h2&gt;&lt;p&gt;Las Codex Skills pueden entenderse como modos de trabajo especializados para Codex CLI. Un prompt normal sirve bien para una instruccion temporal; una Skill encaja mejor con algo que quieres reutilizar durante mucho tiempo.&lt;/p&gt;
&lt;p&gt;Por ejemplo, puede que a menudo necesites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generar mensajes de commit con un formato fijo;&lt;/li&gt;
&lt;li&gt;consultar una familia especifica de documentacion de API;&lt;/li&gt;
&lt;li&gt;ejecutar comandos de pruebas y despliegue propios de un proyecto;&lt;/li&gt;
&lt;li&gt;reescribir articulos, traducir documentos u organizar notas segun reglas del equipo;&lt;/li&gt;
&lt;li&gt;llamar herramientas externas para tareas de desarrollo repetitivas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Escribir estas instrucciones cada vez se convierte rapidamente en sobrecarga. Una Skill coloca las reglas en un directorio independiente. El nucleo suele ser un archivo &lt;code&gt;SKILL.md&lt;/code&gt;, a veces acompanado de scripts, plantillas, documentos de referencia o assets. Cuando Codex se activa, lee las instrucciones y sigue el flujo descrito alli.&lt;/p&gt;
&lt;h2 id=&#34;en-que-se-diferencia-de-un-prompt&#34;&gt;En que se diferencia de un prompt
&lt;/h2&gt;&lt;p&gt;Un prompt se parece mas a una instruccion puntual: &amp;ldquo;haz esta tarea de esta forma&amp;rdquo;. Una Skill se parece mas a un pequeno manual operativo: &amp;ldquo;cuando aparezca esta clase de tarea, trabaja de esta manera&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Sus principales ventajas son:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reutilizable&lt;/strong&gt;: los flujos comunes ya no necesitan preparacion por copy-and-paste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revisable&lt;/strong&gt;: los archivos de skill suelen ser Markdown locales que pueden abrirse, editarse y versionarse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensible&lt;/strong&gt;: las skills complejas pueden incluir scripts, plantillas y referencias, no solo instrucciones en lenguaje natural.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Por eso catalogos como &lt;code&gt;awesome-codex-skills&lt;/code&gt; son utiles: ayudan a descubrir skills existentes y luego adaptarlas a tu propio flujo de trabajo.&lt;/p&gt;
&lt;h2 id=&#34;instalacion-y-uso&#34;&gt;Instalacion y uso
&lt;/h2&gt;&lt;p&gt;El repositorio ofrece un script de instalacion y tambien soporta instalacion manual. Un flujo tipico es:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/ComposioHQ/awesome-codex-skills.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; awesome-codex-skills
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python install.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si solo quieres probar algunas skills, lee primero el &lt;code&gt;SKILL.md&lt;/code&gt; de cada directorio. Revisa que lee, que scripts puede ejecutar, que archivos puede editar y si los valores por defecto encajan con tu entorno local.&lt;/p&gt;
&lt;p&gt;Despues de instalar, Codex puede detectar skills cuando la tarea las necesita, o puedes nombrar una skill de forma explicita. Para uso a largo plazo, el enfoque mas practico suele ser instalar primero una skill comunitaria y despues reescribir sus instrucciones alrededor de las convenciones de tu proyecto.&lt;/p&gt;
&lt;h2 id=&#34;que-skills-merece-la-pena-observar&#34;&gt;Que skills merece la pena observar
&lt;/h2&gt;&lt;p&gt;Las skills mas valiosas no son necesariamente las que tienen los nombres mas llamativos. Son las que eliminan trabajo repetido de forma fiable.&lt;/p&gt;
&lt;p&gt;Yo miraria primero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Skills de flujo de desarrollo&lt;/strong&gt;: review, pruebas, commits, releases, comprobacion de dependencias.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills de documentacion&lt;/strong&gt;: reescritura, traduccion, resumen, organizacion estructurada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills de integracion de herramientas&lt;/strong&gt;: conectar Codex con servicios externos, APIs y herramientas CLI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills de convenciones de proyecto&lt;/strong&gt;: codificar reglas del equipo, estructura de directorios, convenciones de nombres y pasos de despliegue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si una skill solo envuelve un prompt de una frase, su valor es limitado. Si puede conectar investigacion, juicio, ejecucion, verificacion y salida en un flujo estable, merece conservarse.&lt;/p&gt;
&lt;h2 id=&#34;puntos-de-cuidado&#34;&gt;Puntos de cuidado
&lt;/h2&gt;&lt;p&gt;Las skills comunitarias son comodas, pero no deberian tratarse como cajas negras. Esto es especialmente cierto para Skills que incluyen scripts. Antes de instalar una, revisa:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;que le pide &lt;code&gt;SKILL.md&lt;/code&gt; a Codex;&lt;/li&gt;
&lt;li&gt;si incluye scripts que acceden a la red, leen o escriben archivos, o llaman servicios externos;&lt;/li&gt;
&lt;li&gt;si las rutas, comandos y permisos por defecto encajan con tu maquina.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Una Skill amplia lo que Codex puede hacer. Bien escrita, hace que Codex se sienta mas como un companero que conoce tu proyecto. Escrita con descuido, puede traer reglas inadecuadas a tu flujo de trabajo. El mejor patron no es instalar muchas skills, sino mantener un conjunto pequeno, ajustarlas con cuidado y conservarlas con el tiempo.&lt;/p&gt;
&lt;h2 id=&#34;mi-lectura&#34;&gt;Mi lectura
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;awesome-codex-skills&lt;/code&gt; merece guardarse en favoritos, especialmente si ya usas Codex CLI para desarrollo real, documentacion o automatizacion. No es una capacidad oficial por si misma; es un punto de entrada comunitario para encontrar y adaptar flujos reutilizables.&lt;/p&gt;
&lt;p&gt;Para usuarios intensivos, el punto de Codex Skills no es simplemente ayudar a la IA a recordar mas. Es ayudar a la IA a dar menos rodeos en tareas repetidas. Escribir reglas como Skills convierte instrucciones temporales en infraestructura de trabajo reutilizable.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Warp Open Source: de terminal a entorno de desarrollo agentico</title>
        <link>https://knightli.com/es/2026/05/07/warpdotdev-warp-open-source-agentic-terminal/</link>
        <pubDate>Thu, 07 May 2026 20:15:08 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/warpdotdev-warp-open-source-agentic-terminal/</guid>
        <description>&lt;p&gt;&lt;code&gt;warpdotdev/warp&lt;/code&gt; es el repositorio open source del cliente de Warp. Warp se describe ahora como un &amp;ldquo;entorno de desarrollo agentico, nacido del terminal&amp;rdquo;: parte del terminal, pero lleva agentes de programacion con IA, indexacion de codebase, gestion de tareas y flujos de desarrollo a un solo entorno.&lt;/p&gt;
&lt;p&gt;No es un repositorio open source ordinario de emulador de terminal. Se parece mas a una respuesta a una pregunta mayor: cuando agentes como Claude Code, Codex y Gemini CLI se vuelven comunes, deberia el propio terminal convertirse en un entorno de desarrollo para planificar, observar y gestionar agentes?&lt;/p&gt;
&lt;p&gt;La respuesta de Warp es si.&lt;/p&gt;
&lt;h2 id=&#34;estado-actual-del-repositorio&#34;&gt;Estado actual del repositorio
&lt;/h2&gt;&lt;p&gt;Al 7 de mayo de 2026, &lt;code&gt;warpdotdev/warp&lt;/code&gt; es un repositorio publico. GitHub muestra alrededor de 56k stars y 4.1k forks. El README dice que el codigo del cliente Warp ahora es open source y da la bienvenida a contribuciones de la comunidad.&lt;/p&gt;
&lt;p&gt;El lenguaje principal es Rust. El desglose de lenguajes de GitHub muestra Rust por encima del 98%, lo que encaja con el posicionamiento de Warp: no es un wrapper web, sino una herramienta de desarrollo nativa y multiplataforma.&lt;/p&gt;
&lt;p&gt;Varios detalles del README importan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Warp es un entorno de desarrollo agentico, nacido del terminal.&lt;/li&gt;
&lt;li&gt;Puede usar su agente de programacion integrado y tambien conectar con agentes CLI externos como Claude Code, Codex y Gemini CLI.&lt;/li&gt;
&lt;li&gt;OpenAI es el patrocinador fundador del repositorio Warp recien abierto.&lt;/li&gt;
&lt;li&gt;Los flujos de gestion agentica del repositorio estan impulsados por modelos GPT.&lt;/li&gt;
&lt;li&gt;Los crates del framework de UI de Warp usan licencia MIT, mientras que el resto del codigo usa AGPL v3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto muestra que el movimiento open source de Warp no consiste solo en publicar un terminal. Esta operando el proyecto como un campo de pruebas para flujos de trabajo con agentes.&lt;/p&gt;
&lt;h2 id=&#34;warp-es-mas-que-un-terminal&#34;&gt;Warp es mas que un terminal
&lt;/h2&gt;&lt;p&gt;Los terminales tradicionales hacen principalmente tres cosas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iniciar una shell;&lt;/li&gt;
&lt;li&gt;ejecutar comandos;&lt;/li&gt;
&lt;li&gt;mostrar salida.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La diferenciacion inicial de Warp era hacer que el terminal se sintiera mas moderno: bloques de comandos, autocompletado, historial, colaboracion, interacciones con estilo de UI y pulido multiplataforma. Ahora el foco se ha desplazado mas hacia organizar el desarrollo alrededor de agentes de IA.&lt;/p&gt;
&lt;p&gt;Segun el README, Warp ya no enfatiza solo &amp;ldquo;un mejor terminal&amp;rdquo;. Enfatiza:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;agentes de programacion integrados;&lt;/li&gt;
&lt;li&gt;soporte para agentes CLI externos;&lt;/li&gt;
&lt;li&gt;triage de issues;&lt;/li&gt;
&lt;li&gt;escritura de especificaciones;&lt;/li&gt;
&lt;li&gt;revision de PR;&lt;/li&gt;
&lt;li&gt;coordinacion de contribuidores;&lt;/li&gt;
&lt;li&gt;sesiones de agentes observables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En otras palabras, Warp quiere convertir el terminal de &amp;ldquo;donde escribes comandos&amp;rdquo; en &amp;ldquo;donde trabajas con multiples agentes&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;oz-y-gestion-de-proyectos-open-source&#34;&gt;Oz y gestion de proyectos open source
&lt;/h2&gt;&lt;p&gt;El README menciona &lt;code&gt;Oz&lt;/code&gt; varias veces.&lt;/p&gt;
&lt;p&gt;La vista de contribucion de Warp muestra miles de agentes Oz trabajando en triage de issues, especificaciones, implementacion y revision de PR. Esto es interesante porque extiende los agentes de IA desde &amp;ldquo;ayudar a una persona a escribir codigo&amp;rdquo; hasta &amp;ldquo;ayudar a gestionar colaboracion open source&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;La parte mas dificil de muchos proyectos open source no es escribir codigo, sino mantener:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;demasiados issues y poca clasificacion;&lt;/li&gt;
&lt;li&gt;bugs y feature requests mezclados;&lt;/li&gt;
&lt;li&gt;nuevos contribuidores sin saber que tareas son abordables;&lt;/li&gt;
&lt;li&gt;presion de revision de PR;&lt;/li&gt;
&lt;li&gt;maintainers intentando seguir cada hilo de comunidad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La idea de Warp es dejar que los agentes asuman primero parte del trabajo de gestion de proyecto y colaboracion. El README tambien menciona &lt;code&gt;Oz for OSS&lt;/code&gt;, un programa orientado a maintainers para llevar flujos similares de gestion open source agentica a otros repositorios.&lt;/p&gt;
&lt;p&gt;Esto sugiere que la ambicion de Warp no es solo el producto terminal, sino tambien un nuevo modelo de mantenimiento open source en la era de la IA.&lt;/p&gt;
&lt;h2 id=&#34;estructura-del-repositorio-y-stack-tecnico&#34;&gt;Estructura del repositorio y stack tecnico
&lt;/h2&gt;&lt;p&gt;Por la estructura del repositorio, Warp es un proyecto Rust grande.&lt;/p&gt;
&lt;p&gt;La raiz contiene:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app/&lt;/code&gt;: codigo principal de la aplicacion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crates/&lt;/code&gt;: crates Rust centrales.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets/&lt;/code&gt;: archivos de recursos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;command-signatures-v2/&lt;/code&gt;: contenido relacionado con firmas de comandos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker/&lt;/code&gt;, &lt;code&gt;script/&lt;/code&gt;, &lt;code&gt;resources/&lt;/code&gt;, &lt;code&gt;specs/&lt;/code&gt; y otros directorios de ingenieria.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;.warp/&lt;/code&gt;, &lt;code&gt;.agents/skills&lt;/code&gt; y otras configuraciones relacionadas con agentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;WARP.md&lt;/code&gt; aporta mas detalle de ingenieria. Describe Warp como un emulador de terminal basado en Rust que usa un framework de UI interno llamado &lt;code&gt;WarpUI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Los modulos principales pueden entenderse aproximadamente asi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app/&lt;/code&gt;: emulacion de terminal, gestion de shell, integracion de IA, Drive, autenticacion, ajustes, workspace y sesiones.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crates/warp_core/&lt;/code&gt;: utilidades centrales y abstraccion de plataforma.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crates/editor/&lt;/code&gt;: funcionalidad de edicion de texto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crates/warpui/&lt;/code&gt; y &lt;code&gt;crates/warpui_core/&lt;/code&gt;: framework de UI interno.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crates/ipc/&lt;/code&gt;: comunicacion entre procesos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;crates/graphql/&lt;/code&gt;: cliente GraphQL y esquema.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;WARP.md&lt;/code&gt; tambien menciona rasgos arquitectonicos como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un sistema Entity-Handle;&lt;/li&gt;
&lt;li&gt;una estructura modular de workspace;&lt;/li&gt;
&lt;li&gt;targets para macOS, Windows, Linux y WASM;&lt;/li&gt;
&lt;li&gt;integracion de IA, incluyendo Agent Mode, conciencia de contexto e indexacion de codebase;&lt;/li&gt;
&lt;li&gt;sincronizacion cloud Warp Drive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esta complejidad esta mas cerca de un IDE completo que de un terminal tradicional ligero.&lt;/p&gt;
&lt;h2 id=&#34;comandos-de-build-local&#34;&gt;Comandos de build local
&lt;/h2&gt;&lt;p&gt;El README da un flujo local conciso:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./script/bootstrap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./script/run
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./script/presubmit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Donde:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./script/bootstrap&lt;/code&gt; realiza la inicializacion especifica de la plataforma.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./script/run&lt;/code&gt; compila y ejecuta Warp.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./script/presubmit&lt;/code&gt; ejecuta formato, clippy, tests y otras comprobaciones previas al envio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;WARP.md&lt;/code&gt; tambien lista comandos mas detallados:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo run
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo bundle --bin warp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo nextest run --no-fail-fast --workspace --exclude command-signatures-v2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo fmt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cargo clippy --workspace --all-targets --all-features --tests -- -D warnings
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si quieres contribuir a Warp, &lt;code&gt;./script/presubmit&lt;/code&gt; es practicamente obligatorio.&lt;/p&gt;
&lt;h2 id=&#34;flujo-de-contribucion&#34;&gt;Flujo de contribucion
&lt;/h2&gt;&lt;p&gt;El flujo de contribucion de Warp no es simplemente &amp;ldquo;abre un PR&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;El README describe un proceso ligero desde issue hasta PR:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Buscar primero issues existentes.&lt;/li&gt;
&lt;li&gt;Si no hay duplicado, abrir un bug o feature request.&lt;/li&gt;
&lt;li&gt;Los maintainers revisan el issue y pueden anadir etiquetas de preparacion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ready-to-spec&lt;/code&gt; significa que el diseno puede expandirse en una especificacion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ready-to-implement&lt;/code&gt; significa que el diseno esta lo bastante claro para empezar un PR de implementacion.&lt;/li&gt;
&lt;li&gt;Los contribuidores pueden tomar issues etiquetados.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este proceso encaja con un proyecto open source grande. Separa ideas, diseno e implementacion, reduciendo el riesgo de que los contribuidores pasen tiempo construyendo en una direccion equivocada.&lt;/p&gt;
&lt;p&gt;Tambien encaja bien con agentes de IA. Un agente puede organizar issues, redactar specs, anadir tests y luego pasar a implementacion. Warp usa este patron para demostrar gestion de proyecto agentica.&lt;/p&gt;
&lt;h2 id=&#34;licencia-mit--agpl-v3&#34;&gt;Licencia: MIT + AGPL v3
&lt;/h2&gt;&lt;p&gt;Warp usa una estructura de doble licencia.&lt;/p&gt;
&lt;p&gt;El README dice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;el framework de UI de Warp, concretamente los crates &lt;code&gt;warpui_core&lt;/code&gt; y &lt;code&gt;warpui&lt;/code&gt;, usa licencia MIT;&lt;/li&gt;
&lt;li&gt;el resto del repositorio usa AGPL v3.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto importa. AGPL v3 tiene requisitos open source mas fuertes para servicios de red y distribucion. Si estas aprendiendo, investigando o contribuyendo, normalmente es sencillo. Pero si quieres usar codigo de Warp en un producto comercial o en un derivado closed-source, debes leer la licencia con cuidado y consultar asesoria legal si hace falta.&lt;/p&gt;
&lt;p&gt;En resumen, Warp es open source, pero no es open source de &amp;ldquo;tomalo y cierralo libremente&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;por-que-merece-atencion&#34;&gt;Por que merece atencion
&lt;/h2&gt;&lt;p&gt;Primero, Warp une terminal, agentes y gestion de proyecto.&lt;/p&gt;
&lt;p&gt;Muchas herramientas de programacion con IA siguen siendo CLI o plugins de editor. Warp parte del punto de entrada del terminal e intenta unificar tareas de agentes, ejecucion de codigo, salida de comandos, flujos de PR y colaboracion de equipo.&lt;/p&gt;
&lt;p&gt;Segundo, el enfoque open source de Warp es un buen lugar para observar flujos con agentes.&lt;/p&gt;
&lt;p&gt;No solo publica codigo. Tambien expone vistas de contribucion, sesiones de agentes, triage de issues y flujos de especificacion. Para cualquiera que estudie como la IA puede participar en colaboracion open source, el propio repositorio es una muestra.&lt;/p&gt;
&lt;p&gt;Tercero, Warp es una aplicacion de escritorio Rust compleja.&lt;/p&gt;
&lt;p&gt;Si quieres estudiar GUI en Rust, emulacion de terminal, apps multiplataforma, clientes GraphQL, sincronizacion cloud e integracion de IA, el repositorio tiene mucho que leer. Pero no es un proyecto pequeno, asi que los nuevos contribuidores deberian leer primero la documentacion y el proceso de issues.&lt;/p&gt;
&lt;p&gt;Cuarto, Warp soporta tanto un agente integrado como un enfoque &amp;ldquo;trae tu propio agente CLI&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Esto es realista. Los desarrolladores no usaran un solo agente. Claude Code, Codex, Gemini CLI, OpenCode, OpenClaw y herramientas similares probablemente coexistiran. Si Warp puede convertirse en un banco de trabajo para ellos, se vuelve mas valioso que un terminal de proposito unico.&lt;/p&gt;
&lt;h2 id=&#34;a-quien-deberia-importarle&#34;&gt;A quien deberia importarle
&lt;/h2&gt;&lt;p&gt;Si eres un usuario normal de terminal, Warp importa porque el terminal puede estar cambiando de herramienta de linea de comandos a banco de trabajo con IA.&lt;/p&gt;
&lt;p&gt;Si eres usuario intensivo de agentes de programacion con IA, Warp merece seguimiento porque intenta gestionar multiples agentes en vez de actuar como otro punto de entrada de chat.&lt;/p&gt;
&lt;p&gt;Si mantienes proyectos open source, la direccion de Oz for OSS merece atencion. Explora triage de issues con agentes, revision de PR, colaboracion comunitaria e incorporacion de contribuidores.&lt;/p&gt;
&lt;p&gt;Si eres desarrollador Rust, Warp es una aplicacion de escritorio real y de gran escala que merece estudiarse por organizacion de UI, internals de terminal, sincronizacion cloud, integracion de IA y codigo multiplataforma.&lt;/p&gt;
&lt;p&gt;Si solo quieres un terminal que pueda reemplazar al actual de inmediato, es mejor descargar primero la version estable y despues decidir si estudiar el codigo fuente. Compilar desde codigo es mas adecuado para contribuidores y usuarios profundos.&lt;/p&gt;
&lt;h2 id=&#34;lectura-breve&#34;&gt;Lectura breve
&lt;/h2&gt;&lt;p&gt;El punto de que Warp se vuelva open source no es simplemente &amp;ldquo;un terminal moderno se hizo open source&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Mas precisamente, Warp intenta actualizar el terminal hasta convertirlo en un entorno de desarrollo agentico: el terminal conecta shell, codebase, ejecucion de comandos, agentes, issues, PRs y flujo de colaboracion.&lt;/p&gt;
&lt;p&gt;A medida que los agentes de programacion con IA sigan creciendo, el punto de entrada del entorno de desarrollo puede cambiar. Antes, el IDE dominaba la experiencia del desarrollador mientras el terminal ejecutaba comandos. Ahora el terminal puede convertirse en el centro de colaboracion con agentes. El repositorio de Warp explora esa posibilidad.&lt;/p&gt;
&lt;h2 id=&#34;enlaces-relacionados&#34;&gt;Enlaces relacionados
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GitHub repository: &lt;a class=&#34;link&#34; href=&#34;https://github.com/warpdotdev/warp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/warpdotdev/warp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Warp website: &lt;a class=&#34;link&#34; href=&#34;https://www.warp.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.warp.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Warp documentation: &lt;a class=&#34;link&#34; href=&#34;https://docs.warp.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.warp.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Warp build overview: &lt;a class=&#34;link&#34; href=&#34;https://build.warp.dev&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://build.warp.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WARP.md: &lt;a class=&#34;link&#34; href=&#34;https://github.com/warpdotdev/warp/blob/master/WARP.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/warpdotdev/warp/blob/master/WARP.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CONTRIBUTING.md: &lt;a class=&#34;link&#34; href=&#34;https://github.com/warpdotdev/warp/blob/master/CONTRIBUTING.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/warpdotdev/warp/blob/master/CONTRIBUTING.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Primeros pasos con la compilación de programas UEFI: desde uefi-simple hasta su primer .EFI</title>
        <link>https://knightli.com/es/2026/04/30/compile-uefi-program-beginner-guide/</link>
        <pubDate>Thu, 30 Apr 2026 19:53:08 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/30/compile-uefi-program-beginner-guide/</guid>
        <description>&lt;p&gt;Compilar su primer programa UEFI no es precisamente sencillo. La configuración del entorno puede llevar tiempo, los errores del vinculador son comunes y un programa &lt;code&gt;.EFI&lt;/code&gt; no tiene la misma experiencia directa de edición y ejecución que una aplicación de escritorio normal.&lt;/p&gt;
&lt;p&gt;Este artículo organiza el tema desde la perspectiva de un principiante: si sólo desea compilar su primer programa UEFI, ¿por dónde debería empezar, qué conceptos importan primero y qué errores es más probable que aparezcan?&lt;/p&gt;
&lt;h2 id=&#34;qué-es-un-programa-uefi&#34;&gt;¿Qué es un programa UEFI?
&lt;/h2&gt;&lt;p&gt;Un programa UEFI suele ser un archivo &lt;code&gt;.EFI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No es un &lt;code&gt;.exe&lt;/code&gt; ordinario en el que se hace doble clic en Windows. Es un ejecutable PE/COFF que se ejecuta dentro del entorno de firmware UEFI. Los casos de uso comunes incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestores de arranque&lt;/li&gt;
&lt;li&gt;Herramientas de inicialización de hardware.&lt;/li&gt;
&lt;li&gt;Herramientas de actualización de firmware&lt;/li&gt;
&lt;li&gt;Herramientas de diagnóstico previas al arranque&lt;/li&gt;
&lt;li&gt;Flujos de arranque personalizados&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Muchas funciones que ve al principio del proceso de inicio del sistema pueden estar relacionadas con aplicaciones, controladores o servicios de firmware UEFI.&lt;/p&gt;
&lt;p&gt;Para los principiantes, no es necesario comprender inmediatamente el desarrollo completo del firmware. El primer objetivo es simple: compilar un archivo &lt;code&gt;.EFI&lt;/code&gt; que pueda cargarse mediante un UEFI Shell o un emulador.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-no-empezar-con-edk-ii&#34;&gt;¿Por qué no empezar con EDK II?
&lt;/h2&gt;&lt;p&gt;El desarrollo real de UEFI a menudo implica EDK II.&lt;/p&gt;
&lt;p&gt;EDK II es completo y más cercano a la ingeniería de firmware real, pero no es muy amigable para principiantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La estructura del proyecto es compleja.&lt;/li&gt;
&lt;li&gt;El sistema de construcción tiene una curva de aprendizaje.&lt;/li&gt;
&lt;li&gt;Las variables de entorno y la configuración de la cadena de herramientas implican muchos detalles.&lt;/li&gt;
&lt;li&gt;Los errores del compilador no siempre son fáciles de entender.&lt;/li&gt;
&lt;li&gt;Es fácil quedarse atascado en el entorno antes de escribir cualquier código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si el objetivo es simplemente ejecutar un programa UEFI mínimo, un ejemplo ligero es un mejor punto de partida.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pbatard/uefi-simple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pbatard/uefi-simple&lt;/a&gt; es uno de esos proyectos. Su objetivo es sencillo: proporcionar un ejemplo UEFI Hello World sencillo para que puedas compilar un archivo &lt;code&gt;.EFI&lt;/code&gt; primero.&lt;/p&gt;
&lt;h2 id=&#34;para-qué-sirve-uefi-simple&#34;&gt;¿Para qué sirve &lt;code&gt;uefi-simple&lt;/code&gt;?
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;uefi-simple&lt;/code&gt; es un buen primer paso para los principiantes en UEFI.&lt;/p&gt;
&lt;p&gt;Resuelve tres problemas prácticos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le brinda una estructura de aplicación UEFI mínima y compilable.&lt;/li&gt;
&lt;li&gt;Evita la complejidad de grandes proyectos de firmware al principio&lt;/li&gt;
&lt;li&gt;Le permite verificar que compilar, vincular y ejecutar todo funciona.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El proyecto admite múltiples métodos de compilación, incluidos Visual Studio 2022 y MinGW/gcc. También se puede probar con QEMU y OVMF.&lt;/p&gt;
&lt;p&gt;En otras palabras, no es necesario reiniciar repetidamente una máquina real para los primeros experimentos. Ejecutar primero el programa en un emulador es mucho más seguro.&lt;/p&gt;
&lt;h2 id=&#34;qué-preparar-antes-de-comenzar&#34;&gt;Qué preparar antes de comenzar
&lt;/h2&gt;&lt;p&gt;Necesita al menos algunas categorías de herramientas.&lt;/p&gt;
&lt;p&gt;La primera categoría es la cadena de herramientas del compilador.&lt;/p&gt;
&lt;p&gt;En Windows, puedes comenzar con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estudio Visual 2022&lt;/li&gt;
&lt;li&gt;O MinGW/gcc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La segunda categoría es un entorno de ejecución UEFI.&lt;/p&gt;
&lt;p&gt;Hay dos opciones comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ejecute el archivo &lt;code&gt;.EFI&lt;/code&gt; en UEFI Shell de una máquina real&lt;/li&gt;
&lt;li&gt;Pruébalo en un entorno virtual con QEMU + OVMF&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La tercera categoría es un proyecto de ejemplo.&lt;/p&gt;
&lt;p&gt;Los principiantes no deberían empezar escribiendo scripts de compilación desde un directorio vacío. Usar un ejemplo mínimo como &lt;code&gt;uefi-simple&lt;/code&gt; ayuda a evitar muchos problemas del sistema de compilación.&lt;/p&gt;
&lt;h2 id=&#34;flujo-de-trabajo-básico&#34;&gt;Flujo de trabajo básico
&lt;/h2&gt;&lt;p&gt;Un flujo de trabajo mínimo de un programa UEFI se puede entender así.&lt;/p&gt;
&lt;p&gt;Primero, obtenga el proyecto de ejemplo.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pbatard&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;uefi-simple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En segundo lugar, elija una cadena de herramientas de compilación.
Si usa Visual Studio, cree con la solución Visual Studio en el proyecto.&lt;br&gt;
Si usa MinGW/gcc, siga el Makefile o las instrucciones proporcionadas por el proyecto.&lt;/p&gt;
&lt;p&gt;En tercer lugar, genere el archivo &lt;code&gt;.EFI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El punto clave aquí es confirmar la arquitectura de destino. Una PC común suele ser &lt;code&gt;x86_64&lt;/code&gt;, es decir, un entorno UEFI de 64 bits.&lt;/p&gt;
&lt;p&gt;Cuarto, coloque el archivo &lt;code&gt;.EFI&lt;/code&gt; en algún lugar al que pueda acceder UEFI Shell.&lt;/p&gt;
&lt;p&gt;En una máquina real, esto normalmente significa preparar una partición FAT32 o una unidad USB.&lt;br&gt;
Con QEMU, puede montar un directorio o una imagen de disco.&lt;/p&gt;
&lt;p&gt;Quinto, ejecútelo en UEFI Shell.&lt;/p&gt;
&lt;p&gt;El resultado suele ser un resultado mínimo, como un mensaje estilo Hola mundo.&lt;/p&gt;
&lt;h2 id=&#34;donde-los-principiantes-suelen-quedarse-estancados&#34;&gt;Donde los principiantes suelen quedarse estancados
&lt;/h2&gt;&lt;p&gt;La parte más difícil de compilar un programa UEFI no suele ser el lenguaje C en sí, sino el entorno y el proceso de vinculación.&lt;/p&gt;
&lt;p&gt;Los problemas comunes incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arquitectura de compilador incorrecta&lt;/li&gt;
&lt;li&gt;Formato de destino incorrecto&lt;/li&gt;
&lt;li&gt;Parámetros del enlazador incompletos&lt;/li&gt;
&lt;li&gt;Falta el punto de entrada UEFI&lt;/li&gt;
&lt;li&gt;Generar un ejecutable ordinario en lugar de un &lt;code&gt;.EFI&lt;/code&gt; cargable por UEFI&lt;/li&gt;
&lt;li&gt;QEMU u OVMF no configurados correctamente&lt;/li&gt;
&lt;li&gt;Arranque seguro en una máquina real que bloquea un programa no firmado&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los errores del vinculador son especialmente fáciles de malinterpretar como problemas de código.&lt;br&gt;
En muchos casos, el verdadero problema es la función de entrada, el subsistema, la arquitectura de destino o el script del vinculador.&lt;/p&gt;
&lt;p&gt;Entonces, en la primera etapa, no se apresure a entrar en una lógica compleja. Asegúrese de que el ejemplo original se pueda compilar y ejecutar, luego cambie la salida poco a poco.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-utilizar-qemu--ovmf-para-realizar-pruebas&#34;&gt;¿Por qué utilizar QEMU + OVMF para realizar pruebas?
&lt;/h2&gt;&lt;p&gt;Es posible probar programas UEFI en una máquina real, pero no es conveniente en la etapa principiante.&lt;/p&gt;
&lt;p&gt;Es posible que tengas que repetir este ciclo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compilar&lt;/li&gt;
&lt;li&gt;Copiar a una unidad USB&lt;/li&gt;
&lt;li&gt;Reiniciar&lt;/li&gt;
&lt;li&gt;Ingrese al UEFI Shell&lt;/li&gt;
&lt;li&gt;Ejecutar el programa&lt;/li&gt;
&lt;li&gt;Registra el error&lt;/li&gt;
&lt;li&gt;Regresar al sistema y modificar el código.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ese bucle es lento.&lt;/p&gt;
&lt;p&gt;QEMU + OVMF le permite simular un entorno UEFI directamente dentro del sistema operativo. Puede verificar si un archivo &lt;code&gt;.EFI&lt;/code&gt; se carga más rápidamente y es menos probable que afecte sus entradas de arranque reales.&lt;/p&gt;
&lt;p&gt;Una vez que el programa funciona básicamente, probarlo en una máquina real es mucho más manejable.&lt;/p&gt;
&lt;h2 id=&#34;qué-deberían-modificar-primero-los-principiantes&#34;&gt;¿Qué deberían modificar primero los principiantes?
&lt;/h2&gt;&lt;p&gt;Si ya ha compilado su primer &lt;code&gt;.EFI&lt;/code&gt; con el proyecto de ejemplo, no salte a funciones complejas de inmediato.&lt;/p&gt;
&lt;p&gt;Un mejor orden es:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cambie primero el texto de salida para confirmar que la recompilación realmente surte efecto.&lt;/li&gt;
&lt;li&gt;Intente leer información sencilla proporcionada por UEFI.&lt;/li&gt;
&lt;li&gt;Comprender la función de entrada, protocolo de salida y servicios básicos.&lt;/li&gt;
&lt;li&gt;Luego considere funciones más complejas, como sistemas de archivos, salida gráfica o administración de entradas de arranque.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este enfoque hace que cada paso sea verificable.&lt;br&gt;
Si cambia demasiado a la vez, resulta difícil saber si el problema está en el código, el proceso de compilación o el entorno de ejecución.&lt;/p&gt;
&lt;h2 id=&#34;en-qué-se-diferencia-de-un-programa-c-normal&#34;&gt;¿En qué se diferencia de un programa C normal?
&lt;/h2&gt;&lt;p&gt;Aunque los programas UEFI se pueden escribir en C, su entorno de ejecución es completamente diferente al de los programas C normales.&lt;/p&gt;
&lt;p&gt;Un programa C normal normalmente se ejecuta dentro de un sistema operativo y puede depender de la biblioteca, el sistema de archivos, el modelo de proceso y las llamadas al sistema estándar.&lt;/p&gt;
&lt;p&gt;Un programa UEFI se ejecuta antes de que se inicie el sistema operativo. Se basa en los servicios proporcionados por el firmware UEFI. Muchas cosas a las que está acostumbrado en los programas normales no están disponibles aquí automáticamente.
Al escribir programas UEFI, es necesario adaptarse a varias diferencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La función de entrada es diferente.&lt;/li&gt;
&lt;li&gt;La salida funciona de manera diferente&lt;/li&gt;
&lt;li&gt;Las bibliotecas disponibles son diferentes.&lt;/li&gt;
&lt;li&gt;El acceso a la memoria y a los archivos funciona de forma diferente&lt;/li&gt;
&lt;li&gt;La depuración funciona de manera diferente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es por esto que partir de un ejemplo mínimo es mejor que escribir código como si fuera un programa C normal.&lt;/p&gt;
&lt;h2 id=&#34;un-camino-de-aprendizaje-práctico&#34;&gt;Un camino de aprendizaje práctico
&lt;/h2&gt;&lt;p&gt;Para principiantes, un camino realista es el siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paso 1: compilar &lt;code&gt;uefi-simple&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Paso 2: Ejecútelo con QEMU + OVMF&lt;/li&gt;
&lt;li&gt;Paso 3: Modificar la salida de Hola Mundo&lt;/li&gt;
&lt;li&gt;Paso 4: Comprenda cómo UEFI Shell carga &lt;code&gt;.EFI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Paso 5: aprenda la función de entrada UEFI y el protocolo de salida básico&lt;/li&gt;
&lt;li&gt;Paso 6: Luego lea EDK II o material de desarrollo UEFI más completo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El objetivo de este camino es construir primero un circuito de retroalimentación que funcione.&lt;/p&gt;
&lt;p&gt;Una vez que pueda generar un &lt;code&gt;.EFI&lt;/code&gt; desde la fuente y ver el resultado en un entorno UEFI, ya habrá cruzado el primer umbral más difícil.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;p&gt;-&lt;a class=&#34;link&#34; href=&#34;https://github.com/pbatard/uefi-simple&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pbatard/uefi-simple&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Zhihu: material de compilación del programa UEFI] (&lt;a class=&#34;link&#34; href=&#34;https://zhuanlan.zhihu.com/p/643704056&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://zhuanlan.zhihu.com/p/643704056&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pensamiento-final&#34;&gt;Pensamiento final
&lt;/h2&gt;&lt;p&gt;La parte difícil de compilar su primer programa UEFI generalmente no es escribir un poco de código C, sino conectar la cadena de herramientas, el formato de enlace y el entorno de ejecución.&lt;/p&gt;
&lt;p&gt;No se apresure a utilizar funciones complejas.&lt;br&gt;
Comience con un ejemplo mínimo como &amp;ldquo;uefi-simple&amp;rdquo;, obtenga primero un &amp;ldquo;.EFI&amp;rdquo; ejecutable y luego comprenda gradualmente los puntos de entrada, protocolos y métodos de compilación de UEFI.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Notas más recientes sobre la compilación desde el código fuente de GoAccess: desde la instalación del código fuente hasta los informes HTML en tiempo real</title>
        <link>https://knightli.com/es/2026/04/29/goaccess-build-from-source-and-latest-usage/</link>
        <pubDate>Wed, 29 Apr 2026 00:08:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/29/goaccess-build-from-source-and-latest-usage/</guid>
        <description>&lt;p&gt;Esto está organizado para el &lt;code&gt;2026-04-29&lt;/code&gt;.&lt;br&gt;
En este punto, la última versión estable que figura en el archivo README oficial es &amp;ldquo;1.10.2&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;1-instale-primero-las-dependencias-de-compilación&#34;&gt;1. Instale primero las dependencias de compilación
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install -y build-essential wget tar &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  libncurses-dev libmaxminddb-dev libssl-dev zlib1g-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;2-descargue-el-paquete-fuente-más-reciente&#34;&gt;2. Descargue el paquete fuente más reciente
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /usr/local/src
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo wget https://tar.goaccess.io/goaccess-1.10.2.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tar -xzvf goaccess-1.10.2.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; goaccess-1.10.2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;3-configurar-las-opciones-de-compilación&#34;&gt;3. Configurar las opciones de compilación
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ./configure --enable-utf8 --enable-geoip&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mmdb --with-zlib
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si también desea compatibilidad con TLS para informes HTML en tiempo real:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ./configure --enable-utf8 --enable-geoip&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mmdb --with-zlib --with-openssl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;4-construir-e-instalar&#34;&gt;4. Construir e instalar
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;5-verificar-la-versión&#34;&gt;5. Verificar la versión
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which goaccess
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;6-ver-informes-directamente-en-la-terminal&#34;&gt;6. Ver informes directamente en la terminal
&lt;/h2&gt;&lt;p&gt;Para registros combinados comunes de Nginx o Apache:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si la ruta del registro es Apache:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/apache2/access.log --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;7-generar-un-informe-html-estático&#34;&gt;7. Generar un informe HTML estático
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -a &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o /usr/share/nginx/html/goaccess-report.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También puedes escribirlo en el directorio actual:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -a &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o report.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;8-genere-un-informe-html-en-tiempo-real&#34;&gt;8. Genere un informe HTML en tiempo real
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -a &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o /usr/share/nginx/html/goaccess-report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --real-time-html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para cambiar el puerto:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -a &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o /usr/share/nginx/html/goaccess-report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --real-time-html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --port&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7891&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para vincularse solo a localhost:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -a &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o /usr/share/nginx/html/goaccess-report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --real-time-html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --addr&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;9-siga-los-registros-continuamente&#34;&gt;9. Siga los registros continuamente
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f /var/log/nginx/access.log &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; goaccess --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Desde el principio del archivo y mantenlo activo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f -n +0 /var/log/nginx/access.log &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; goaccess &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --real-time-html -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;10-mire-solo-ciertas-solicitudes&#34;&gt;10. Mire solo ciertas solicitudes
&lt;/h2&gt;&lt;p&gt;Por ejemplo, solo solicitudes que contengan &lt;code&gt;firefox&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f /var/log/nginx/access.log &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -i --line-buffered &lt;span class=&#34;s1&#34;&gt;&amp;#39;firefox&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; goaccess &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Por ejemplo, sólo &lt;code&gt;5xx&lt;/code&gt; y &lt;code&gt;3xx&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f -n +0 /var/log/nginx/access.log &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk &lt;span class=&#34;s1&#34;&gt;&amp;#39;$9~/3[0-9]{2}|5[0-9]{2}/&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; goaccess &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o out.html -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;11-analizar-varios-registros-juntos&#34;&gt;11. Analizar varios registros juntos
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log /var/log/nginx/access.log.1 --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Lea registros comprimidos y sin comprimir juntos:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;zcat --force /var/log/nginx/access.log* &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; goaccess --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;12-habilitar-subprocesos-múltiples&#34;&gt;12. Habilitar subprocesos múltiples
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -j &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Aumentar el tamaño del trozo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -j &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --chunk-size&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8192&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;13-procesamiento-incremental&#34;&gt;13. Procesamiento incremental
&lt;/h2&gt;&lt;p&gt;Primero persista en un registro antiguo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log.1 --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED --persist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Luego agregue el registro actual:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED --restore --persist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Solo lectura de datos persistentes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess --restore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;14-el-conjunto-de-comandos-que-ejecutaría-primero&#34;&gt;14. El conjunto de comandos que ejecutaría primero
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install -y build-essential wget tar &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  libncurses-dev libmaxminddb-dev libssl-dev zlib1g-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /usr/local/src
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo wget https://tar.goaccess.io/goaccess-1.10.2.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tar -xzvf goaccess-1.10.2.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; goaccess-1.10.2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ./configure --enable-utf8 --enable-geoip&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mmdb --with-zlib --with-openssl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;goaccess /var/log/nginx/access.log &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --log-format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;COMBINED &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -a &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o /usr/share/nginx/html/goaccess-report.html &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --real-time-html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Básicamente eso es todo.&lt;br&gt;
Si su objetivo es claro, instalar la última versión fuente y hacer que &lt;code&gt;--log-format=COMBINED&lt;/code&gt; más &lt;code&gt;--real-time-html&lt;/code&gt; funcione primero suele ser suficiente. Después de eso, la mayoría de los cambios se refieren solo a rutas de registro, archivos de salida y puertos.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cómo elegir un entorno de desarrollo embebido en 2026: Keil, STM32CubeIDE, VS Code y colaboración AI</title>
        <link>https://knightli.com/es/2026/04/22/embedded-development-environment-keil-vscode-ai-2026/</link>
        <pubDate>Wed, 22 Apr 2026 23:05:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/22/embedded-development-environment-keil-vscode-ai-2026/</guid>
        <description>&lt;p&gt;Si todavía trabajas con microcontroladores o sistemas embebidos, pronto aparece una pregunta práctica: en 2026, cuando la programación asistida por AI se ha vuelto común, ¿qué entorno de desarrollo tiene sentido?&lt;/p&gt;
&lt;p&gt;En la superficie parece una comparación entre varios IDEs. Pero en realidad pregunta otra cosa: ¿quieres una herramienta que simplemente haga correr el proyecto, o un workflow que equilibre compatibilidad de ecosistema, experiencia de programación y colaboración AI?&lt;/p&gt;
&lt;p&gt;Desde ese ángulo, la respuesta normalmente no es elegir uno entre &lt;code&gt;Keil&lt;/code&gt;, &lt;code&gt;STM32CubeIDE&lt;/code&gt;, &lt;code&gt;VS Code&lt;/code&gt; y &lt;code&gt;CLion&lt;/code&gt;, sino recombinar lo que cada uno hace mejor.&lt;/p&gt;
&lt;h2 id=&#34;primero-mira-las-opciones-principales-y-qué-resuelve-cada-una&#34;&gt;Primero mira las opciones principales y qué resuelve cada una
&lt;/h2&gt;&lt;p&gt;En desarrollo embebido, los nombres familiares siguen siendo casi los mismos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Keil&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;STM32CubeIDE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VS Code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vas aún más atrás, la gente mencionará &lt;code&gt;IAR&lt;/code&gt;. Pero para esta discusión importa menos quién tiene el linaje más antiguo y más quién encaja realmente con la realidad actual del desarrollo.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://knightli.com/2026/04/22/embedded-development-environment-keil-vscode-ai-2026/embedded-ide-comparison.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Comparison chart of embedded development environments&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;keil-ecosistema-fuerte-entrada-fiable-pero-edición-claramente-anticuada&#34;&gt;Keil: ecosistema fuerte, entrada fiable, pero edición claramente anticuada
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Keil&lt;/code&gt; sigue siendo difícil de evitar, y la razón es simple: está en todas partes.&lt;/p&gt;
&lt;p&gt;Ya sea en proyectos legacy de empresas, tutoriales online, ejemplos compartidos o codebases antiguas, una enorme cantidad de trabajo embebido sigue organizada alrededor de &lt;code&gt;Keil&lt;/code&gt;. Su flujo de build, descarga y debug sigue siendo maduro, y si tu objetivo principal es hacer correr código en una placa, sigue siendo un camino corto.&lt;/p&gt;
&lt;p&gt;Sus problemas son igual de obvios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;interfaz anticuada&lt;/li&gt;
&lt;li&gt;experiencia de edición promedio&lt;/li&gt;
&lt;li&gt;no es un hogar natural para programación asistida por AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que &lt;code&gt;Keil&lt;/code&gt; se siente más como punto de entrada de proyecto y base de depuración que como editor ideal para una experiencia de programación en 2026.&lt;/p&gt;
&lt;h2 id=&#34;stm32cubeide-amigable-para-stm32-pero-más-herramienta-de-aprendizaje-e-inicio-rápido&#34;&gt;STM32CubeIDE: amigable para STM32, pero más herramienta de aprendizaje e inicio rápido
&lt;/h2&gt;&lt;p&gt;Si vives principalmente en el ecosistema &lt;code&gt;STM32&lt;/code&gt;, &lt;code&gt;STM32CubeIDE&lt;/code&gt; suele ser el primer entorno que tocas.&lt;/p&gt;
&lt;p&gt;Sus fortalezas son claras:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;onboarding amigable para principiantes&lt;/li&gt;
&lt;li&gt;configuración de periféricos y generación de proyectos cómoda&lt;/li&gt;
&lt;li&gt;cadena de debug bastante completa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para estudiantes, principiantes e inicio temprano de proyectos, la experiencia es directa y suficiente.&lt;/p&gt;
&lt;p&gt;Pero al entrar en proyectos largos, colaboración pesada y workflows personalizados, sus limitaciones se hacen más visibles. En trabajo comercial o entornos de equipo más complejos, puede no ser el entorno primario más cómodo.&lt;/p&gt;
&lt;p&gt;Encaja mejor como herramienta all-in-one centrada en STM32 para comenzar rápido que como editor primario a largo plazo.&lt;/p&gt;
&lt;h2 id=&#34;vs-code-no-es-realmente-un-ide-pero-gana-fuerza-en-la-era-ai&#34;&gt;VS Code: no es realmente un IDE, pero gana fuerza en la era AI
&lt;/h2&gt;&lt;p&gt;Estrictamente, &lt;code&gt;VS Code&lt;/code&gt; no es un IDE tradicional. Más exactamente, es un editor extensible.&lt;/p&gt;
&lt;p&gt;Eso le da una naturaleza dual.&lt;/p&gt;
&lt;p&gt;Sus debilidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;necesita plugins y configuración&lt;/li&gt;
&lt;li&gt;no es suficientemente amable para principiantes&lt;/li&gt;
&lt;li&gt;no reemplaza de entrada todo el flujo de un IDE embebido&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero sus fortalezas vienen del mismo lugar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gran extensibilidad&lt;/li&gt;
&lt;li&gt;experiencia de programación mucho más moderna&lt;/li&gt;
&lt;li&gt;mejor resaltado, navegación, búsqueda y refactorización&lt;/li&gt;
&lt;li&gt;más impulso alrededor de herramientas AI y flujos de agentes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En esta etapa, muchos desarrolladores ya no quieren solo algo para escribir código. Quieren saber si la colaboración AI encaja naturalmente en el mismo entorno. Desde esa perspectiva, la ventaja de &lt;code&gt;VS Code&lt;/code&gt; es difícil de ignorar.&lt;/p&gt;
&lt;h2 id=&#34;clion-buena-experiencia-pero-no-suficientemente-central-en-práctica-embebida&#34;&gt;CLion: buena experiencia, pero no suficientemente central en práctica embebida
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CLion&lt;/code&gt; aparece a menudo porque su experiencia C/C++ lleva tiempo considerándose sólida.&lt;/p&gt;
&lt;p&gt;Pero para muchos desarrolladores embebidos, la pregunta no es si es bueno. La pregunta es si vale la pena cambiar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;relativamente menos gente lo usa en workflows embebidos&lt;/li&gt;
&lt;li&gt;no se conecta tan directamente con ecosistemas de proyectos embebidos existentes como &lt;code&gt;Keil&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;quizá no ofrece una ventaja de colaboración AI más práctica que &lt;code&gt;VS Code&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que se siente más como una opción teóricamente buena que como el centro más natural de un workflow embebido mainstream hoy.&lt;/p&gt;
&lt;h2 id=&#34;una-respuesta-más-práctica-keil-para-builddebug-vs-code-para-programar&#34;&gt;Una respuesta más práctica: Keil para build/debug, VS Code para programar
&lt;/h2&gt;&lt;p&gt;Si separas estas herramientas por rol, aparece una conclusión mucho más pragmática:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;usar &lt;code&gt;Keil&lt;/code&gt; para preservar compatibilidad de proyectos existentes, build, flashing y debugging&lt;/li&gt;
&lt;li&gt;usar &lt;code&gt;VS Code&lt;/code&gt; para programación diaria, búsqueda, navegación y colaboración AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El valor de esta combinación es que no intenta forzar una herramienta a hacerlo todo. Devuelve cada herramienta al rol donde es mejor.&lt;/p&gt;
&lt;p&gt;Para muchos proyectos embebidos, el ecosistema &lt;code&gt;Keil&lt;/code&gt; simplemente no es opcional. Si eso es cierto, en lugar de forzar todo de vuelta a &lt;code&gt;Keil&lt;/code&gt;, tiene más sentido tratarlo como backend de build y debug, y entregar la experiencia real de edición a &lt;code&gt;VS Code&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://knightli.com/2026/04/22/embedded-development-environment-keil-vscode-ai-2026/keil-vscode-ai-workflow.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Workflow diagram for combining Keil and VS Code&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;por-qué-esta-combinación-tiene-más-sentido-en-la-era-ai&#34;&gt;Por qué esta combinación tiene más sentido en la era AI
&lt;/h2&gt;&lt;p&gt;Hoy, la línea divisoria entre entornos ya no es solo si el editor se siente fluido. Es si la AI puede conectarse naturalmente al workflow.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;VS Code&lt;/code&gt; tiene varias fortalezas prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soporte más activo para plugins y agentes AI&lt;/li&gt;
&lt;li&gt;experiencia de exploración de código más adecuada para que AI lea y modifique proyectos&lt;/li&gt;
&lt;li&gt;integración más fácil con ecosistemas modernos de plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso significa que algunas de las partes más incómodas del desarrollo embebido pueden empezar a descargarse en AI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;encontrar funciones y call chains en un proyecto existente&lt;/li&gt;
&lt;li&gt;generar rápidamente código de inicialización&lt;/li&gt;
&lt;li&gt;añadir un print UART simple&lt;/li&gt;
&lt;li&gt;explicar la estructura de proyectos antiguos&lt;/li&gt;
&lt;li&gt;hacer ediciones pequeñas y localizadas en archivos existentes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas tareas nunca fueron imposibles. Solo eran incómodas. El significado de &lt;code&gt;VS Code&lt;/code&gt; no es solo que se vea mejor, sino que puede convertirse más naturalmente en el banco de trabajo para colaboración AI.&lt;/p&gt;
&lt;h2 id=&#34;el-parche-clave-conectar-vs-code-con-proyectos-keil-mediante-plugins&#34;&gt;El parche clave: conectar VS Code con proyectos Keil mediante plugins
&lt;/h2&gt;&lt;p&gt;Que este workflow funcione en la práctica depende de algo: ¿puedes conectar realmente &lt;code&gt;VS Code&lt;/code&gt; con un proyecto &lt;code&gt;Keil&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Una clase muy práctica de plugins hace exactamente eso, permitiendo que &lt;code&gt;VS Code&lt;/code&gt; lea la estructura de proyecto &lt;code&gt;Keil&lt;/code&gt; y llame a programas backend de &lt;code&gt;Keil&lt;/code&gt; desde el editor para tareas como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;abrir un proyecto&lt;/li&gt;
&lt;li&gt;compilar&lt;/li&gt;
&lt;li&gt;descargar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así no tienes que saltar constantemente entre dos interfaces solo para escribir código. Solo vuelves a &lt;code&gt;Keil&lt;/code&gt; para trabajo de depuración pesado, como stepping, breakpoints e inspección de registros.&lt;/p&gt;
&lt;p&gt;El valor real de estos plugins no es ahorrar unas ventanas. Es hacer continuo el workflow.&lt;/p&gt;
&lt;h2 id=&#34;no-olvides-la-configuración-básica-de-plugins-cc&#34;&gt;No olvides la configuración básica de plugins C/C++
&lt;/h2&gt;&lt;p&gt;Si quieres usar &lt;code&gt;VS Code&lt;/code&gt; como editor embebido principal, hay un punto básico que suele ignorarse: debes configurar correctamente el plugin C/C++ central y el indexado del proyecto.&lt;/p&gt;
&lt;p&gt;Si no, aparecerán problemas que dañan mucho la experiencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jump-to-definition no funciona&lt;/li&gt;
&lt;li&gt;aparecen subrayados rojos falsos&lt;/li&gt;
&lt;li&gt;la calidad de completion es pobre&lt;/li&gt;
&lt;li&gt;las relaciones de headers se vuelven confusas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mucha gente asume que eso significa que &lt;code&gt;VS Code&lt;/code&gt; no sirve para embebido. En la práctica, a menudo solo ocurre que el indexado y la configuración de plugins no están conectados correctamente.&lt;/p&gt;
&lt;p&gt;Una vez configurada esa capa, &lt;code&gt;VS Code&lt;/code&gt; sí puede entregar sus fortalezas al leer proyectos grandes, buscar símbolos y usar AI para cambios de código dirigidos.&lt;/p&gt;
&lt;h2 id=&#34;para-quién-encaja-este-workflow&#34;&gt;Para quién encaja este workflow
&lt;/h2&gt;&lt;p&gt;Creo que esta combinación funciona especialmente bien para estos grupos.&lt;/p&gt;
&lt;h3 id=&#34;1-personas-con-muchos-proyectos-basados-en-keil&#34;&gt;1. Personas con muchos proyectos basados en Keil
&lt;/h3&gt;&lt;p&gt;Si tus proyectos de empresa, materiales de curso o código histórico giran alrededor de &lt;code&gt;Keil&lt;/code&gt;, no hay razón para tirar ese ecosistema solo por parecer moderno. Conserva &lt;code&gt;Keil&lt;/code&gt; y añade &lt;code&gt;VS Code&lt;/code&gt; como frontend. Suele ser la transición de menor coste.&lt;/p&gt;
&lt;h3 id=&#34;2-personas-que-quieren-ayuda-ai-con-código-embebido&#34;&gt;2. Personas que quieren ayuda AI con código embebido
&lt;/h3&gt;&lt;p&gt;Si ya te gusta usar AI para explicar funciones, generar boilerplate o hacer cambios locales de lógica, &lt;code&gt;VS Code&lt;/code&gt; asumirá ese rol de forma más natural que los IDEs embebidos tradicionales.&lt;/p&gt;
&lt;h3 id=&#34;3-personas-que-quieren-equilibrar-materiales-de-aprendizaje-y-proyectos-reales&#34;&gt;3. Personas que quieren equilibrar materiales de aprendizaje y proyectos reales
&lt;/h3&gt;&lt;p&gt;Muchos tutoriales siguen construidos alrededor de &lt;code&gt;Keil&lt;/code&gt;, pero tu propio workflow no necesita quedarse atrapado en esa época. Trata &lt;code&gt;Keil&lt;/code&gt; como capa de compatibilidad y &lt;code&gt;VS Code&lt;/code&gt; como capa de productividad, y el equilibrio mejora mucho.&lt;/p&gt;
&lt;h2 id=&#34;cierre&#34;&gt;Cierre
&lt;/h2&gt;&lt;p&gt;En 2026, la pregunta clave sobre entornos embebidos ya no es solo qué IDE tiene más funciones. Es qué combinación encaja mejor con cómo trabaja la gente hoy.&lt;/p&gt;
&lt;p&gt;Si solo quieres empezar rápido, &lt;code&gt;STM32CubeIDE&lt;/code&gt; sigue teniendo su lugar. Si necesitas heredar mucha realidad de ingeniería existente, &lt;code&gt;Keil&lt;/code&gt; sigue siendo inevitable. Pero si también quieres una experiencia moderna de edición y colaboración AI, la respuesta más práctica suele ser:&lt;/p&gt;
&lt;p&gt;deja que &lt;code&gt;Keil&lt;/code&gt; maneje build y debugging, y que &lt;code&gt;VS Code&lt;/code&gt; maneje escribir código.&lt;/p&gt;
&lt;p&gt;Quizá no sea la única respuesta, pero probablemente es una de las menos incómodas disponibles hoy.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cómo elegir entre 8 formatos comunes de configuración: de INI, XML, JSON, YAML y TOML a Markdown</title>
        <link>https://knightli.com/es/2026/04/22/common-config-file-formats-ini-xml-json-yaml-toml-markdown/</link>
        <pubDate>Wed, 22 Apr 2026 21:48:37 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/22/common-config-file-formats-ini-xml-json-yaml-toml-markdown/</guid>
        <description>&lt;p&gt;Si escribes código, administras servidores, ajustas opciones de juegos o mantienes toolchains, casi seguro no puedes evitar los archivos de configuración.&lt;/p&gt;
&lt;p&gt;Muchas veces, lo que realmente rompe un programa no es el algoritmo ni el framework, sino una línea diminuta de configuración: un espacio faltante, una coma extra o un valor escrito de una forma que el sistema no esperaba. Mirar formatos comunes lado a lado nos devuelve a varias preguntas centrales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;¿Qué formatos son más amables para escribir por humanos?&lt;/li&gt;
&lt;li&gt;¿Qué formatos son más amables para parsear por máquinas?&lt;/li&gt;
&lt;li&gt;En la era de AI Agents, ¿empezará a cambiar el papel de los archivos de configuración?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este artículo intenta organizar esa cuestión de forma concisa.&lt;/p&gt;
&lt;h2 id=&#34;01-un-archivo-de-configuración-es-básicamente-una-negociación-entre-humanos-y-máquinas&#34;&gt;01 Un archivo de configuración es básicamente una negociación entre humanos y máquinas
&lt;/h2&gt;&lt;p&gt;Hay una forma de decirlo que me parece especialmente precisa: un archivo de configuración es un contrato de comportamiento entre humanos y programas.&lt;/p&gt;
&lt;p&gt;Su valor es obvio. No necesitas reescribir lógica de negocio ni recompilar nada. Cambiando unas pocas líneas de texto puedes alterar el comportamiento de un sitio, la lógica de una aplicación, el despliegue o incluso gráficos y opciones ocultas de un juego.&lt;/p&gt;
&lt;p&gt;El problema es que este contrato contiene una tensión incorporada.&lt;/p&gt;
&lt;p&gt;Desde el lado humano queremos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;algo legible, escribible y estructuralmente claro&lt;/li&gt;
&lt;li&gt;preferiblemente con comentarios para entenderlo después&lt;/li&gt;
&lt;li&gt;la menor repetición posible, idealmente con reutilización y modularidad&lt;/li&gt;
&lt;li&gt;un formato que no explote de inmediato por un pequeño error&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero desde el lado máquina, la elegancia es irrelevante. Le importan principalmente dos cosas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;el parsing debe ser rápido&lt;/li&gt;
&lt;li&gt;las reglas deben ser estrictas, los tipos claros y la ambigüedad mínima&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso los formatos de configuración siempre se tensan entre lo human-friendly y lo machine-friendly. Cuanto mejor es un formato para lectura humana, más trabajo suele necesitar la máquina para parsearlo. Cuanto más eficiente es para máquinas, más fácil suele ser que humanos cometan errores al editarlo.&lt;/p&gt;
&lt;h2 id=&#34;02-ini-simple-y-directo-pero-limitado&#34;&gt;02 INI: simple y directo, pero limitado
&lt;/h2&gt;&lt;p&gt;Empecemos con &lt;code&gt;INI&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sus fortalezas son muy directas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;estructura simple&lt;/li&gt;
&lt;li&gt;secciones más pares clave-valor fáciles de entender&lt;/li&gt;
&lt;li&gt;soporte de comentarios&lt;/li&gt;
&lt;li&gt;adecuado para configuración ligera, como ajustes de juegos o entorno básico&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si alguna vez modificaste ajustes de juegos antiguos o parámetros de herramientas a mano, probablemente lo viste.&lt;/p&gt;
&lt;p&gt;Pero &lt;code&gt;INI&lt;/code&gt; también tiene limitaciones obvias. Su estructura es demasiado plana y no representa naturalmente anidamiento profundo o arrays. Además, normalmente carece de un sistema de tipos estricto, así que muchos valores son básicamente strings y el programa decide cómo interpretarlos.&lt;/p&gt;
&lt;p&gt;Eso hace que &lt;code&gt;INI&lt;/code&gt; se sienta como una herramienta vieja pero cómoda: excelente para trabajo ligero, fácil de superar cuando el proyecto crece.&lt;/p&gt;
&lt;p&gt;Un &lt;code&gt;INI&lt;/code&gt; típico:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[server]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[feature]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;enable_cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;03-xml-riguroso-y-estable-pero-cansado-de-escribir&#34;&gt;03 XML: riguroso y estable, pero cansado de escribir
&lt;/h2&gt;&lt;p&gt;El segundo formato importante es &lt;code&gt;XML&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si mantuviste proyectos Java antiguos o viste archivos enormes llenos de tags de cierre, te resultará familiar.&lt;/p&gt;
&lt;p&gt;Sus fortalezas incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;estructura jerárquica clara&lt;/li&gt;
&lt;li&gt;soporte de comentarios&lt;/li&gt;
&lt;li&gt;reglas estrictas&lt;/li&gt;
&lt;li&gt;validación fuerte cuando se combina con un schema&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso permite a las máquinas conocer tipos, cardinalidad y restricciones estructurales antes de parsear de verdad, dando mucha seguridad.&lt;/p&gt;
&lt;p&gt;Pero su coste humano es igual de clásico:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tags verbosos&lt;/li&gt;
&lt;li&gt;mucho ruido visual&lt;/li&gt;
&lt;li&gt;archivos que crecen rápido&lt;/li&gt;
&lt;li&gt;un cierre faltante puede romperlo todo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso &lt;code&gt;XML&lt;/code&gt; se siente como un contrato formal sellado. A las máquinas les gusta; los humanos se cansan de mantenerlo. Muchos proyectos nuevos ya no lo eligen primero, pero en sistemas antiguos y entornos con reglas estrictas no ha desaparecido.&lt;/p&gt;
&lt;p&gt;La misma configuración en &lt;code&gt;XML&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;config&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;host&amp;gt;&lt;/span&gt;127.0.0.1&lt;span class=&#34;nt&#34;&gt;&amp;lt;/host&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;port&amp;gt;&lt;/span&gt;8080&lt;span class=&#34;nt&#34;&gt;&amp;lt;/port&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/server&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;feature&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;enable_cache&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/enable_cache&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/feature&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/config&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;04-json-dominante-para-intercambio-de-datos-incómodo-para-configuración-editada-a-mano&#34;&gt;04 JSON: dominante para intercambio de datos, incómodo para configuración editada a mano
&lt;/h2&gt;&lt;p&gt;En desarrollo moderno, &lt;code&gt;JSON&lt;/code&gt; es casi inevitable.&lt;/p&gt;
&lt;p&gt;El juicio clásico es: excelente como formato de intercambio de datos, algo incómodo como configuración mantenida por humanos.&lt;/p&gt;
&lt;p&gt;Sus ventajas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;estructuras claras de objetos y arrays&lt;/li&gt;
&lt;li&gt;transmisión amigable para red&lt;/li&gt;
&lt;li&gt;parsers maduros&lt;/li&gt;
&lt;li&gt;encaje fuerte con APIs web y comunicación frontend-backend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Frente a &lt;code&gt;XML&lt;/code&gt;, &lt;code&gt;JSON&lt;/code&gt; se ve mucho más ligero. La misma estructura suele ser más corta y más fácil de enviar por red.&lt;/p&gt;
&lt;p&gt;Pero tiene un defecto grande: &lt;code&gt;JSON&lt;/code&gt; estándar no soporta comentarios.&lt;/p&gt;
&lt;p&gt;Su sintaxis también es estricta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;las claves deben ir entre comillas dobles&lt;/li&gt;
&lt;li&gt;el último elemento no puede tener coma final&lt;/li&gt;
&lt;li&gt;un símbolo faltante rompe todo de inmediato&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que &lt;code&gt;JSON&lt;/code&gt; es excelente para APIs e intercambio entre servicios, pero no siempre ideal para configuración que humanos editan, explican y revisan a menudo.&lt;/p&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;server&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;feature&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;enable_cache&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;05-yaml-muy-legible-pero-la-indentación-y-los-tipos-implícitos-pueden-traicionarte&#34;&gt;05 YAML: muy legible, pero la indentación y los tipos implícitos pueden traicionarte
&lt;/h2&gt;&lt;p&gt;Si trabajaste con Docker, CI/CD, Kubernetes o automatización de despliegues, casi seguro trataste con &lt;code&gt;YAML&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Su mayor atractivo es lo limpio que se ve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;menos llaves y comillas&lt;/li&gt;
&lt;li&gt;la indentación expresa jerarquía&lt;/li&gt;
&lt;li&gt;soporta comentarios&lt;/li&gt;
&lt;li&gt;anchors para reutilización&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Desde una primera mirada humana, &lt;code&gt;YAML&lt;/code&gt; suele parecer más amable que &lt;code&gt;JSON&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pero el problema está justo ahí. Oculta mucha complejidad y en uso real produce dos fallos clásicos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;infierno de indentación&lt;/li&gt;
&lt;li&gt;conversión implícita de tipos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los problemas de indentación son fáciles de entender: un espacio extra o faltante puede romper la config. Peor aún, la conversión implícita hace que valores que parecen strings simples puedan interpretarse automáticamente como booleanos u otros tipos.&lt;/p&gt;
&lt;p&gt;Por eso tanta gente elogia lo bien que se ve &lt;code&gt;YAML&lt;/code&gt; y al mismo tiempo sufre con él. Es realmente bueno para lectura humana, pero las máquinas no lo parsean sin esfuerzo, e incluso distintas librerías pueden discrepar en detalles sutiles.&lt;/p&gt;
&lt;p&gt;La misma configuración en &lt;code&gt;YAML&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;127.0.0.1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;feature&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enable_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;06-toml-equilibrio-entre-legibilidad-y-determinismo&#34;&gt;06 TOML: equilibrio entre legibilidad y determinismo
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;TOML&lt;/code&gt; suele presentarse como una respuesta moderna equilibrada.&lt;/p&gt;
&lt;p&gt;Su atractivo combina parte de la claridad de &lt;code&gt;INI&lt;/code&gt; con parte de la claridad de tipos de &lt;code&gt;JSON&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soporte de comentarios&lt;/li&gt;
&lt;li&gt;estructura clara&lt;/li&gt;
&lt;li&gt;tipado más fuerte y explícito&lt;/li&gt;
&lt;li&gt;manejo más natural de tipos comunes como fecha y hora&lt;/li&gt;
&lt;li&gt;muchas menos trampas de conversión implícita que &lt;code&gt;YAML&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;También se ha vuelto cada vez más común en toolchains modernas, como &lt;code&gt;pyproject.toml&lt;/code&gt; en Python.&lt;/p&gt;
&lt;p&gt;No es perfecto. En estructuras profundamente anidadas, &lt;code&gt;TOML&lt;/code&gt; puede volverse verboso, y la escritura por rutas puede sentirse repetitiva. Pero para config de proyectos pequeños y medianos, herramientas y package management, la experiencia suele ser muy estable.&lt;/p&gt;
&lt;p&gt;Si quieres un formato con comentarios, significado claro y bajo dolor de parser, &lt;code&gt;TOML&lt;/code&gt; es un candidato fuerte.&lt;/p&gt;
&lt;p&gt;Ejemplo común:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;feature&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;enable_cache&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;07-conf-y-configuración-apache-no-es-un-formato-universal-sino-un-lenguaje-de-dominio&#34;&gt;07 &lt;code&gt;.conf&lt;/code&gt; y configuración Apache: no es un formato universal, sino un lenguaje de dominio
&lt;/h2&gt;&lt;p&gt;Vale la pena enfatizar que mucha gente ve &lt;code&gt;.conf&lt;/code&gt; y asume que es un formato estándar único. No lo es.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.conf&lt;/code&gt; es solo un sufijo de archivo para &amp;ldquo;configuration&amp;rdquo;. El contenido depende por completo de las reglas del sistema concreto. Es más una categoría amplia que una sintaxis estándar.&lt;/p&gt;
&lt;p&gt;Toma &lt;code&gt;Apache&lt;/code&gt; como ejemplo. Su estilo es representativo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;parte parece una lista de directivas de una línea&lt;/li&gt;
&lt;li&gt;parte parece bloques etiquetados con comportamiento acotado&lt;/li&gt;
&lt;li&gt;encaja naturalmente en el dominio de servidores web&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sus fortalezas son prácticas para operaciones, especialmente al expresar permisos, routing y virtual hosts. La desventaja es que sirve a su propio ecosistema y no tiene mucha portabilidad general.&lt;/p&gt;
&lt;p&gt;Eso lo acerca a un lenguaje específico de dominio: excelente dentro del sistema para el que fue diseñado, no algo que tratar como formato universal.&lt;/p&gt;
&lt;p&gt;Ejemplo mínimo estilo Apache:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-apache&#34; data-lang=&#34;apache&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Listen&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;VirtualHost&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;*:80&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;ServerName&lt;/span&gt; example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;DocumentRoot&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/var/www/html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;08-protocol-buffers-tipado-industrial-pero-mayor-barrera&#34;&gt;08 Protocol Buffers: tipado industrial, pero mayor barrera
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Protocol Buffers&lt;/code&gt; ya no son realmente &amp;ldquo;solo escribir una config a mano&amp;rdquo;. Se parecen más a un sistema formal de definición y serialización de datos.&lt;/p&gt;
&lt;p&gt;Sus fortalezas son importantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tipado fuerte&lt;/li&gt;
&lt;li&gt;schema explícito&lt;/li&gt;
&lt;li&gt;buena compatibilidad hacia adelante y atrás&lt;/li&gt;
&lt;li&gt;transmisión binaria compacta&lt;/li&gt;
&lt;li&gt;procesamiento eficiente por máquinas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero los costes también son claros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hay que definir archivos &lt;code&gt;.proto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;se necesitan herramientas y paso de compilación&lt;/li&gt;
&lt;li&gt;la barrera es relativamente alta para proyectos pequeños&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que no son ideales si solo quieres configurar una herramienta pequeña. Pero si construyes sistemas grandes, servicios RPC, sistemas distribuidos o protocolos de datos de larga vida, suelen ser mucho más fiables que formatos ligeros.&lt;/p&gt;
&lt;p&gt;Su estilo se acerca a &amp;ldquo;define primero la estructura y luego genera código&amp;rdquo;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-proto&#34; data-lang=&#34;proto&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;syntax&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;proto3&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ServerConfig&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;host&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;int32&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;bool&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;enable_cache&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;09-en-la-era-de-ai-agents-markdown-puede-volver-a-ser-formato-de-configuración&#34;&gt;09 En la era de AI Agents, Markdown puede volver a ser formato de configuración
&lt;/h2&gt;&lt;p&gt;La parte más interesante es poner &lt;code&gt;Markdown&lt;/code&gt; dentro de la categoría de &amp;ldquo;formatos de configuración&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Desde una perspectiva tradicional, suena extraño, porque &lt;code&gt;Markdown&lt;/code&gt; parece más bien documentación. Pero si el objetivo ya no es un parser rígido sino un LLM o AI Agent, el argumento tiene sentido.&lt;/p&gt;
&lt;p&gt;¿Por qué?&lt;/p&gt;
&lt;p&gt;Porque los programas tradicionales dependen de sintaxis estricta y campos fijos, mientras los modelos grandes entienden mejor significado, estructura y contexto. Para ellos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;los encabezados son jerarquía&lt;/li&gt;
&lt;li&gt;las listas son pasos&lt;/li&gt;
&lt;li&gt;el texto en negrita es énfasis&lt;/li&gt;
&lt;li&gt;el lenguaje natural puede portar reglas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cuando el objetivo de configuración cambia de &amp;ldquo;parser rígido&amp;rdquo; a &amp;ldquo;agente que entiende significado&amp;rdquo;, &lt;code&gt;Markdown&lt;/code&gt;, como texto estructurado amigable para humanos, puede volverse una configuración más natural.&lt;/p&gt;
&lt;p&gt;Esto lleva a un juicio importante: en la era tradicional del software, muchos formatos existían para hacer que humanos se adaptaran a máquinas; en la era AI, las máquinas empiezan a adaptarse a la expresión humana.&lt;/p&gt;
&lt;p&gt;Por ejemplo, una configuración de tarea para un agente podría ser:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Goal
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Write a welcome email for a new user.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Requirements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Friendly tone
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; No more than 150 words
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Mention the product&amp;#39;s 3 core features
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Forbidden
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Do not promise features that do not exist
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Do not use exaggerated marketing language
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;10-entonces-cómo-elegir&#34;&gt;10 Entonces, ¿cómo elegir?
&lt;/h2&gt;&lt;p&gt;Si comprimimos toda la discusión:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si quieres configuración extremadamente simple, ligera y plana: &lt;code&gt;INI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si quieres estructura fuerte, validación fuerte y compatibilidad legacy: &lt;code&gt;XML&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si quieres transmisión de red e intercambio de interfaces: &lt;code&gt;JSON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si quieres alta legibilidad más cloud-native y config de despliegue: &lt;code&gt;YAML&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si quieres una experiencia moderna generalista más estable: &lt;code&gt;TOML&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si quieres reglas internas específicas de dominio: &lt;code&gt;.conf&lt;/code&gt; / DSLs estilo Apache&lt;/li&gt;
&lt;li&gt;si quieres diseño industrial de protocolos y evolución a largo plazo: &lt;code&gt;Protocol Buffers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;si quieres expresión natural y orquestación de tareas para AI Agents: &lt;code&gt;Markdown&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No hay un único mejor formato. Depende de para quién escribes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;humanos que mantienen el sistema&lt;/li&gt;
&lt;li&gt;máquinas que parsean a alta velocidad&lt;/li&gt;
&lt;li&gt;servicios que se comunican entre sí&lt;/li&gt;
&lt;li&gt;o AI Agents que necesitan entender y ejecutar&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusión-breve&#34;&gt;Conclusión breve
&lt;/h2&gt;&lt;p&gt;La historia de los archivos de configuración es, en el fondo, la historia de humanos y máquinas renegociando constantemente dónde debe caer el coste de entender.&lt;/p&gt;
&lt;p&gt;Antes, los humanos tenían que adaptarse a las máquinas, así que memorizábamos llaves, reglas de indentación, comillas y sintaxis rígida. Ahora que los modelos de lenguaje y sistemas de agentes entienden cada vez mejor la expresión natural, la propia &amp;ldquo;configuración&amp;rdquo; empieza a cambiar.&lt;/p&gt;
&lt;p&gt;Quizá en el futuro muchos escenarios de configuración ya no giren alrededor de una sintaxis fija, sino de declaraciones estructuradas de intención. Hasta entonces, formatos como &lt;code&gt;JSON&lt;/code&gt;, &lt;code&gt;YAML&lt;/code&gt;, &lt;code&gt;TOML&lt;/code&gt;, &lt;code&gt;INI&lt;/code&gt; y &lt;code&gt;XML&lt;/code&gt; seguirán coexistiendo, cada uno en el rol que mejor le encaja.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cree imágenes de Docker en VS Code en Windows: desde la configuración hasta la compilación</title>
        <link>https://knightli.com/es/2026/04/16/vscode-docker-image-build-windows/</link>
        <pubDate>Thu, 16 Apr 2026 10:20:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/16/vscode-docker-image-build-windows/</guid>
        <description>&lt;p&gt;Si desea crear imágenes de Docker directamente desde VS Code en Windows, el flujo de trabajo es sencillo. Solo necesitas tres partes: preparar el entorno, crear un Dockerfile y luego ejecutar la compilación.&lt;/p&gt;
&lt;h2 id=&#34;01-requisitos-previos&#34;&gt;01 Requisitos previos
&lt;/h2&gt;&lt;p&gt;Asegúrese de que estos dos elementos estén listos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instale y ejecute Docker Desktop.&lt;/li&gt;
&lt;li&gt;Instale la extensión oficial de Microsoft &lt;code&gt;Docker&lt;/code&gt; en VS Code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En Windows, usar el backend &lt;code&gt;WSL 2&lt;/code&gt; en Docker Desktop (&lt;code&gt;Configuración &amp;gt; Recursos &amp;gt; Integración WSL&lt;/code&gt;) suele ser más estable y rápido.&lt;/p&gt;
&lt;h2 id=&#34;02-preparar-un-archivo-docker&#34;&gt;02 Preparar un archivo Docker
&lt;/h2&gt;&lt;p&gt;Si tu proyecto aún no tiene uno, VS Code puede generarlo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abra la carpeta de su proyecto en VS Code.&lt;/li&gt;
&lt;li&gt;Presione &lt;code&gt;F1&lt;/code&gt; o &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; para abrir la paleta de comandos.&lt;/li&gt;
&lt;li&gt;Ejecute &lt;code&gt;Docker: Agregar archivos Docker al espacio de trabajo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Elija su plataforma (Node.js, Python, .NET, etc.) y siga las indicaciones.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Normalmente obtendrá al menos:&lt;/p&gt;
&lt;p&gt;-&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.dockerignore&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto le proporciona una base de trabajo que podrá perfeccionar más adelante.&lt;/p&gt;
&lt;h2 id=&#34;03-tres-maneras-de-construir-la-imagen&#34;&gt;03 Tres Maneras de Construir la Imagen
&lt;/h2&gt;&lt;h3 id=&#34;método-a-haga-clic-con-el-botón-derecho-en-dockerfile&#34;&gt;Método A: haga clic con el botón derecho en Dockerfile
&lt;/h3&gt;&lt;p&gt;En el Explorador de archivos, haga clic derecho en &amp;ldquo;Dockerfile&amp;rdquo;, seleccione &amp;ldquo;Crear imagen&amp;hellip;&amp;rdquo; e ingrese una etiqueta de imagen.&lt;/p&gt;
&lt;h3 id=&#34;método-b-paleta-de-comandos&#34;&gt;Método B: Paleta de comandos
&lt;/h3&gt;&lt;p&gt;Presione &lt;code&gt;F1&lt;/code&gt;, ejecute &lt;code&gt;Docker: Build Image&lt;/code&gt;, luego seleccione el contexto y la etiqueta.&lt;/p&gt;
&lt;h3 id=&#34;método-c-terminal-integrado&#34;&gt;Método C: Terminal integrado
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker build -t your-image-name .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este comando crea una imagen a partir del contexto del directorio actual con la etiqueta &lt;code&gt;tu-nombre-de-imagen&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;04-comprobaciones-rápidas-para-problemas-comunes&#34;&gt;04 Comprobaciones rápidas para problemas comunes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Docker Desktop no se está ejecutando: verifique que esté iniciado.&lt;/li&gt;
&lt;li&gt;La compilación es muy lenta: verifique si el backend de WSL 2 está habilitado.&lt;/li&gt;
&lt;li&gt;La compilación no puede encontrar archivos: asegúrese de que su terminal esté en la raíz del proyecto y que los archivos estén dentro del contexto de compilación.&lt;/li&gt;
&lt;li&gt;Los recursos de Docker no se muestran en VS Code: reinicie VS Code y verifique Docker CLI (&lt;code&gt;versión de Docker&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La creación de imágenes de Docker en VS Code en Windows es principalmente un problema de configuración. Una vez que Docker Desktop y la extensión VS Code Docker estén implementados, puede generar archivos Docker rápidamente y crear imágenes desde la interfaz de usuario o el terminal.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Guía de recursos CH347: controladores, herramientas y programación SPI Flash</title>
        <link>https://knightli.com/es/2026/04/03/ch347-resources-drivers-tools/</link>
        <pubDate>Fri, 03 Apr 2026 10:00:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/03/ch347-resources-drivers-tools/</guid>
        <description>&lt;p&gt;Esta publicación resume los recursos de CH347 que uso con más frecuencia, con un objetivo: pasar de la configuración a la depuración/programación lo más rápido posible.&lt;/p&gt;
&lt;p&gt;Si es nuevo en CH347, prepare su entorno en este orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Consulte primero la página oficial del producto.&lt;/li&gt;
&lt;li&gt;Instale el controlador correcto para su caso de uso&lt;/li&gt;
&lt;li&gt;Prepare una herramienta SPI Flash y verifique la conectividad&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;entrada-oficial&#34;&gt;Entrada oficial
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Página del producto CH347: &lt;a class=&#34;link&#34; href=&#34;https://www.wch.cn/products/CH347.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.wch.cn/products/CH347.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es mejor descargar primero desde la página oficial para evitar paquetes de controladores obsoletos o de origen desconocido.&lt;/p&gt;
&lt;h2 id=&#34;controladores-comunes&#34;&gt;Controladores comunes
&lt;/h2&gt;&lt;h3 id=&#34;1-ch341parexe&#34;&gt;1) &lt;code&gt;CH341PAR.EXE&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Propósito:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controlador de interfaz USB a JTAG / SPI / I2C / Paralelo / GPIO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uso típico:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comunicación multiprotocolo y depuración de interfaz de bajo nivel con CH347&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-ch343serexe&#34;&gt;2) &lt;code&gt;CH343SER.EXE&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Propósito:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controlador de Windows del proveedor para USB a serie de alta velocidad&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uso típico:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilizar CH347 principalmente como herramienta en serie, especialmente a velocidades de baudios más altas&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;herramienta-de-programación-spi-flash&#34;&gt;Herramienta de programación SPI Flash
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ComoProgramador: &lt;a class=&#34;link&#34; href=&#34;https://github.com/nofeletru/UsbAsp-flash&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/nofeletru/UsbAsp-flash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tareas comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Detectar SPI NOR Flash&lt;/li&gt;
&lt;li&gt;Leer identificación del chip&lt;/li&gt;
&lt;li&gt;Copia de seguridad del firmware original&lt;/li&gt;
&lt;li&gt;Borrar / escribir / verificar firmware&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;flujo-de-trabajo-recomendado-para-evitar-errores-comunes&#34;&gt;Flujo de trabajo recomendado (para evitar errores comunes)
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Después de instalar los controladores, vuelva a conectar el dispositivo y confirme la detección en el Administrador de dispositivos.&lt;/li&gt;
&lt;li&gt;Antes de escribir por primera vez, realice una lectura completa + copia de seguridad del contenido original.&lt;/li&gt;
&lt;li&gt;Ejecute siempre verificar después de escribir. No confíe únicamente en un mensaje de &amp;ldquo;escritura exitosa&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Si no se detecta el chip, verifique la alimentación, el nivel de voltaje y el cableado antes de verificar la configuración del software.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;solución-rápida-de-problemas&#34;&gt;Solución rápida de problemas
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;El dispositivo está enchufado pero no es visible en las herramientas: generalmente hay problemas de carga del controlador o un cable USB de solo alimentación.&lt;/li&gt;
&lt;li&gt;Se detecta el dispositivo pero falla la lectura/escritura: primero verifique el orden del cableado, la tierra compartida y la estabilidad de la energía.&lt;/li&gt;
&lt;li&gt;Comportamiento inestable a alta velocidad: primero reduzca la velocidad de lectura/escritura y luego aumente gradualmente una vez confirmada la estabilidad.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;CH347 no es difícil de usar. La clave es hacer bien cuatro cosas: controlador, herramienta, cableado y verificación.&lt;/p&gt;
&lt;p&gt;Los recursos anteriores cubren la mayoría de los escenarios de mantenimiento diarios y para principiantes, y deberían permitirle alcanzar rápidamente un flujo de trabajo estable.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Explicación de FFmpeg `-map`: seleccione con precisión transmisiones de video, audio y subtítulos</title>
        <link>https://knightli.com/es/2026/04/02/ffmpeg-map-parameter-guide/</link>
        <pubDate>Thu, 02 Apr 2026 23:14:03 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/02/ffmpeg-map-parameter-guide/</guid>
        <description>&lt;p&gt;En flujos de trabajo de múltiples audios y subtítulos, &lt;code&gt;-map&lt;/code&gt; es una de las opciones más importantes y más frecuentemente mal utilizadas de FFmpeg.&lt;/p&gt;
&lt;p&gt;Si no especifica explícitamente &lt;code&gt;-map&lt;/code&gt;, FFmpeg selecciona automáticamente las transmisiones usando reglas predeterminadas y, a menudo, el resultado no es el esperado. Por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los subtítulos desaparecen después de la exportación.&lt;/li&gt;
&lt;li&gt;Se seleccionó la pista de idioma incorrecta&lt;/li&gt;
&lt;li&gt;Se incluyen flujos de datos no deseados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este artículo utiliza escenarios comunes del mundo real para explicar cómo funciona &amp;ldquo;-map&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;primero-comprenda-qué-es-una-transmisión&#34;&gt;Primero, comprenda qué es una &amp;ldquo;transmisión&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Un archivo contenedor (como &lt;code&gt;mp4&lt;/code&gt; o &lt;code&gt;mkv&lt;/code&gt;) generalmente contiene múltiples secuencias, que incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Secuencias de vídeo (&lt;code&gt;v&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Flujos de audio (&lt;code&gt;a&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Secuencias de subtítulos (&lt;code&gt;s&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Archivos adjuntos/flujos de datos (fuentes, portadas, capítulos, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puedes inspeccionar transmisiones con &lt;code&gt;ffprobe&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffprobe -hide_banner input.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;sintaxis-básica-de--map&#34;&gt;Sintaxis básica de &lt;code&gt;-map&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Patrón más común:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-map input_index[:stream_type][:stream_index]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejemplos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0:v&lt;/code&gt;: todas las transmisiones de video desde la primera entrada&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0:a:0&lt;/code&gt;: la primera secuencia de audio desde la primera entrada&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1:s:1&lt;/code&gt;: la segunda secuencia de subtítulos desde la segunda entrada&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_index&lt;/code&gt; comienza desde &lt;code&gt;0&lt;/code&gt;, según el orden &lt;code&gt;-i&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream_index&lt;/code&gt; también comienza desde &lt;code&gt;0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ejemplos-prácticos&#34;&gt;Ejemplos prácticos
&lt;/h2&gt;&lt;h3 id=&#34;1-vídeo-de-a-audio-de-b&#34;&gt;1) Vídeo de A, audio de B
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i english.mp4 -i french.mp3 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -map 0:v:0 -map 1:a:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c:v copy -c:a aac &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  french.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Significado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilice la primera transmisión de video de &lt;code&gt;english.mp4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Utilice la primera secuencia de audio de &lt;code&gt;french.mp3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fusionar en &lt;code&gt;french.mp4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-mantenga-todas-las-transmisiones-desde-la-entrada-1-luego-agregue-una-pista-de-audio-más&#34;&gt;2) Mantenga todas las transmisiones desde la entrada 1, luego agregue una pista de audio más
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i english.mp4 -i french.mp3 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -map &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -map 1:a:0 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c copy &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  english-french.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Significado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-map 0&lt;/code&gt; mantiene todas las transmisiones desde la primera entrada&lt;/li&gt;
&lt;li&gt;Luego agregue la primera secuencia de audio de la segunda entrada.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;dos-trucos-avanzados-útiles&#34;&gt;Dos trucos avanzados útiles
&lt;/h2&gt;&lt;h3 id=&#34;1-mapeo-negativo-excluye-transmisiones-no-deseadas&#34;&gt;1) Mapeo negativo: excluye transmisiones no deseadas
&lt;/h3&gt;&lt;p&gt;Por ejemplo, mantenga todo lo de la entrada 1 pero elimine su segunda secuencia de audio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mkv -map &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; -map -0:a:1 -c copy output.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-mapeo-opcional-no-falle-cuando-falte-una-transmisión&#34;&gt;2) Mapeo opcional: no falle cuando falte una transmisión
&lt;/h3&gt;&lt;p&gt;Si es posible que algunos archivos no tengan subtítulos, utilice &lt;code&gt;?&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ffmpeg -i input.mp4 -map 0:v -map 0:a -map 0:s? -c copy output.mp4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;0:s?&lt;/code&gt; significa: subtítulos del mapa si están presentes; de lo contrario, salte sin error.&lt;/p&gt;
&lt;h2 id=&#34;errores-comunes&#34;&gt;Errores comunes
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Una vez que usa &lt;code&gt;-map&lt;/code&gt;, FFmpeg detiene la selección automática de secuencias, por lo que debe mapear todo lo que necesita.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c copy&lt;/code&gt; solo remuxes sin transcodificación. Si el contenedor de destino no admite un códec, igualmente falla.&lt;/li&gt;
&lt;li&gt;Con múltiples entradas, los errores de índice son comunes. Los índices de entrada están determinados únicamente por el orden &amp;ldquo;-i&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Para scripts robustos, inspeccione primero con &lt;code&gt;ffprobe&lt;/code&gt; y luego genere &lt;code&gt;-map&lt;/code&gt; dinámicamente.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La idea central de &lt;code&gt;-map&lt;/code&gt; es simple: decirle explícitamente a FFmpeg qué entrada usar, qué tipo de flujo elegir y qué índice de flujo seleccionar.&lt;/p&gt;
&lt;p&gt;Una vez que domine esto, podrá manejar de manera confiable casos complejos como composición de múltiples audios, múltiples subtítulos y transmisiones entre archivos.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cómo solucionar problemas de uso elevado de CPU de VS Code causado por extensiones</title>
        <link>https://knightli.com/es/2026/04/01/vscode-extension-cpu-troubleshooting/</link>
        <pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://knightli.com/es/2026/04/01/vscode-extension-cpu-troubleshooting/</guid>
        <description>&lt;p&gt;Cuando VS Code de repente se siente lento, el ventilador gira y el uso de la CPU se mantiene alto, la causa más común generalmente no es el editor en sí, sino conflictos de extensiones o un comportamiento anormal de las extensiones.&lt;/p&gt;
&lt;p&gt;Esta guía le brinda un flujo de trabajo directo y práctico para identificar el problema rápidamente.&lt;/p&gt;
&lt;h2 id=&#34;comience-con-el-método-más-rápido-iniciar-la-extensión-en-bisección&#34;&gt;Comience con el método más rápido: iniciar la extensión en bisección
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Start Extension Bisect&lt;/code&gt; utiliza un enfoque de búsqueda binaria:
En cada ronda, VS Code desactiva temporalmente la mitad de tus extensiones y se reinicia. Según si el problema persiste, reduce rápidamente la lista de sospechosos.&lt;/p&gt;
&lt;p&gt;Pasos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Presione &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; (macOS: &lt;code&gt;Cmd+Shift+P&lt;/code&gt;) para abrir la paleta de comandos.&lt;/li&gt;
&lt;li&gt;Ejecute &lt;code&gt;Iniciar extensión bisect&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Después de cada reinicio, verifique si todavía hay un uso elevado de la CPU y un retraso, luego elija &amp;ldquo;Bien ahora&amp;rdquo; o &amp;ldquo;Esto es malo&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Después de varias rondas, VS Code mostrará las extensiones probablemente problemáticas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;qué-hacer-después-de-encontrar-al-sospechoso&#34;&gt;Qué hacer después de encontrar al sospechoso
&lt;/h2&gt;&lt;p&gt;Una vez que identifique la extensión, manéjela en este orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Actualice la extensión a la última versión.&lt;/li&gt;
&lt;li&gt;Si el problema persiste, desactívelo durante 1 o 2 días y observe.&lt;/li&gt;
&lt;li&gt;Si existen alternativas, cambie a una extensión más ligera.&lt;/li&gt;
&lt;li&gt;Si debe conservarlo, revise la configuración avanzada y desactive las funciones innecesarias de análisis, indexación o visualización de archivos en tiempo real.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;dos-amplificadores-comunes-que-quizás-pases-por-alto&#34;&gt;Dos &amp;ldquo;amplificadores&amp;rdquo; comunes que quizás pases por alto
&lt;/h2&gt;&lt;p&gt;Incluso si una extensión es la causa principal, estas configuraciones pueden amplificar la carga de la CPU:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;El alcance de la búsqueda es demasiado amplio&lt;br&gt;
Si los resultados de la compilación, las carpetas de dependencia y los registros se incluyen en la búsqueda global, las extensiones y los indexadores pueden permanecer bajo una carga pesada y continua.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La visualización de archivos incluye carpetas o enlaces simbólicos enormes&lt;br&gt;
Los enlaces simbólicos, los directorios de caché y las carpetas generadas pueden desencadenar una gran cantidad de eventos de archivos y forzar que las extensiones se reprocesen repetidamente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Puede recortar el alcance en &lt;code&gt;settings.json&lt;/code&gt;, por ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;search.exclude&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;**/node_modules&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;**/dist&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;**/build&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;files.watcherExclude&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;**/.git/objects/**&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;**/node_modules/**&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;**/dist/**&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;consejo-post-mortem&#34;&gt;Consejo post mortem
&lt;/h2&gt;&lt;p&gt;Después de aislar el problema, registre tres cosas: nombre de la extensión, escenario desencadenante y solución final.&lt;br&gt;
Esa nota le ahorrará tiempo cuando migre su entorno o reconstruya su máquina más adelante.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Para un uso elevado de CPU de VS Code, la ruta más eficaz es utilizar primero &amp;ldquo;Iniciar extensión Bisect&amp;rdquo; y luego ajustar el alcance de búsqueda y observación de archivos.&lt;br&gt;
Localice primero, optimice en segundo lugar. Es más rápido y confiable que deshabilitar aleatoriamente muchas extensiones.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
