Turborepo vs Nx в 2026: какой инструмент для монорепо выбрать
Содержание
Монорепозитории стали стандартным способом организации кода в крупных JavaScript- и TypeScript-проектах. Google, Meta, Microsoft и тысячи стартапов хранят десятки и сотни пакетов в одном репозитории, получая единую историю изменений, атомарные рефакторинги и переиспользование кода без публикации в реестр. Но управление монорепо — задача нетривиальная: сборка сотен пакетов занимает часы, граф зависимостей становится запутанным, а CI-пайплайны превращаются в узкое горлышко.
В 2026 году два инструмента доминируют в экосистеме монорепозиториев для JavaScript: Turborepo (от Vercel) и Nx (от Nrwl, ныне Nx). Оба решают ключевую проблему — оркестрацию задач и интеллектуальное кеширование — но подходят к ней с принципиально разных сторон. Turborepo позиционирует себя как быстрый и минималистичный таск-раннер, а Nx — как полноценная платформа «build intelligence» с генераторами кода, плагинами и визуализацией зависимостей.
Эта статья поможет разработчикам, тимлидам и DevOps-инженерам сделать осознанный выбор. Мы разберём архитектуру, производительность, экосистему плагинов, инструменты для CI/CD и реальные сценарии, в которых каждый инструмент раскрывает свои сильные стороны.
Обзор Turborepo: скорость и простота
Turborepo был создан Джаредом Палмером в 2021 году и приобретён Vercel в конце того же года. Инструмент написан на Rust (миграция с Go была завершена в серии 2.x) и сфокусирован на единственной задаче — максимально быстрое выполнение задач (build, test, lint) в монорепозитории с интеллектуальным кешированием результатов.
Философия Turborepo — делать одну вещь и делать её хорошо. Инструмент не навязывает структуру проекта, не генерирует код и не управляет зависимостями. Он работает поверх стандартных workspaces пакетных менеджеров (npm, pnpm, Yarn, Bun) и оркестрирует выполнение скриптов из package.json.
Ключевые возможности Turborepo
- Инкрементальные сборки — Turborepo кеширует результат каждой задачи (выходные файлы и логи) и при повторном запуске мгновенно воспроизводит кеш, если входные данные не изменились.
- Remote Cache — результаты кеширования можно разделять между разработчиками и CI через удалённый кеш. Vercel предоставляет бесплатный managed Remote Cache, но можно развернуть и собственный сервер.
- Параллельное выполнение — Turborepo строит граф зависимостей задач и запускает независимые задачи параллельно, утилизируя все ядра процессора.
- Topological ordering — задачи выполняются в правильном порядке с учётом зависимостей между пакетами.
- Terminal UI — начиная с версии 2.x, Turborepo предоставляет интерактивный терминальный интерфейс для наблюдения за ходом сборки.
- Devtools — в версии 2.7 появились визуальные инструменты для исследования графов пакетов и задач командой
turbo devtools.
На GitHub репозиторий Turborepo (vercel/turborepo) набрал более 26 000 звёзд. Еженедельные загрузки пакета turbo на npmjs.com превышают 3,5 миллиона.
Конфигурация Turborepo
Конфигурация описывается в файле turbo.json (или turbo.jsonc для поддержки комментариев) в корне рабочего пространства:
{
"$schema": "https://turborepo.dev/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"],
"inputs": ["src/**", "tsconfig.json"]
},
"test": {
"dependsOn": ["build"],
"outputs": ["coverage/**"],
"env": ["CI", "NODE_ENV"]
},
"lint": {
"outputs": []
},
"dev": {
"cache": false,
"persistent": true
}
}
}
Здесь "dependsOn": ["^build"] означает, что задача build пакета может запуститься только после того, как build всех его зависимостей завершится. Свойство outputs указывает, какие директории нужно кешировать, а inputs — какие файлы влияют на хеш кеша. Задача dev помечена как persistent (для watch-режима) и не кешируется.
Обзор Nx: платформа build intelligence
Nx был создан Виктором Савкиным и Джеффом Кроссом (бывшими членами Angular-команды Google) в 2017 году под названием Nrwl Extensions. К 2026 году Nx эволюционировал из набора расширений для Angular CLI в полноценную платформу build intelligence, поддерживающую любые языки и фреймворки.
Философия Nx — предоставить полную экосистему для разработки в монорепозитории. Помимо оркестрации задач и кеширования, Nx включает генераторы кода, анализ зависимостей на уровне файлов, визуализацию графа проектов, контроль модульных границ и интеграцию с IDE.
Ключевые возможности Nx
- Гранулярный анализ зависимостей — Nx анализирует зависимости на уровне отдельных файлов, а не пакетов. Это означает, что изменение README в пакете A не приведёт к перезапуску сборки пакета B, даже если B зависит от A.
- Affected-команды — команда
nx affectedопределяет, какие проекты затронуты изменениями, и запускает задачи только для них. - Генераторы кода — Nx предоставляет мощную систему генерации кода для скаффолдинга приложений, библиотек, компонентов, сервисов и других артефактов.
- Плагины — первоклассные плагины для React, Angular, Next.js, Node.js, Docker, .NET, Maven и других технологий.
- Project Crystal — инферентная конфигурация: простое подключение плагина автоматически настраивает проект без ручного конфигурирования.
- Nx Cloud — платформа для распределённого выполнения задач в CI, разделяющая задачи между агентами для максимального параллелизма.
- Визуализация графа — интерактивная визуализация зависимостей между проектами и задачами через команду
nx graph. - Контроль модульных границ — ESLint-правила, которые запрещают импорты, нарушающие заданную архитектуру (например, feature-модуль не может импортировать из другого feature-модуля напрямую).
- Migrate UI — начиная с Nx 21, миграции между версиями доступны через визуальный интерфейс в Nx Console.
На GitHub репозиторий Nx (nrwl/nx) набрал более 24 000 звёзд. Еженедельные загрузки пакета nx на npmjs.com превышают 4 миллиона.
Конфигурация Nx
Основная конфигурация задаётся в nx.json в корне рабочего пространства:
{
"$schema": "./node_modules/nx/schemas/nx-schema.json",
"targetDefaults": {
"build": {
"dependsOn": ["^build"],
"inputs": ["production", "^production"],
"cache": true
},
"test": {
"inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"],
"cache": true
},
"lint": {
"inputs": ["default", "{workspaceRoot}/.eslintrc.json"],
"cache": true
}
},
"namedInputs": {
"default": ["{projectRoot}/**/*", "sharedGlobals"],
"production": [
"default",
"!{projectRoot}/**/*.spec.ts",
"!{projectRoot}/tsconfig.spec.json"
],
"sharedGlobals": ["{workspaceRoot}/tsconfig.base.json"]
},
"defaultBase": "main"
}
Конфигурация каждого проекта дополнительно описывается в project.json:
{
"name": "my-app",
"projectType": "application",
"sourceRoot": "apps/my-app/src",
"targets": {
"build": {
"executor": "@nx/vite:build",
"options": {
"outputPath": "dist/apps/my-app"
},
"configurations": {
"production": {
"mode": "production"
}
}
},
"serve": {
"executor": "@nx/vite:dev-server",
"options": {
"buildTarget": "my-app:build"
}
}
},
"tags": ["scope:frontend", "type:app"]
}
Теги tags в связке с ESLint-правилом @nx/enforce-module-boundaries позволяют контролировать, какие проекты могут импортировать друг друга.
Сравнение по ключевым параметрам
Рассмотрим оба инструмента через призму критериев, которые наиболее важны при выборе решения для монорепозитория.
Производительность и кеширование
Оба инструмента поддерживают локальное кеширование результатов задач. Turborepo вычисляет хеш на основании входных файлов, переменных окружения и зависимостей, а затем сохраняет выходные файлы и логи. Nx делает то же самое, но идёт дальше: благодаря файловому анализу зависимостей он точнее определяет, что действительно изменилось.
Бенчмарки на малых проектах (до 10 пакетов): Turborepo показывает примерно 3-кратное преимущество над Nx. Типичная cold-build завершается за ~2,8 секунды у Turborepo против ~8,3 секунды у Nx. Разница объясняется тем, что Nx выполняет больше работы при инициализации: анализ графа зависимостей, проверка конфигурации плагинов, валидация workspace integrity.
Бенчмарки на больших проектах (50+ пакетов): Ситуация меняется кардинально. Nx показывает до 7-кратного преимущества благодаря гранулярному анализу затронутых файлов. Когда разработчик изменяет один файл в проекте с сотнями зависимостей, Nx точно определяет, какие именно пакеты нужно пересобрать, пропуская остальные. Turborepo работает на уровне пакетов, что приводит к избыточным пересборкам.
Remote Cache: Turborepo предлагает бесплатный Remote Cache через Vercel (с нулевой конфигурацией для проектов на Vercel) и поддержку self-hosted серверов. Артефакты подписываются HMAC-SHA256 для обеспечения целостности. Nx Cloud предоставляет аналогичную функциональность, но с дополнительными возможностями — распределённое выполнение задач между CI-агентами, аналитика и управление.
Опыт разработчика (DX)
Turborepo делает ставку на минимальное время входа. Установка — один пакет (turbo), конфигурация — один файл (turbo.json), и вы готовы к работе. Не нужно изучать специфические абстракции, executors или generators. Turborepo работает с тем, что у вас уже есть: package.json скрипты и workspaces вашего пакетного менеджера.
Nx предоставляет более rich DX, но за счёт более крутой кривой обучения. Генераторы кода, визуализация графа, контроль модульных границ, Nx Console (расширение для VS Code) — всё это требует времени на освоение, но даёт значительный выигрыш на масштабе. Например, создание нового React-компонента с тестами и историей Storybook одной командой:
# Nx: генерация компонента с тестами
nx g @nx/react:component Button \
--project=ui-lib \
--style=css \
--unitTestRunner=vitest
# Turborepo: нет встроенных генераторов,
# разработчик создаёт файлы вручную или использует внешние шаблоны
Экосистема плагинов
Это одно из самых существенных различий. Nx располагает обширной экосистемой первоклассных плагинов:
@nx/react,@nx/angular,@nx/next— фронтенд-фреймворки@nx/node,@nx/express,@nx/nest— бэкенд@nx/vite,@nx/webpack,@nx/rspack— сборщики@nx/jest,@nx/vitest,@nx/playwright— тестирование@nx/docker,@nx/dotnet,@nx/gradle— другие языки и платформы
Каждый плагин включает executors (обёртки над инструментами сборки), generators (скаффолдинг кода) и migrations (автоматические обновления при смене версий). Начиная с Project Crystal, подключение плагина автоматически определяет и конфигурирует задачи проекта без ручного редактирования project.json.
Turborepo не имеет системы плагинов в традиционном понимании. Он полагается на нативные инструменты экосистемы (Vite, ESLint, Jest и др.) и скрипты в package.json. Начиная с версии 2.5, Turborepo добавил экспериментальную поддержку Boundaries — правил для контроля зависимостей между пакетами, но эта функциональность пока не сопоставима с @nx/enforce-module-boundaries.
CI/CD интеграция
Turborepo интегрируется с CI через команду turbo run и Remote Cache. Основная оптимизация — кеширование: если CI-агент уже собирал пакет с теми же входными данными, Turborepo извлечёт результат из кеша. Для GitHub Actions доступен официальный экшн.
# GitHub Actions с Turborepo
name: CI
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm turbo run build test lint
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
Nx предлагает более развитую CI-интеграцию через Nx Cloud. Ключевая возможность — Distributed Task Execution (DTE): Nx Cloud автоматически распределяет задачи между несколькими CI-агентами, обеспечивая максимальный параллелизм. По данным Nx, это сокращает время CI на 60-80% для крупных монорепозиториев.
# GitHub Actions с Nx
name: CI
on: push
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- uses: nrwl/nx-set-shas@v4
- run: pnpm nx affected -t build test lint
env:
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
Команда nx affected — ключевое отличие. Она определяет, какие проекты затронуты изменениями между текущим коммитом и базовой веткой, и запускает задачи только для них. Turborepo не имеет встроенного аналога affected — он полагается на кеш для пропуска неизменных задач, что менее эффективно в некоторых CI-сценариях.
Сводная таблица сравнения
| Критерий | Turborepo | Nx |
|---|---|---|
| Первый релиз | 2021 | 2017 |
| Язык ядра | Rust | TypeScript + Rust (миграция) |
| Кеширование задач | Да (локальное + remote) | Да (локальное + Nx Cloud) |
| Remote Cache бесплатно | Да (Vercel) | Да (до лимита Nx Cloud) |
| Анализ зависимостей | На уровне пакетов | На уровне файлов |
| Affected-команды | Нет | Да (nx affected) |
| Генераторы кода | Нет | Да (обширная библиотека) |
| Плагины | Нет | 60+ официальных |
| Контроль модульных границ | Экспериментально (Boundaries) | Да (enforce-module-boundaries) |
| Визуализация графа | Devtools (с v2.7) | nx graph (встроено) |
| Поддержка не-JS языков | Нет | Да (Docker, .NET, Java, Go) |
| Миграции между версиями | Ручные | Автоматические (nx migrate) |
| Terminal UI | Да (с v2.x) | Да (с Nx 21) |
| Минимальная конфигурация | 1 файл (turbo.json) | 1-2 файла (nx.json + project.json) |
| Скорость на малых проектах | Быстрее (~3x) | Медленнее (инициализация) |
| Скорость на больших проектах | Медленнее | Быстрее (до ~7x) |
| Backing | Vercel | Nx (независимая компания) |
Примеры из практики
Пример 1: Настройка монорепо с Turborepo
Создание нового монорепозитория с Turborepo занимает считанные минуты:
# Инициализация монорепо с pnpm workspaces
pnpm dlx create-turbo@latest my-monorepo
# Структура проекта
# my-monorepo/
# ├── apps/
# │ ├── web/ # Next.js приложение
# │ └── docs/ # Документация
# ├── packages/
# │ ├── ui/ # Общая UI-библиотека
# │ ├── eslint-config/
# │ └── typescript-config/
# ├── turbo.json
# ├── pnpm-workspace.yaml
# └── package.json
Добавим новый пакет — shared-утилиты:
mkdir -p packages/utils/src
// packages/utils/package.json
{
"name": "@repo/utils",
"version": "0.0.0",
"private": true,
"main": "./src/index.ts",
"types": "./src/index.ts",
"scripts": {
"build": "tsup src/index.ts --format cjs,esm --dts",
"test": "vitest run",
"lint": "eslint src/"
}
}
// packages/utils/src/index.ts
export function formatDate(date: Date, locale = 'ru-RU'): string {
return new Intl.DateTimeFormat(locale, {
year: 'numeric',
month: 'long',
day: 'numeric',
}).format(date);
}
export function slugify(text: string): string {
return text
.toLowerCase()
.replace(/[^\w\s-]/g, '')
.replace(/[\s_]+/g, '-')
.replace(/^-+|-+$/g, '');
}
Теперь запустим все задачи:
# Сборка всех пакетов с учётом зависимостей
pnpm turbo run build
# Результат: Turborepo определяет порядок сборки,
# кеширует результаты и при повторном запуске
# выдаёт "FULL TURBO" — мгновенный результат из кеша
Пример 2: Настройка монорепо с Nx
Nx предлагает более управляемый процесс создания проекта:
# Инициализация монорепо с Nx
pnpm dlx create-nx-workspace@latest my-monorepo \
--preset=ts \
--nxCloud=yes
# Добавление плагина React
pnpm nx add @nx/react
# Генерация приложения
pnpm nx g @nx/react:app web \
--bundler=vite \
--style=css \
--unitTestRunner=vitest
# Генерация общей библиотеки
pnpm nx g @nx/react:lib ui \
--bundler=vite \
--unitTestRunner=vitest
Создание компонента в библиотеке:
# Генерация компонента с тестами
pnpm nx g @nx/react:component Button \
--project=ui \
--style=css
Nx автоматически создаст:
// libs/ui/src/lib/button/button.tsx
import styles from './button.module.css';
export interface ButtonProps {
children: React.ReactNode;
variant?: 'primary' | 'secondary';
onClick?: () => void;
}
export function Button({ children, variant = 'primary', onClick }: ButtonProps) {
return (
<button
className={`${styles.button} ${styles[variant]}`}
onClick={onClick}
>
{children}
</button>
);
}
export default Button;
// libs/ui/src/lib/button/button.spec.tsx
import { render } from '@testing-library/react';
import Button from './button';
describe('Button', () => {
it('should render successfully', () => {
const { baseElement } = render(<Button>Click me</Button>);
expect(baseElement).toBeTruthy();
});
});
Контроль модульных границ:
// .eslintrc.json (корневой)
{
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"rules": {
"@nx/enforce-module-boundaries": [
"error",
{
"depConstraints": [
{
"sourceTag": "type:app",
"onlyDependOnLibsWithTags": ["type:lib", "type:util"]
},
{
"sourceTag": "type:lib",
"onlyDependOnLibsWithTags": ["type:lib", "type:util"]
},
{
"sourceTag": "type:util",
"onlyDependOnLibsWithTags": ["type:util"]
}
]
}
]
}
}
]
}
Теперь если разработчик попытается импортировать код из приложения (type:app) в библиотеку (type:lib), ESLint выдаст ошибку. Это предотвращает появление циклических зависимостей и поддерживает чистую архитектуру.
Пример 3: Кастомный генератор в Nx
Одно из сильнейших преимуществ Nx — возможность создавать собственные генераторы для стандартизации кода в команде:
# Создание локального плагина с генератором
pnpm nx g @nx/plugin:plugin my-plugin
pnpm nx g @nx/plugin:generator feature --project=my-plugin
// libs/my-plugin/src/generators/feature/generator.ts
import {
Tree,
generateFiles,
joinPathFragments,
names,
formatFiles,
} from '@nx/devkit';
interface FeatureGeneratorSchema {
name: string;
project: string;
}
export default async function featureGenerator(
tree: Tree,
options: FeatureGeneratorSchema
) {
const { className, fileName } = names(options.name);
const projectRoot = `apps/${options.project}`;
generateFiles(
tree,
joinPathFragments(__dirname, 'files'),
joinPathFragments(projectRoot, 'src/features', fileName),
{
className,
fileName,
template: '',
}
);
await formatFiles(tree);
}
Теперь вся команда создаёт feature-модули единообразно:
pnpm nx g my-plugin:feature user-profile --project=web
# Создаёт стандартизированную структуру:
# apps/web/src/features/user-profile/
# ├── user-profile.tsx
# ├── user-profile.spec.tsx
# ├── user-profile.module.css
# └── index.ts
Когда выбрать Turborepo
Turborepo — оптимальный выбор в следующих сценариях:
1. Малый и средний монорепо (2-15 пакетов). Если ваш проект состоит из нескольких приложений и shared-библиотек, Turborepo даст максимальную скорость с минимальными накладными расходами. На таком масштабе его преимущество в скорости инициализации (~3x) перевешивает отсутствие гранулярного affected-анализа.
2. Команда уже использует workspaces пакетного менеджера. Turborepo не требует изменения существующей структуры проекта. Вы добавляете turbo.json, устанавливаете пакет turbo — и получаете кеширование и параллельное выполнение задач.
3. Проекты на Vercel. Если ваши приложения деплоятся на Vercel, интеграция с Remote Cache происходит автоматически, без дополнительной настройки. Это даёт моментальную отдачу от кеширования в CI.
4. Простой стек без специфических требований к архитектуре. Если ваша команда не нуждается в контроле модульных границ, генераторах кода или поддержке нескольких языков — Turborepo даст всё необходимое без избыточной сложности.
5. Быстрый старт и низкий порог входа. Для стартапов и небольших команд, которым важно начать работу быстро, Turborepo — идеальный выбор. Один файл конфигурации, минимум абстракций.
Когда выбрать Nx
Nx раскрывается в более сложных и масштабных сценариях:
1. Крупные монорепо (20+ пакетов). На масштабе файловый анализ зависимостей и affected-команды дают значительное преимущество. Если ваш репозиторий содержит 50+ проектов, Nx сэкономит часы CI-времени ежедневно.
2. Микрофронтенды и Module Federation. Nx предоставляет первоклассную поддержку Module Federation с генераторами для host- и remote-приложений. Turborepo не имеет аналогичной интеграции.
3. Полиглот-репозитории. Если ваш монорепозиторий содержит код на нескольких языках (JavaScript + Java, TypeScript + .NET), Nx поддерживает это через плагины. Turborepo ограничен JavaScript-экосистемой.
4. Необходимость стандартизации кода. Генераторы Nx позволяют создавать шаблоны для проектов, компонентов, сервисов и других артефактов. Это критически важно для команд из 10+ разработчиков, где единообразие кода снижает когнитивную нагрузку.
5. Строгий контроль архитектуры. Модульные границы (enforce-module-boundaries) предотвращают деградацию архитектуры по мере роста кодовой базы. Для enterprise-проектов это часто обязательное требование.
6. Распределённое выполнение CI. Nx Cloud DTE автоматически распределяет задачи между CI-агентами, что критически важно для монорепо, где полная сборка и тестирование занимают более 30 минут.
Тренды 2026: Rust и AI
Оба инструмента следуют двум ключевым трендам 2026 года: миграция на Rust и интеграция с AI.
Rust-миграция. Turborepo завершил переход с Go на Rust в серии 2.x, получив значительное улучшение производительности хеширования и обхода графа. Nx объявил о миграции критических компонентов ядра с TypeScript на Rust. Части, написанные на Rust, уже используются в продакшне — в частности, новый Terminal UI и core-логика обработки задач. Полная миграция запланирована на 2025-2026 годы.
AI-интеграция. Nx движется в направлении «инфраструктуры для автономных AI-агентов». В Q1 2026 запланированы: MCP-сервер для интеграции с IDE, code mode для управления LLM-контекстом, специализированные агенты для миграций и кодогенерации. Turborepo пока не анонсировал прямой AI-интеграции, но экосистема Vercel активно развивает AI-направление (v0, AI SDK).
Synthetic Monorepos. Nx представил концепцию «синтетических монорепо» — возможность получить преимущества монорепозитория (единый граф, affected-анализ, кеширование) при хранении кода в отдельных репозиториях. Это интересное решение для организаций, которые не могут мигрировать на единый репозиторий по политическим или техническим причинам.
Заключение
Turborepo и Nx не конкурируют напрямую — они занимают разные ниши в спектре решений для монорепозиториев.
Turborepo — это высокопроизводительный таск-раннер, который решает конкретную проблему: быстрое и кешируемое выполнение задач. Он идеально подходит для команд, которым нужна минимальная конфигурация, быстрый старт и интеграция с Vercel. Если ваш монорепо содержит до 15 пакетов и ваша команда не нуждается в генераторах кода или строгом контроле архитектуры, Turborepo — отличный выбор.
Nx — это полноценная платформа, которая не только оркестрирует задачи, но и помогает строить, поддерживать и масштабировать архитектуру монорепозитория. Генераторы кода, контроль модульных границ, affected-анализ на уровне файлов и распределённое выполнение CI делают Nx предпочтительным выбором для крупных команд и enterprise-проектов.
Хорошая новость в том, что оба инструмента продолжают активно развиваться. Turborepo стабильно наращивает функциональность (Devtools, Boundaries, sidecar tasks), а Nx расширяет экосистему (Docker, .NET, AI-агенты). Какой бы инструмент вы ни выбрали, монорепозиторий в 2026 году — это проверенный подход к организации кода, и оба инструмента помогут вам реализовать его эффективно.
Источники
- Turborepo — официальная документация
- Nx — официальная документация
- Nx 2026 Roadmap: Expanding Agent Autonomy
- Turborepo, Nx, and Lerna: The Truth about Monorepo Tooling in 2026
- Nx vs Turborepo: Integrated Ecosystem or High-Speed Task Runner?
- Benchmarking Nx and Turborepo — large-monorepo
- Wrapping Up 2025 — Nx Blog
- Turborepo 2.7 Release Blog