Skip to content

Get Started ​

React Command Palette helps you ship a GitHub-like launcher that surfaces commands, links, and shortcuts from anywhere in your app. This guide walks you through installation, setup, and your first commands.

Installation ​

Prerequisites ​

  • A React 18+ project (Vite, Next.js, Remix, CRA, etc.).
  • react and react-dom must be installed as peer dependencies.

Install the library via npm (or your favourite package manager):

bash
npm install @mattis44/react-command-palette
# or
pnpm add @mattis44/react-command-palette
# or
yarn add @mattis44/react-command-palette

Bootstrapping the provider ​

Wrap your application with the CommandPaletteProvider. This registers the keyboard shortcut, renders the overlay, and provides context for the hooks.

tsx
import { CommandPaletteProvider, SHORTCUTS } from "@mattis44/react-command-palette";
import type { Command } from "@mattis44/react-command-palette";

const commands: Command[] = [
  {
    id: "open-settings",
    label: "Open Settings",
    category: "Navigation",
    action: () => console.log("Navigating to settings"),
  },
];

export function App() {
  return (
    <CommandPaletteProvider
      commands={commands}
      shortcut={SHORTCUTS.COMMAND} // Ctrl+K / ⌘K
    >
      <YourRoutes />
    </CommandPaletteProvider>
  );
}

The provider automatically injects the default stylesheet (index.css). You can override every part of the UI later through the options prop or your own CSS.

Adding commands from an API ​

The commands prop accepts either an array or an async function that returns a list of commands. Async functions receive the debounced query so you can implement server-side filtering.

tsx
async function searchCommands(query: string) {
  const response = await fetch(`/api/commands?q=${encodeURIComponent(query)}`);
  const payload = await response.json();

  return payload.map((item: any) => ({
    id: item.id,
    label: item.name,
    category: item.group ?? "Remote",
    action: () => console.log("Selected", item.id),
  }));
}

export function App() {
  return (
    <CommandPaletteProvider commands={searchCommands}>
      <YourRoutes />
    </CommandPaletteProvider>
  );
}

The palette debounces calls by 300 ms and caches the last query to avoid firing the same request twice.

Opening the palette manually ​

Besides keyboard shortcuts, you can open or close the palette from anywhere using the useCommandPalette hook:

tsx
import { useCommandPalette } from "@mattis44/react-command-palette";

function HeaderShortcut() {
  const { open } = useCommandPalette();
  return (
    <button type="button" onClick={open}>
      Open command palette
    </button>
  );
}

For more advanced control (setting queries, appending commands, etc.), use useApiRef and the imperative runtime API.

Next steps ​

  • Browse the Commands guide for the full command object reference.
  • Review Shortcuts to customise keyboard triggers and global modes.
  • Visit Customize to tailor the layout, overlay, and helper hints.