App Switcher

The sidebar-header launcher for the Nexus app family: an animated grid of product tiles with search, the active app marked, coming-soon entries disabled and no-access apps locked.

$bunx shadcn@latest add @nx-ui/app-switcher
Registry item
Installs withnx-app-iconpopoverutils

In the sidebar header

The trigger is a compact lockup of the active app's tile and name — it replaces a plain logo in the AppSidebar header slot. Open it for the family grid: tiles stagger in, hover lifts, the chevron flips, a tick springs onto the app you're in and 'Soon' tiles stay disabled.

Nexus ReGenThe rest of the sidebar continues below…

Search and status

With more than six apps the popover gains a filter (name, description and keywords are matched; ArrowDown moves into the grid). A `statusBadge` marks beta apps.

Driven by the nx-apps directory

In production the data comes from the nx-apps module: the real Nexus directory, one entry per app with its own tone + identity mark. By default the directory is the same everywhere — every app visible and enabled (apps gate their own auth). Pass enforceAccessPolicy once roles/entitlements are reliable: staff apps then hide from known non-staff users and entitlement-gated apps lock ('No access').

Default — same everywhere (in Agent Services)

Enforced — customer (no staff role)

Scope carries across

Switching apps is expected to keep the user signed in (shared nx-id session) and in the same organisation. That carry-over is platform infrastructure, deliberately outside this block: AppSwitcher only renders links, and the target app restores scope on arrival. See docs/scoped-shell.md.

<AppSwitcher apps={resolveNxApps({ activeId: "…", user: { role, entitlements } })} />

API reference

Exported parts and their props, extracted from the component source.

PropTypeDefaultDescription
apps*AppSwitcherApp[]
titlestring"Nexus apps"Heading shown at the top of the popover.
footerReact.ReactNodeOptional footer rendered at the bottom of the popover (e.g. an environment hint or a link to a apps directory page).
onSelect(app: AppSwitcherApp) => voidCalled when an enabled, non-active app tile is chosen (the link still navigates). Use for telemetry or SPA-side bookkeeping.
classNamestring