Skip to content

Troubleshooting

Known issues, what causes them, and how to fix them.

Requirements

Zenith requires Node.js 20.9 or newer, enforced by Next.js 16. Check your version with node --version.

createContext is not a function on npm run dev

Affects v1.1.3 and earlier. The dev server fails while compiling a route, pointing at src/app/not-found.tsx:

 TypeError: react__WEBPACK_IMPORTED_MODULE_0__.createContext is not a function
    at eval (webpack-internal:///(rsc)/./src/app/not-found.tsx)
 TypeError: createContext only works in Client Components.
   Add the "use client" directive at the top of the file to use it.

Cause. @dashboardpack/core imported Radix's Slot from the radix-ui barrel, which evaluates every Radix primitive on import — and several of them call React.createContext() at module scope. Because not-found.tsx is a Server Component that imports Button, the barrel was pulled into the React Server Component graph, where createContext does not exist.

Whether it actually crashed depended on whether your bundler tree-shook the barrel, so the same source failed on some machines and worked on others.

Fix. Upgrade to @dashboardpack/core ^1.2.1, which imports @radix-ui/react-slot directly.

npm install @dashboardpack/core@^1.2.1

Scripts that fail on v1.1.3

v1.1.3 added several overrides to silence audit findings. Each forced a breaking major onto a package that could not handle it, and each broke a script. All are fixed in v1.1.4 — if you are patching an older copy, edit the overrides block in package.json and reinstall.

ScriptErrorRemove this override
npm run testMODULE_NOT_FOUND for undici/lib/handler/wrap-handler.jsundici
npm run lintTypeError: expand is not a functionbrace-expansion
npm run build-storybookloadPartialConfig expects a callback@babel/core

npm run lint also crashed under ESLint 10, which removed the context.getFilename() API that eslint-plugin-react still calls. Zenith pins eslint to ^9 for this reason — do not upgrade it until eslint-config-next supports v10.

Lint reports thousands of findings

If npm run lint reports findings with very large column numbers, it is linting generated output. Make sure storybook-static/, coverage/ and playwright-report/ are listed in globalIgnores in eslint.config.mjs. A clean run reports 8 findings.

ERESOLVE on install

Usually a stale lockfile pinning a transitive peer — the Tiptap packages, for example, require an exact matching @tiptap/pm. A clean resolve fixes it:

rm -rf node_modules package-lock.json
npm install

If it persists, npm install --legacy-peer-deps is safe here.

Keep installs reproducible

Install with the bundled package-lock.json in place. Deleting it re-resolves every caret range to whatever is newest that day, which is how several of the issues above first surfaced. Use npm ci in CI and for clean checkouts.

Still stuck?

Check the Changelog for fixes in newer releases, or the Installation guide to verify your setup.