Files
reflector/docs/docs/installation/daily-setup.md
Juan Diego García ec8b49738e feat: show trash for soft deleted transcripts and hard delete option (#942)
* feat: show trash for soft deleted transcripts and hard delete option

* fix: test fixtures

* docs: aws new permissions
2026-03-31 13:15:52 -05:00

5.5 KiB

sidebar_position, title
sidebar_position title
6 Daily.co Setup

Daily.co Setup

This page covers Daily.co video platform setup for live meeting rooms. For the complete deployment guide, see Deployment Guide.

Daily.co enables live video meetings with automatic recording and transcription.

What You'll Set Up

User joins meeting → Daily.co video room → Recording to S3 → [Webhook] → Reflector transcribes

Prerequisites


Create Daily.co Account

  1. Visit https://dashboard.daily.co and sign up
  2. Verify your email
  3. Note your subdomain (e.g., yourname.daily.co → subdomain is yourname)

Get Daily.co API Key

  1. In Daily.co dashboard, go to Developers
  2. Click API Keys
  3. Click Create API Key
  4. Copy the key (starts with a long string)

Save this for later.


Create AWS S3 Bucket

Daily.co needs somewhere to store recordings before Reflector processes them.

# Choose a unique bucket name
BUCKET_NAME="reflector-dailyco-yourname" # -yourname is not a requirement, you can name the bucket as you wish
AWS_REGION="us-east-1"

# Create bucket
aws s3 mb s3://$BUCKET_NAME --region $AWS_REGION

# Enable versioning (required)
aws s3api put-bucket-versioning \
  --bucket $BUCKET_NAME \
  --versioning-configuration Status=Enabled

Create IAM Role for Daily.co

Daily.co needs permission to write recordings to your S3 bucket.

Follow the guide https://docs.daily.co/guides/products/live-streaming-recording/storing-recordings-in-a-custom-s3-bucket

Save the role ARN - you'll need it soon.

It looks like: arn:aws:iam::123456789012:role/DailyCo

Shortly, you'll need to set up a role and give this role your s3 bucket access

No additional setup is required from Daily.co settings website side: the app code takes care of letting Daily know where to save the recordings.


Configure Reflector

Location: Reflector server

Add to server/.env:

# Daily.co Configuration
DEFAULT_VIDEO_PLATFORM=daily
DAILY_API_KEY=<your-api-key-from-daily-setup>
DAILY_SUBDOMAIN=<your-subdomain-from-daily-setup>

# S3 Storage for Daily.co recordings
DAILYCO_STORAGE_AWS_BUCKET_NAME=<your-bucket-from-daily-setup>
DAILYCO_STORAGE_AWS_REGION=us-east-1
DAILYCO_STORAGE_AWS_ROLE_ARN=<your-role-arn-from-daily-setup>

# Worker credentials for reading/deleting recordings from Daily's S3 bucket.
# Required when transcript storage uses a different bucket or credentials
# (e.g., selfhosted with Garage or a separate S3 account).
DAILYCO_STORAGE_AWS_ACCESS_KEY_ID=<your-aws-access-key>
DAILYCO_STORAGE_AWS_SECRET_ACCESS_KEY=<your-aws-secret-key>

# Transcript storage (should already be configured from main setup)
# TRANSCRIPT_STORAGE_BACKEND=aws
# TRANSCRIPT_STORAGE_AWS_ACCESS_KEY_ID=<your-key>
# TRANSCRIPT_STORAGE_AWS_SECRET_ACCESS_KEY=<your-secret>
# TRANSCRIPT_STORAGE_AWS_BUCKET_NAME=<your-bucket-name>
# TRANSCRIPT_STORAGE_AWS_REGION=<your-bucket-region>

:::info Two separate credential sets for Daily.co

  • ROLE_ARN — Used by Daily's API to write recordings into your S3 bucket (configured via Daily dashboard).
  • ACCESS_KEY_ID / SECRET_ACCESS_KEY — Used by Reflector workers to read recordings for transcription and delete them on consent denial or permanent transcript deletion.

Required IAM permissions for the worker key on the Daily recordings bucket:

  • s3:GetObject — Download recording files for processing
  • s3:DeleteObject — Remove files on consent denial, trash destroy, or data retention cleanup
  • s3:ListBucket — Scan for recordings needing reprocessing

If the worker keys are not set, Reflector falls back to the transcript storage master key, which then needs cross-bucket access to the Daily bucket. :::


Restart Services

After changing .env files, reload with up -d:

sudo docker compose -f docker-compose.prod.yml up -d server worker

Note: docker compose up -d detects env changes and recreates containers automatically.


Test Live Room

  1. Visit your Reflector frontend: https://app.example.com
  2. Go to Rooms
  3. Click Create Room
  4. Select Daily as the platform
  5. Allow camera/microphone access
  6. You should see Daily.co video interface
  7. Speak for 10-20 seconds
  8. Leave the meeting
  9. Recording should appear in Transcripts within 5 minutes (if webhooks aren't set up yet, see Webhook Configuration below)

Troubleshooting

Recording doesn't appear in S3

  1. Check Daily.co dashboard → Logs for errors
  2. Verify IAM role trust policy has correct Daily.co account ID and your Daily.co subdomain
  3. Verify that the bucket has

Recording in S3 but not transcribed

  1. Check webhook is configured (Reflector should auto-create it)
  2. Check worker logs:
    docker compose -f docker-compose.prod.yml logs worker --tail 50
    
  3. Verify DAILYCO_STORAGE_AWS_* vars in server/.env

"Access Denied" when Daily.co tries to write to S3

  1. Double-check IAM role ARN in Daily.co settings
  2. Verify bucket name matches exactly
  3. Check IAM policy has s3:PutObject permission

Webhook Configuration [optional]

manage_daily_webhook.py script guides you through creating a webhook for Daily recordings.

The webhook isn't required - polling mechanism is the default and performed automatically.

This guide won't go deep into webhook setup.