<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lenin Uzcategui</title>
    <description>The latest articles on Forem by Lenin Uzcategui (@leuzga).</description>
    <link>https://forem.com/leuzga</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1360145%2Fa637b9f0-238c-4359-a345-03bdefe9b0e8.png</url>
      <title>Forem: Lenin Uzcategui</title>
      <link>https://forem.com/leuzga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/leuzga"/>
    <language>en</language>
    <item>
      <title>Alerta para Desarrolladores: Trae IDE y el Riesgo Real con el Código de tus Clientes</title>
      <dc:creator>Lenin Uzcategui</dc:creator>
      <pubDate>Wed, 18 Feb 2026 18:35:35 +0000</pubDate>
      <link>https://forem.com/leuzga/alerta-para-desarrolladores-trae-ide-y-el-riesgo-real-con-el-codigo-de-tus-clientes-1cgg</link>
      <guid>https://forem.com/leuzga/alerta-para-desarrolladores-trae-ide-y-el-riesgo-real-con-el-codigo-de-tus-clientes-1cgg</guid>
      <description>&lt;h2&gt;
  
  
  El IDE gratuito que te cuesta más de lo que crees
&lt;/h2&gt;

&lt;p&gt;Imagina esto: estás trabajando en el sistema core de pagos de un banco. Tu IDE, de forma silenciosa y en segundo plano, está abriendo 500 conexiones a servidores en otro país, enviando 26 MB de datos que incluyen rutas completas de tus archivos, tiempos exactos de tu actividad, identificadores únicos de tu hardware — y todo esto justo cuando creías haberlo desactivado.&lt;/p&gt;

&lt;p&gt;No es una película de espionaje. Es lo que documentaron investigadores independientes sobre &lt;strong&gt;Trae IDE&lt;/strong&gt;, el nuevo IDE con IA de ByteDance (la empresa detrás de TikTok), en julio de 2025.&lt;/p&gt;

&lt;p&gt;Este artículo no es un ataque a Trae ni a ByteDance. Es una llamada de atención al ecosistema de desarrollo de software sobre algo que debería ser innegociable: &lt;strong&gt;la privacidad del código de nuestros clientes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué es Trae y por qué se volvió tan popular tan rápido?
&lt;/h2&gt;

&lt;p&gt;Trae es un IDE basado en VS Code, desarrollado por ByteDance, que se lanzó ofreciendo algo que ningún competidor directo daba: &lt;strong&gt;acceso gratuito a modelos premium como Claude 3.7 Sonnet y GPT-4o&lt;/strong&gt;, sin pagar suscripción.&lt;/p&gt;

&lt;p&gt;Cursor cobra $20/mes para acceso a modelos de calidad. Trae lo daba gratis.&lt;/p&gt;

&lt;p&gt;El resultado fue una adopción masiva, especialmente entre desarrolladores independientes y estudiantes. Y aquí está el problema clásico: cuando un producto es gratuito, la pregunta obligatoria es ¿cuál es el modelo de negocio real?&lt;/p&gt;




&lt;h2&gt;
  
  
  El escándalo que la comunidad no debería olvidar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Julio 2025 — Lo que los datos revelaron
&lt;/h3&gt;

&lt;p&gt;Un investigador independiente realizó un análisis técnico detallado de Trae y lo que encontró fue alarmante:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consumo de recursos fuera de lo normal:&lt;/strong&gt; Trae lanzaba &lt;strong&gt;33 procesos paralelos&lt;/strong&gt; y consumía &lt;strong&gt;5.7 GB de RAM&lt;/strong&gt; cargando el mismo codebase que VSCode manejaba con apenas 9 procesos y 0.9 GB. Una diferencia de casi 6x en recursos para hacer el mismo trabajo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La telemetría que se intensificaba al apagarla:&lt;/strong&gt; El hallazgo más perturbador fue que al deshabilitar la telemetría desde los ajustes del IDE, el comportamiento no mejoraba — &lt;strong&gt;empeoraba&lt;/strong&gt;. El sistema registró 500 conexiones de red en apenas 7 minutos, enviando 26 MB de datos. Cada paquete individual llegaba a los 53,606 bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Qué contenían esos paquetes?&lt;/strong&gt; Los payloads interceptados revelaban dos capas distintas de recolección:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capa 1:&lt;/strong&gt; Identificadores persistentes de hardware e información del perfil de usuario&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capa 2:&lt;/strong&gt; Tiempos exactos de actividad, &lt;strong&gt;rutas completas del sistema de archivos&lt;/strong&gt;, métricas detalladas de comportamiento incluyendo movimiento del mouse y estados de foco de ventana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto no es telemetría de diagnóstico. Esto es vigilancia comportamental granular.&lt;/p&gt;

&lt;h3&gt;
  
  
  La respuesta que hizo más ruido que la solución
&lt;/h3&gt;

&lt;p&gt;Cuando el investigador reportó sus hallazgos en el servidor oficial de Discord de Trae, fue silenciado por &lt;strong&gt;7 días&lt;/strong&gt;. La razón: la palabra "tokens" estaba en una lista negra del bot de moderación del servidor.&lt;/p&gt;

&lt;p&gt;La elección de silenciar una discusión técnica legítima sobre seguridad, en lugar de responder abiertamente, fue para muchos en la comunidad más reveladora que los propios datos técnicos.&lt;/p&gt;




&lt;h2&gt;
  
  
  La respuesta de ByteDance — ¿Suficiente?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Julio - Agosto 2025: Reconocimiento y parches parciales
&lt;/h3&gt;

&lt;p&gt;ByteDance respondió reconociendo el problema, aunque con matices importantes. Explicaron que el toggle de telemetría en los settings solo controlaba la recolección a través del framework base de VS Code, pero que &lt;strong&gt;extensiones de terceros no respetaban ese control&lt;/strong&gt;. Lanzaron actualizaciones de texto en la UI para ser más explícitos sobre la presencia de telemetría.&lt;/p&gt;

&lt;p&gt;El investigador original actualizó su reporte reconociendo el avance, pero también confirmó que seguía pendiente una solución más profunda: un &lt;strong&gt;Privacy Mode dedicado&lt;/strong&gt;, prometido para agosto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agosto - Septiembre 2025: Llega Privacy Mode
&lt;/h3&gt;

&lt;p&gt;Trae lanzó Privacy Mode, disponible para todos los usuarios incluyendo el plan gratuito. Con él activado, la telemetría de analytics y mejora de producto se deshabilita.&lt;/p&gt;

&lt;p&gt;Trae comunicó oficialmente: "Privacy Mode está completamente soportado en Trae IDE para usuarios Free y Pro. Tus conversaciones se mantienen privadas cuando lo necesitas."&lt;/p&gt;

&lt;p&gt;Suena bien. Pero hay que leer la letra chica.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lo que Privacy Mode no resuelve — La letra chica que importa
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Los Términos de Servicio hablan por sí solos
&lt;/h3&gt;

&lt;p&gt;Los ToS actualizados de Trae indican que pueden usar el contenido del usuario para "proveer, mantener, desarrollar y mejorar sus Servicios… &lt;strong&gt;entrenar sus modelos&lt;/strong&gt;… y mantener los Servicios seguros."&lt;/p&gt;

&lt;p&gt;La aclaración de Trae es que el código en texto plano se elimina después de procesarse — pero &lt;strong&gt;los embeddings y la metadata se retienen&lt;/strong&gt;. Un embedding es una representación matemática del código que puede contener su semántica, su estructura, sus patrones. No es el código literalmente, pero sí una huella profunda de él.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lo que la Política de Privacidad no dice
&lt;/h3&gt;

&lt;p&gt;La Política de Privacidad actualizada el 21 de agosto de 2025 no enumera los endpoints específicos de telemetría que siguen activos, ni ofrece una matriz clara de qué se puede desactivar y qué no. La opacidad sigue siendo parte del diseño.&lt;/p&gt;

&lt;h3&gt;
  
  
  La comparación que lo dice todo
&lt;/h3&gt;

&lt;p&gt;Microsoft, en su política para GitHub Copilot, se compromete públicamente a que los datos de código de usuario &lt;strong&gt;no se usan para entrenar modelos base&lt;/strong&gt;. Es un compromiso claro, auditado y vinculante.&lt;/p&gt;

&lt;p&gt;ByteDance no ha hecho un compromiso público equivalente para Trae. No porque sea imposible hacerlo — sino porque no lo han hecho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los tiempos de retención
&lt;/h3&gt;

&lt;p&gt;Los datos personales se retienen &lt;strong&gt;5 años&lt;/strong&gt; después de terminar el servicio. Los datos no personales se retienen &lt;strong&gt;indefinidamente&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  El escenario que todo equipo debería imaginar
&lt;/h2&gt;

&lt;p&gt;Eres un desarrollador trabajando para un banco. Tu cliente te ha dado acceso al repositorio que contiene la lógica de procesamiento de transacciones, los algoritmos de detección de fraude, las integraciones con sistemas de pagos internacionales. Código que vale millones. Código que, si se filtrara, podría comprometer la seguridad financiera de miles de personas.&lt;/p&gt;

&lt;p&gt;Abres Trae. Activas el modo agente SOLO, que planea y ejecuta tareas de forma autónoma navegando tu codebase. SOLO lee múltiples archivos, genera contexto, hace llamadas a la API.&lt;/p&gt;

&lt;p&gt;Todo ese contexto — las rutas de archivos, la estructura del proyecto, los patrones del código, potencialmente fragmentos completos de lógica de negocio — viaja a servidores de ByteDance para ser procesado.&lt;/p&gt;

&lt;p&gt;Privacy Mode activado. Pero embeddings retenidos. Metadata retenida. Datos no personales retenidos indefinidamente.&lt;/p&gt;

&lt;p&gt;¿Cuántos contratos de confidencialidad acabas de violar sin saberlo?&lt;/p&gt;




&lt;h2&gt;
  
  
  El estado real en Febrero 2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Estado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Privacy Mode disponible&lt;/td&gt;
&lt;td&gt;✅ Sí, para Free y Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telemetría completamente desactivable&lt;/td&gt;
&lt;td&gt;⚠️ Parcialmente — telemetría básica permanece&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso del código para entrenar modelos&lt;/td&gt;
&lt;td&gt;⚠️ Los ToS lo permiten (código plano se borra, embeddings se retienen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compromiso público explícito de no entrenar con tu código&lt;/td&gt;
&lt;td&gt;❌ No existe de ByteDance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datos personales retenidos&lt;/td&gt;
&lt;td&gt;⚠️ 5 años post-servicio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datos no personales retenidos&lt;/td&gt;
&lt;td&gt;⚠️ Indefinidamente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Resumen honesto:&lt;/strong&gt; ByteDance movió el nivel de riesgo de &lt;em&gt;inaceptable&lt;/em&gt; a &lt;em&gt;manejable con condiciones&lt;/em&gt;. Eso no es lo mismo que resolverlo.&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué debería exigir la comunidad de desarrollo?
&lt;/h2&gt;

&lt;p&gt;La presión colectiva funciona. Las empresas cambian sus políticas cuando el costo reputacional supera el beneficio de mantenerlas. Esto es lo que deberíamos exigir como estándar mínimo a cualquier IDE con IA:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Compromiso público y vinculante de no entrenar con código de usuario&lt;/strong&gt;, con auditoría independiente anual, igual o más sólido que el de Microsoft para Copilot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Un Privacy Mode que sea verdaderamente total&lt;/strong&gt;, no parcial. Si está activado, cero telemetría, sin excepciones para "monitoreo de funcionalidad".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Publicación de los endpoints activos de telemetría&lt;/strong&gt; con documentación clara de qué datos viajan a cada uno y bajo qué condiciones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Términos de retención de embeddings y metadata&lt;/strong&gt; que sean razonables, limitados y auditables — no "indefinidamente".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Transparencia ante reportes de seguridad&lt;/strong&gt;, no silenciamiento. Un servidor de Discord que banea la discusión de "tokens" cuando un investigador reporta un hallazgo legítimo es una señal de alerta enorme.&lt;/p&gt;




&lt;h2&gt;
  
  
  La regla práctica más importante
&lt;/h2&gt;

&lt;p&gt;Antes de usar cualquier IDE con IA en un proyecto de cliente, hazte esta pregunta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;¿Si este código apareciera mañana en un repositorio público o en el dataset de entrenamiento de un modelo de IA, habría consecuencias legales, reputacionales o de seguridad para mi cliente o para mí?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si la respuesta es sí, ese IDE no debería tener acceso a ese codebase. Sin importar cuánto cueste la alternativa. Sin importar qué tan bueno sea el Privacy Mode. Sin importar las promesas del marketing.&lt;/p&gt;

&lt;p&gt;La confidencialidad del código de un cliente no es un feature opcional. Es una obligación profesional y, en muchos sectores, legal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión — La privacidad del código no debería ser un privilegio de pago
&lt;/h2&gt;

&lt;p&gt;Trae ofrece algo genuinamente atractivo: modelos de IA de calidad sin costo. Eso es valioso, especialmente para desarrolladores que están aprendiendo o en proyectos personales sin código sensible.&lt;/p&gt;

&lt;p&gt;Pero el sector del desarrollo de software necesita establecer una norma clara: &lt;strong&gt;ningún IDE debería tener acceso ambiguo al código de clientes, independientemente de su precio&lt;/strong&gt;. La transparencia y los compromisos verificables no deberían ser características premium.&lt;/p&gt;

&lt;p&gt;Compartir este tipo de análisis, hacer preguntas difíciles en público, y exigir respuestas claras de las empresas es la única forma en que la industria avanza hacia estándares más honestos.&lt;/p&gt;

&lt;p&gt;Si usas Trae para proyectos personales o de aprendizaje, adelante — es una herramienta poderosa. Pero si tienes código de clientes en tu máquina, esta es tu alerta.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;¿Trabajas con clientes en sectores regulados como banca, salud o fintech? Comparte este artículo con tu equipo. Las decisiones sobre herramientas de desarrollo son decisiones de seguridad.&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Publicado:&lt;/strong&gt; Febrero 2026 | &lt;strong&gt;Categoría:&lt;/strong&gt; Seguridad, Herramientas de Desarrollo, IA&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Audiencia:&lt;/strong&gt; Desarrolladores freelance, equipos de software, CTOs, equipos de seguridad&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#Seguridad&lt;/code&gt; &lt;code&gt;#DesarrolloDeSoftware&lt;/code&gt; &lt;code&gt;#TraeIDE&lt;/code&gt; &lt;code&gt;#ByteDance&lt;/code&gt; &lt;code&gt;#PrivacidadDelCódigo&lt;/code&gt; &lt;code&gt;#IAParaDevs&lt;/code&gt; &lt;code&gt;#CursorVsTrae&lt;/code&gt; &lt;code&gt;#DataPrivacy&lt;/code&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seguridad</category>
      <category>desarrollodesoftware</category>
      <category>ai</category>
    </item>
    <item>
      <title>Custom Elements: The Superpower of Svelte 5</title>
      <dc:creator>Lenin Uzcategui</dc:creator>
      <pubDate>Fri, 16 May 2025 15:57:41 +0000</pubDate>
      <link>https://forem.com/leuzga/custom-elements-the-superpower-of-svelte-5-4mo</link>
      <guid>https://forem.com/leuzga/custom-elements-the-superpower-of-svelte-5-4mo</guid>
      <description>&lt;h3&gt;
  
  
  Svelte 5 and the Future of Truly Reusable Web Components
&lt;/h3&gt;

&lt;p&gt;In today's web development ecosystem, framework fragmentation can be a headache. Can you imagine creating components that work equally well in React, Vue, Angular, or even plain HTML? With Svelte 5 and Web Components technology, this isn't just possible—it's surprisingly simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Challenge
&lt;/h3&gt;

&lt;p&gt;Modern frontend development is based on reusable components. However, these components often remain "trapped" within the ecosystem for which they were created. A button made in React will hardly work in a Vue application without significant modifications.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore how to create truly framework-agnostic components using Svelte 5 and Storybook 8+. Our example will be a fully customizable Alert component that will work in any framework or environment—in some cases directly, in others with minimal modifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the Problem?
&lt;/h3&gt;

&lt;p&gt;Imagine this situation: your company has several teams working on different projects. Team A uses React, team B uses Vue, and new project C is being developed with Svelte.&lt;/p&gt;

&lt;p&gt;If each team creates their own components from scratch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Effort is duplicated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visual and behavioral inconsistencies emerge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintenance becomes a nightmare&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The learning curve multiplies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore, if tomorrow they decided to migrate to another framework, they would have to rewrite all the components. This represents an enormous cost in time and resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Solve It: Web Components with Svelte 5
&lt;/h3&gt;

&lt;p&gt;The magic of our solution lies in the combination of Svelte 5 with Web Components (or Custom Elements) and their documentation in Storybook 8+.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Alert component in Svelte&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Documentation with Storybook&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detailed documentation with MDX (to be covered in another post...)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's look at the code for our Alert.svelte component:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQE8hWm1cqg3Uw%2Farticle-inline_image-shrink_1000_1488%2FB4EZa16ltyHIAQ-%2F0%2F1746808758124%3Fe%3D1752710400%26v%3Dbeta%26t%3DAMk5qXQPHEgsiHVkpOC5vD4YS7q5kUpJM0x9v8Q-9xE" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQE8hWm1cqg3Uw%2Farticle-inline_image-shrink_1000_1488%2FB4EZa16ltyHIAQ-%2F0%2F1746808758124%3Fe%3D1752710400%26v%3Dbeta%26t%3DAMk5qXQPHEgsiHVkpOC5vD4YS7q5kUpJM0x9v8Q-9xE" alt="Custom Element Alert script functionality" width="808" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Breaking down the code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The magic is in this line:  This directive converts our Svelte component into a Web Component that can be used in any framework or plain HTML. When you compile this component, Svelte generates a JavaScript file that, when included in any project, registers the custom element  which you can use like any other HTML tag.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The rest of the code consists of the $props() directive, which automates reactivity. This reactive directive allows you to declare and destructure all the properties that the component can receive from the outside, assigning them default values, very similar to a React prop. Then there are a couple of functions: getIconSVG() to get the corresponding icon from the svgIcons object, and finally the closeAlert() function to close the notification dialog box.&lt;/p&gt;

&lt;p&gt;Let's look at the HTML code of the component:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQEt-1ZyISnTbw%2Farticle-inline_image-shrink_1000_1488%2FB4EZa16wrzGcAQ-%2F0%2F1746808803216%3Fe%3D1752710400%26v%3Dbeta%26t%3DgLg1BZVeSNcU_dtsgEmWVFwhxz9JPVRS5IeYxUgjTy0" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQEt-1ZyISnTbw%2Farticle-inline_image-shrink_1000_1488%2FB4EZa16wrzGcAQ-%2F0%2F1746808803216%3Fe%3D1752710400%26v%3Dbeta%26t%3DgLg1BZVeSNcU_dtsgEmWVFwhxz9JPVRS5IeYxUgjTy0" alt="component Alert HTML" width="1029" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The structure of a Svelte component consists of the JavaScript/TypeScript script that provides functionality, the HTML which is the rendering template, and the associated style either in CSS within the same file or using tailwindcss among others. The Shadow DOM will always ensure that the CSS belongs exclusively to the defined component. In this case, it's omitted. Basically, we have a dialog tag whose style varies depending on the type of icon (info, warn, error, success, dark, default), which provides the appropriate style. Inside, there are the title and description props that will be displayed in the notification, as seen in the following image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQEkCVeqw67eRg%2Farticle-inline_image-shrink_1000_1488%2FB4EZa162UYGQAQ-%2F0%2F1746808825538%3Fe%3D1752710400%26v%3Dbeta%26t%3DwuKG403ibDTE-y3xaxvdS9FbA-9R1xhRGxTm81T4BgM" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQEkCVeqw67eRg%2Farticle-inline_image-shrink_1000_1488%2FB4EZa162UYGQAQ-%2F0%2F1746808825538%3Fe%3D1752710400%26v%3Dbeta%26t%3DwuKG403ibDTE-y3xaxvdS9FbA-9R1xhRGxTm81T4BgM" alt="Images Preview Component Alert" width="448" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Documenting with Storybook
&lt;/h3&gt;

&lt;p&gt;The configuration of Storybook version 8+ in a Svelte v5 project created via Vite is actually automatic, but you can refer to the official documentation for installation at &lt;a href="https://storybook.js.org/docs/svelte/get-started/install" rel="noopener noreferrer"&gt;StoryBook Docs, Installation&lt;/a&gt;. What we have then is a file with the extension Alert.stories.js, which tells the project and StoryBook where the component comes from and how to render it and add component variations. It's also possible to include a table of properties that can be modified live to observe the component's behavior, as shown in the example code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQG1luqw00BAcg%2Farticle-inline_image-shrink_1500_2232%2FB4EZa16973HcAU-%2F0%2F1746808857255%3Fe%3D1752710400%26v%3Dbeta%26t%3DSYuQQQaZ_HkV8SRLvNz4i35OlFEnfVdo9XsWfCl65RE" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQG1luqw00BAcg%2Farticle-inline_image-shrink_1500_2232%2FB4EZa16973HcAU-%2F0%2F1746808857255%3Fe%3D1752710400%26v%3Dbeta%26t%3DSYuQQQaZ_HkV8SRLvNz4i35OlFEnfVdo9XsWfCl65RE" alt="Alert.stories.js for Storybook" width="631" height="1500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The heart of our file begins with export default {...}. This is like the main menu of a restaurant: it tells Storybook all the basic information about our component. The title is super important—it's like your home address but for Storybook. In this case, we're saying: "Hey, place this component in the 'Garnet UI Library' folder, inside 'Notification Components', and call it 'Alert'". When you open Storybook, you'll see exactly that folder structure in the left sidebar menu. Inside that export default, we find argTypes. This section is like the instruction manual for our component.&lt;/p&gt;

&lt;p&gt;Each property here defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What type of control Storybook will display (checkbox for booleans, text field, selector, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A friendly description so other developers understand what it's for&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Default values and additional configuration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The table part is like adding a detailed price tag—it shows technical information in Storybook's properties table. Then we have parameters, which are like the extra menu configuration; Here we're saying: "The general description of the component is this" and "when showing examples, give them a height of 150px". It's like giving additional instructions to the chef on how to present the dish. In this case, the chef is Storybook.&lt;/p&gt;

&lt;p&gt;Now come the most interesting parts: the stories. Each export const is like a visual example of our component in a specific situation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;render: This is the function that says "this is how I want to display my component". In Svelte, we use this standard pattern.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;args: These are the specific ingredients for this version of the component. Here we're saying: "Show an alert of type 'info', with this title, this description, etc."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each story (Default, Warn, Error, etc.) shows a different variant of the same component, like photos of the same furniture in different colors so the client can choose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQH6QpZnWTZjPw%2Farticle-inline_image-shrink_1500_2232%2FB4EZa17Jm_HoAU-%2F0%2F1746808904860%3Fe%3D1752710400%26v%3Dbeta%26t%3Dtnei16dok66ivL0Kt2ASOlM9737ht4IfVToRA-3J_Os" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQH6QpZnWTZjPw%2Farticle-inline_image-shrink_1500_2232%2FB4EZa17Jm_HoAU-%2F0%2F1746808904860%3Fe%3D1752710400%26v%3Dbeta%26t%3Dtnei16dok66ivL0Kt2ASOlM9737ht4IfVToRA-3J_Os" alt="View in Storybook" width="881" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  In Summary
&lt;/h3&gt;

&lt;p&gt;The Storybook file is like an interactive catalog for our Alert component:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First, we define where to find it in the menu (title)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then we explain all its customizable options (argTypes)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We add extra configuration if needed (parameters)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And finally, we show practical examples of all its variants (stories)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This way, any developer using our component can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;See how it looks in different states&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Play with its properties to see how it changes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read the documentation to understand how to use it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And all this without having to read a single line of the component's internal code. It's like test-driving a car without needing to understand how the engine works!&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes These Components Framework-Agnostic?
&lt;/h3&gt;

&lt;p&gt;The key to understanding why our component is agnostic lies in Web Components (or Custom Elements) technology. Web Components are a set of standard web technologies that allow creating custom, encapsulated, and reusable HTML elements. When Svelte compiles a component with the customElement directive, it generates a Web Component that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Encapsulates its style and functionality: Styles defined within the component don't affect the rest of the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exposes a clear API: The component can be used through standard HTML attributes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is compatible with any framework or pure HTML: It doesn't depend on Svelte to function, meaning in the Svelte framework it would be native and used without modifications, and in frameworks that support web components like Astro, SolidJS, among others, the modifications are minimal or none.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In frameworks that have their own engine, their lifecycle is different, especially those using a reconciliation algorithm for their Virtual DOM; more code needs to be created to adapt the requests or states specific to the framework regarding the functionality established in the Web Component.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How to Use Our Component in Different Environments?
&lt;/h3&gt;

&lt;p&gt;Once compiled, our component can be used like this:&lt;/p&gt;

&lt;p&gt;In plain HTML:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQHmsZ8qewvtng%2Farticle-inline_image-shrink_400_744%2FB4EZa17TcEH4Ac-%2F0%2F1746808945255%3Fe%3D1752710400%26v%3Dbeta%26t%3DOv_LWtqYeuRednUYcdUJLJMHeqxaJY7pCx-EmGcubWs" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQHmsZ8qewvtng%2Farticle-inline_image-shrink_400_744%2FB4EZa17TcEH4Ac-%2F0%2F1746808945255%3Fe%3D1752710400%26v%3Dbeta%26t%3DOv_LWtqYeuRednUYcdUJLJMHeqxaJY7pCx-EmGcubWs" alt="Using agnostic component in HTML" width="744" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In React:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQFQSt_Wr3zvxg%2Farticle-inline_image-shrink_1000_1488%2FB4EZa17YSkHkAQ-%2F0%2F1746808965091%3Fe%3D1752710400%26v%3Dbeta%26t%3DxZEnmp4dLnXXrvhLRSadUTUmX2vRHi8SPTK9CaJQw9Q" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQFQSt_Wr3zvxg%2Farticle-inline_image-shrink_1000_1488%2FB4EZa17YSkHkAQ-%2F0%2F1746808965091%3Fe%3D1752710400%26v%3Dbeta%26t%3DxZEnmp4dLnXXrvhLRSadUTUmX2vRHi8SPTK9CaJQw9Q" alt="Using agnostic component in React" width="1298" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Vue.js:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQEZsy9JrzkWEg%2Farticle-inline_image-shrink_400_744%2FB4EZa17fG0HcAY-%2F0%2F1746808993474%3Fe%3D1752710400%26v%3Dbeta%26t%3DsE45GrqzMNq-cKGsYSUbdTS_pBibEL1TO3DiutPpxUA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQEZsy9JrzkWEg%2Farticle-inline_image-shrink_400_744%2FB4EZa17fG0HcAY-%2F0%2F1746808993474%3Fe%3D1752710400%26v%3Dbeta%26t%3DsE45GrqzMNq-cKGsYSUbdTS_pBibEL1TO3DiutPpxUA" alt="Using agnostic component in Vue.js" width="744" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In SolidJS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQGN7A9H-KpEgg%2Farticle-inline_image-shrink_1000_1488%2FB4EZa17lP.HMAU-%2F0%2F1746809018282%3Fe%3D1752710400%26v%3Dbeta%26t%3DSfAUjpJVuZBPGhEv6cLThg7lzBJg1LWOnaDZZ3_6tes" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FD4E12AQGN7A9H-KpEgg%2Farticle-inline_image-shrink_1000_1488%2FB4EZa17lP.HMAU-%2F0%2F1746809018282%3Fe%3D1752710400%26v%3Dbeta%26t%3DSfAUjpJVuZBPGhEv6cLThg7lzBJg1LWOnaDZZ3_6tes" alt="Using agnostic componet in Solid.js" width="1074" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's that simple! Web Components are used like any standard HTML tag in both frameworks. However, as I mentioned before, if a component has more complex functional logic, for example, returning a state that needs to be obtained to perform other logic, in these types of scenarios is where the use in React and Vue.js becomes complicated since you need to add functionalities compatible with their engines, as the philosophy of state management is specific to each engine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages of Web Components with Svelte
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write once, use everywhere&lt;/strong&gt;: The same component works in any framework or without a framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimized performance&lt;/strong&gt;: Svelte compiles the code to highly efficient vanilla JavaScript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real encapsulation&lt;/strong&gt;: Styles and functionalities don't interfere with the rest of the application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easy maintenance&lt;/strong&gt;: A single component to maintain instead of multiple implementations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Long-term compatibility&lt;/strong&gt;: By following web standards, components are more resistant to changes in frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduced size&lt;/strong&gt;: Svelte generates very compact code, resulting in lighter components.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Browser support&lt;/strong&gt;: Although most modern browsers support Web Components, there may be issues in older browsers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom Elements limitations&lt;/strong&gt;: Some advanced functionalities specific to each framework may not be available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Initial learning curve&lt;/strong&gt;: Understanding Svelte's mental model and Web Components takes time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less mature ecosystem&lt;/strong&gt;: Compared to React or Vue, the Svelte and Web Components ecosystem is more recent.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Overcome Web Components Disadvantages
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Browser support&lt;/strong&gt; Solution: Use polyfills for compatibility with older browsers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom Elements limitations&lt;/strong&gt; Solution: Design a clear event API and use standard communication patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less mature ecosystem&lt;/strong&gt; Solution: Leverage existing libraries and contribute to the ecosystem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Share your components as open source to enrich the ecosystem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Join communities like &lt;a href="https://www.w3.org/community/webcomponents/" rel="noopener noreferrer"&gt;Web Components Community Group&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement good testing and documentation practices for your components&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ease of Implementation by Framework
&lt;/h3&gt;

&lt;p&gt;From easiest to most difficult:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Vanilla HTML: Simply import the script and use the component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Svelte: Native compatibility and perfect integration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Astro: Excellent support for Web Components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SolidJS: Natively supports Web Components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vue: Good integration with Custom Elements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React: Requires some adjustments to handle events and properties.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why Architects Should Consider This Solution
&lt;/h3&gt;

&lt;p&gt;As a software architect or technical leader, there are powerful reasons to consider Web Components in Svelte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Visual and functional consistency&lt;/strong&gt;: Ensures that all teams use the same components, regardless of the framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technical debt reduction&lt;/strong&gt;: Less duplicate code means fewer bugs and easier maintenance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technological flexibility&lt;/strong&gt;: Teams can change frameworks without needing to rewrite the basic components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Team scalability&lt;/strong&gt;: Different teams can work on different parts of the application using different technologies while maintaining a coherent user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Future-proof&lt;/strong&gt;: Being based on web standards, these components are more likely to remain relevant in the future.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The combination of Svelte 5 and Web Components represents a revolutionary approach to user interface development. It allows creating truly agnostic components that work in any environment, reducing duplication of efforts and ensuring a consistent user experience. Additionally, incorporating Storybook as a documentation tool significantly elevates the value of these components. By documenting each variant, property, and possible behavior, Storybook not only facilitates the use of components for other developers but also serves as a visual and functional source of truth. This living documentation allows teams to test, visualize, and understand how components work without needing to read their internal code, accelerating adoption and reducing the learning curve. Ultimately, a well-documented agnostic component with Storybook becomes a high-value asset that transcends frameworks and teams, materializing the true potential of reuse in modern frontend development.&lt;/p&gt;

&lt;p&gt;Although it's not the perfect solution for all use cases, it's a powerful option that architects and developers should seriously consider, especially in organizations with multiple teams or projects using different technologies.&lt;/p&gt;

&lt;p&gt;What did you think of this article on Svelte 5 and Web Components? We'd love to hear about your experience implementing these solutions in your projects. Have you found other advantages or challenges not mentioned? This agnostic component approach is revolutionizing the way we build interfaces, and we've barely scratched the surface. In upcoming articles, we'll delve into topics such as advanced documentation integration in Storybook, Web Component performance in large-scale applications, and how to build complete design systems with this architecture. We'll also explore npm deployment and how to perform tests in Storybook. Stay connected to discover how to take your components to the next level, and don't hesitate to share this article with other developers interested in building more efficient and coherent interfaces!&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>web</category>
      <category>components</category>
      <category>agnosticos</category>
    </item>
  </channel>
</rss>
