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); @akapulu/react plus a direct @daily-co/daily-react because this app imports DailyVideo. 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. This demo does not authenticate users. Anyone who can reach /api/connect can start a conversation on your account. Before production, authenticate users on that route. Pass those headers with config.headers on AkapuluProvider (object or a function called when the request is sent). 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, useConnectChime for the connect chime, 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