IntegrationsRemix

Add AI Chat to your Remix app

What is Remix

Remix is a modern web framework for building web applications based on React.

Get an API key

  1. Go to the Inkeep Dashboard
  2. Select your project under Projects
  3. Go to the Integrations tab
  4. Click on Create integration
  5. Select Web
  6. Provide a Name and URL (optional) for the integration
  7. Click on Create
  8. Click the Example < /> button to get your API key and view suggested settings

Copy and add the apiKey, integrationId and organizationId to your environment variables:

.env
INKEEP_API_KEY="INKEEP_API_KEY"
INKEEP_INTEGRATION_ID="INKEEP_INTEGRATION_ID"
INKEEP_ORGANIZATION_ID="INKEEP_ORGANIZATION_ID"

Get the environment variables

Use loader/action to access your environment variables:

root.tsx
// ...
export const loader = async () => {
  return json({
    ENV: {
      API_KEY: process.env.INKEEP_API_KEY!,
      INTEGRATION_ID: process.env.INKEEP_INTEGRATION_ID!,
      ORGANIZATION_ID: process.env.INKEEP_ORGANIZATION_ID!
    }
  });
};

Install the component library

npm install @inkeep/uikit
bun add @inkeep/uikit
pnpm add @inkeep/uikit
yarn add @inkeep/uikit

Customize your settings

First, create a useInkeepSettings.ts file that will contain a hook that returns configuration for our Inkeep component(s).

Below is an example with common customizations.

import { useLoaderData } from "@remix-run/react";
 
const useInkeepSettings = () => {
  const { ENV } = useLoaderData();
 
  const baseSettings = {
    apiKey: ENV.API_KEY,
    integrationId: ENV.INTEGRATION_ID,
    organizationId: ENV.ORGANIZATION_ID,
    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
    botAvatarSrcUrl: "/img/logo.svg", // use your own bot avatar
    quickQuestions: [
      "Example question 1?",
      "Example question 2?",
      "Example question 3?",
    ],
  };
 
  return { baseSettings, aiChatSettings, searchSettings, modalSettings };
};
 
export default useInkeepSettings;
import type {
  InkeepAIChatSettings,
  InkeepSearchSettings,
  InkeepBaseSettings,
  InkeepModalSettings,
} from "@inkeep/uikit";
import { loader } from "~/root";
import { useLoaderData } from "@remix-run/react";
 
type InkeepSharedSettings = {
  baseSettings: InkeepBaseSettings;
  aiChatSettings: InkeepAIChatSettings;
  searchSettings: InkeepSearchSettings;
  modalSettings: InkeepModalSettings;
};
 
const useInkeepSettings = (): InkeepSharedSettings => {
  const { ENV } = useLoaderData<typeof loader>();
 
  const baseSettings: InkeepBaseSettings = {
    apiKey: ENV.API_KEY,
    integrationId: ENV.INTEGRATION_ID,
    organizationId: ENV.ORGANIZATION_ID,
    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
    botAvatarSrcUrl: "/img/logo.svg", // use your own bot avatar
    quickQuestions: [
      "Example question 1?",
      "Example question 2?",
      "Example question 3?",
    ],
  };
 
  return { baseSettings, aiChatSettings, searchSettings, modalSettings };
};
 
export default useInkeepSettings;

Define the component

Next, create an InkeepChatButton.tsx file for the Chat Button component.

import React, { useEffect, useState } from "react";
import useInkeepSettings from "@/utils/useInkeepSettings";
 
export default function InkeepChatButton() {
  const [ChatButton, setChatButton] = useState(null);
 
  const { baseSettings, aiChatSettings, searchSettings, modalSettings } =
    useInkeepSettings();
 
  // load the library asynchronously
  useEffect(() => {
    const loadChatButton = async () => {
      try {
        const { InkeepChatButton } = await import("@inkeep/uikit");
        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 useInkeepSettings from "@/utils/useInkeepSettings";
import type { InkeepChatButtonProps } from "@inkeep/uikit";
 
export default function InkeepChatButton() {
  const [ChatButton, setChatButton] =
    useState<(e: InkeepChatButtonProps) => JSX.Element>();
 
  const { baseSettings, aiChatSettings, searchSettings, modalSettings } =
    useInkeepSettings();
 
  // load the library asynchronously
  useEffect(() => {
    const loadChatButton = async () => {
      try {
        const { InkeepChatButton } = await import("@inkeep/uikit");
        setChatButton(() => InkeepChatButton);
      } catch (error) {
        console.error("Failed to load ChatButton:", error);
      }
    };
 
    loadChatButton();
  }, []);
 
  const chatButtonProps: InkeepChatButtonProps = {
    baseSettings,
    aiChatSettings,
    searchSettings,
    modalSettings,
  };
 
  return ChatButton && <ChatButton {...chatButtonProps} />;
}

For a full list of customizations, check out the Chat Button documentation.

On this page