IntegrationsNextra

Add Chat and Search to Nextra

Integrate Inkeep's chat button and search bar into your Nextra documentation for enhanced user experience and content discovery.

What is Nextra

Nextra is a framework for creating content-focused websites using Next.js and markdown.

Get an API key

Follow these steps to create an API key for your web integration.

Copy and add the apiKey to your environment variables:

.env
NEXT_PUBLIC_INKEEP_API_KEY="INKEEP_API_KEY"

Install the component library

npm install @inkeep/cxkit-react
yarn add @inkeep/cxkit-react

Customize your settings

Define your Inkeep settings.

const baseSettings = {
  apiKey,
  primaryBrandColor: "#26D6FF", // your brand color, widget color scheme is derived from this
  organizationDisplayName: "Inkeep",
  // ...optional settings
};
 
const modalSettings = {
  // optional settings
};
 
const searchSettings = {
  // optional settings
};
 
const aiChatSettings = {
  // optional settings
  aiAssistantAvatar: "/img/logo.svg", // use your own AI assistant avatar
  exampleQuestions: [
    "Example question 1?",
    "Example question 2?",
    "Example question 3?",
  ],
};
import type {
  InkeepAIChatSettings,
  InkeepSearchSettings,
  InkeepBaseSettings,
  InkeepModalSettings,
} from "@inkeep/cxkit-react";
 
const baseSettings: InkeepBaseSettings = {
  apiKey,
  primaryBrandColor: "#26D6FF", // your brand color, widget color scheme is derived from this
  organizationDisplayName: "Inkeep",
  // ...optional settings
};
 
const modalSettings: InkeepModalSettings = {
  // optional settings
};
 
const searchSettings: InkeepSearchSettings = {
  // optional settings
};
 
const aiChatSettings: InkeepAIChatSettings = {
  // optional settings
  aiAssistantAvatar: "/img/logo.svg", // use your own AI assistant avatar
  exampleQuestions: [
    "Example question 1?",
    "Example question 2?",
    "Example question 3?",
  ],
};

Define the components

Next, create component files InkeepChatButton.tsx and InkeepSearchBar.tsx

ChatButton

import React, { useEffect, useState } from "react";
 
export default function InkeepChatButton() {
  const [ChatButton, setChatButton] = useState(null);
 
  //...
 
  // load the library asynchronously
  useEffect(() => {
    const loadChatButton = async () => {
      try {
        const { InkeepChatButton } = await import("@inkeep/cxkit-react");
        setChatButton(() => InkeepChatButton);
      } catch (error) {
        console.error("Failed to load ChatButton:", error);
      }
    };
 
    loadChatButton();
  }, []);
 
  const chatButtonProps = {
    baseSettings,
    aiChatSettings,
    searchSettings,
    modalSettings,
  };
 
  return ChatButton && <ChatButton {...chatButtonProps} />;
}
import React, { useEffect, useState } from "react";
import type { InkeepChatButtonProps } from "@inkeep/cxkit-react";
 
export default function InkeepChatButton() {
  const [ChatButton, setChatButton] =
    useState<(e: InkeepChatButtonProps) => JSX.Element>();
 
  //...
 
  // load the library asynchronously
  useEffect(() => {
    const loadChatButton = async () => {
      try {
        const { InkeepChatButton } = await import("@inkeep/cxkit-react");
        setChatButton(() => InkeepChatButton);
      } catch (error) {
        console.error("Failed to load ChatButton:", error);
      }
    };
 
    loadChatButton();
  }, []);
 
  const chatButtonProps: InkeepChatButtonProps = {
    baseSettings,
    aiChatSettings,
    searchSettings,
    modalSettings,
  };
 
  return ChatButton && <ChatButton {...chatButtonProps} />;
}
import React, { useEffect, useState } from "react";
 
export default function InkeepSearchBar() {
  const [SearchBar, setSearchBar] = useState(null);
 
  //...
 
  // load the library asynchronously
  useEffect(() => {
    const loadSearchBar = async () => {
      try {
        const { InkeepSearchBar } = await import("@inkeep/cxkit-react");
        setSearchBar(() => InkeepSearchBar);
      } catch (error) {
        console.error("Failed to load SearchBar:", error);
      }
    };
 
    loadSearchBar();
  }, []);
 
  const searchBarProps = {
    baseSettings,
    aiChatSettings,
    searchSettings,
    modalSettings,
  };
 
  return SearchBar && <SearchBar {...searchBarProps} />;
}
import React, { useEffect, useState } from "react";
import type { InkeepSearchBarProps } from "@inkeep/cxkit-react";
 
export default function InkeepSearchBar() {
  const [SearchBar, setSearchBar] =
    useState<(e: InkeepSearchBarProps) => JSX.Element>();
 
  //...
 
  // load the library asynchronously
  useEffect(() => {
    const loadSearchBar = async () => {
      try {
        const { InkeepSearchBar } = await import("@inkeep/cxkit-react");
        setSearchBar(() => InkeepSearchBar);
      } catch (error) {
        console.error("Failed to load SearchBar:", error);
      }
    };
 
    loadSearchBar();
  }, []);
 
  const searchBarProps: InkeepSearchBarProps = {
    baseSettings,
    aiChatSettings,
    searchSettings,
    modalSettings,
  };
 
  return SearchBar && <SearchBar {...searchBarProps} />;
}

Modify theme config

To add widgets to the page, paste the code shown below into the theme.config.tsx file:

theme.config.tsx
//...
footer: {
  component: () => <InkeepChatButton />
},
search: {
  component: () => <InkeepSearchBar />
}

For a full list of customizations, check out the Common Settings.

On this page