<?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>DEV Community: Aylen Tejas</title>
    <description>The latest articles on DEV Community by Aylen Tejas (@nakiviar).</description>
    <link>https://dev.to/nakiviar</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%2F3592439%2Fd307ff5b-467d-41bc-9f2d-9afcbe72ac59.jpeg</url>
      <title>DEV Community: Aylen Tejas</title>
      <link>https://dev.to/nakiviar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nakiviar"/>
    <language>en</language>
    <item>
      <title>TOON vs JSON en RAG (Java): el Grinch de los formatos cuando cada token cuenta 🎁</title>
      <dc:creator>Aylen Tejas</dc:creator>
      <pubDate>Thu, 25 Dec 2025 12:21:20 +0000</pubDate>
      <link>https://dev.to/nakiviar/toon-vs-json-en-rag-java-como-evaluarlo-correctamente-el-grinch-de-los-formatos-cuando-cada-5571</link>
      <guid>https://dev.to/nakiviar/toon-vs-json-en-rag-java-como-evaluarlo-correctamente-el-grinch-de-los-formatos-cuando-cada-5571</guid>
      <description>&lt;p&gt;En RAG (Retrieval-Augmented Generation) hay un detalle que parece menor hasta que te golpea en producción: cómo representas la evidencia que le pasas al modelo.&lt;/p&gt;

&lt;p&gt;Dos sistemas pueden recuperar exactamente la misma información… y aun así comportarse distinto si el prompt queda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;demasiado largo (se corta evidencia útil),&lt;/li&gt;
&lt;li&gt;demasiado ruidoso (el modelo “se pierde” en sintaxis),&lt;/li&gt;
&lt;li&gt;o demasiado caro (tokens y latencia se disparan).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por eso TOON (Token-Oriented Object Notation) aparece como un retador interesante frente a JSON: no porque JSON “esté mal”, sino porque JSON fue diseñado para máquinas, mientras que TOON intenta optimizar cómo un LLM consume datos estructurados.&lt;/p&gt;

&lt;p&gt;Este post te deja un marco claro para que tú mismo puedas armar tu comparativa con tus datasets (por ejemplo: políticas de cuentas, tarjetas de crédito, retiros, transferencias, etc.), y sin caer en el error más común: mezclar indexación con prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  1) Lo esencial: TOON es otra estrategia de empaquetado
&lt;/h2&gt;

&lt;p&gt;TOON está pensado para reducir repetición de claves y ruido estructural cuando el dato es uniforme.&lt;br&gt;&lt;br&gt;
La idea fuerte: en listas de objetos similares, JSON repite el mismo set de keys una y otra vez; TOON intenta declarar “el esquema” una sola vez y luego listar valores.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ejemplo realista (tarifas / fees tabulares)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JSON minificado (baseline justo)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"producto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Cuenta Ahorro Plus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"mantenimiento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"moneda"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"PEN"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"producto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Cuenta Sueldo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"mantenimiento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"moneda"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"PEN"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"producto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Cuenta Premium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"mantenimiento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"moneda"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"PEN"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TOON (representación tabular, declarando campos una vez)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]{&lt;/span&gt;&lt;span class="err"&gt;producto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;mantenimiento&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;moneda&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Cuenta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Ahorro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Plus,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;,PEN&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Cuenta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Sueldo,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;,PEN&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Cuenta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Premium,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="err"&gt;,PEN&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fíjate en lo importante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En TOON no se repiten keys en cada fila.&lt;/li&gt;
&lt;li&gt;La estructura queda muy parecida a una tabla.&lt;/li&gt;
&lt;li&gt;Para listas grandes (catálogos, comisiones, condiciones), esa reducción de repetición puede liberar contexto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2) El error que más veo: “TOON usa menos tokens” (sin separar dos mundos)
&lt;/h2&gt;

&lt;p&gt;Cuando se habla de TOON en RAG, casi siempre aparece la misma afirmación:&lt;br&gt;&lt;br&gt;
&lt;em&gt;“TOON es mejor porque usa menos tokens que JSON”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El problema no es que la frase sea falsa. El problema es que mezcla efectos distintos y lleva a conclusiones incorrectas. En un sistema RAG hay dos mundos separados, y si no los distingues, cualquier comparación queda contaminada.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.1 Indexación / embeddings: aquí no compites por tokens
&lt;/h3&gt;

&lt;p&gt;En la fase de indexación, el objetivo no es ahorrar tokens, sino capturar señal semántica. Lo que importa es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;qué información llega al embedding
&lt;/li&gt;
&lt;li&gt;cuánto ruido sintáctico introduces
&lt;/li&gt;
&lt;li&gt;cómo fragmentas (chunking)
&lt;/li&gt;
&lt;li&gt;qué tan estable es el vector resultante
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este punto, TOON, JSON minificado o incluso texto plano pueden generar embeddings muy similares si la información real es la misma. El formato no “gana” por ser más corto, sino por no distorsionar el significado.&lt;/p&gt;

&lt;p&gt;Si cambias formato, chunking y dataset al mismo tiempo, luego no sabes qué afectó al retrieval. Por eso, el formato aquí compite por semántica, no por tokens.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 Prompt / contexto: aquí sí compites por espacio, costo y latencia
&lt;/h3&gt;

&lt;p&gt;Este es el escenario donde TOON suele marcar diferencia.&lt;/p&gt;

&lt;p&gt;Aquí importan cosas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cuántos tokens ocupa la evidencia
&lt;/li&gt;
&lt;li&gt;cuánta evidencia adicional cabe en la ventana
&lt;/li&gt;
&lt;li&gt;costo por request
&lt;/li&gt;
&lt;li&gt;latencia y TTFT (time to first token)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En esta capa, reducir repetición sí importa, porque te permite meter más información útil sin cortar contexto. Y es aquí donde TOON suele brillar, especialmente cuando la evidencia es tabular y repetitiva.&lt;/p&gt;
&lt;h2&gt;
  
  
  3) El tipo de dato importa más que el formato
&lt;/h2&gt;

&lt;p&gt;Otro error frecuente es comparar TOON contra JSON “a secas”. Para ser justos, el baseline real debería ser JSON minificado, no el JSON bonito con sangrías que nadie usa en producción.&lt;/p&gt;

&lt;p&gt;Además, TOON no compite en un vacío. Dependiendo del tipo de dato, otros formatos pueden funcionar igual o mejor. Por eso, antes de elegir formato, hay que mirar qué tipo de información estás metiendo al RAG.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1 Datos tabulares y uniformes (donde TOON suele ganar)
&lt;/h3&gt;

&lt;p&gt;Ejemplos bancarios típicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tarifas y fees
&lt;/li&gt;
&lt;li&gt;catálogos de productos
&lt;/li&gt;
&lt;li&gt;listas de condiciones con el mismo esquema
&lt;/li&gt;
&lt;li&gt;tablas de comisiones por canal
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En estos casos, TOON suele funcionar muy bien porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evita repetir claves
&lt;/li&gt;
&lt;li&gt;hace explícito el esquema
&lt;/li&gt;
&lt;li&gt;reduce ruido sintáctico
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo simplificado con tarifas de cuenta:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON minificado&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"producto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Cuenta Ahorro Plus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"mantenimiento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"moneda"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"PEN"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"producto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Cuenta Sueldo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"mantenimiento"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"moneda"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"PEN"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TOON&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]{&lt;/span&gt;&lt;span class="err"&gt;producto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;mantenimiento&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;moneda&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Cuenta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Ahorro&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Plus,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;,PEN&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Cuenta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Sueldo,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;,PEN&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La información es la misma, pero el patrón es más evidente y la repetición se reduce.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Datos anidados o irregulares (donde TOON no siempre gana)
&lt;/h3&gt;

&lt;p&gt;Ejemplos típicos en dominios bancarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;políticas con excepciones&lt;/li&gt;
&lt;li&gt;reglas con múltiples condiciones&lt;/li&gt;
&lt;li&gt;configuraciones profundas por segmento o canal&lt;/li&gt;
&lt;li&gt;objetos donde no todos los ítems comparten los mismos campos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En este tipo de datos no existe un patrón tabular claro. Cada elemento puede tener una estructura distinta, y forzar una representación tipo tabla deja de aportar valor.&lt;/p&gt;

&lt;p&gt;En estos escenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la compresión de TOON se diluye
&lt;/li&gt;
&lt;li&gt;no hay un esquema uniforme que declarar una sola vez
&lt;/li&gt;
&lt;li&gt;JSON minificado puede empatar o incluso ser más eficiente
&lt;/li&gt;
&lt;li&gt;CSV deja de ser viable porque pierde jerarquía
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aquí es importante decirlo sin rodeos:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TOON no gana siempre.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Y eso no es una debilidad, es una señal de que el formato debe elegirse según el tipo de dato y no por moda o benchmark aislado.&lt;/p&gt;

&lt;h2&gt;
  
  
  4) TOON no es el formato del sistema, es el formato del prompt
&lt;/h2&gt;

&lt;p&gt;Una decisión arquitectónica clave en RAG es separar el formato del sistema del formato del prompt.&lt;/p&gt;

&lt;p&gt;El error común es intentar migrar todo el sistema a TOON. Eso genera fricción innecesaria, rompe tooling existente y dificulta auditoría e integración.&lt;/p&gt;

&lt;p&gt;Un enfoque mucho más sano es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistir y trabajar los datos en JSON o Markdown
&lt;/li&gt;
&lt;li&gt;Indexar con el formato que ya existe
&lt;/li&gt;
&lt;li&gt;Recuperar documentos sin alterar el pipeline
&lt;/li&gt;
&lt;li&gt;Convertir a TOON solo al ensamblar el prompt, cuando la evidencia lo amerite
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este enfoque tiene varias ventajas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no rompe contratos existentes
&lt;/li&gt;
&lt;li&gt;permite experimentar sin impacto sistémico
&lt;/li&gt;
&lt;li&gt;hace el cambio reversible (feature flag)
&lt;/li&gt;
&lt;li&gt;mantiene la comparación limpia
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TOON se convierte así en una &lt;strong&gt;optimización localizada&lt;/strong&gt;, no en una decisión irreversible.&lt;/p&gt;

&lt;h2&gt;
  
  
  5) Cómo preparar tus datasets para comparar formatos
&lt;/h2&gt;

&lt;p&gt;Usando documentos reales como los que ya venías trabajando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;políticas de cuentas
&lt;/li&gt;
&lt;li&gt;información de tarjetas de crédito
&lt;/li&gt;
&lt;li&gt;reglas de retiros y transferencias
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una estrategia práctica y replicable para cualquier lector es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mantener archivos &lt;code&gt;.md&lt;/code&gt; como fuente base y legible.
&lt;/li&gt;
&lt;li&gt;Generar una versión &lt;strong&gt;JSON minificada&lt;/strong&gt; con la misma información.
&lt;/li&gt;
&lt;li&gt;Generar una versión &lt;strong&gt;TOON&lt;/strong&gt;, tabulando solo las partes uniformes.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La clave es que el &lt;strong&gt;contenido sea el mismo&lt;/strong&gt;, solo cambia la representación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo: tarjeta de crédito (estructura realista)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JSON minificado&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"producto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"TC Classic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"beneficios"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;"compras nacionales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"pago sin contacto"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"cobros"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"concepto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"membresía anual"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"monto"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"moneda"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"PEN"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"reglas"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"si"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"pago mínimo fuera de fecha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"entonces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"se aplican intereses y mora"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TOON&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;card&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;producto&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;TC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Classic&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;beneficios&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;compras&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nacionales&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;pago&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;contacto&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;cobros&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]{&lt;/span&gt;&lt;span class="err"&gt;concepto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;monto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;moneda&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;membresía&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;anual,&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="err"&gt;,PEN&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;reglas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]{&lt;/span&gt;&lt;span class="err"&gt;si&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;entonces&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;pago&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mínimo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fuera&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fecha,se&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;aplican&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;intereses&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mora&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota importante: TOON no tiene por qué ser completamente tabular.&lt;br&gt;
Funciona mejor cuando usas tablas solo donde hay repetición y texto simple donde no la hay.&lt;/p&gt;
&lt;h2&gt;
  
  
  El “switch” correcto en un RAG real
&lt;/h2&gt;

&lt;p&gt;Para comparar formatos sin contaminar el sistema, el cambio debe estar aislado.&lt;/p&gt;

&lt;p&gt;El flujo ideal es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieval igual&lt;/li&gt;
&lt;li&gt;embeddings iguales&lt;/li&gt;
&lt;li&gt;mismo número de chunks&lt;/li&gt;
&lt;li&gt;solo cambia la representación en el prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conceptualmente, el punto de decisión se ve así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;TOON&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;toonFormatter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;JSON_MIN&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;jsonMinFormatter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;MD&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;markdownFormatter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto nos permite activar TOON solo cuando conviene, comparar formatos limpiamente, evitar efectos colaterales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se ve esto en un RAG real con LangChain4j
&lt;/h2&gt;

&lt;p&gt;Nada de slides bonitas. Algo que sí podría vivir en producción.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ContentRetriever&lt;/span&gt; &lt;span class="n"&gt;retriever&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// retrieval normal&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;vectorStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;assemblePrompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Format&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;Format&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TOON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ToonSerializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JsonSerializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compact&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retriever&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;retrieve&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;assemblePrompt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Format&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TOON&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chatModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Responde usando solo este contexto:\n"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s"&gt;"\nPregunta: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fíjate en algo importante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El &lt;em&gt;switch&lt;/em&gt; de formato está &lt;strong&gt;aislado&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No contamina retrieval&lt;/li&gt;
&lt;li&gt;No contamina embeddings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eso es diseño defensivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  6) Medir cambia la conversación
&lt;/h2&gt;

&lt;p&gt;Sin medición, todo es opinión. Para evaluar formatos en RAG de forma seria, es clave observar dos capas distintas del sistema y no mezclar conclusiones.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Métricas de retrieval (indexación)
&lt;/h3&gt;

&lt;p&gt;Estas métricas responden a la pregunta:&lt;br&gt;&lt;br&gt;
¿estoy trayendo la evidencia correcta?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recall@k&lt;/strong&gt;: ¿el fragmento relevante aparece dentro del top-k?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MRR (Mean Reciprocal Rank)&lt;/strong&gt;: ¿qué tan arriba aparece la primera evidencia correcta?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latencia de búsqueda&lt;/strong&gt;: tiempo de recuperación desde el vector store.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aquí el formato compite por señal semántica, no por tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Métricas de prompt y generación
&lt;/h3&gt;

&lt;p&gt;Estas métricas responden a otra pregunta distinta:&lt;br&gt;&lt;br&gt;
¿cómo de eficiente es empacar y usar esa evidencia?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tamaño del contexto (tokens o proxies como caracteres/bytes)&lt;/li&gt;
&lt;li&gt;TTFT (Time To First Token)&lt;/li&gt;
&lt;li&gt;tiempo total de generación&lt;/li&gt;
&lt;li&gt;tokens de entrada y salida&lt;/li&gt;
&lt;li&gt;fidelidad de la respuesta (¿usa la evidencia o inventa?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es en esta capa donde TOON suele mostrar ventajas, al reducir repetición y liberar espacio para más contexto útil.&lt;/p&gt;

&lt;p&gt;Separar estas métricas evita conclusiones falsas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“TOON no sirve”&lt;/li&gt;
&lt;li&gt;“TOON es mágico”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A veces TOON reduce tokens pero no latencia.&lt;br&gt;
A veces permite meter más evidencia y mejora la respuesta.&lt;br&gt;
A veces no cambia nada.&lt;/p&gt;

&lt;h2&gt;
  
  
  La Conclusión de este 25
&lt;/h2&gt;

&lt;p&gt;TOON no viene a destronar a JSON. Viene a ocupar un lugar específico: optimizar cómo empacas evidencia cuando el dato es repetitivo y la ventana de contexto aprieta.&lt;/p&gt;

&lt;p&gt;En RAG, la madurez técnica no está en elegir un formato, sino en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;separar indexación de prompt
&lt;/li&gt;
&lt;li&gt;adaptar el formato al tipo de dato
&lt;/li&gt;
&lt;li&gt;instrumentar y medir
&lt;/li&gt;
&lt;li&gt;decidir con evidencia
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un buen sistema no se casa con un formato.&lt;br&gt;&lt;br&gt;
Un buen sistema entiende por qué usa cada uno.&lt;/p&gt;

</description>
      <category>java</category>
      <category>rag</category>
      <category>llm</category>
      <category>performance</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Aylen Tejas</dc:creator>
      <pubDate>Mon, 03 Nov 2025 03:29:25 +0000</pubDate>
      <link>https://dev.to/nakiviar/-4ndm</link>
      <guid>https://dev.to/nakiviar/-4ndm</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/nakiviar" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3592439%2Fd307ff5b-467d-41bc-9f2d-9afcbe72ac59.jpeg" alt="nakiviar"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/nakiviar/hacktoberfest-2025-my-first-time-as-a-contributor-5hlo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Hacktoberfest 2025 — My First Time as a Contributor 😼&lt;/h2&gt;
      &lt;h3&gt;Aylen Tejas ・ Nov 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#hacktoberfest&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hacktoberfest 2025 — My First Time as a Contributor 😼</title>
      <dc:creator>Aylen Tejas</dc:creator>
      <pubDate>Mon, 03 Nov 2025 02:15:08 +0000</pubDate>
      <link>https://dev.to/nakiviar/hacktoberfest-2025-my-first-time-as-a-contributor-5hlo</link>
      <guid>https://dev.to/nakiviar/hacktoberfest-2025-my-first-time-as-a-contributor-5hlo</guid>
      <description>&lt;h1&gt;
  
  
  ✨ Hacktoberfest 2025 — My First Time as a Contributor ✨
&lt;/h1&gt;

&lt;p&gt;Ahoi!!&lt;br&gt;&lt;br&gt;
Well, where to start? It was my first time joining Hacktoberfest, and honestly, I joined a bit late — but I was determined to earn that Super Contributor badge.&lt;br&gt;
So I woke up early, made myself some quinua (I’m from Peru 🇵🇪, we’re very proud of our food!) with my classic pan con tortilla 🥖🍳 — and got to work.&lt;br&gt;
(Of course, I had to include a bit of Peruvian flavor in this post! 😄)&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k3slee3r6y4g4bnvio9.jpg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k3slee3r6y4g4bnvio9.jpg" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I contributed to projects as curious as one with &lt;strong&gt;a button that literally did nothing but gave you motivational quotes&lt;/strong&gt; (&lt;em&gt;the-button-that-does-nothing&lt;/em&gt;), all the way to a “Word-like” collaborative editor built with React (&lt;em&gt;CollabSpace&lt;/em&gt;).&lt;br&gt;&lt;br&gt;
Here are a few examples of what I worked on with lots of joy n.n  &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeua0vj4p2czptoe0vhu.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeua0vj4p2czptoe0vhu.png" alt=" " width="800" height="557"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyjnxkstc12rwy7f66yz.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyjnxkstc12rwy7f66yz.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x9lop9rv1o20sy72lzc.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1x9lop9rv1o20sy72lzc.png" alt=" " width="675" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first, I noticed that most of the issues labeled &lt;em&gt;hacktoberfest&lt;/em&gt; were already taken.&lt;br&gt;&lt;br&gt;
Then I saw something interesting — some people created their own issues and assigned them to themselves.&lt;br&gt;&lt;br&gt;
That was the key: &lt;strong&gt;proactivity.&lt;/strong&gt;  &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69gedwu0q4ypn3vh9gbp.png" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69gedwu0q4ypn3vh9gbp.png" alt=" " width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I started checking out projects, seeing what they were missing, and that’s how my own issues came to life.&lt;br&gt;&lt;br&gt;
As the cliché says: &lt;strong&gt;if the opportunity doesn’t exist, invent it.&lt;/strong&gt;  &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fivr9j9dagoml7qcl3hxd.jpeg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fivr9j9dagoml7qcl3hxd.jpeg" alt=" " width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And just when everything seemed to be going smoothly… one of my PRs had conflicts.&lt;br&gt;&lt;br&gt;
The nightmare became real.&lt;br&gt;&lt;br&gt;
Fixing merge conflicts in Git is, for me, a small torment.&lt;br&gt;&lt;br&gt;
I made myself some tea (my calm version of the stereotypical programmer’s coffee), took a deep breath, and got back to it.  &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67kqhuzost3kyapkov2i.jpg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67kqhuzost3kyapkov2i.jpg" alt=" " width="800" height="1222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have a white cat. I thought about dressing her up for the occasion —I even considered painting her black (for the drama, obviously)— but in the end, I let her be.&lt;br&gt;&lt;br&gt;
Free, like the open source spirit 😸  &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwo39ag36wz6vtxmznt9.jpg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwo39ag36wz6vtxmznt9.jpg" alt=" " width="794" height="1370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond the beautiful &lt;strong&gt;super contributor badge&lt;/strong&gt;, what truly made me happy was seeing my changes come to life in real projects, each with its own essence and community.&lt;br&gt;&lt;br&gt;
Being able to contribute to something I love is worth more than any prize.  &lt;/p&gt;

&lt;p&gt;Thanks to all the maintainers for the opportunity.&lt;br&gt;&lt;br&gt;
This experience left me full of ideas for future projects I’d love to support.&lt;br&gt;&lt;br&gt;
Definitely, being a contributor is my thing —even if PR conflicts will always be my nightmare.  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; I’m usually a &lt;em&gt;backend&lt;/em&gt; developer, so it had been ages since I touched anything &lt;em&gt;frontend&lt;/em&gt; or &lt;em&gt;UX/UI&lt;/em&gt;-related.&lt;br&gt;&lt;br&gt;
My respect to my not-so-distant cousins: the &lt;em&gt;frontend devs&lt;/em&gt; and the &lt;em&gt;full-stack unicorns&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
CSS styling was a real headache 😅 — &lt;code&gt;!important&lt;/code&gt; became my best friend, haha.&lt;br&gt;&lt;br&gt;
But seriously, this event opened my eyes to the vast &lt;em&gt;open source&lt;/em&gt; universe that’s out there.  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Happy Hacktoberfest 2025, and thanks for reading! 💻🍂&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Now time to enjoy some Halloween movies 🎃🍿  &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
