Phase 9d · Tier B

RN-universal Command pilot

Scaffolded

Typeahead-filtered command palette. Substring (case-insensitive) match in v1. Library decision: no new runtime dep — cmdk evaluated and rejected because it is web-only and would force a .web/.native split that no other 0.2.x primitive uses.

Side-by-side: app commands

shadcn (cmdk)
RN
Actions
New file
Open…
Settings
Preferences

Type to filter; tap an item to select.

Library decision

Per Phase 9 Q2, every Tier B primitive must record its library choice. RnCommand ships with no new runtime dependency.

  • cmdk@1.1.1 (MIT, ~39M/wk) — evaluated and rejected. cmdk is web-only (DOM portals, refs, focus trap) and would force a `.web/.native` split that no other 0.2.x primitive uses.
  • This implementation — pure React Native primitives (`View`, `TextInput`, `ScrollView`, `Pressable`) plus a context-driven substring filter. Same mechanics as `RnAccordion` / `RnSelect`. Zero added bundle weight.
  • Substring vs fuzzy — v1 is case-insensitive substring. Score-based fuzzy ranking is a 0.2.x candidate if a consumer reports the difference matters.

Semantics

Aspectshadcn (cmdk)RNNotes
Filterfuzzy + scoresubstring (case-insensitive)Custom filter prop overrides
Group hideauto when emptyauto when no visible itemsSame UX
Empty state<CommandEmpty><RnCommandEmpty>Shown when typed and 0 matches
Keyboard navarrow keys + Entertap (or Tab on RN-Web)Arrow-key roving in v1+
Item synonymsvalue + keywordsvalue + searchTextsearchText overrides label for filtering
Mountingalways mountedvisible items onlyHidden items return null