Private, invite-only voice and video calling built with Next.js App Router, Clerk, Convex, Twilio, and Stripe Managed Payments.
- Next.js 16 + TypeScript (strict)
- Tailwind CSS v4 + shadcn/ui-style components
- Clerk v6 auth
- Convex for realtime data, call state, invites, and presence
- Twilio Voice SDK 2.x + Twilio Video SDK
- Express signaling server (
/server) - Stripe Managed Payments subscription checkout
-
Install dependencies:
npm install
-
Fill
.env.localand provide Twilio/Clerk/Convex/Stripe credentials. -
Start app + signaling + Convex:
npm run dev:all
- Convex setup required: Run
npx convex devbefore starting the app. Theconvex/_generated/*files are scaffold placeholders until Convex generates strongly typed API references. Without this step, call features will fail at runtime. - Presence heartbeat runs every 30 seconds through
usePresence. - Invite acceptance enforces the free-tier max of 20 contacts at mutation level.
- Stripe Checkout uses hosted payment pages. Match the Landlines theme from the Stripe Dashboard under Checkout branding (logo, colors, font, and corner radius), and point your webhook endpoint at
/api/webhooks/stripe.