Migrate
Migrate from Daily to Synento
Rooms become sessions, tokens become connection tokens, and startRecording goes away — because there is nothing to start.
Daily and Synento agree on the easy parts: join from the browser, publish camera and mic, leave. They differ on everything around recording. Daily records through a separate cloud-recording product you start, stop and pay per recorded minute; Synento records every session by construction, with replay the moment the call ends. Most of this migration is therefore deletion.
This guide maps Daily's concepts onto Synento's, shows the before-and-after for a standard call, and lists what Daily does that Synento deliberately does not — so you can check the gaps before you commit.
Concept mapping
| You have | You get | What changes |
|---|---|---|
| Room URL and meeting token | Session id and connection token | Rooms become sessions created server-side; meeting tokens become short-lived connection tokens minted per participant. |
| DailyIframe call object | SynentoRoom you compose | The call object becomes a room plus your own UI. There is no prebuilt interface to theme. |
| startRecording / stopRecording | Nothing | Delete both calls. Every session records by construction; forgetting to record is impossible. |
| Recording job events | Session lifecycle events | Subscribe to session.ended and recording.ready instead of recording started, finished and error events. |
| Dial-in and SIP interconnect | Not supported | Telephony stays on Daily. Synento carries browser camera, microphone and screen only. |
| Call minutes plus recording minutes | Participant-minutes plus storage | Recording has no rate of its own. One meter for the call, one for keeping it. |
Before and after
Before
A Daily call with cloud recording: join, start, remember to stop.
import DailyIframe from '@daily-js/daily-js'
const call = DailyIframe.createCallObject()
await call.join({ token: meetingToken, url: 'https://team.daily.co/standup' })
// Recording is a separate product: start it, remember to stop it, and wait
// for the file to process before anyone can watch.
await call.startRecording()
// ... the call happens ...
await call.stopRecording()After
The same call on Synento: create, join, publish. Recording needs no code.
import { SynentoClient } from '@synento/node'
import { SynentoRoom } from '@synento/client'
// Server: the session is already its own recording.
const synento = new SynentoClient()
const session = await synento.createSession({ name: 'Standup' })
const token = await synento.createConnectionToken(session.id, { userId: 'alice' })
// Browser: join and publish. No prebuilt UI to theme, no recording to start.
const room = new SynentoRoom({
getToken: async () => ({ token: token.accessToken, wsUrl }),
userId: 'alice',
})
await room.connect()
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true })
await room.publishCamera(stream)
await room.publishMicrophone(stream)The migration, step by step
Create a Synento project and a restricted key for the app's server environment. The key mints sessions and tokens in its own project and nothing else.
Replace meeting-token minting with the connection-token route: one endpoint that takes a session and user id and returns a short-lived token plus the WebSocket URL.
Replace the call object with SynentoRoom: connect, publish camera and microphone, render remote tiles from participantsChanged. Budget the UI work honestly — the prebuilt interface was doing plenty.
Delete the recording code and re-point webhooks: session.ended starts transcription or review, recording.ready confirms the media, export.completed delivers files.
Verify with two browsers and the manifest: both participants list cam and mic tracks with non-null start_ts. Then delete the Daily room.
What has no equivalent
What has no equivalent
Three Daily strengths stay behind. The prebuilt call UI has no counterpart: Synento ships an SDK and components, and composing them is real work — the main cost of this migration. Telephony has no counterpart either: dial-in numbers and SIP interconnect do not exist here, so meeting-style products with phone participants should stay where they are.
And latency climbs. Daily routes over a global mesh built for the lowest possible call delay; Synento relays from a single region. For standups, interviews and reviews the difference is invisible; for rapid-fire conversation it is the reason to choose Daily instead.
Common questions
What happens to our existing Daily recordings?
They stay in Daily. Export the MP4s you must keep before you wind the rooms down — Synento cannot import another platform's recording files, and retention on the old rooms still applies.
How do connection tokens differ from meeting tokens?
Meeting tokens admit a participant to a room under your rules; connection tokens admit one user to one session for about an hour, carried as a WebSocket subprotocol. Your server mints them per join, and the SDK re-mints on every reconnect.
We use the prebuilt UI heavily. Should we migrate?
Probably not yet. Rebuilding a themed call interface on the SDK is the largest cost here. Migrate when recording and verification matter more to the product than the interface Daily gives you.
More migration guides
- Migrate from LiveKit to SynentoRooms become sessions, self-signed tokens become API-minted ones, and the egress pipeline collapses into a single export call.
- Migrate from Twilio Video to SynentoRooms become sessions, signed tokens become API-minted ones, and the recordings-plus-compositions two-step becomes one export.
Give your agent a video platform it can verify.
Sign up, point your agent at llms.txt, and have a recorded call running before lunch.