Apps SDK UI is a lightweight, accessible design system for building high-quality ChatGPT apps with the Apps SDK. It provides Tailwind-integrated design tokens, a curated React component library, and utilities optimized for consistent experiences inside ChatGPT.
Apps SDK UI requires React 18 or 19 and Tailwind 4.
npm install @openai/apps-sdk-ui
Add the foundation styles and Tailwind layers to the top of your global stylesheet (e.g. main.css):
@import "tailwindcss";
@import "@openai/apps-sdk-ui/css";
/* Required for Tailwind to find class references in Apps SDK UI components. */
@source "../node_modules/@openai/apps-sdk-ui";
/* The rest of your application CSS */
Then import your stylesheet before rendering any components:
// Must be imported first to ensure Tailwind layers and style foundations are defined before any potential component styles
import "./main.css"
import { StrictMode } from "react"
import { createRoot } from "react-dom/client"
import { App } from "./App"
createRoot(document.getElementById("root")!).render(
<StrictMode>
<App />
</StrictMode>,
)
<AppsSDKUIProvider> helps define your default router link component, used in components like <TextLink> and <ButtonLink>.
This provider is optional - router links can also be passed directly to components via the as prop.
// Must be imported first to ensure Tailwind layers and style foundations are defined before component styles
import "./main.css"
import { AppsSDKUIProvider } from "@openai/apps-sdk-ui/components/AppsSDKUIProvider"
import { StrictMode } from "react"
import { createRoot } from "react-dom/client"
import { Link } from "react-router"
import { App } from "./App"
declare global {
interface AppsSDKUIConfig {
LinkComponent: typeof Link
}
}
createRoot(document.getElementById("root")!).render(
<StrictMode>
<AppsSDKUIProvider linkComponent={Link}>
<App />
</AppsSDKUIProvider>
</StrictMode>,
)
Your project is now ready to use Apps SDK UI!
Here's an example of a simple reservation card, using Tailwind classes and components.
import { Badge } from "@openai/apps-sdk-ui/components/Badge"
import { Button } from "@openai/apps-sdk-ui/components/Button"
import { Calendar, Invoice, Maps, Members, Phone } from "@openai/apps-sdk-ui/components/Icon"
export function ReservationCard() {
return (
Reservation
<h2 className="mt-1 heading-lg">La Luna Bistro</h2>
<Badge color="success">Confirmed</Badge>
<dl className="mt-4 grid grid-cols-[auto_1fr] gap-x-3 gap-y-2 text-sm">
<dt className="flex items-center gap-1.5 font-medium text-secondary">
<Calendar className="size-4" />
Date
</dt>
<dd className="text-right">Apr 12 · 7:30 PM</dd>
<dt className="flex items-center gap-1.5 font-medium text-secondary">
<Members className="size-4" />
Guests
</dt>
<dd className="text-right">Party of 2</dd>
<dt className="flex items-center gap-1.5 font-medium text-secondary">
<Invoice className="size-4" />
Reference
</dt>
<dd className="text-right uppercase">4F9Q2K</dd>
</dl>
<Button variant="soft" color="secondary" block>
<Phone />
Call
</Button>
<Button color="primary" block>
<Maps />
Directions
</Button>
)
}
MIT © OpenAI
$ claude mcp add apps-sdk-ui \
-- python -m otcore.mcp_server <graph>