Turborepo: minimalismo y lo que no hace por ti
Turborepo elige hacer poco y hacerlo bien: se sienta sobre pnpm, envuelve tus scripts y cachea el grafo de tareas con una configuracion diminuta. Su filosofia de minima intrusion es a la vez su mayor virtud y su limite. Saber que deja fuera a proposito —instalar, generar codigo, gestionar el runtime, imponer arquitectura— es lo que te permite elegirlo con los ojos abiertos y no pedirle lo que nunca prometio.
Turborepo es la respuesta minimalista a la pregunta de cómo dejar de recompilar lo que no cambió. No aspira a ser una plataforma ni a modelar tu organización: aspira a envolver los scripts que ya tienes, hashear sus entradas y no repetir su ejecución cuando el resultado sigue siendo válido. Toda su superficie de configuración cabe en un turbo.json de una docena de líneas, y su curva de adopción se mide en minutos. Esa economía de medios es una decisión de diseño, no una carencia: Turborepo hace deliberadamente pocas cosas para hacerlas bien y sin pedirte que cambies cómo trabajas. Elegirlo con criterio exige entender con la misma claridad lo que hace y lo que se niega a hacer.
- Situar la filosofía de mínima intrusión como el eje de diseño de Turborepo.
- Reconocer por qué su superficie de configuración es diminuta y qué implica eso.
- Enumerar lo que Turborepo deja fuera a propósito y por qué no es un defecto.
- Decidir cuándo esa frugalidad es exactamente lo que tu repositorio necesita.
La filosofía: envolver, no reemplazar
Turborepo parte de una tesis fuerte: tu monorepo ya funciona con pnpm y con los scripts de cada package.json, y lo único que falta es memoria. En vez de reemplazar ese flujo, se coloca encima como una capa fina que lee el workspace que pnpm ya define, descubre las tareas que tus paquetes ya declaran y las orquesta con caché. No introduce un modelo de proyecto propio, no te pide reorganizar carpetas ni reescribir comandos: envuelve lo existente.
flowchart TD pnpm[pnpm resuelve e instala] --> scripts[tus scripts en package json] scripts --> turbo[turborepo orquesta y cachea] turbo -.-> cache[cache local y remota por contenido] style turbo fill:#89b4fa,color:#11111b style pnpm fill:#a6e3a1,color:#11111b style cache fill:#cba6f7,color:#11111b
La consecuencia práctica de esa tesis es la reversibilidad. Como Turborepo no toca la capa de workspace ni convierte tus scripts en artefactos propietarios, quitarlo es tan barato como borrar turbo.json y volver a invocar pnpm -r run build. No hay lock-in estructural: la herramienta es un acelerador enchufable, no un cimiento. Esa propiedad —poder irse sin coste— es la que da tranquilidad para adoptarlo un martes cualquiera sin convocar un comité de arquitectura.
El camino típico es npx turbo sobre un workspace de pnpm ya existente: escribes un turbo.json con la tarea build, declaras que depende del build de sus dependencias, corres turbo run build dos veces y ves la segunda restaurar desde caché. No hay migración de código, ni generadores que aprender, ni convenciones que adoptar. Esta baja fricción es el argumento comercial más honesto de Turborepo: el coste de probarlo es casi nulo y el coste de abandonarlo también.
Una superficie de configuración diminuta
El turbo.json es casi todo lo que hay que aprender. Su vocabulario se reduce a un puñado de claves —tasks, dependsOn, inputs, outputs, cache, env— y con ellas se describe el pipeline completo. No hay executors que abstraigan tus comandos, no hay un lenguaje de plantillas, no hay un plugin que inferir. La tarea es, literalmente, el script que ya tenías; Turborepo solo aprende cuándo puede saltárselo.
// turbo.json: la superficie entera cabe aqui
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"], "outputs": [] },
"lint": {}
}
}
Esa parquedad tiene un corolario en 2026: el motor de hashing y planificación está escrito en Rust, y un daemon opcional vigila el sistema de archivos para no rehashear el mundo en cada invocación. Turborepo funciona indistintamente sobre pnpm, npm, yarn o bun —no impone gestor— y añade turbo watch para reejecutar tareas afectadas al vuelo. La regla mental es que el turbo.json no es un programa: es la declaración de un grafo de funciones que deben ser deterministas para que memoizarlas sea legítimo.
Que la superficie sea pequeña no la vuelve juguete. Sobre esas pocas claves, Turborepo paraleliza respetando la topología, cachea por contenido local y remotamente, y selecciona subgrafos con --filter y --affected. La potencia vive en el motor, no en la configuración; lo que es diminuto es lo que tú tienes que escribir y mantener. Menos superficie es menos que se te puede romper y menos que tienes que entender para depurar un fallo.
Lo que Turborepo no hace por ti, a propósito
El otro lado de la frugalidad es una lista clara de responsabilidades que Turborepo declina. No son huecos por hacer: son fronteras trazadas para no acoplar lo que debe permanecer separado.
No instala ni resuelve
No escribe el lockfile, no enlaza node_modules, no unifica versiones. Eso es trabajo de pnpm, y Turborepo delega en él sin solaparse. Le pides orquestar, no instalar.
No genera ni andamia
No trae generadores ni scaffolding: no crea paquetes, componentes ni configuraciones por ti. Si quieres estandarizar cómo nace un paquete, esa plantilla la pones tú.
No gestiona el runtime
Asume que node, bun o la herramienta que uses ya están instalados y en la versión correcta. No descarga ni fija el toolchain; eso lo dejas a corepack, proto o volta.
No impone arquitectura
No hace cumplir fronteras de módulo ni reglas de qué puede importar a qué. El grafo lo observa para cachear, pero no lo vigila para prohibir dependencias indebidas.
Conviene tabular la frontera, porque discutir a Turborepo por lo que no hace es discutirlo por su propia tesis. La columna izquierda es su promesa; la derecha, lo que a conciencia delega en otras capas.
| Turborepo sí hace | Turborepo no hace |
|---|---|
| hashear entradas y memoizar salidas | instalar dependencias o escribir el lockfile |
| paralelizar respetando la topología | generar código o andamiar paquetes |
| caché local y remota por contenido | gestionar la versión de node o del runtime |
seleccionar por --filter y --affected |
imponer fronteras de módulo o de arquitectura |
Hay dos ausencias que merecen matiz porque a veces se esperan y no están. La primera es la ejecución distribuida entre varias máquinas efímeras —repartir un pipeline en un enjambre de agentes—: Turborepo cachea de forma remota, pero no orquesta ese reparto como sí hace Nx Cloud. La segunda son las fronteras de módulo: existe un boundaries experimental, pero imponer arquitectura no es su terreno natural. Pedirle cualquiera de las dos es pedirle que deje de ser Turborepo.
Toda la caché de Turborepo descansa en una premisa que la configuración no verifica por ti: que cada tarea, ante las mismas entradas, produzca las mismas salidas. Un build que incrusta una marca de tiempo, un identificador aleatorio o el nombre de la máquina rompe esa pureza y hará que la caché restaure artefactos sutilmente incorrectos que pasan en verde. Como Turborepo hace poco, la carga de mantener las tareas deterministas recae enteramente en ti; es el precio silencioso de su minimalismo.
La tentación al comparar build systems es leer la lista de funciones y suponer que más funciones equivale a mejor herramienta. Bajo ese marco, Turborepo parece perder frente a Nx en casi todas las casillas: no genera, no impone arquitectura, no distribuye, no gestiona el toolchain, no infiere un grafo de proyecto elaborado. Pero ese marco confunde superficie con valor. Cada cosa que Turborepo se niega a hacer es una cosa que no tienes que aprender, mantener, depurar ni desmontar el día que quieras irte. Su tesis es que el ochenta por ciento del dolor de un monorepo —recompilar lo que no cambió— se resuelve con una sola idea bien ejecutada, el grafo de tareas memoizado, y que envolver esa idea en una plataforma opinada es cargar al equipo con complejidad que la mayoría de los repos nunca amortiza. Elegir Turborepo es, por tanto, una apuesta explícita: prefieres una capa fina y reversible que respeta tus scripts a una plataforma que los absorbe. Esa apuesta es correcta con una frecuencia altísima, porque casi ningún repositorio necesita una plataforma; casi todos necesitan dejar de repetir trabajo. La madurez al evaluar Turborepo no consiste en lamentar lo que no hace, sino en reconocer que su lista de negativas es exactamente el argumento a su favor: hace poco para que tú tengas que entender poco, y delega el resto en capas que ya hacían bien su trabajo. Cuando alguien pide “que Turborepo también genere código y vigile la arquitectura”, en realidad está pidiendo Nx sin saberlo, y esa es una decisión legítima —pero es otra decisión, con otro coste.
- Añade un
turbo.jsonmínimo a un workspace de pnpm y correturbo run builddos veces seguidas para ver la segunda restaurar desde caché. - Borra
turbo.jsony vuelve apnpm -r run build: comprueba de primera mano que quitar Turborepo no toca ni un archivo de tus paquetes. - Lista tres cosas que tu equipo hace a mano hoy —crear paquetes, fijar la versión de node, revisar imports prohibidos— y confirma que ninguna es trabajo de Turborepo.
- Introduce a propósito un
Date.now()en el output de una tarea y observa cómo la caché deja de tener sentido: acabas de ver por qué el determinismo es tu responsabilidad. - Escribe en una frase por qué, para tu repo actual, esa frugalidad es una virtud o una carencia; esa frase es tu criterio de elección.