Fumadocs

Search

Implement document search in your docs

Search UI

You can customise the search UI from root provider, such as disabling search:

app/layout.tsx
import { RootProvider } from 'fumadocs-ui/provider';
import type { ReactNode } from 'react';

export default function Layout({ children }: { children: ReactNode }) {
  return (
    <html>
      <body>
        <RootProvider
          search={{
            enabled: false,
          }}
        >
          {children}
        </RootProvider>
      </body>
    </html>
  );
}

Hot Keys

Customise the hot keys to trigger search dialog, by default it's K or Ctrl K.

import { RootProvider } from 'fumadocs-ui/provider';

<RootProvider
  search={{
    hotKey: [
      {
        display: 'K',
        key: 'k', // key code, or a function determining whether the key is pressed
      },
    ],
  }}
>
  {children}
</RootProvider>;

Replace Search Dialog

Make a <RootProvider /> wrapper with use client directive, and use it instead of your previous root provider.

'use client';
import { RootProvider } from 'fumadocs-ui/provider';
import type { ReactNode } from 'react';

// for example, using the default `fetch()` client
import SearchDialog from 'fumadocs-ui/components/dialog/search-default';

export function Provider({ children }: { children: ReactNode }) {
  return (
    <RootProvider
      search={{
        SearchDialog,
      }}
    >
      {children}
    </RootProvider>
  );
}
import { Provider } from './provider';
import type { ReactNode } from 'react';

export default function Layout({ children }: { children: ReactNode }) {
  return (
    <html lang="en">
      <body>
        <Provider>{children}</Provider>
      </body>
    </html>
  );
}

Search Server

The search server/backend is provided and documented on Fumadocs Core, see available engines.

Search Client

You can choose a search client according to your search engine, it defaults to fetch client.

fetch

It sends queries to an API endpoint, works with the built-in Orama search engine.

You can pass options to the search client:

import { RootProvider } from 'fumadocs-ui/provider';

<RootProvider
  search={{
    options: {
      // customise the API endpoint
      api: '/api/search/docs',
    },
  }}
>
  {children}
</RootProvider>;

Tag Filter

Add UI for filtering results by tags, configure Tag Filter on search server and add the following:

import { RootProvider } from 'fumadocs-ui/provider';

<RootProvider
  search={{
    options: {
      defaultTag: 'value',
      tags: [
        {
          name: 'Tag Name',
          value: 'value',
        },
      ],
    },
  }}
>
  {children}
</RootProvider>;

Algolia

For the setup guide, see Integrate Algolia Search.

While generally we recommend building your own search with their client-side SDK, you can also plug the built-in dialog interface.

components/search.tsx
'use client';

import algo from 'algoliasearch/lite';
import type { SharedProps } from 'fumadocs-ui/components/dialog/search';
import SearchDialog from 'fumadocs-ui/components/dialog/search-algolia';

const appId = process.env.NEXT_PUBLIC_ALGOLIA_APP_ID;
const apiKey = process.env.NEXT_PUBLIC_ALGOLIA_API_KEY;
const indexName = process.env.NEXT_PUBLIC_ALGOLIA_INDEX;

if (!appId || !apiKey || !indexName) throw new Error('Algolia credentials');

const client = algo(appId, apiKey);

const index = client.initIndex(indexName);

export default function CustomSearchDialog(props: SharedProps) {
  return <SearchDialog index={index} {...props} showAlgolia />;
}
  1. Replace appId, apiKey and indexName with your desired values.

  2. Replace the default search dialog with your new component.

Note

The built-in implementation doesn't use instant search (their official javascript client).

Tag Filter

Same as default search client, you can configure Tag Filter on the dialog.

components/search.tsx
import SearchDialog from 'fumadocs-ui/components/dialog/search-algolia';

<SearchDialog
  defaultTag="value"
  tags={[
    {
      name: 'Tag Name',
      value: 'value',
    },
  ]}
/>;

Orama Cloud

For the setup guide, see Integrate Orama Cloud.

components/search.tsx
'use client';

import { OramaClient } from '@oramacloud/client';
import type { SharedProps } from 'fumadocs-ui/components/dialog/search';
import SearchDialog from 'fumadocs-ui/components/dialog/search-orama';

const client = new OramaClient({
  endpoint: 'endpoint',
  api_key: 'apiKey',
});

export default function CustomSearchDialog(props: SharedProps) {
  return <SearchDialog {...props} client={client} showOrama />;
}
  1. Replace endpoint, apiKey with your desired values.
  2. Replace the default search dialog with your new component.

Community Integrations

A list of integrations maintained by community.

Built-in UI

If you want to use the built-in search dialog UI instead of building your own, you may use the SearchDialog component.

import {
  SearchDialog,
  type SharedProps,
} from 'fumadocs-ui/components/dialog/search';

export default function CustomSearchDialog(props: SharedProps) {
  return <SearchDialog {...props} />;
}

Unstable

It is an internal API, might break during iterations

How is this guide?