Takumi is an open-source, AI-powered meeting assistant platform built with the modern web stack. It bridges the gap between real-time video conferencing and intelligent post-meeting analysis.
With Takumi, users can create custom AI Agents with specific personas/instructions, invite them to meetings, and interact with them afterward to query transcripts, summaries, and action items.
- 📹 Real-time Video Meetings: High-quality video calls powered by Stream Video.
- 🤖 Custom AI Agents: Create agents with unique personalities and instructions (e.g., "Note Taker", "Technical Reviewer").
- 📝 Automated Transcription & Summarization: Meetings are automatically transcribed and summarized using OpenAI and Inngest.
- 💬 Interactive AI Chat: Chat with your AI agents after the meeting. They have full context of the transcript and can answer specific questions about what happened.
- 🔐 Secure Authentication: Built-in auth using Better Auth.
- 💸 Subscription Ready: Integrated with Polar for managing premium features and subscriptions.
- ⚡ Reactive UI: Built with Shadcn UI, Tailwind CSS, and React 19.
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- Database: PostgreSQL (via Neon)
- ORM: Drizzle ORM
- Video & Chat: Stream
- AI & LLMs: OpenAI
- Background Jobs: Inngest
- Authentication: Better Auth
- Payments: Polar
- API Layer: tRPC
Follow these steps to get Takumi running locally on your machine.
Ensure you have the following installed:
- Node.js (v18 or higher)
- npm or pnpm
- PostgreSQL Database (We recommend Neon Serverless)
git clone [https://github.com/vasanthrs-dev/takumi.git](https://github.com/vasanthrs-dev/takumi.git)
cd takumi
npm install
Create a .env.local file in the root directory. You will need credentials from the services listed below:
# 1. Database (Neon/Postgres)
# Get this from your Neon Dashboard
DATABASE_URL="postgresql://user:password@host/dbname?sslmode=require"
# 2. Authentication (Better Auth)
# The URL where your app is running (http://localhost:3000 for dev)
BETTER_AUTH_URL="http://localhost:3000"
# Generate a random string: openssl rand -base64 32
BETTER_AUTH_SECRET="your_generated_secret_here"
# 3. OAuth Providers (Required for Sign In)
# You need to set these up in Google Cloud Console or GitHub Developer Settings
GITHUB_CLIENT_ID="your_github_client_id"
GITHUB_CLIENT_SECRET="your_github_client_secret"
# (Optional: Add Google if you are using it)
GOOGLE_CLIENT_ID="your_google_client_id"
GOOGLE_CLIENT_SECRET="your_google_client_secret"
# 4. Stream (Video & Chat)
# Get these from the GetStream.io Dashboard
NEXT_PUBLIC_STREAM_VIDEO_API_KEY="your_stream_api_key"
STREAM_VIDEO_SECRET_KEY="your_stream_secret_key"
# 5. AI Services (OpenAI)
# Get this from platform.openai.com
OPENAI_API_KEY="sk-..."
# 6. Payments (Polar)
# Get this from polar.sh settings
POLAR_ACCESS_TOKEN="your_polar_access_token"
# 7. Background Jobs (Inngest)
# Optional for local development (uses Inngest Dev Server default)
# Required for production
INNGEST_EVENT_KEY="local"
INNGEST_SIGNING_KEY="local"
Push the database schema to your PostgreSQL instance using Drizzle.
npm run db:push
You need to run the development server and the Inngest dev server (for handling background workflows like summarization).
Terminal 1: Next.js App
npm run dev
Terminal 2: Inngest Dev Server
npx inngest-cli@latest dev
Open http://localhost:3000 to see the app. Open http://localhost:8288 to see the Inngest dashboard.
- Creation: A user creates a meeting and assigns an Agent to it.
- Live Session: The user joins the video call powered by Stream. The session is recorded.
- Processing: Once the meeting ends, a webhook triggers an Inngest function.
- The system fetches the transcript.
- It identifies speakers (Users vs. Agents).
- It uses OpenAI to generate a structured summary.
- Interaction: The user can visit the meeting detail page and chat. The chat messages are processed by an Inngest function that feeds the meeting summary + agent instructions to OpenAI to generate a response.
src/
├── app/ # Next.js App Router pages (auth, dashboard, call)
├── components/ # Reusable UI components (Shadcn)
├── db/ # Drizzle schema and connection logic
├── inngest/ # Background job definitions (AI processing)
├── lib/ # Utility libraries (Stream, OpenAI, Utils)
├── modules/ # Feature-based architecture
│ ├── agents/ # Agent management logic
│ ├── auth/ # Authentication views
│ ├── call/ # Video call UI & logic
│ ├── dashboard/ # Dashboard layout & components
│ ├── home/ # Landing page & public views
│ ├── meetings/ # Meeting management & transcripts
│ └── premium/ # Polar subscription logic
└── trpc/ # tRPC API definition
We love contributions! Takumi is open source and built for the community.
- Fork the repository.
- Create a Feature Branch (
git checkout -b feature/AmazingFeature). - Commit your changes (
git commit -m 'Add some AmazingFeature'). - Push to the branch (
git push origin feature/AmazingFeature). - Open a Pull Request.
npm run dev: Start the dev server.npm run db:studio: Open Drizzle Studio to view your database data visually.npm run dev:webhook: Start an ngrok tunnel (useful for testing Stream webhooks locally).
This project is licensed under the MIT License. Feel free to use, modify, and distribute it as you wish.