Touch Grass: un design system brutalista open source

Categoria:
Design di prodotto
Ruolo:
Autore del progetto (design e implementazione)
Periodo:
2026

Per Touch Grass, sono partito da una direzione visiva per costruire componenti e token che potessi implementare e verificare. Il sistema collega CSS, Tailwind, Figma e JavaScript/TypeScript, con test e documentazione pubblica.

Fonte: il repository, i pacchetti pubblicati su npm e la verifica automatizzata del 14/04/2026. Repository (github.com) Si apre in una nuova schedaPacchetto React (npmjs.com) Si apre in una nuova schedaPacchetto di token (npmjs.com) Si apre in una nuova scheda

Documentazione di Touch Grass: il pattern FocusTimerDisplay, la schermata principale di Timeouts, con il tempo offline della giornata, il confronto con ieri, la serie di giorni, la posizione in classifica e il pulsante per avviare il focus

Sfida

Costruire un design system con un’identità visiva propria, token condivisi fra CSS, Tailwind, Figma e JS/TS, test e documentazione pubblica. La direzione visiva ha adottato angoli retti, tipografia in due famiglie (Geist Sans e Geist Mono) e vincoli espliciti per guidare l’implementazione.

Soluzione

Decisioni di design: angoli retti in tutti i componenti, due famiglie tipografiche, Geist Sans per il testo e Geist Mono per numeri, etichette e dati, e caricamento con un blocco di caratteri invece dello spinner. I token nascono da un'unica fonte JSON, e Style Dictionary genera variabili CSS, tema Tailwind, JSON per Figma e costanti JS/TS. La governance sta nel codice, con un test di contratto sul contrasto e un plugin ESLint dedicato. Per l'esecuzione ho usato Claude Code con uno spec breve, un piano per fasi, test prima del componente e revisione da parte di un agente separato. Le decisioni qui sopra sono rimaste mie.

Risultati

10 componenti di base e 9 pattern composti, 23 file di test e due workflow di CI. Nell'audit automatico del 14/04/2026 con axe-core, le 27 pagine di documentazione hanno avuto 0 violazioni e 687 controlli superati; il risultato vale per quell'esecuzione, in ambiente locale. I pacchetti @touch-grass-ds/react e @touch-grass-ds/tokens sono pubblicati su npm con licenza MIT. Limite: è un progetto personale, senza team che lo usano né metriche di adozione.

Galleria

Ritagli della documentazione pubblica, acquisiti a ottobre 2026.

Colore: nero, bianco, verde lime e rosso, con il contrasto misurato di ogni abbinamento, compresi quelli che non superano la verifica
Tipografia: Geist Sans per titoli e testo corrente, Geist Mono per numeri, etichette e dati, e la scala dei pesi
Bordi: sottile per la struttura, bianco per i confini importanti, verde lime per lo stato attivo, rosso per il pericolo e tratteggiato per lo stato disabilitato
Movimento: durata zero, niente transizioni né animazioni, e un'eccezione documentata per il flash della fotocamera
PatternInterruptModal: le regole di testo dell'avviso, come nominare la perdita, parlare direttamente alla persona, scrivere l'azione principale come una frase e non chiamare mai l'uscita "Annulla"

Apprendimenti chiave

Quello che era scritto nella specifica, l'agente l'ha seguito, come il caricamento con un blocco di caratteri. Quello che non avevo scritto è emerso in revisione. L'agente revisore ha notato che il Button non impostava type="button" di default, e un clic dentro un form lo inviava.

Devi trasformare un problema di prodotto in un'esperienza implementabile?

Posso aiutarti a collegare strategia, interfaccia e ingegneria in un lavoro che resta chiaro dopo l'handoff.