Real‑time video meetings for teams and communities fast, reliable, and easy to host yourself.
Meet is an open‑source video meeting application built on Next.js and LiveKit. It provides low‑latency audio/video, a clean UI, and simple authentication so you can spin up secure meetings in minutes.
- ✅ Open‑Source – Transparent, forkable, and extensible.
- 🦾 LiveKit‑Powered – Adaptive streaming with a modern SFU.
- 🔒 Privacy‑First – You control your infrastructure and data.
- ⚙️ Self‑Hosting Freedom – Run locally or deploy anywhere.
- 🚀 Developer‑Friendly – TypeScript, Prisma, and a modular UI.
- Frontend: Next.js, React, TypeScript, Tailwind CSS, shadcn/ui, Radix UI
- Realtime: LiveKit (client SDK + server token issuance)
- Backend: Next.js API routes (Node.js)
- Database/ORM: PostgreSQL + Prisma
- Authentication: Better Auth (Email/Password)
- State Management: Zustand
- Node.js v18+ and npm v10+
- Docker (optional, for running PostgreSQL locally)
Before running the app, configure environment variables. See Environment Variables below.
- Clone and Install
git clone https://github.com/akashwarrior/meet.git
cd meet
npm install- Start PostgreSQL (Local, via Docker)
docker run -d \
--name meet-db \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-e POSTGRES_DB=meet \
-p 5432:5432 postgres- Configure Environment
Copy the existing .env.example to .env and update the values as needed:
# macOS/Linux
cp .env.example .env
# Windows (PowerShell)
copy .env.example .envExample values:
NODE_ENV='development'
# Better Auth
BETTER_AUTH_URL='http://localhost:3000'
BETTER_AUTH_SECRET='your_long_random_string'
# Database URL
DATABASE_URL="postgresql://postgres:mysecretpassword@localhost:5432/meet"
# LiveKit WebSocket URL (Cloud or self-hosted)
NEXT_PUBLIC_LIVEKIT_URL=ws://127.0.0.1:7880
# API credentials used server-side to mint room tokens
LIVEKIT_API_KEY=devkey
LIVEKIT_API_SECRET=secret- Initialize the Database
npm run generate
npm run db:migrate- Start the App
npm run devRequired for a typical local setup:
- NODE_ENV: Application environment (
developmentorproduction) - DATABASE_URL: PostgreSQL connection string
- BETTER_AUTH_URL: Public application URL (http://localhost:3000 in dev)
- BETTER_AUTH_SECRET: Secret used to sign Better Auth tokens
- LIVEKIT_API_KEY and LIVEKIT_API_SECRET: Credentials to mint LiveKit access tokens
- NEXT_PUBLIC_LIVEKIT_URL: LiveKit WebSocket URL (e.g.,
ws://127.0.0.1:7880for local orwss://your-livekit-hostfor cloud)
Use .env.example as your starting point. Copy it to .env and then edit values to match your local/production environment.
You can use LiveKit Cloud or a self‑hosted LiveKit server.
- Create API credentials and obtain your WS URL.
- Set
LIVEKIT_API_KEY,LIVEKIT_API_SECRET, andNEXT_PUBLIC_LIVEKIT_URLin.env. - The app will mint per‑user room tokens via
GET /api/token?meetingId=...&username=....
The project uses Prisma with PostgreSQL.
- Generate client:
npm run generate - Apply migrations:
npm run db:migrate - Inspect data (optional):
npx prisma studio
Meet uses Better Auth with email/password authentication. Authentication routes:
- Sign in/Sign up:
/auth
Set BETTER_AUTH_SECRET and BETTER_AUTH_URL in .env. Better Auth provides a more modern, type-safe authentication solution with built-in session management and security features.
POST /api/meetings– Create a meeting (requires authenticated session)GET /api/meetings/[id]– Validate and join an existing meetingGET /api/token– Issue a LiveKit token for a user and room
npm run dev– Start the development servernpm run build– Build for productionnpm run start– Start the production servernpm run generate– Generate Prisma clientnpm run db:migrate– Run Prisma migrations in devnpm run lint– Lint project
If you run into setup issues, double‑check your .env and ensure PostgreSQL and LiveKit credentials are correct.