Guide for building UIs with Galaxy UI components across React, Vue, Angular, React Native, and Flutter...
Galaxy UI is a multi-framework component library (73 React components, 69 Vue/Angular, 67 mobile per framework) built on the shadcn philosophy: components are copied into the user's project and remain fully editable.
Package registry: npm scope @galaxy-stack. CLI: @galaxy-stack/nebula-cli (command: nebula).
This file is the rulebook. Component APIs are data, and the companion MCP server
(@galaxy-stack/nebula-mcp) serves them from the canonical manifests — never guess props from
shadcn/ui or another library, and never copy a component's source by hand.
| Need | Call |
|---|---|
| Find a component by intent ("pricing table", "stat card", "searchable select") | search_components { query } |
| Every component with its per-framework status | list_components { framework? } |
| One component's manifest | get_component { id, section? } — section is summary (default), props, files or raw; prefer a section to stay inside the token budget |
| The real source of one file | get_component_source { id, framework } — omit file to list the files that are actually bundled, then read one |
| What exists per framework | get_coverage |
If nebula-mcp is not connected, the docs site is the fallback:
https://galaxy-nebula.vercel.app/components/<name> (and /assistant/overview for the
assistant-* set). Do not infer an API from a screenshot or from another design system.
nebula doctor (or ask whether components.json exists).nebula add <names> — supports multiple names, --all,
--overwrite (backs up to .galaxy/backups/), --registry-url <url> for a
versioned CDN. Always install through the CLI: it also wires dependencies, path aliases and the
Tailwind/CSS-var tokens, which copying source by hand does not.nebula doctor reports alias, dependency and Tailwind problems.bunx …@latestorbit (from @galaxy-stack/orbit-cli) and nebula are already on PATH (otherwise
~/.bun/bin/orbit). Run them directly — orbit new gymflow-backend --directory backend,
nebula init --yes --theme violet, nebula add button card badge. bunx
re-resolves the package from the registry on every call and stalls for minutes when the registry is
slow (measured: 180s, then 300s, then 480s inside one step). If a binary really is missing, prefer
bunx --offline or a pinned version with a generous timeout.
input, textarea, select, checkbox, radio-group, switch, slider, form, tags-input, otp-input, combobox (searchable select)dialog, alert-dialog, sheet, popover, tooltip, dropdown-menu, commandtable, data-table (React/Vue only), pagination, tabs, accordion, cardalert, toast, progress, spinner, skeleton, badgecalendar, calendar-range, date-picker, date-range-picker, date-time-picker, time-pickercard, separator, tabs, accordion, collapsible, resizable, scroll-area, aspect-ratio, toolbarlogin-block, pricing-block, dashboard-block, sidebar, chat-ui, authentication, email, featuredchat-panel, agent-activity, diff-review, prompt-boxWeb-only components (not on mobile): breadcrumb, command, combobox, dashboard-block,
data-table, kbd, toolbar, resizable, scroll-area — plus all four
assistant-* components. get_coverage is the authority when a list here is not enough.
Read references/framework-notes.md for per-framework gotchas before writing code:
DateValue (not native Date)ui-* selectors, ControlValueAccessor for form controlsGalaxy prefixAll components use Tailwind + CSS variables (design tokens). Read references/tailwind.md for the
v3/v4 setup. Theme presets: nebula init --theme violet|green|blue|default.
Prove a UI change with bounded tools, not with a running server:
validate_project with checks: ["build"] plus lint/typecheck for the packages you
touched, and nebula doctor for alias, dependency and token wiring.vite/npm run dev as a check: a dev server never exits, produces no
completion evidence, and any log or probe file it writes is an unreviewed write that invalidates
the validation it was meant to support. Start a server only when the task explicitly asks to
exercise the running app — with run_command, not by searching for a session tool (this catalog
has no manage_session/preview capability): start it detached, probe the URL with curl -sf,
and stop it before the final validation.get_component { id, section: "props" }).