Troubleshooting
Problems that show up often when running MeetCast locally.
Database connection failed
- Confirm
DATABASE_URLin.env.local(Neon: use the pooled string). - Check the database is up and IP allowlisting (if any) allows you.
- Run
pnpm db:migrateso required tables exist. - Hit
GET /api/health— degraded usually means DB.
LiveKit connection failed
LIVEKIT_URL,LIVEKIT_API_KEY,LIVEKIT_API_SECRETmust match the LiveKit server.- Local server actually listening (often port 7880).
- Browser can reach that URL (localhost vs remote machine; mixed content if the app is HTTPS and LiveKit is
ws://). - Token route returns an error — check server logs for auth, schedule, visibility, or capacity failures.
Camera or microphone does not work
- Browser permission prompt denied or blocked for the origin
- Some browsers require a secure context (HTTPS or localhost) for media
- Another app holding the device exclusively
Cannot join a private room
- You must be logged in (guests are blocked).
- Session email must match an allowlist entry (normalized). Host is always allowed.
- Meeting must still be inside its schedule window.
Auth email never arrives
Set RESEND_API_KEY (and preferably RESEND_FROM_EMAIL on a verified domain). Without the key, MeetCast skips sending on purpose. Outside production, look for the fallback action link in the UI when mail was not delivered.
Payment does not work
- Zero-price plans should fulfill without a gateway — check order status on
/billing. - Non-zero amounts need
ZARINPAL_MERCHANT_ID(or mock in non-production). PAYMENT_PROVIDERforce modes:auto,zarinpal,mock.- Callback alone is not enough — server verify must succeed before fulfill.
Admin panel forbidden
Your user needs role = admin. Put your email in ADMIN_EMAILS and open the admin panel once so bootstrap can promote you (tight allowlist in production).