Voice UI Kit

Pipecat App Base

Higher-order component that streamlines setup of a Pipecat Client instance.

Overview

The PipecatAppBase component reduces the boilerplate code required to bootstrap a new Pipecat Client application.

It handles the common setup tasks that are typically the same across most applications, providing a simpler developer experience:

  • Creates a Pipecat Client instance and manages its lifecycle.
  • Wraps children with the necessary providers (such as ThemeProvider and PipecatClientProvider).
  • Provides connect and disconnect handlers (sync or async).
  • Mounts any available audio tracks using the Pipecat React <PipecatClientAudio /> component.
  • Passes through transport and client options from the constructor.
  • Automatically disconnects and disposes the client when unmounting.
  • Surfaces error states to the child components.
  • Optionally disables theme provider based on noThemeProvider prop.

This component creates the PipecatClientProvider context for you. Child components will be able to use all Pipecat Client SDK hooks and components.

Usage

Parent / adjacent state changes will trigger component re-renders, which will recycle the Pipecat client instance. We recommend using this component at the highest order in your application, and not nesting it inside other components.

The PipecatAppBase component can be used in two ways:

1. Render Prop Pattern (Function Children)

This pattern gives you access to the client instance, connection handlers and state, allowing you to build custom UI that have direct access to these props:

import {
  PipecatAppBase,
  ErrorCard,
  SpinLoader,
} from "@pipecat-ai/voice-ui-kit";

export default function Home() {
  return (
    <PipecatAppBase
      transportType="smallwebrtc"
      connectParams={{
        webrtcUrl: "/api/offer",
      }}
    >
      {({ client, handleConnect, handleDisconnect, error }) =>
        !client ? (
          <SpinLoader />
        ) : error ? (
          <ErrorCard error={error} />
        ) : (
          <div>
            <button onClick={handleConnect}>Connect</button>
            <button onClick={handleDisconnect}>Disconnect</button>
          </div>
        )
      }
    </PipecatAppBase>
  );
}

2. Direct Children Pattern

This pattern is simpler when you want to use the built-in components that already handle connection state internally (e.g. using Pipecat React hooks).

import {
  PipecatAppBase,
  ConnectButton,
  ControlBar,
  UserAudioControl,
} from "@pipecat-ai/voice-ui-kit";

export default function Home() {
  return (
    <PipecatAppBase
      transportType="smallwebrtc"
      connectParams={{
        webrtcUrl: "/api/offer",
      }}
    >
      <div>
        <ConnectButton />
        <ControlBar>
          <UserAudioControl />
        </ControlBar>
      </div>
    </PipecatAppBase>
  );
}

3. Without Theme Provider

You can disable the theme provider wrapper by setting noThemeProvider={true}:

import { PipecatAppBase } from "@pipecat-ai/voice-ui-kit";

export default function Home() {
  return (
    <PipecatAppBase
      transportType="smallwebrtc"
      connectParams={{
        webrtcUrl: "/api/offer",
      }}
      noThemeProvider={true}
    >
      <YourCustomComponent />
    </PipecatAppBase>
  );
}

4. Auto-Connect on Mount

You can automatically connect to the session when the component mounts by setting connectOnMount={true}:

import { PipecatAppBase } from "@pipecat-ai/voice-ui-kit";

export default function Home() {
  return (
    <PipecatAppBase
      transportType="smallwebrtc"
      connectParams={{
        webrtcUrl: "/api/offer",
      }}
      connectOnMount={true}
    >
      <YourCustomComponent />
    </PipecatAppBase>
  );
}

Props

PropTypeDefault
connectParams
TransportConnectionParams
-
transportType
"smallwebrtc" | "daily"
-
clientOptions?
PipecatClientOptions
-
noThemeProvider?
boolean
false
themeProps?
Partial<ThemeProviderProps>
-
connectOnMount?
boolean
false
children
((props: PipecatBaseChildProps) => React.ReactNode) | React.ReactNode
-

Child Props

The PipecatAppBase component passes the following props to its children when using the render prop pattern:

PropTypeDefault
client
PipecatClient | null
-
handleConnect?
() => void | Promise<void>
-
handleDisconnect?
() => void | Promise<void>
-
error?
string | null
-