Touch Grass: un design system brutalista open source

Categoría:
Diseño de producto
Rol:
Autor del proyecto (diseño e implementación)
Período:
2026

En Touch Grass, partí de una dirección visual para construir componentes y tokens que pudiera implementar y verificar. El sistema conecta CSS, Tailwind, Figma y JavaScript/TypeScript, con pruebas y documentación pública.

Fuente: el repositorio, los paquetes publicados en npm y la auditoría automática del 14/04/2026. Repositorio (github.com) Abre en otra pestañaPaquete React (npmjs.com) Abre en otra pestañaPaquete de tokens (npmjs.com) Abre en otra pestaña

Documentación de Touch Grass: el patrón FocusTimerDisplay, la pantalla principal de Timeouts, con el tiempo desconectado del día, la comparación con ayer, la racha de días, la posición en el ranking y el botón para empezar el foco

Desafío

Construir un design system con identidad visual propia, tokens compartidos entre CSS, Tailwind, Figma y JS/TS, pruebas y documentación pública. La dirección visual adoptó esquinas rectas, tipografía en dos familias (Geist Sans y Geist Mono) y restricciones explícitas para guiar la implementación.

Solución

Decisiones de diseño: esquinas rectas en todos los componentes, dos familias tipográficas, Geist Sans para texto y Geist Mono para números, etiquetas y datos, y carga con bloque de caracteres en lugar de spinner. Los tokens salen de una única fuente en JSON, y Style Dictionary genera variables CSS, tema de Tailwind, JSON para Figma y constantes JS/TS. La gobernanza vive en el código, con un test de contrato de contraste y un plugin de ESLint propio. En la ejecución usé Claude Code con un spec corto, un plan por etapas, tests antes del componente y revisión por un agente separado. Las decisiones de arriba quedaron conmigo.

Resultados

10 componentes básicos y 9 patrones compuestos, 23 archivos de test y dos flujos de CI. En la auditoría automática del 14/04/2026 con axe-core, las 27 páginas de documentación tuvieron 0 violaciones y 687 verificaciones aprobadas; el resultado vale para esa ejecución, hecha en un entorno local. Los paquetes @touch-grass-ds/react y @touch-grass-ds/tokens están publicados en npm con licencia MIT. Límite: es un proyecto personal, sin equipos que lo consuman ni métricas de adopción.

Galería

Recortes de la documentación pública, capturados en octubre de 2026.

Color: negro, blanco, verde lima y rojo, con el contraste medido de cada combinación, incluidas las que no aprueban
Tipografía: Geist Sans para títulos y texto corrido, Geist Mono para números, etiquetas y datos, y la escala de pesos
Bordes: fino para la estructura, blanco para límites importantes, verde lima para el estado activo, rojo para peligro y discontinuo para el deshabilitado
Movimiento: duración cero, sin transiciones ni animaciones, y una excepción documentada para el flash de la cámara
PatternInterruptModal: las reglas de texto del aviso, como nombrar la pérdida, hablarle directo a la persona, escribir la acción principal como una frase y nunca llamar "Cancelar" a la salida

Aprendizajes clave

Lo que estaba escrito en la especificación, el agente lo siguió, como la carga con bloque de caracteres. Lo que no escribí apareció en la revisión. El agente revisor notó que el Button no definía type="button" por defecto, y un clic dentro de un formulario lo enviaba.

¿Necesitas convertir un problema de producto en una experiencia que se pueda implementar?

Puedo ayudarte a conectar estrategia, interfaz e ingeniería en una entrega que sigue siendo clara después del handoff.