The repository uses pnpm as its package manager and Turborepo to orchestrate tasks across the monorepo. Most commands are run from the repository root; some are also available scoped to individual workspaces.
Node.js 24.x and pnpm 10.28.2 are required. See the devEngines field in the root package.json for authoritative version requirements.
Development
| Command | Description |
|---|
pnpm dev | Start the Next.js development server with hot reload |
pnpm build | Production build for all packages and the site |
pnpm deploy | Static-export build (NEXT_PUBLIC_STATIC_EXPORT=true) |
pnpm start | Start the production Next.js server after build |
| Command | Description |
|---|
pnpm dev | next dev — development server |
pnpm build | next build — production build (also runs build:blog-data first) |
pnpm build:blog-data | Pre-computes blog metadata used by the RSS feeds and listing pages |
pnpm build:blog-data:watch | Re-runs blog data compilation on file changes |
pnpm deploy | Static export build |
pnpm start | next start — serve the production build |
# Start the development server
pnpm dev
# Build for production
pnpm build
# Start the production server
pnpm start
Code quality
Linting
| Command | Description |
|---|
pnpm lint | Run all linters (JS/TS, CSS, Markdown) |
pnpm lint:fix | Run all linters with auto-fix enabled |
The lint command is a composite that runs three sub-linters in sequence:
| Sub-command | Tool | Targets |
|---|
lint:js | ESLint | **/*.{js,mjs,ts,tsx} |
lint:css | Stylelint | **/*.css |
lint:md | ESLint + eslint-plugin-mdx | **/*.md?(x) |
Each has a corresponding :fix variant that passes --fix to the underlying tool.
| Command | Description |
|---|
pnpm prettier | Check formatting with Prettier (no changes written) |
pnpm prettier:fix | Apply Prettier formatting |
pnpm format | Alias that runs prettier:fix and all lint:fix tasks together |
# Check formatting without making changes
pnpm prettier
# Apply Prettier formatting
pnpm prettier:fix
# Run all fixers at once
pnpm format
Type checking
Runs tsc --noEmit across all TypeScript workspaces.
Testing
| Command | Description |
|---|
pnpm test | Run all unit tests |
pnpm test:unit | Alias for pnpm test |
pnpm test:ci | Run unit tests with CI reporters (lcov, JUnit, GitHub annotations) |
# Run all unit tests
pnpm test
# Run tests with CI output formats
pnpm test:ci
The test:ci command sets NODE_OPTIONS to enable three reporters simultaneously:
NODE_OPTIONS="\
--test-reporter=lcov --test-reporter-destination=lcov.info \
--test-reporter=junit --test-reporter-destination=junit.xml \
--test-reporter=@reporters/github --test-reporter-destination=stdout"
For Playwright end-to-end tests, run directly from apps/site:
pnpm --filter @node-core/website playwright
Storybook
| Command | Description |
|---|
pnpm storybook | Start the Storybook development server |
pnpm storybook:build | Build a static Storybook for deployment |
# Start Storybook
pnpm storybook
# Build static Storybook
pnpm storybook:build
Scripts
Release post generator
pnpm scripts:release-post -- --version=vXX.X.X
Generates a release blog post at apps/site/pages/en/blog/release/vX.Y.Z.md by fetching data from the Node.js dist server and GitHub changelog. Pass --force to overwrite an existing file:
pnpm scripts:release-post -- --version=v24.0.0 --force
See Writing Blog Posts for full usage details.
Cloudflare deployment
| Command | Description |
|---|
pnpm cloudflare:deploy | Build and deploy to Cloudflare Workers |
pnpm cloudflare:preview | Local preview with wrangler dev |
Compilation
Runs the compile Turborepo task across all packages. Used to compile TypeScript packages (e.g. @node-core/ui-components) before publishing.