Pretext: medir y distribuir texto multilínea sin tocar el DOM
chenglou/pretext · 50.570★ · 2.739 forks
Todo lo que hay que saber sobre chenglou/pretext: una biblioteca de JavaScript/TypeScript que calcula la altura, el salto de líneas y los rangos de un párrafo usando el motor tipográfico del navegador como referencia, pero sin insertar ni medir nodos del DOM en el camino crítico.
Desambiguación: este informe documenta
chenglou/pretext(librería de medición de texto, paquete npm@chenglou/pretext, creada en marzo de 2026). No debe confundirse conPreTeXtBook/pretext(459 estrellas), un sistema de autoría y publicación de documentos académicos, ni conpretext-project/pretext-project.github.io, una colección de pretextos de ingeniería social.
Qué es Pretext
Pretext es una biblioteca de JavaScript/TypeScript para medir y distribuir párrafos multilínea. Resuelve una operación que parece pequeña pero condiciona muchas interfaces: saber cuántas líneas ocupará un texto y qué altura tendrá a un ancho dado, sin tener que renderizarlo en el DOM y consultar getBoundingClientRect() u offsetHeight, lecturas que obligan a una re-derivación de layout (reflow), una de las operaciones más costosas del navegador.
El proyecto separa dos operaciones. prepare() hace el trabajo que depende del texto y de la fuente —normalizar espacios, segmentar con Intl.Segmenter, aplicar reglas de «pegamento» (NBSP, ZWSP, guiones suaves, saltos duros) y medir los segmentos con Canvas— y devuelve un manejador opaco reutilizable. layout() recibe ese resultado, un ancho máximo y un alto de línea, y calcula height y lineCount mediante aritmética sobre anchos cacheados. En un redimensionamiento o una virtualización se vuelve a ejecutar solo la segunda parte, no todo el análisis.
Pretext no intenta reemplazar el motor de maquetación CSS ni convertirse en un motor completo de renderizado de fuentes. Es una herramienta especializada para cuando se necesita predecir o controlar un flujo de texto desde JavaScript: virtualización, Canvas, SVG, WebGL, diseño editorial dinámico, animación, validación de etiquetas durante el desarrollo y (próximamente, según el README) renderizado del lado del servidor.
El origen
El repositorio fue creado el 7 de marzo de 2026 por Cheng Lou (chenglou), quien según el blog de Simon Willison era anteriormente desarrollador del núcleo de React y el creador original de la librería de animación react-motion (21.914 estrellas). El paquete @chenglou/pretext se publicó por primera vez en npm el 27 de marzo de 2026 (versión 0.0.0); el repositorio GitHub data de unos veinte días antes, lo que sugiere un desarrollo privado previo al lanzamiento público.
El README reconoce explícitamente como antecedente el proyecto text-layout de Sebastian Markbåge (se conserva un fork, chenglou/text-layout, con 34 estrellas) y su arquitectura: measureText de Canvas para el shaping, datos bidi basados en pdf.js y saltos de línea en streaming. El README describe además un método de desarrollo particular: el motor se iteró «muy favorable para la IA» mostrando a agentes de código como Claude Code y Codex la verdad del navegador (ground truth) y haciéndoles medir e iterar contra ella en cada ancho de contenedor relevante, a lo largo de semanas.
La verificación es un rasgo distintivo del origen: las pruebas renderizaron una copia completa de El Gran Gatsby en varios navegadores para confirmar que las mediciones estimadas eran correctas, y después se unió la carpeta corpora/ con el mismo método sobre documentos de dominio público largos en tailandés, chino, coreano, japonés, árabe y otros.

Filosofía y principios
Su principio central es separar lo costoso de lo repetible: analizar y medir una sola vez, y recalcular las líneas a muchos anchos con datos cacheados. El README advierte textualmente: «No vuelvas a ejecutar prepare() para el mismo texto y configuración; eso destruiría su precomputación». Ese es el contrato de rendimiento: prepare() es caro pero único; layout() es el camino caliente, sub-milisegundo, sin lecturas de DOM, sin llamadas a Canvas y sin trabajo de cadenas.

Otro principio, visible en el código y la documentación interna, es usar el motor de fuentes del navegador como referencia en lugar de reinventar todo CSS. Pretext no modela por separado las propiedades CSS que quedan fuera del atajo canvas.font (como font-optical-sizing o font-feature-settings), y limita su objetivo a la configuración de texto común: white-space: normal y pre-wrap, word-break: normal y keep-all, overflow-wrap: break-word, line-break: auto y letter-spacing como valor numérico en píxeles. Esa estrechez deliberada explica tanto su precisión relativa como sus límites.
El enfoque de corrección de rarezas por plataforma —un «libro de contabilidad» de bugs (PLATFORM_BUGS.md) con enlaces a Chromium, Mozilla y WebKit, repros y correcciones detectadas por capacidades— refleja una filosofía de honestidad: en vez de prometer exactitud universal, documenta dónde diverge de cada navegador y cómo lo mitiga.

Cómo funciona
El navegador calcula el tamaño final de un elemento dentro de un árbol de estilos, fuentes, contenedores y reglas de flujo. Consultar geometría después de cambios del DOM puede obligarlo a sincronizar ese trabajo. Para unas pocas etiquetas estáticas es irrelevante; en listas grandes, mensajes que llegan en streaming, animaciones o muchas correcciones de altura, alternar escritura y lectura produce layout thrashing y saltos visibles.
Pretext esquiva el árbol de layout para la estimación. Usa CanvasRenderingContext2D.measureText(), que devuelve métricas del texto según la fuente activa, como referencia de medida; después compone las líneas en código de usuario. La ventaja no es que Canvas sea mágicamente más rápido que todo CSS, sino que el camino caliente de layout() no necesita insertar un elemento temporal ni pedir geometría al DOM.

El núcleo sigue esta secuencia:
- Preparación.
prepare(text, font, options)recibe el texto y un valor de fuente con el formato que acepta Canvas (por ejemplo,16px Inter). Segmenta el contenido, mide los tramos una sola vez y devuelve un manejador opaco. Opciones:{ whiteSpace: 'pre-wrap' }para conservar espacios, tabulaciones y saltos duros;{ wordBreak: 'keep-all' }paraword-break: keep-all(CJK/hangul);{ letterSpacing: n }en píxeles CSS. - Distribución.
layout(prepared, maxWidth, lineHeight)resuelve cuántas líneas caben y devuelve{ height, lineCount }. Es el paso diseñado para repetirse cuando cambia el ancho.

- Control manual, si hace falta.
prepareWithSegments()ylayoutWithLines()devuelven las líneas;walkLineRanges(),measureLineStats(),layoutNextLineRange()ymaterializeLineRange()permiten recorrerlas fila a fila sin materializar todo el texto. Con ello se puede dibujar en Canvas, SVG o alrededor de un obstáculo cuya anchura cambia por fila (el README incluye un ejemplo que hace fluir el texto alrededor de una imagen flotante).

El diseño se apoya en las APIs del navegador, no en tablas tipográficas propias: Canvas aporta el ancho de los segmentos y Intl.Segmenter ayuda a dividir palabras y grafemas para idiomas, emojis y escrituras sin espacios. Esto importa porque cortar una cadena por índices UTF-16 no equivale a cortar caracteres visibles.
Estado oficial y semioficial
La superficie oficial es el README (fuente pública de verdad para ejemplos y límites), la documentación de desarrollo (DEVELOPMENT.md), el registro de bugs de plataforma (PLATFORM_BUGS.md), el CHANGELOG.md, los demos en chenglou.me/pretext y el paquete npm @chenglou/pretext. No forma parte de ningún marketplace ni de un estándar formal; no hay una organización que lo «respalde» en sentido de certificación.
Su semioficialidad, en la práctica, consiste en la adopción de TanStack Virtual: el sitio oficial de TanStack dedica una página de documentación («Text Measurement with Pretext») a su uso como estimador de altura para filas dominadas por texto en chats, streams, feeds, comentarios, changelogs y notificaciones, dejando que TanStack conserve el control del scroll, el rango visible y la posición. Ninguna de estas señales constituye un endorsement de un vendor sobre la metodología o sus resultados; son integraciones y referencias técnicas, no una designación de estándar.

El ecosistema
Pretext se convirtió rápidamente en una plataforma de referencia para una oleada de puertos, adaptadores y experimentos.
Repositorios del autor: chenglou/pretext (la biblioteca principal), chenglou/text-layout (34 estrellas, el proyecto anterior de Markbåge, conservado como antecedente), chenglou/react-motion (21.914 estrellas, la librería de animación de la que Lou fue creador original) y chenglou/freerange (594 estrellas, verificaciones estáticas @fit para código de layout en TypeScript).
Puertos a otros lenguajes y plataformas: tornikegomareli/swift-pretextkit (183 estrellas, puerto a Swift para plataformas Apple, lanzado tres días después del original), wieslawsoltes/PretextSharp (27 estrellas, preparación de texto y layout de líneas para SkiaSharp), craigm26/pretext_dart (8 estrellas) y nathankim0/pretext_flutter (7 estrellas, puertos a Dart/Flutter), waleed-qamar/flutter_pretext (35 estrellas, otro puerto a Flutter), hyj1230/pretext-py (4 estrellas, reescritura en Python), mjshin82/UnityPretext (46 estrellas, adaptador para Unity) y fifteen42/pretext-video (90 estrellas, convierte la webcam en tipografía viva combinando Pretext con MediaPipe).

Adaptadores para frameworks y tooling: JubaKitiashvili/expo-pretext (259 estrellas, predice alturas de texto de React Native antes del renderizado), Agent-Pattern-Labs/textura (154 estrellas, «Pretext x Yoga = Textura», un motor de layout sin DOM), BaselAshraf81/layout-sans (67 estrellas, motor de layout flex/grid 2D impulsado por Pretext), LucasBassetti/react-pretext (2 estrellas, adaptador headless de React), BALOTIAS/vite-pretext (4 estrellas, plugin de Vite sin configuración para eliminar CLS), nikilok/virtual-text-layout (4 estrellas, gancho de React que reemplaza measureElement de TanStack Virtual) y lucascrespo23/pinch-type (112 estrellas, «pellizca para hacer zoom al texto, no a la página»).
Listas curadas y proyectos vecinos: bluedusk/awesome-pretext (35 estrellas, lista curada de demos y tutoriales), AsharibAli/pretext-skills (12 estrellas) y yaniv-golan/pretext-skill (15 estrellas), «skills» para agentes de IA. Como comparación directa, leeoniya publicó uWrap.js (mencionado en HN 43583478), una biblioteca de ~2 kb para estimar el alto de fila de ASCII, que él mismo opone a Pretext en el hilo principal.
El patrón general del ecosistema: un núcleo muy pequeño que muchos extienden a lenguajes (Swift, C#, Dart, Python), a frameworks (React, React Native, Flutter, Vue, Vite, Unity) y a casos de nicho (PDF, video, 3D), más una capa de «skills» para agentes de IA.
Números del repo
Medición: 22 de agosto de 2026, API de GitHub y registro npm.
| Métrica | Valor |
|---|---|
| Estrellas | 49.966 |
| Bifurcaciones | 2.729 |
| Suscriptores reales | 147 |
Commits (rama main) | 410 |
| Incidencias + PR abiertos | 90 |
| Lenguaje principal | TypeScript |
| Licencia | MIT |
| Creación | 7 de marzo de 2026 |
| Última versión npm | 0.0.8 (12 de junio de 2026) |
| Descargas npm (semana 14–20 ago. 2026) | 905.501 |
| Descargas npm (mes 22 jul.–20 ago. 2026) | 4.127.107 |
watchers_count replica las estrellas, por lo que se informa subscribers_count como suscriptores reales. open_issues_count incluye solicitudes de cambios abiertas. La API de releases devolvió una lista vacía: Pretext no publica releases formales en GitHub, pero sí tags git (v0.0.4…v0.0.8) y versiones en npm con un CHANGELOG.md por versión; la versión de referencia es la de npm (0.0.8).
Los principales contribuidores por número de contribuciones son chenglou (403), bg-l2norm (2) y, con una contribución cada uno, brandonmcconnell, cxa, threepointone, bytaesu y somnai-dreams. La concentración de 403 de 410 contribuciones en un solo autor confirma que es un proyecto de un solo responsable principal.
Guía rápida de uso
Instalación y primer arranque
npm install @chenglou/pretext
Requisitos: un entorno de navegador (o runtime) con Intl.Segmenter y Canvas 2D disponibles. En Node puro sin esas APIs no está soportado actualmente; la representación del lado del servidor figura como trabajo futuro. Es ESM-only; no hay soporte directo de require() de CommonJS.
Primer arranque en el navegador:
import { prepare, layout } from '@chenglou/pretext'
const prepared = prepare('AGI 春天到了. بدأت الرحلة 🚀', '16px Inter')
const { height, lineCount } = layout(prepared, 320, 20)
// height y lineCount: aritmética pura, sin layout ni reflow del DOM
Flujos de trabajo habituales
- Predecir la altura de un párrafo antes de renderizar.
prepare(texto, '16px Inter')una vez;layout(prepared, ancho, 20)tantas veces como cambie el ancho. El resultado da{ height, lineCount }para anclar el scroll, dimensionar una fila virtualizada o validar que un rótulo cabe en un botón. - Fluir texto alrededor de una imagen (layout editorial). Con
prepareWithSegments+ un cursorLayoutCursor, llamarlayoutNextLineRange()por fila con un ancho que se reduce mientras la fila está junto a la imagen, ymaterializeLineRange()para obtener el texto de esa fila. - Shrinkwrap multilinea (ancho mínimo que contiene el texto).
measureLineStats(prepared, ancho)devuelve{ lineCount, maxLineWidth };walkLineRanges()recorre las líneas sin construir cadenas, útil para hacer un binary search de un ancho «bonito». - Virtualización de chat con TanStack Virtual. Cachear
prepare()por texto y estilo, ejecutarlayout()para el ancho actual y, cuando cambian ancho/fuente/line-height, restablecer las mediciones de Virtual para recalcular offsets.
Configuración esencial
Los 4–5 «ajustes» que un usuario nuevo topará primero son las opciones de prepare() y los parámetros de layout(): font (cadena de fuente de Canvas, p. ej. 16px Inter, que debe coincidir con el CSS efectivo del texto medido — usar una fuente nombrada, no system-ui), lineHeight (parámetro de layout(), debe coincidir con line-height del CSS), { whiteSpace: 'pre-wrap' } (para texto tipo textarea), { wordBreak: 'keep-all' } (para CJK/hangul) y { letterSpacing: n } (valor en píxeles CSS).
Además, dos helpers globales: setLocale(locale?) para fijar el locale del segmentador de palabras (y limpia cachés) y clearCache() para liberar la caché compartida de métricas cuando la app cicla por muchas fuentes.
Trampas frecuentes y soluciones
system-uies insegura en macOS. Canvas y DOM pueden resolver fuentes distintas. Solución: usar una fuente nombrada.PLATFORM_BUGS.mdenlaza los bugs Chromium #489579956 y Mozilla #2020917.- Emojis Apple Color Emoji miden más en Canvas que en DOM a tamaños pequeños (macOS, Chrome y Firefox). La corrección se detecta por capacidad una vez por fuente y se resta por grafema de emoji; desactivarla reduce el barrido de precisión de 7680/7680 a ~7652–7660/7680.
- Espera a que la fuente se cargue antes de preparar. Si la fuente no está disponible, las mediciones de Canvas difieren de las que el navegador aplicará después.
layout()con cadena vacía devuelve{ lineCount: 0, height: 0 }. Si se necesita otro comportamiento, clampar conMath.max(1, lineCount) * lineHeight.- No volver a llamar
prepare()sin cambios. Destruye la principal ventaja de la precomputación; en un resize solo se re-ejecutalayout(). - Safari necesita una tolerancia de ajuste de línea de 1/64 px (Chromium/Gecko usan 0.005 px). Y Safari 26.4 aún falla
word-break-keep-all-006de WPT; la correcciónbreakKeepAllAfterPunctuationse mantiene hasta que WebKit lo repare aguas arriba. - Headless con
devicePixelRatio = 1enmascara los bugs de emoji ysystem-uide macOS. Re-testear en un navegador con cabeza en una pantalla Retina. - Hifenación automática no está construida. Insertar guiones suaves (soft hyphens) antes de
prepare(). - CSS fuera del atajo
canvas.font(font-optical-sizing,font-feature-settings,font-variation-settings) no se modela por separado.
Integraciones y migración
- TanStack Virtual: integración documentada oficialmente como estimador de altura para filas dominadas por texto. TanStack sigue poseyendo scroll, rango y posicionamiento; Pretext solo da la estimación.
- Migración desde mediciones de DOM: el patrón de migración es reemplazar
getBoundingClientRect()/offsetHeightporprepare()+layout()en el camino caliente, conservando el texto real en el DOM para accesibilidad. - Migración desde uWrap.js (leeoniya): uWrap es ~2 kb, solo ASCII/Latin, solo
white-space: pre-line, sin guiones suaves ni emoji; Pretext cubrenormalypre-wrap, guiones suaves, emojis y multilínea completo. Es un cambio de alcance, no de API. - Integración con MCP/CI/editores: un uso de tiempo de desarrollo (verificar que un rótulo cabe sin navegador) y casos de CI (geometría como test unitario), SSR (alturas precalculadas al hidratar) y 3D/WebGL (posiciones de línea como coordenadas). No hay un servidor MCP oficial de Pretext documentado.
Cómo contribuir
El proceso de desarrollo está documentado en DEVELOPMENT.md y en AGENTS.md: instalación única con bun install (el proyecto usa Bun, no npm, para el desarrollo); desarrollo diario con bun start (sirve el sitio de demos local en http://localhost:3000); verificación con bun run check (typecheck con tsc, lint con oxlint, escaneo de código muerto con knip) y bun test; precisión y benchmark específicos de Pretext (bun run accuracy-check, accuracy-snapshot, benchmark-check, corpus-check/corpus-sweep); empaquetado con bun run build:package.
Reglas documentadas: mantener el README como fuente pública de verdad; no parchear monos (resolver la causa raíz, no el síntoma); el changelog solo lleva notas orientadas al usuario; los diff que cambian el motor caliente deben regenerar los snapshots de precisión y benchmark.
Cómo lo recibió la comunidad
La evidencia recuperada muestra entusiasmo fuerte, pero también críticas concretas sobre rendimiento y sobre a qué le presta la gente atención.
El hilo principal de Hacker News (397 puntos, 69 comentarios, enviado el 28 de marzo de 2026) reunió opiniones destacadas. simonw: «Está cosa es muy impresionante. El problema que resuelve es calcular eficientemente la altura de un texto envuelto en una página web, sin renderizar ese texto primero (muy caro). Lo hace precalculando el ancho/alto de segmentos individuales —piensa en palabras— y cacheando…». rattray: «Sin importar el tema, los tweets anunciando esto son una magistral demostración de por qué una mejora arquitectónica/plataforma puede ser de alto impacto».
leeoniya (autor de uWrap.js) generó el intercambio más técnico: «Escribí algo similar para este fin, pero mucho más simple y de 2 kb, sin IA, hace un año: uWrap.js… Para texto ASCII, el mío termina en 80 ms, mientras Pretext tarda 2200 ms». simonw respondió que uWrap solo maneja Latin y no guiones suaves/emoji, y solo pre-line. liuliu (colaborador del proyecto) replicó que prepare usa measureText en un bucle y que «esta librería está pensada para hacer prepare una vez y layout muchas veces. Las llamadas a layout deberían ser sub-1 ms». leeoniya probó concatenar 100k frases con saltos de línea: «no fue mucho más rápido, ~1880 ms».
lewisjoe: «Resumen rápido de pretext: si quieres dar layout a texto en la web, tienes que usar la API canvas.measureText e implementar saltos/segmentación/RTL tú mismo. Pretext lo hace más fácil». rikroots: «Los motores de layout de texto son absurdamente difíciles. Empiezas pensando ‘es una tarea difícil, pero puedo’ y tres meses después te encuentras en una esquina gritando ‘¿por qué, chino?’». tadfisher (de Mozilla): «Mejoraría que exponer el medidor de layout de texto del navegador se convierta en una API web en el futuro».
En un hilo secundario (16 puntos), sublinear objetó: «Aunque esto es muy genial, me resulta difícil verlo en una página web de producción. Si hay una dependencia de JS para el estilo, el dev aún tiene que escribir un CSS de respaldo». En otro hilo (14 puntos, 5 comentarios), lewisjoe corrigió un artículo sobre Pretext: «Pretext no libera el layout de texto del navegador por completo (al menos aún no). Aún usa canvas.measureText que hace el trabajo pesado crítico»; el autor del artículo, cyrusradfar, aceptó y actualizó el post.
El blog de Simon Willison (29 de marzo de 2026) lo presenta como «una nueva biblioteca de navegador emocionante», y destaca el método de verificación con El Gran Gatsby y los corpora multilingües. El blog de Den Odell (30 de marzo de 2026, Dev.to) argumenta que «la comunidad ha pasado tres días construyendo dragones [demos de canvas]. Debería estar construyendo interfaces de chat» — la característica real, según él, es predecir la altura sin leer del DOM.
Resumen honesto: el entusiasmo es amplio y de alto nivel (397 puntos en el hilo principal). La crítica real es de leeoniya (rendimiento de prepare en un bucle) y de sublinear (dificultad de adopción en producción por la dependencia de JS para estilos). El propio cyrusradfar matiza que la limitación de SSR aún depende de Canvas.
Pretext frente a otras propuestas
| Propuesta | Coincidencia verificable | Diferencia verificable |
|---|---|---|
leeoniya / uWrap.js | Estima altura de fila para virtualización usando measureText de Canvas. | uWrap es ~2 kb, solo Latin/ASCII, solo white-space: pre-line, sin guiones suaves ni emoji; Pretext cubre normal y pre-wrap, guiones suaves, emoji y multilínea completo. |
| Skia-wasm (mencionado en HN) | Renderiza texto sin depender del DOM del navegador. | Skia es un motor de renderizado completo que «trae el mundo»; Pretext solo mide y distribuye, delegando el render final al navegador. |
Mediciones de DOM (getBoundingClientRect, offsetHeight) | Devuelven la geometría real, definitiva. | Obligan a reflow sincronizado; en listas grandes producen layout thrashing. Pretext evita esa lectura en el camino caliente. |
CSS text-wrap: balance/pretty (mencionado en HN) | Ajusta el número de palabras por línea. | No elimina el espacio vacío en el borde derecho ni da la altura antes del render; es un complemento, no un sustituto. |
La comparación más útil no es por popularidad: Pretext destaca cuando la medición repetida está en el camino crítico o cuando la app necesita poseer explícitamente los saltos de línea. Para una web corriente con contenido estable, CSS, ResizeObserver y estructura semántica siguen siendo más simples y adecuados.
Casos de uso y a quién puede ayudar este repositorio
- Equipos que virtualizan listas densas en texto (chats, feeds, comentarios, notificaciones, cronologías) pueden usar
prepare()+layout()con TanStack Virtual para predecir el alto de cada fila y anclar el scroll sin correcciones visibles. - Constructores de editores de texto enriquecido o de chat de IA en streaming pueden recalcular alturas a medida que llegan tokens sin que una burbuja cambiante corrija continuamente el desplazamiento.
- Desarrolladores de Canvas, SVG, WebGL o motores 3D pueden obtener líneas y rangos para dibujar texto en un renderizador que no usa el DOM, o calcular posiciones de línea como coordenadas y el tamaño de textura antes de asignar memoria GPU.
- Equipos de SSR/hidratación pueden precalcular alturas durante el renderizado del servidor para hidratar el cliente con dimensiones correctas desde el primer frame y evitar CLS.
- Quien hace validación de interfaz en desarrollo puede verificar que un rótulo cabe en un botón o que un texto de 50 caracteres cabe en una tarjeta sin abrir el navegador.
- Equipos multiplataforma pueden partir del núcleo y usar puertos verificados: Swift, React Native, Flutter, C#/SkiaSharp o Python.
- Para una web convencional con contenido estable, CSS +
ResizeObserver+ estructura semántica siguen siendo más simples y adecuados.
Recursos
- Repositorio: https://github.com/chenglou/pretext
- Documentación / demos: https://chenglou.me/pretext/
- Paquete npm: https://www.npmjs.com/package/@chenglou/pretext (ESM-only, 0.0.8)
- Guía de desarrollo: https://github.com/chenglou/pretext/blob/main/DEVELOPMENT.md
- Registro de bugs de plataforma: https://github.com/chenglou/pretext/blob/main/PLATFORM_BUGS.md
- TanStack Virtual (integración oficial): https://tanstack.com/virtual/latest/docs/pretext
- Lista curada: https://github.com/bluedusk/awesome-pretext
Nota: este artículo combina el README, DEVELOPMENT.md, PLATFORM_BUGS.md, el CHANGELOG.md, el registro npm @chenglou/pretext, la API de GitHub y artículos de Simon Willison, Den Odell y Cyrus Radfar, todos consultados el 22 de agosto de 2026. Las cifras de estrellas, descargas y contribuciones cambian con el tiempo.
Comentarios