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.1Scripts 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.
| Script | Error | Remove this override |
|---|---|---|
npm run test | MODULE_NOT_FOUND for undici/lib/handler/wrap-handler.js | undici |
npm run lint | TypeError: expand is not a function | brace-expansion |
npm run build-storybook | loadPartialConfig 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 installIf 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.