Curso
Estás trabajando en un proyecto. El frontend vive en un repo, el backend en otro y las librerías compartidas en un tercero. Vas saltando entre repos y cruzando los dedos para que las versiones no se desalineen.
Ahora imagina todo en un mismo sitio. Un solo repo para todos tus proyectos, código compartido que se actualiza al instante y cambios que se propagan con un único commit.
Los monorepos lo hacen posible. Por eso muchas grandes tecnológicas lo usan, como:
- Google creó Piper con automatización a gran escala
- Meta escaló Mercurial
- Microsoft ejecuta Windows en un monorepo Git con VFS for Git
- Uber incluso pasó de mono > multi > de vuelta a mono cuando las herramientas estuvieron a la altura
En esta guía verás qué es un monorepo, cómo se compara con los polyrepos y los principales beneficios, retos y buenas prácticas que deberías conocer.
¿Qué es un monorepo?
Un monorepo (monolithic repository) significa un único repositorio. En un monorepo, todos tus proyectos conviven en el mismo lugar en lugar de estar repartidos en repositorios separados.
Aunque los proyectos estén uno al lado del otro, siguen siendo independientes. Puedes construirlos, probarlos y desplegarlos por separado, con la ventaja de mantenerlo todo junto en un único sitio.
Pero ojo: una aplicación monolítica y un monorepo no son lo mismo:
- Una aplicación monolítica (monolito) es una sola aplicación de software construida y ejecutada como una unidad, normalmente trabajando sobre el mismo conjunto de datos. Puede estar dentro de un monorepo (como uno de muchos proyectos).
- Monorepo almacena y gestiona el código de forma que muchos proyectos viven en el mismo repo, pero siguen siendo independientes entre sí.
Un monorepo no es una app monolítica. De hecho, los monorepos suelen encajar muy bien con microservicios, porque cada servicio puede vivir en el mismo repo y seguir siendo independiente.
El concepto de monorepo no es nuevo.
A principios de los 2000, grandes tecnológicas empezaron a adoptar un enfoque de «código compartido». La idea era simple: en lugar de dispersar el código en muchos repos, ponerlo todo en un único lugar para facilitar la colaboración.
Desde entonces, compañías como Google, Meta, Microsoft, Airbnb, Twitter (X), Uber y Pinterest han adoptado monorepos para gestionar bases de código grandes y en constante evolución.
Monorepo vs. polyrepo
Lo opuesto a un monorepo es un polyrepo (multirepo). Veamos en qué se diferencian.
Polyrepo
Un polyrepo, también llamado multirepo, es cuando cada proyecto tiene su propio repositorio independiente.
Por ejemplo, el código del frontend puede estar en un repositorio, el backend en otro y las librerías compartidas por su cuenta. Cada repositorio se gestiona de forma independiente con sus propias dependencias y flujos de trabajo.

Monorepo vs. polyrepo. Imagen del autor.
Diferencias clave de un vistazo
Veamos las diferencias principales entre monorepos y polyrepos:
|
Monorepo |
Polyrepo |
|
Un repositorio para todos los proyectos y el código compartido. |
Cada proyecto tiene su propio repositorio independiente. |
|
Compartir y reutilizar código es sencillo porque todo está en un único repo. |
Compartir código es más difícil: puede haber duplicidades o desincronización entre proyectos. |
|
Se gestiona en un solo lugar, así que las versiones se mantienen coherentes entre proyectos. |
Cada repo gestiona sus dependencias, lo que puede ser más difícil de controlar. |
|
Puedes usar una configuración unificada de CI/CD que detecte qué código ha cambiado y ejecute solo los builds/tests afectados. |
Cada repo tiene su propia canalización. Las mantiene separadas, pero complica unificarlas. |
|
Ideal para equipos pequeños o medianos, o proyectos con mucho código compartido. |
Mejor cuando los proyectos son independientes, necesitan acceso estricto o pertenecen a equipos distintos. |
Beneficios de un monorepo
Los monorepos aportan muchos beneficios. Estos son algunos:
Mejor colaboración y visibilidad
Cuando todo el código está en un único sitio, todo el mundo ve qué está pasando. Puedes revisar otros proyectos, aprender de ellos o incluso echar una mano si hace falta.
Esto facilita el trabajo en equipo, impulsa la colaboración entre áreas y reduce los silos.
Gestión de dependencias más simple
Si distintos proyectos usan las mismas librerías pero mantienen sus propias versiones, el desorden aparece rápido.
Por ejemplo, un proyecto usa una versión antigua y otro una más nueva. Esto complica la ejecución del código y te obliga a arreglar lo mismo en varios sitios.
En un monorepo, el código compartido vive en un único lugar. Lo actualizas una vez y todos los proyectos reciben la corrección al momento. No tienes que perseguir desajustes de versiones ni pelearte con conflictos.
Commits atómicos y refactors más fáciles
A veces necesitas un cambio que afecta a más de un proyecto. Por ejemplo, actualizar una librería compartida. Con un monorepo, actualizas ese código y aplicas las correcciones a todos los proyectos en un solo commit.
Así todos los proyectos se mantienen sincronizados y evitas romper otras partes por accidente.
Herramientas y procesos coherentes
Con un solo repo, hay una única manera de construir, probar y desplegar. No tienes que recordar configuraciones distintas por proyecto. La incorporación de nuevas personas es más rápida y sin confusiones.
Iteración más rápida en ciertos flujos
Si dos o más proyectos dependen del mismo código, por ejemplo una librería o utilidad compartida, no necesitas actualizar cada proyecto por separado en repos distintos.
Con un monorepo, actualizas el código una vez y todos los proyectos de ese repositorio reciben el cambio de inmediato. En lugar de alternar entre repos separados, haces los cambios en un sitio y ves el impacto en todas partes a la vez.
Esto ayuda en situaciones del día a día:
- Cuando refactorizas código compartido, actualizas la librería y todos los servicios que dependen de ella reciben la actualización al instante.
- Cuando lanzas una función que toca más de una app, puedes publicarlo todo a la vez en lugar de coordinarte entre repos distintos.
- Incluso tus pipelines de CI/CD se simplifican porque los builds y tests se ejecutan contra la misma base de código en lugar de duplicarse.
Todo esto reduce idas y venidas, disminuye los cambios de contexto y acorta los ciclos de feedback. En consecuencia, acelera la iteración sin sobrecarga extra.
Retos de un monorepo
Los monorepos aportan mucho, pero también traen retos. Estos son los principales:
Problemas de escalabilidad y rendimiento
A medida que el repo crece, tareas cotidianas como clonar, buscar o incluso abrirlo en tu editor se van ralentizando. ¿Por qué? Porque Git no se diseñó originalmente para bases de código masivas. Las grandes compañías lo notan.
Tiempos de build y test más largos
Como todos los proyectos están en el mismo sitio, un cambio pequeño puede disparar mucho trabajo extra en tu pipeline de CI/CD. Por eso, los desarrolladores acaban esperando a que terminen builds o baterías de tests antes de poder hacer merge o publicar su código.
Con el tiempo, estos retrasos pueden bloquear otras tareas y dificultar la entrega de cambios pequeños y frecuentes.
Mira el caso de Uber: cuando su monorepo de Go alcanzó millones de líneas de código, algunos ingenieros esperaban horas a que terminaran los builds y validaciones antes de poder hacer merge.
Tiempo después lo aceleraron con herramientas como Bazel y colas de build personalizadas. Aun así, ilustra lo rápido que CI puede convertirse en un cuello de botella cuando todos tus proyectos comparten un repositorio.
Riesgos al romper la rama principal
La rama main es la rama por defecto en Git donde vive la última versión estable de tu código. En un monorepo, todo el mundo trabaja desde esta rama compartida, así que si un cambio la rompe, todo el equipo (o la empresa) puede quedar bloqueado hasta que se arregle.
Airbnb es un buen ejemplo. Implantaron un deployment democrático (cualquier ingeniero podía probar su trabajo y ponerlo en producción sin esperar a un release manager).
Al principio parecía ágil, pero al crecer la empresa, gestionarlo todo se complicó porque su código estaba en un único y gran monorepo. Varias personas desplegaban a la vez, las actualizaciones chocaban y era difícil encontrar la causa de los problemas.
Control de acceso y seguridad
Limitar accesos en un monorepo es complicado porque todo el código, ficheros de configuración, scripts de build y demás recursos están juntos. Por defecto, cualquiera con acceso al repo suele poder ver y modificar todos estos componentes.
Eso está bien para colaborar abiertamente, pero es un reto cuando ciertas partes —como claves de seguridad, scripts de despliegue o algoritmos propietarios— requieren permisos más estrictos.
Por ejemplo, una empresa puede tener el código de su web en el mismo monorepo. Quien trabaja en la web no necesita acceso a credenciales de producción, pero al vivir todo en un mismo sitio, es difícil evitar que vean o editen por accidente esos ficheros sensibles.
Curva de aprendizaje para nuevas incorporaciones
Para quien llega nuevo, un repo enorme con muchos proyectos puede abrumar. Hay tantos archivos y carpetas que cuesta saber por dónde empezar o qué es relevante para su trabajo.
También tienen que aprender la estructura, herramientas y dependencias del proyecto antes de poder ejecutar builds o hacer cambios con seguridad, lo que puede ralentizar su progreso hasta familiarizarse.
Buenas prácticas para gestionar un monorepo
Para que un monorepo funcione como la seda, ten en cuenta lo siguiente:
- Mantén el repo organizado con lógica. Agrupa proyectos relacionados, usa nombres claros y facilita que cualquiera encuentre lo que necesita.
- Evita ramas de larga vida. Prueba el desarrollo basado en trunk, donde todos integran cambios a la rama principal con frecuencia. Mantiene el repo limpio y reduce conflictos.
- Fija las dependencias a versiones concretas para que todo el mundo esté alineado. Actualízalas en todo el repo a la vez para evitar desajustes.
- Usa herramientas de build modernas como Bazel, Buck, Nx, Pants, Rush o Lerna para acelerar builds y manejar la complejidad de repos grandes.
- No rehagas ni vuelvas a probar todo el repo si solo cambió una parte pequeña. Usa builds diferenciales y tests dirigidos para ahorrar tiempo y dar feedback más rápido.
- Configura Git CODEOWNERS en tu plataforma de VCS (por ejemplo, GitHub/GitLab) para proteger áreas sensibles como scripts de despliegue o archivos de configuración, y exigir la revisión de los equipos adecuados.
Herramientas populares para gestionar monorepos
Un monorepo puede volverse complejo a medida que los proyectos crecen. Para facilitarlo, han surgido muchas herramientas que ayudan con los builds, las dependencias y a mantener todo organizado.
Estas son algunas de las más comunes:
Bazel
Bazel es un sistema de build de código abierto creado en Google para manejar bases de código muy grandes y complejas.
Estas son algunas de sus funciones clave:
- Builds rápidos: Reconstruye solo lo que ha cambiado, con caché avanzado, análisis optimizado de dependencias y ejecución en paralelo.
- Multilenguaje: Funciona en distintas plataformas y lenguajes, incluidos Java, C++, Go, Android e iOS, y en Windows, macOS y Linux.
- Escala con facilidad: Maneja monorepos masivos y múltiples repositorios, apto para organizaciones de cualquier tamaño.
- Extensible: Permite añadir nuevos lenguajes y plataformas con su sistema de extensiones, respaldado por una comunidad creciente.
Bazel es de confianza para empresas como Google, Stripe y Dropbox para compilar y probar infraestructuras y aplicaciones de misión crítica.
Nx
Nx es un toolkit de código abierto para gestionar monorepos, especialmente popular en JavaScript y TypeScript, con gran soporte para frameworks como React, Angular, Vue y NestJS. Ayuda a organizar múltiples apps y librerías en un solo lugar, manteniendo builds y tests rápidos.
Funciones clave:
- Orquestador inteligente de tareas: Entiende las dependencias entre partes del código y ejecuta solo lo necesario, evitando trabajo inútil.
- Encaja con tu stack: Ejecuta scripts existentes, como tareas npm o Gradle, sin cambiar tu configuración.
- Nx Cloud: Acelera el ciclo de desarrollo con caché remoto, CI más rápido y herramientas que ayudan a detectar y corregir problemas automáticamente.
- Herramientas extra: Funciones como Nx Console ofrecen autocompletado, un grafo visual de proyectos y gestión de tareas más cómoda.
Lerna
Lerna es una de las herramientas más veteranas y fiables para gestionar monorepos de JavaScript y TypeScript. Facilita organizar múltiples paquetes en un único repo y ayuda a construirlos, probarlos y publicarlos.
De hecho, proyectos tan conocidos como Create React App, Jest y NestJS han usado Lerna para gestionar sus paquetes.
Entre sus funciones clave:
- Builds inteligentes: Evita repetir trabajo reutilizando resultados en caché en lugar de reconstruir lo mismo.
- Ejecución rápida: Las tareas se ejecutan en paralelo respetando el orden de dependencias.
- Caché distribuida: Los resultados de build se comparten entre desarrolladores y sistemas de CI, reduciendo tiempos.
- Publicación de paquetes: Simplifica publicar en npm con versionado compartido o independiente.
- Escalado: Reparte cargas entre varias máquinas sin configuración extra.
- Visualización: Incluye herramientas para ver cómo se conectan proyectos y dependencias en tu repo.
- Puesta en marcha mínima: Requiere poca configuración; puedes mantener tus scripts de npm y ejecutarlos más rápido.
Pants
Pants es un sistema de build rápido y fácil de usar que funciona bien para monorepos de distintos tamaños. Empezó centrado en Python y ahora también soporta Go, Java, Scala, Kotlin, Shell y Docker, con más lenguajes en camino.
Por eso lo usan y confían en él empresas como Coinbase, IBM, Slack, Salesforce y Orca Security, además de muchos equipos pequeños.
Funciones clave:
- Fácil de adoptar: Requiere mínima configuración e infiere automáticamente la mayoría de la información de build, con menos boilerplate que mantener.
- Builds seguras: Soporta múltiples resoluciones de dependencias y lockfiles, creando builds reproducibles más resistentes a ataques a la cadena de suministro.
- Flexible: Trabaja a nivel de archivo, por lo que maneja estructuras de dependencias complejas sin imponer modularidad estricta.
- Extensible: Ofrece un sistema de plugins en Python para personalizarlo a tus necesidades.
- Consciente de Git: Detecta cambios entre ramas y ejecuta solo los tests o builds afectados.
Rush
Rush es una herramienta de monorepo diseñada para proyectos JavaScript que requieren gestionar múltiples paquetes dentro de un único repositorio.
Funciones clave:
- Pensado para escalar: Soporta builds en paralelo, incrementales y distribuidos para mantener eficientes incluso los repos enormes.
- Coordinación de equipo: Mantiene versiones de dependencias coherentes, revisa nuevos paquetes antes de añadirlos y admite versionado compartido o independiente.
- Instalaciones fiables: Soporta pnpm (recomendado), npm y Yarn para instalaciones predecibles.
- Herramienta todo en uno: Gestiona instalaciones, linking, builds, publicación, versiones y changelogs en un solo sitio.
Rush es abierto y de confianza, usado por productos como Azure SDK, HBO Max, OneDrive, SharePoint, Office 365 y Wix.
Turborepo
Turborepo es un sistema de build de alto rendimiento que hace los monorepos de JavaScript y TypeScript más rápidos y fáciles de gestionar. Se centra en resolver problemas típicos de escalado cuando conviven múltiples apps y paquetes en el mismo repo.
Funciones clave:
- Caché remoto: Guarda los resultados de builds y tests para no repetir trabajo, reduciendo tiempos de CI.
- Planificación de tareas: Ejecuta tareas en el orden correcto y en paralelo en todos los cores disponibles para máxima velocidad.
- Adopción incremental: Puedes añadirlo a cualquier repo en minutos, usando los scripts de package.json y trabajando con npm, Yarn o PNPM.
- Clonado ligero: Permite clonar solo las partes del monorepo que necesitas, reduciendo el tiempo de puesta a punto.
- Flujos optimizados: Construye solo lo que ha cambiado, manteniendo ciclos de feedback ágiles.
- Experiencia familiar: Funciona con flujos estándar de Git y no exige cambiar cómo ya gestionan el código los equipos.
Moon
Moon es una herramienta rápida de gestión de monorepos escrita en Rust. Soporta lenguajes como JavaScript, TypeScript, Rust, Go y Ruby.
Funciones clave:
- Velocidad: Usa caché inteligente y builds incrementales para reconstruir solo el código que cambia.
- Colaboración: La caché remota comparte resultados entre compañeros y CI.
- Multiplataforma: Funciona en Linux, macOS y Windows.
- Grafo de proyectos: Mapea dependencias para organizar y escalar repos grandes.
Lage
Lage es un task runner creado para monorepos que prioriza la velocidad y la eficiencia. Ayuda a evitar reconstruir trabajo ya hecho.
Funciones clave:
- Evita trabajo repetido: Reutiliza resultados en local o de tus compañeros para no ejecutar dos veces los builds.
- Configuración rápida: Fácil de configurar y consistente entre entornos.
- Caché: Soporta caché local o almacenamiento externo para acelerar CI.
- Insights: Incluye herramientas para perfilar builds y visualizar grafos de dependencias.
Yarn workspaces
Yarn introdujo workspaces para facilitar la gestión de proyectos con muchos paquetes dentro de un mismo repo (un monorepo).
Funciones clave:
- Sin instalaciones duplicadas: Las dependencias comunes se instalan una sola vez en la raíz, evitando
node_modulesinflados en cada paquete. - Enlazado automático: Si un paquete depende de otro del mismo repo, Yarn los enlaza por ti.
- Un único lockfile: Un solo yarn.lock para todo el repo mantiene versiones coherentes en todos los paquetes.
Cuándo usar un monorepo
Veamos algunos casos habituales en los que un monorepo te resultará útil:
Equipos pequeños o medianos con código compartido
Si tu equipo es pequeño y se reutiliza mucho código entre proyectos, un monorepo te ahorra tiempo. Todo el equipo trabaja en el mismo sitio y las librerías compartidas se mantienen sincronizadas sin esfuerzo extra. Gana-gana.
Proyectos con dependencias muy acopladas
Cuando tus proyectos dependen estrechamente entre sí, mantenlos en un único repo. Así los cambios se hacen a la vez en un solo commit, sin malabares entre repos.
Organizaciones que buscan herramientas y visibilidad unificadas
Con un monorepo, puedes configurar CI/CD de forma unificada. No significa que haya una sola pipeline para todo, pero sí que puedes optimizarlas para ejecutar únicamente los builds y tests afectados por los cambios recientes, ahorrando tiempo y recursos.
Pero los monorepos no son la solución para todo. Si tus proyectos son totalmente independientes o necesitas controles de acceso estrictos (donde algunos equipos no deberían ver cierto código), entonces los polyrepos (múltiples repos) pueden ser tu mejor opción.
Sopesar pros y contras
Aquí tienes un resumen de las vantajas y desventajas de los monorepos:
|
Pros |
Contras |
|
Colaboración y visibilidad más fáciles entre equipos. |
El repo puede crecer mucho y ralentizar Git/IDEs. |
|
Las librerías compartidas se mantienen coherentes, sin conflictos de versión. |
Los builds y tests tardan más a medida que crece el código. |
|
Cambios entre proyectos en un solo commit. |
Un cambio roto puede bloquear a todo el mundo. |
|
Una forma unificada de construir, probar y desplegar (herramientas coherentes). |
Más difícil definir controles de acceso granulares. |
|
Feedback más rápido al actualizar código compartido. |
Curva de aprendizaje más pronunciada para nuevas incorporaciones. |
Reflexión final
Un monorepo puede facilitar la colaboración, simplificar dependencias y acelerar la iteración, pero también trae retos reales de escala, rendimiento y acceso. Adoptarlo debe ser una decisión estratégica basada en cómo se organizan tus equipos, cuán interdependientes son tus proyectos y si estás listo para invertir en el tooling adecuado.
Sin hábitos de colaboración sólidos y una propiedad clara, incluso el mejor monorepo sufrirá. Si estás explorando este camino, merece la pena afianzar primero los fundamentos. El curso Software Engineering Principles in Python es un gran punto de partida. Te ayudará a asentar las prácticas que hacen que un monorepo tenga éxito.
Soy una estratega de contenidos a la que le encanta simplificar temas complejos. He ayudado a empresas como Splunk, Hackernoon y Tiiny Host a crear contenidos atractivos e informativos para su público.
Preguntas frecuentes sobre monorepos
¿Un monorepo requiere proveedores de hosting específicos?
No. Cualquier plataforma basada en Git (GitHub, GitLab, Bitbucket) sirve. Para repos muy grandes, valora funciones como clonado parcial, checkout disperso (sparse), búsqueda de código compatible con monorepos y límites de tamaño de repo más altos en planes enterprise.
¿Es necesario migrar de un polyrepo a un monorepo?
No necesariamente. Compensa cuando los proyectos comparten código/configuración, se versionan/publican juntos o necesitan cambios sincronizados. Si los servicios son independientes y comparten poco, un polyrepo (más una librería común) puede ser más simple.
¿Se puede usar un monorepo con una aplicación monolítica?
Sí. Monorepo vs. polyrepo va de cómo organizas el control de código fuente, no de arquitectura. Tanto monolitos como microservicios pueden vivir en un monorepo; las ventajas son tooling coherente, CI compartido y refactors atómicos.
¿Los monorepos te atan a herramientas específicas?
No por defecto. Aunque herramientas como Bazel, Nx o Pants son habituales, puedes adoptar un monorepo con Git básico y CI/CD sencillos. Las herramientas solo facilitan escalar.
¿Cuáles son los posibles inconvenientes de los monorepos para empresas pequeñas?
Para empresas más pequeñas, un monorepo puede sentirse restrictivo porque es difícil controlar quién ve o edita ciertas partes del código. También complica si quieren compartir u open sourcear solo una parte del proyecto.


