Skip to main content
A fully custom conversation UI built from @akapulu/react hooks plus Daily primitives. You build the call surface yourself — video tiles, mic/cam/end controls, transcript, loading and error states, and tool toasts — and end with a post-call review screen (recording + transcript). Use it when you need full control over markup and state wiring. Two folders:
  • backend/ — Express server that holds your API key and calls Akapulu with @akapulu/server
  • frontend/ — React app (Vite); no @akapulu/react-ui

Prerequisites

Setup

Clone the repo:
Install and configure the backend. Copy backend/.env.example to backend/.env.local and add your API key:
Set your scenario id in backend/server.ts:
record_conversation: true is required for the post-call review to have a recording to show. Start the backend (localhost:3001) and leave it running:
In a second terminal, start the frontend:
Open localhost:5173 and click Start call. When the call ends, you land on the review screen.

How it works

The frontend (localhost:5173) calls your backend (localhost:3001), which calls Akapulu with your API key. The backend exposes four routes:
On the frontend:
  • src/App.tsxAkapuluProvider (points at the backend) plus a single reviewId state that decides which screen shows (live call UI or conversation review).
  • src/CustomConversation.tsx — the custom call surface: useAkapuluSession for lifecycle, Daily hooks (useDaily, useVideoTrack, DailyVideo) for video, useAkapuluMediaControls for mic/cam, useAkapuluEvents for tool toasts, and AkapuluBotAudio for audio.
  • src/ConversationReview.tsx — post-call screen; fetches details and polls until the recording is ready.
  • src/styles.css — the call surface styling.

View on GitHub