Skip to content

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 haveYou getWhat changes
Room URL and meeting tokenSession id and connection tokenRooms become sessions created server-side; meeting tokens become short-lived connection tokens minted per participant.
DailyIframe call objectSynentoRoom you composeThe call object becomes a room plus your own UI. There is no prebuilt interface to theme.
startRecording / stopRecordingNothingDelete both calls. Every session records by construction; forgetting to record is impossible.
Recording job eventsSession lifecycle eventsSubscribe to session.ended and recording.ready instead of recording started, finished and error events.
Dial-in and SIP interconnectNot supportedTelephony stays on Daily. Synento carries browser camera, microphone and screen only.
Call minutes plus recording minutesParticipant-minutes plus storageRecording 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.

daily.js
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.

synento.ts
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

  1. 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.

  2. 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.

  3. 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.

  4. Delete the recording code and re-point webhooks: session.ended starts transcription or review, recording.ready confirms the media, export.completed delivers files.

  5. 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.

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.