Troubleshooting
Search this page for the exact text your console printed. Every entry below is derived from a real failure this repository actually produces — a thrown provider error, a starter script guard, a CI verification script, or a CLI validation message — not from a generic checklist.
Every entry uses the same schema:
| Field | What it tells you |
|---|---|
| Symptom / exact error | The literal string to match against your output. |
| Applies to | Expo, bare React Native, Web, CLI/source ownership, or the repository itself. |
| Likely cause | The one condition that produces this message. |
| Fix | The change to make. |
| Verify | The command whose success proves it. |
| Relevant versions | The tested/promised range this entry is valid for. |
| Still broken | Next diagnostic, then where to file. |
Prerequisites: the exact error string or symptom from your own console/build output, and which platform (Expo, bare React Native, Web) it happened on — this page is searched by literal text, not read top to bottom.
Providers, overlays, and safe area
Section titled “Providers, overlays, and safe area”BeeUI anchored overlays require BeeUIProvider at the application root.
Section titled “BeeUI anchored overlays require BeeUIProvider at the application root.”This is BeeUI’s provider-not-found error: no BeeUIProvider was found above the component in
the tree.
- Applies to: Expo · bare React Native · Web. Thrown by
Popover,Select,DropdownMenu,Tooltip,DatePicker,DateTimePicker, and anything else that mounts an anchored overlay. - Likely cause: the component rendered outside
BeeUIProvider. Most often the provider is mounted inside a route/screen instead of at the application root, or a test/story renders the component in isolation. - Fix: mount exactly one
BeeUIProviderat the true application root, above your router and above every screen.
import { BeeUIProvider, SafeArea, Screen } from '@beemvp/beeui-ui';
export default function App() { return ( <BeeUIProvider> <Screen> <SafeArea edges={['top', 'left', 'right']} className="flex-1"> {/* routes and screens */} </SafeArea> </Screen> </BeeUIProvider> );}- Verify: the overlay opens and closes;
Escape(Web) or the Android hardware back button dismisses the topmost overlay only. - Relevant versions: all currently tested React Native (
>=0.86.0 <0.87.0) and Web rows. - Still broken: you likely have two independent roots (for example a second provider mounted by a modal library) each arbitrating its own dismiss stack. Collapse them to one. Read Provider & safe area.
BeeUI toast APIs require BeeUIProvider at the application root.
Section titled “BeeUI toast APIs require BeeUIProvider at the application root.”- Applies to: every platform. Thrown by
useToast(). - Likely cause:
useToast()was called from a component that is not a descendant ofBeeUIProvider— commonly a component rendered by a portal/host that escaped the provider subtree, or a unit test with no provider wrapper. - Fix: move the caller inside the provider subtree, or wrap the test render in
BeeUIProvider. - Verify: calling
show()renders a toast in the provider’s viewport. - Relevant versions: all tested rows.
- Still broken: confirm the toast scope you expect — a nested provider reuses the supported root runtime rather than creating a second, competing toast host.
BeeUI toast show() requires a descriptor with a string title.
Section titled “BeeUI toast show() requires a descriptor with a string title.”Also: BeeUI toast show() requires a non-empty string title.
- Applies to: every platform. Thrown by
useToast().show(). - Likely cause:
show()was called with a bare string, withundefined, or with a descriptor whosetitleis empty. The toast API takes a descriptor object and refuses to render an unannounceable, unlabelled toast. - Fix: pass
{ title: 'Saved' }(a non-empty string), plus any optional description. - Verify: the toast renders and is announced by the screen reader.
- Relevant versions: all tested rows.
- Still broken: if the title is user-supplied, guard the empty case before calling
show()— BeeUI deliberately fails loudly rather than announcing a blank toast.
Safe area duplicated: content is double-inset, or sits under the notch / home indicator
Section titled “Safe area duplicated: content is double-inset, or sits under the notch / home indicator”This is BeeUI’s safe-area-duplicated symptom and its mirror image: the same physical edge gets padded twice, or no component pads it at all.
- Applies to: iOS and Android. Web starters intentionally use no
SafeArea. - Likely cause: either two nested components each claim the same edge (double inset,
i.e. the safe-area padding is duplicated), or no component claims an edge that actually
touches system UI (content underlaps).
Screen, headers, and bottom bars do not silently own all four insets. - Fix: assign each physical edge to exactly one
SafeArea. The verified starter shape isedges={['top', 'left', 'right']}on the outer shell, leaving the bottom edge to whichever bottom bar actually renders there. - Verify: rotate the device and toggle a bottom bar; no content is clipped and no gap doubles.
- Relevant versions:
react-native-safe-area-context>=5 <6, tested at5.7.0. - Still broken: read Provider & safe area, which documents nested-provider behavior, overlay scopes, and toast scope explicitly.
Expo and Metro resolution
Section titled “Expo and Metro resolution”packages/<pkg>/dist is missing. Run "pnpm build" ...
Section titled “packages/<pkg>/dist is missing. Run "pnpm build" ...”- Applies to: every starter under
examples/, and both consumer verification scripts. Thrown byexamples/scripts/pack-beeui-packages.mjs. - Likely cause: you ran a starter’s
setup.shbefore building the workspace. The packer refuses to produce a tarball from an unbuilt package. - Fix: build from the repository root first, then re-run setup.
pnpm buildbash setup.sh- Verify:
setup.shprints its packing step and installsbeemvp-beeui-<pkg>-<version>.tgztarballs. - Relevant versions: Node
24.13.1, pnpm10.15.0(this repository is engine-strict). - Still broken: confirm your Node major matches; an engine mismatch fails the workspace install long before packing.
node_modules is missing; run setup.sh first.
Section titled “node_modules is missing; run setup.sh first.”Also: app/ is missing; run setup.sh first. (bare) and
Web consumer is missing; run prepare first. / Production build is missing; run build first. (CI script).
- Applies to: the
examples/*starters andscripts/verify-*-consumer.sh. - Likely cause: a bundle/build step ran before its prepare step, or a previous setup run failed partway and left no installed tree.
- Fix: run the steps in order — root
pnpm build, thenbash setup.sh, thenbash bundle.sh(Expo/bare) ornpm run build(Web). - Verify: the step prints its own
OK:success line. - Relevant versions: all.
- Still broken: delete the starter’s
node_modulesand.beeui-tarballsand re-run setup from a clean state.
Expected Android bundle output missing under dist/_expo/static/js/android
Section titled “Expected Android bundle output missing under dist/_expo/static/js/android”Also the iOS variant, Expected iOS bundle output missing under dist/_expo/static/js/ios.
- Applies to: Expo (
examples/expo-package-consumer/bundle.sh). - Likely cause:
expo exportran but did not emit every platform — usually because the platform list was narrowed, or an earlier Metro resolution error aborted one platform while the command still exited zero. - Fix: export all platforms and read the Metro log above the assertion for the first unresolved module.
- Verify:
bash bundle.shprintsOK: Expo export produced Android, iOS, and Web bundle output under dist/. - Relevant versions: Expo SDK
~57.0.0with@expo/metro-runtime ~57.0.12. Expo is not a peer dependency of BeeUI. - Still broken: a missing optional native peer (bottom sheet, reanimated, gesture-handler, worklets, datetimepicker) resolves on one platform and not another. Compare your installed set to Compatibility.
Metro cannot resolve a BeeUI module, or resolves two copies
Section titled “Metro cannot resolve a BeeUI module, or resolves two copies”- Applies to: Expo and bare React Native.
- Likely cause: the consumer installed BeeUI through a workspace link or a copied
dist/instead of a real packed tarball, so Metro sees duplicate React/React Native instances. The supported package boundary is a realpnpm packtarball installed withnpm install --save-exact. - Fix: re-run the starter
setup.sh, which packs and installs tarballs, and remove any hand-addedfile:link into the monorepo. - Verify:
bash bundle.shcompletes and the app renders. - Relevant versions: React
>=19 <20(tested19.2.3), React Native>=0.86.0 <0.87.0(tested0.86.2). - Still broken: the committed starter manifests contain historical tarball filenames
that
setup.shrewrites at install time — never copy those strings by hand as a dependency spec.
Bare React Native native builds
Section titled “Bare React Native native builds”This bare RN consumer unexpectedly resolves the Expo runtime.
Section titled “This bare RN consumer unexpectedly resolves the Expo runtime.”Also: Bare consumer unexpectedly resolves the Expo runtime. (CI) and
This Web consumer unexpectedly resolves the Expo runtime; it must stay independent of the Showcase's Expo path.
- Applies to: the bare React Native and Web isolation guards.
- Likely cause: an Expo package leaked into the consumer tree — commonly by installing from inside the monorepo, or by adding a dependency that pulls Expo transitively. The guard exists because a bare or Web consumer that silently borrows the Expo runtime is not evidence that BeeUI works without Expo.
- Fix: install the consumer outside the workspace, from packed tarballs only, and remove the Expo-pulling dependency.
- Verify:
node -e "require.resolve('expo')"fails inside the consumer directory, and setup completes. - Relevant versions: all.
- Still broken: inspect the dependency path with your package manager’s
why/lsoutput before adding overrides.
Android compile fails with Unresolved reference 'uiImplementation'
Section titled “Android compile fails with Unresolved reference 'uiImplementation'”- Applies to: bare React Native and Expo prebuild on Android.
- Likely cause: React Native
0.87.x. This is an upstream incompatibility inreact-native-safe-area-context@5.7.0against RN 0.87’s native surface — it is not a BeeUI defect, and it is the documented root cause of RN 0.87’s exclusion. - Fix: pin React Native inside
>=0.86.0 <0.87.0(tested at0.86.2). - Verify:
./gradlew assembleDebugproducesapp/build/outputs/apk/debug/app-debug.apk. - Relevant versions: RN
0.86.2is the only version this repository builds and tests. RN0.85has no evidence class at all; RN0.87is tested and explicitly excluded. - Still broken: see the RN rows in Compatibility before widening a peer range.
A native module is undefined at runtime after adding a dependency
Section titled “A native module is undefined at runtime after adding a dependency”- Applies to: iOS and Android.
- Likely cause: the JavaScript bundle refreshed but the native app did not rebuild. A Fast Refresh cannot link native code.
- Fix: reinstall pods (iOS) and rebuild the native app after any native dependency change. In an Expo project, re-run prebuild before the native build.
- Verify: a clean
assembleDebug(Android) orxcodebuild ... build(iOS) succeeds and the module is defined at runtime. - Relevant versions: optional native peers are
@gorhom/bottom-sheet >=5.2 <6,react-native-reanimated >=4.5 <5,react-native-gesture-handler >=2.32 <3,react-native-worklets >=0.10 <1,@react-native-community/datetimepicker >=9.1 <10. - Still broken: confirm the peer is actually installed in the consumer, not only in the workspace.
Web: aliasing, styles, and theme
Section titled “Web: aliasing, styles, and theme”The Web app renders, but everything is unstyled
Section titled “The Web app renders, but everything is unstyled”- Applies to: Vite +
react-native-web, and Expo Web. - Likely cause: the CSS entry file is incomplete. BeeUI’s semantic theme is delivered as
CSS custom properties from
@beemvp/beeui-tokens/theme.css; without it, class names resolve to nothing. The@sourcelines are equally required — they tell the styling engine to scan BeeUI’s own source for the classes it emits. - Fix: the verified CSS entry is exactly five lines:
@import 'tailwindcss';@import 'uniwind';@import '@beemvp/beeui-tokens/theme.css';
@source '../node_modules/@beemvp/beeui-core/src';@source '../node_modules/@beemvp/beeui-ui/src';- Verify:
npm run buildsucceeds and the built page shows themed surfaces, not browser defaults. - Relevant versions: Tailwind CSS
>=4 <5(tested4.3.3), Uniwind>=1.10.1 <2(tested1.10.1),react-native-web0.21.0exact. - Still broken: confirm the entry file is actually imported by your app entry, and that
the path in each
@sourceline matches where your package manager installed BeeUI. Read Web onboarding.
Metro builds, but native styling is missing
Section titled “Metro builds, but native styling is missing”- Applies to: Expo and bare React Native.
- Likely cause:
metro.config.jsdoes not wrap the default config withwithUniwindConfig, orcssEntryFilepoints at a file that is not the entry above.cssEntryFileis relative to the project root wheremetro.config.jslives (for example./global.cssat the root), not tosrc/or any other subdirectory. - Fix: wrap the whole file — a bare options object with no
require/module.exportswrapper is not valid Metro config — and pointcssEntryFileat your real CSS entry:
const { getDefaultConfig } = require('expo/metro-config');const { withUniwindConfig } = require('uniwind/metro');
module.exports = withUniwindConfig(getDefaultConfig(__dirname), { cssEntryFile: './global.css', dtsFile: './uniwind-types.d.ts',});- Verify:
bash bundle.shsucceeds and the running app is themed. - Relevant versions: as above.
- Still broken: if you ship extra brand or high-contrast runtime themes, they must also be declared to the Metro config’s theme list, or those theme names will not exist at runtime. See Branding.
Web components render but react-native-web types or aliases fail
Section titled “Web components render but react-native-web types or aliases fail”- Applies to: Vite +
react-native-web. - Likely cause: the Vite plugin set is incomplete. The verified plugin order is the
react-native-webplugin, the Tailwind plugin, and the Uniwind plugin with the samecssEntryFile/dtsFilevalues your CSS entry uses. - Fix: match
examples/web-consumer/vite.config.ts. - Verify:
npx vite buildsucceeds anddist/index.htmlis non-empty. - Relevant versions: Vite
8.2.2,vite-plugin-rnw0.0.12(pre-1.0, not peer-declared),@tailwindcss/vite4.3.3. - Still broken: BeeUI’s Web contract covers Chromium via Playwright, and the Metro and Vite bundlers only. Next.js, Webpack, Parcel, SSR, and SSG are not claimed. Read Web compatibility.
Unsupported compatibility combinations
Section titled “Unsupported compatibility combinations”unsupported Node.js version v22.x.x. The BeeUI CLI requires Node >=24 ...
Section titled “unsupported Node.js version v22.x.x. The BeeUI CLI requires Node >=24 ...”- Applies to: the source-ownership CLI.
- Likely cause: the CLI ran on Node 22 or older. Node 24 is the only major this repository develops and tests on, so the CLI fails loudly instead of dying later with an obscure syntax or API error.
- Fix: switch to Node 24 (
nvm use) and retry. - Verify:
npx @beemvp/beeui-cli@next doctorprints anOKline naming your Node version (pnpm beeui doctorfrom a BeeUI checkout). - Relevant versions: repository toolchain Node
24.13.1exact; CLI engine>=24. Node 22 has no evidence and is not promised. - Still broken: the workspace is
engine-strict, so an install under the wrong Node fails before the CLI is even reachable.
An install fails complaining about an unsupported engine
Section titled “An install fails complaining about an unsupported engine”- Applies to: the repository itself.
- Likely cause: a Node/pnpm version outside the pinned toolchain. The repository pins
Node in
package.json,.nvmrc, and.node-version, and enforces it withengine-strict. - Fix: use Node
24.13.1and pnpm10.15.0. - Verify:
pnpm installcompletes, thenpnpm build. - Relevant versions: as pinned above; these are machine-checked, so they cannot drift from the compatibility matrix silently.
- Still broken: consumer projects are your engine policy, not BeeUI’s — only this repository is engine-strict.
A combination “should” work but has no evidence
Section titled “A combination “should” work but has no evidence”- Applies to: any peer you are considering.
- Likely cause: you are reading a promised semver range as if it were a tested version. BeeUI states both, and they are not the same claim: the promise is the peer range, the evidence is the single tested pin.
- Fix: treat Current tested versions as the evidence, and the peer ranges as the promise.
- Verify: reproduce your combination through the starter path for your platform before depending on it.
- Relevant versions: the generated table is the authority; it is regenerated from the machine-checked matrix and is never hand-edited.
- Still broken: TypeScript in particular has no single machine-checked pin — the
consumer scripts pin
typescript@5.9.3, but that is a script pin, not a verified compatibility row.
CLI and source-ownership conflicts
Section titled “CLI and source-ownership conflicts”Every command below is shown as a consumer would run it, npx @beemvp/beeui-cli@next <command>
(pin @0.86.2-rc.3 instead of @next for an immutable version). The repository-local
equivalent from a BeeUI checkout is the same command name under pnpm beeui <command> — see
CLI & source ownership for that distinction.
refusing to overwrite existing files: <paths>; rerun with --overwrite only if replacement is intentional
Section titled “refusing to overwrite existing files: <paths>; rerun with --overwrite only if replacement is intentional”- Applies to:
add .... - Likely cause: the destination already contains a file with different content — usually because you already added that component and then edited it. The CLI refuses to silently destroy owned source.
- Fix: inspect the difference first, then decide.
npx @beemvp/beeui-cli@next diffnpx @beemvp/beeui-cli@next add --dry-run buttonOnly then re-run with --overwrite if replacement really is what you want.
- Verify:
npx @beemvp/beeui-cli@next diffreports no unexpected drift afterwards. - Relevant versions: registry
schemaVersion: 1,beeui.config.jsonschema v1. - Still broken: if you want to keep local edits and take upstream changes, use
npx @beemvp/beeui-cli@next update, which never touches a locally edited file unless the upstream source for that same file also changed.
unknown or unsupported registry item '<name>'
Section titled “unknown or unsupported registry item '<name>'”- Applies to:
add .... - Likely cause: a typo, or an internal (non-public) registry item. Only public items are addable.
- Fix: list the addable surface and copy the exact name.
npx @beemvp/beeui-cli@next list- Verify: the add plan resolves, including transitive registry dependencies.
- Relevant versions: registry
schemaVersion: 1. - Still broken: private utilities are intentionally not addable; they arrive only as dependencies of a public item.
malformed beeui.config.json: ... / unknown config field '<key>' / config.themeFile must point to a .css file
Section titled “malformed beeui.config.json: ... / unknown config field '<key>' / config.themeFile must point to a .css file”- Applies to: every CLI command that reads the project config.
- Likely cause: the config was hand-edited into an invalid shape, or carries a field outside the supported schema.
- Fix: correct the offending field, or remove the file and regenerate a default one.
npx @beemvp/beeui-cli@next initinit never overwrites an existing config, so remove the broken file first if you want a
fresh one.
- Verify:
npx @beemvp/beeui-cli@next doctorreports a validbeeui.config.json. - Relevant versions: config schema v1 —
componentsDir,libDir,themeFile. - Still broken: a config schema bump that is not backward compatible is a MAJOR change under Migration & versioning; an unexpected bump means you are running a mismatched CLI.
bundled registry integrity manifest is missing or unreadable ... the installed @beemvp/beeui-cli package may be corrupted — reinstall the package
Section titled “bundled registry integrity manifest is missing or unreadable ... the installed @beemvp/beeui-cli package may be corrupted — reinstall the package”- Applies to:
doctor,diff,update, andadd. - Likely cause: the CLI’s bundled registry data is absent or unreadable. The registry ships inside the CLI package and is never fetched over the network, so a missing manifest means the package tree itself is damaged or partially built.
- Fix: as a consumer, reinstall the package (
npm install @beemvp/beeui-cli@nextagain, or clear thenpxcache) so a fresh, complete build is fetched. From a BeeUI checkout, rebuild the CLI instead:
pnpm --filter @beemvp/beeui-cli run build- Verify:
npx @beemvp/beeui-cli@next doctorprintsBeeUI doctor OK: registry schema v1, ... public components, valid beeui.config.json.(pnpm beeui doctorfrom a checkout). - Relevant versions: CLI engine
>=24. - Still broken: in a source-ownership starter,
Expected packed CLI binary missing: <path>means the same thing one step earlier — the CLI build has not run yet.
This starter unexpectedly resolves @beemvp/beeui-ui; source ownership must not depend on it.
Section titled “This starter unexpectedly resolves @beemvp/beeui-ui; source ownership must not depend on it.”- Applies to:
examples/source-ownership-starter. - Likely cause: the component package leaked into a project that is supposed to own its source outright. Source ownership means the copied files are yours; depending on the package as well defeats the model and hides which copy is actually rendering.
- Fix: remove the package dependency. A source-owning project keeps only
@beemvp/beeui-tokensplus the ordinary React/React Native peers. - Verify:
node -e "require.resolve('@beemvp/beeui-ui')"fails, andnpm run buildstill succeeds. - Relevant versions: all.
- Still broken: read CLI & source ownership for the exact boundary between the two consumption models.
'add' requires at least one component name, or use --all
Section titled “'add' requires at least one component name, or use --all”Related usage errors: 'add --all' does not accept explicit item names,
unknown add option '<flag>', unknown command '<x>'. Run 'beeui help' for usage.
- Applies to: the CLI argument parser.
- Likely cause: a malformed invocation. If you are invoking through
pnpm beeuifrom a BeeUI checkout, note the--separator: everything after it belongs to the CLI, not to pnpm. - Fix: run
npx @beemvp/beeui-cli@next help(pnpm beeui helpfrom a checkout) and copy the exact form. - Verify: the command runs and exits
0. - Relevant versions: commands are
help,version,init,list,add,doctor,verify,diff,update. Every failure exits1with the reason on stderr. - Still broken: do not assume a flag exists because another tool has it — the help output is the contract.
Stale generated assets
Section titled “Stale generated assets”A docs page is missing, empty, or contradicts the source
Section titled “A docs page is missing, empty, or contradicts the source”- Applies to: this documentation site.
- Likely cause: you are looking at a generated page that has not been regenerated, or someone hand-edited one. The per-component reference, the pattern reference, the tested-versions table, the current-release table, the route manifest, and the release state are all generated and git-ignored.
- Fix: regenerate them; never hand-edit a generated file. Edits are silently discarded on the next build.
- Verify: the page rebuilds with the expected content, and the docs checks pass.
- Relevant versions: all.
- Still broken: if a generated page disagrees with a hand-written one, the generated page is authoritative — file the hand-written page as the defect.
A docs build fails a publication-truth check
Section titled “A docs build fails a publication-truth check”- Applies to: contributors editing documentation.
- Likely cause: a page showed a registry-install or public-CLI command for a BeeUI
package with no
@next/exact-version tag — must not be left bare/unqualified — or one that does not match the current dist-tag policy (see the release status on the Start page). During the0.86.2prerelease linelatestfollows the newest complete, verified RC only after the owner moves it, so it can lagnext(the last observed target is recorded indocs/dist-tag-policy.md).scripts/check-public-doc-truth.mjstherefore rejects a bare, unqualified install, unless the same line explicitly negates the command (for example, “do not install unqualified”). - Fix: pin every registry-install/CLI example to
@nextor the exact release-candidate version (the lockstep version authored inpackages/ui/package.json), matchingdocs/dist-tag-policy.md. For an example that intentionally documents a repository-local path instead (workspace commands, starter scripts,pnpm beeui ...), say so explicitly on the same line. - Verify:
node ./scripts/check-public-doc-truth.mjsandnode ./scripts/check-doc-examples.mjsboth pass. - Relevant versions: current publication state per
docs/dist-tag-policy.md. - Still broken: every identifier a doc example imports must be a real public export, and
every
pnpm beeui addtarget must be a real public registry item — the checks fail on invented names.
Registry, exports, and source drift apart
Section titled “Registry, exports, and source drift apart”- Applies to: the repository.
- Likely cause: a component was added or renamed without updating the registry entry, the package export map, or the barrel.
- Fix: run the repository’s registry and export verification before relying on the CLI.
- Verify:
pnpm registry:verifypnpm ui-exports:checkpnpm docs:contract:check- Relevant versions: registry
schemaVersion: 1. - Still broken:
pnpm beeui doctorandpnpm beeui diffare consumer-project commands, not repository ones — from a BeeUI checkout they exit1withBeeUI is not initialized in this project, and runninginitthere would write a straybeeui.config.jsoninto the monorepo. Run them from inside the consumer project instead, wherediffnever mutates anything and is the ground truth about what that project owns.
Still stuck
Section titled “Still stuck”- Re-read the entry’s Verify command and run it verbatim — a fix that does not change the verify result is not the fix.
- Reproduce in the matching starter (
examples/expo-package-consumer,examples/bare-rn-consumer,examples/web-consumer, orexamples/source-ownership-starter). If the starter passes and your app fails, the difference is in your project, and the diff between the two is your bug report. - Capture the exact error string, the platform, and your React Native / Expo / Tailwind / Uniwind versions.
- File it at github.com/beobungbu/BeeUI/issues.
Related
Section titled “Related”- Start — the onboarding paths every fix above assumes.
- Provider & safe area — provider scope, overlay scope, toast scope.
- Compatibility — tested versions versus promised ranges.
- CLI & source ownership — the full CLI contract.
- Migration & versioning — what changes, and when.
- Keyboard & focus — Web keyboard expectations.