> For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.

# v0.10.0

Released: October 24, 2026

Node.js 24 and NestJS 12 are the headline: new projects start on Node 24, with `node:24-slim` images and Node 24 CI workflows, and every NestJS package is on 12. The rest of the stack moves with it: Next.js 16.4, React 19.3, Prisma 7.10, ioredis 6, BullMQ 6, OpenTelemetry 3, the current Google and Azure SDKs, and the toolchain (lerna 10, Rslib 1.0, Rstest 0.12, Vitest 5). Existing projects need the upgrade steps below.

***

## Node.js 24

- **Node 24.15 or later** everywhere: `engines` in the templates and the published packages, `node:24-slim` in the generated Dockerfiles, Node 24 in the generated GitHub workflows. Node 24 is in long-term support until April 2028.
- `@types/node` 24 in every template.

## NestJS 12

- `@nestjs/common`, `core`, `platform-express` and `testing` 12.2, `cli` 12.0, `swagger` 12.0, `config` 12.0 and `@nestjs/bullmq` 12.0 in the services, nest-common and the templates.
- The Nest 12 packages are ES modules. The services stay CommonJS and load them through Node's `require(esm)`. Jest needs `NODE_OPTIONS=--experimental-vm-modules`; the template test scripts carry it.
- Generated clients accept `@nestjs/swagger` 11 or 12.

## Dependencies

- **Frontend:** Next.js 16.4.3, React 19.3.1, eslint-config-next 16.4, Vitest 5, shadcn CLI 4 (the checked-in components are unchanged).
- **Services:** Prisma 7.10.1, ioredis 6, BullMQ 6, compression 1.8.2.
- **nest-common:** OpenTelemetry SDK 3.0 with the 0.300 exporters, Google Cloud Storage 8 and Secret Manager 7. The Redis connections the framework opens stay on the RESP2 protocol.
- **CLI:** googleapis 188, google-auth-library 11, the Google Cloud and Azure management SDK majors, MCP SDK 1.32 (cli-mcp 0.8.0).
- **Toolchain:** lerna 10, Rslib 1.0, Rstest 0.12, eslint 10.13, typescript-eslint 8.72. TypeScript stays on 6.0.
- `npm audit` on a fresh project reports one advisory, in the msal-node dependency of `@azure/identity`, pending its next release.

## Fixes

- The email confirmation page sends the confirmation once. In development, React Strict Mode mounted it twice and the second request failed on the used token.

## Breaking changes

Pre-1.0, so they ship in a minor version. The upgrade guide below covers each.

- **Node.js:** 24.15 or later is required for the CLI, the services and the tests. Deploys build `node:24-slim` images; generated CI runs on Node 24.
- **NestJS 12:** ES-module packages. Jest scripts need `NODE_OPTIONS=--experimental-vm-modules`. Lifecycle hooks run in a new order across modules. `@nestjs/config` validation options move under `validationOptions.libraryOptions` if you use Joi schemas.
- **BullMQ 6:** the legacy `repeat` job option, `Job.discard()`, `debounce` and `Queue.client` are gone; repeatable jobs use job schedulers.
- **ioredis 6:** connections you create yourself speak RESP3 by default (RESP2 on Redis 5 and older); the framework's own connections pin `protocol: 2`.
- **OpenTelemetry 3:** `@opentelemetry/sdk-trace-node` no longer exists; tracing you set up yourself moves to `@opentelemetry/sdk-trace`. `TelemetryModule` needs no change.
- **shadcn 4:** `npx shadcn add` generates components in the new registry style (`radix-ui` and `cn` packages). Existing components keep working.
- **dotenv 18** in nest-common: `.env.vault` files are not read.

## nest-common 0.10.0

NestJS 12, OpenTelemetry 3, ioredis 6 and BullMQ 6. `@nestjs/jwt` is no longer a dependency. The module and service APIs are unchanged.

## Upgrading an existing project

**1. Node 24.** Install 24.15 or later and set `"engines": { "node": ">=24.15.0" }` in the root `package.json` and in each app.

**2. Root packages, overrides, nx.**

```bash
npm install -D @tsdevstack/cli@^0.10.0 lerna@^10.1.1
```

In the root `package.json`, add these `overrides` next to the existing ones:

```json
"@nestjs/platform-express": { "multer": "^2.5.0" },
"@nestjs/swagger": { "js-yaml": "^5.5.0" },
"nx": { "axios": "^1.18.1", "brace-expansion": "^5.0.8", "undici": "^7.30.1" }
```

Add an `nx.json` with `{ "neverConnectToCloud": true }` so lerna's task runner stays offline, and add `.nx/`, `**/.rstack/` and `**/.vitest/` to `.gitignore`.

**3. NestJS services.** For each service:

```bash
npm install @tsdevstack/nest-common@^0.10.0 @nestjs/common@^12.2.0 @nestjs/core@^12.2.0 @nestjs/platform-express@^12.2.0 @nestjs/swagger@^12.0.4 @prisma/client@^7.10.1 @prisma/adapter-pg@^7.10.1 ioredis@^6.0.0 compression@^1.8.2 -w <service>
npm install -D @nestjs/cli@^12.0.10 @nestjs/schematics@^12.0.0 @nestjs/testing@^12.2.0 prisma@^7.10.1 @types/node@^24.19.2 -w <service>
```

The auth service also takes `@nestjs/config@^12.0.1`. Remove `@types/ioredis` if present (ioredis ships its own types). Prefix the Jest scripts in each service's `package.json`:

```json
"test": "NODE_OPTIONS=--experimental-vm-modules jest",
"test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch",
"test:cov": "NODE_OPTIONS=--experimental-vm-modules jest --coverage",
"test:e2e": "NODE_OPTIONS=--experimental-vm-modules jest --config ./test/jest-e2e.json"
```

**4. Frontend.**

```bash
npm install next@^16.4.3 react@^19.3.1 react-dom@^19.3.1 axios@^1.20.0 zod@^4.6.7 -w frontend
npm install -D eslint-config-next@^16.4.3 vitest@^5.0.5 @vitest/coverage-v8@^5.0.5 jsdom@^29.1.1 shadcn@^4.22.1 @types/node@^24.19.2 -w frontend
```

Optional: in `app/(public)/confirm/confirm-client.tsx`, guard the effect with a ref as the template does, so the confirmation is sent once in development.

**5. Generated clients.** Set `"@nestjs/swagger": "^11.0.0 || ^12.0.0"` in each client's `peerDependencies`, or regenerate them:

```bash
npx tsdevstack generate-client <service>
```

**6. Install and check.** `npm install`, then `npm run build` and `npm run test`. Vitest 5 clears mock history before each test; tests that counted calls across tests need their own setup.

**7. Regenerate CI and deploy.**

```bash
npx tsdevstack infra:generate-ci
npx tsdevstack infra:deploy --env <env>
```

The deploy builds the services on `node:24-slim`.

New projects get all of this from the templates.
