Frontend
What is it?
@forge/react is headless client state — no product styling, no transport assumptions. It
turns the backend's stable events into render-ready state, and localizes everything. React is a peer
dependency; the same framework-free reducers back React Native.
Hooks
Wrap your app in ForgeProvider with a client that implements the transport-agnostic
ForgeClient (GraphQL, SSE, or a test double), then use the hooks:
import { ForgeProvider, useRunSubscription, useSendMessage } from "@forge/react";
function Chat({ conversationId, runId }: { conversationId: string; runId: string }) {
const { parts, status, retry, connected } = useRunSubscription({ runId, conversationId });
const { send, sending } = useSendMessage({ conversationId });
// render parts; show `retry` as "attempt 2 of 5" when present
}
Also: useConversations, useConversation, usePendingInteraction, useAnswerQuestion,
useDecideApproval, useCancelRun, and useSessionContext (the context inspector).
Reducers & reconnect
The core is framework-free and tested: createRunProjector pairs an ordering event buffer with a
run reducer, so out-of-order or replayed events are ordered and de-duplicated by sequence — a
reconnect from a cursor misses or duplicates no part. The retry indicator is derived from the
run.retry-pending event and cleared on the next progress event.
Localization
The backend emits stable ids + structured params; the frontend owns all display strings.
createTranslator resolves an id to a string for the active locale, interpolates params (with
Intl plurals / number / date), and falls back requested → default → the raw id (never blank). Add a
language by shipping a catalog — no rebuild.
Optional UI
An unopinionated component set (ChatShell, MessageList, Composer, RetryIndicator,
QuestionCard, ApprovalCard, typed-part renderers) over the hooks — every element takes a
className so your app owns the look, and all text goes through an injected translator.
See GraphQL & transports for wiring a client.
Where this is specified
This page is the shape of the thing. The specification is where the decisions and their reasons live — read it when you need to know why something behaves the way it does, or what was considered and rejected.