sanidhyy/meet-ai:基于 Next.js 的 AI 会议应用开源项目
sanidhyy/meet-ai
GitHub 项目 sanidhyy/meet-ai 是一个基于 Next.js 构建的 AI 会议应用,集成 GetStream 提供视频与聊天、Neon 提供 PostgreSQL 数据库、Polar 处理支付计费、UploadThing 负责文件上传,并支持 GitHub 与 Google OAuth 登录。
📔 Table of Contents
- Folder Structure
- Getting Started
- Screenshots
- Tech Stack
- Stats
- Contribute
- Acknowledgements
- Buy Me a Coffee
- Follow Me
- Learn More
- Deploy on Vercel
- Give A Star
- Star History
- Give A Star
‼️ Folder Structure
Here is the folder structure of this app.
meet-ai/ |- migrations/ |- public/ |- src/ |-- app/ |--- (auth)/ |--- (dashboard)/ |--- api/ |--- call/ |--- portal/ |--- apple-icon.png |--- favicon.ico |--- globals.css |--- icon0.svg |--- icon1.png |--- layout.tsx |--- manifest.json |--- not-found.tsx |-- components/ |--- providers/ |--- ui/ |--- command-select.tsx |--- data-pagination.tsx |--- data-table-features.ts |--- data-table.tsx |--- empty-state.tsx |--- error-state.tsx |--- generated-avatar.tsx |--- loading-state.tsx |--- responsive-dialog.tsx |-- config/ |--- http-status-codes.ts |--- index.ts |-- db/ |--- index.ts |--- schema.ts |-- env/ |--- client.ts |--- server.ts |-- hooks/ |--- use-confirm.tsx |--- use-mobile.ts |-- inngest/ |--- client.ts |--- functions.ts |-- lib/ |--- auth-client.ts |--- auth.ts |--- avatar.tsx |--- encryption.ts |--- polar.ts |--- stream-chat.ts |--- stream-video.ts |--- utils.ts |-- modules/ |--- agents/ |--- auth/ |--- call/ |--- dashboard/ |--- meetings/ |--- premium/ |--- settings/ |-- trpc/ |--- routers/ |--- client.tsx |--- init.ts |--- query-client.ts |--- server.ts |-- types/ |--- index.ts |- .env.example |- .env/.env.local |- .gitignore |- .prettierignore |- .prettierrc.mjs |- components.json |- drizzle.config.ts |- environment.d.ts |- eslint.config.mjs |- next.config.ts |- package.json |- pnpm-lock.yaml |- pnpm-workspace.yaml |- postcss.config.mjs |- tsconfig.json |- vercel.ts
🧰 Getting Started
- Make sure Git and NodeJS is installed.
- Clone this repository to your local computer.
- Create
.env.localfile in root directory. - Contents of
.env.local:
# disable telemetry DO_NOT_TRACK=1 BETTER_AUTH_TELEMETRY=0 NEXT_TELEMETRY_DISABLED=1 # app base url NEXT_PUBLIC_APP_BASE_URL="http://localhost:3000" # neon db uri DATABASE_URL="postgresql://<username>:<password>@<hostname>/MeetAI?sslmode=require" # better auth secret (generated by `openssl rand -hex 32`) BETTER_AUTH_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # github oauth client id and secret GITHUB_CLIENT_ID="XXXXXXXXXXXXXXXXXXXXX" GITHUB_CLIENT_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # google oauth client id and secret NEXT_PUBLIC_GOOGLE_CLIENT_ID="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com" GOOGLE_CLIENT_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # stream video api key and secret NEXT_PUBLIC_STREAM_VIDEO_API_KEY="xxxxxxxxxxxx" STREAM_VIDEO_API_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # stream chat api key and secret NEXT_PUBLIC_STREAM_CHAT_API_KEY="xxxxxxxxxxxx" STREAM_CHAT_API_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # polar access token POLAR_ACCESS_TOKEN="polar_oat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # uploadthing token UPLOADTHING_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # verification and cron secret (generated by `openssl rand -hex 32`) VERIFICATION_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" CRON_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
5. Disable Telemetry (Optional)
DO_NOT_TRACK=1 BETTER_AUTH_TELEMETRY=0 NEXT_TELEMETRY_DISABLED=1
- These disable analytics/telemetry from Better Auth and Next.js. Keep them as provided.
6. App Base URL
NEXT_PUBLIC_APP_BASE_URL="http://localhost:3000"- Keep as
http://localhost:3000during development. - Change to your deployed URL (e.g.,
https://app-meetai.vercel.app) in production.
7. Neon (PostgreSQL Database)
- Sign up at Neon.
- Create a new PostgreSQL project.
- Go to Connection Details and copy the Connection String.
- Replace
<username>,<password>, and<hostname>with your Neon credentials. - Append
?sslmode=requireat the end (needed for secure connections).
8. GetStream (Video & Chat)
-
Create an Account & App
- Sign up at GetStream Dashboard.
- Create a new app.
-
Get Your API Keys
- From your app’s dashboard > Chat Messaging and Video & Audio, locate:
- API Key → used in the frontend (
NEXT_PUBLIC_STREAM_VIDEO_API_KEYandNEXT_PUBLIC_STREAM_CHAT_API_KEY) - API Secret → used in backend or server code only (
STREAM_VIDEO_API_SECRETandSTREAM_CHAT_API_SECRET) (Copy both API Key and API Secret and paste in.env.local)
- API Key → used in the frontend (
- From your app’s dashboard > Chat Messaging and Video & Audio, locate:
-
Create Webhook
- In the GetStream Dashboard, go to:
- Chat Messaging > Settings > Webhooks
- Video & Audio > Settings > Webhooks
- Create a new webhook with this URL:
http://localhost:3000/api/webhook/stream. - Select all available events/endpoints for both Chat Messaging and Video & Audio.
- Click on Create Webhook.
- This ensures your backend receives real-time notifications for messages, participants, and call updates.
- In the GetStream Dashboard, go to:
NOTE: Replace http://localhost:3000 with your app's base URL.
9. Polar (Payments / Billing)
-
Create an Account
- Go to Polar Sandbox Dashboard.
- Set up your Organization.
-
Generate Access Token
- Navigate to Settings > Developers (or Organization > Developers).
- Create a new Organization Access Token (OAT).
- Copy the token and set (
POLAR_ACCESS_TOKEN) in.env.local.
10. UploadThing (File Uploads)
- Sign up at UploadThing.
- Create a new app.
- Copy the API Token →
UPLOADTHING_TOKEN
11. GitHub OAuth Client ID and Secret
To obtain GitHub OAuth credentials:
- Go to GitHub Developer Settings.
- Create a new OAuth app:
- Homepage URL: Your app's base URL (e.g.,
http://localhost:3000). - Authorization callback URL:
http://localhost:3000/api/auth/callback/github.
- Homepage URL: Your app's base URL (e.g.,
- After creation, you'll get Client ID and Client Secret.
NOTE: Replace http://localhost:3000 with your app's base URL.
12. Google OAuth Client ID and Secret
To obtain Google OAuth credentials:
- Visit the Google Cloud Console.
- Create a new project and configure OAuth consent screen with default settings.
- Create OAuth 2.0 credentials:
- Authorised JavaScript origins:
http://localhostandhttp://localhost:3000for one-tap sign in. - Authorized redirect URIs:
http://localhost:3000/api/auth/callback/google.
- Authorised JavaScript origins:
- After creation, you'll receive a Client ID and Client Secret.
NOTE: Replace http://localhost:3000 with your app's base URL.
13. Generate Secrets
-
Generate better auth secret, verification secret and cron secret (for cryptographic signing):
openssl rand -hex 32
Copy the output →
BETTER_AUTH_SECRET,VERIFICATION_SECRETandCRON_SECRETseparately
14. Ngrok
- Download Ngrok: https://ngrok.com/download
- Sign up at Ngrok and copy your auth token from the dashboard.
- Authenticate ngrok locally:
ngrok config add-authtoken YOUR_AUTH_TOKEN
-
Install Project Dependencies using
npm install --legacy-peer-depsoryarn install --legacy-peer-depsorpnpm install --legacy-peer-deps. -
Now app is fully configured 👍 and you can start using this app using either one of
npm run devoryarn devorpnpm dev.
NOTE: Please make sure to keep your API keys and configuration values secure and do not expose them publicly.
🙋 Need Help?
If you run into issues during installation or setup:
- GitHub Discussions — Open a Q&A discussion for setup and troubleshooting help.
- Email — sanidhyyy@gmail.com
- Discord —
@sanidhyy
📷 Screenshots
⚙️ Tech Stack
🔧 Stats
🙌 Contribute
You might encounter some bugs while using this app. You are more than welcome to contribute. Just submit changes via pull request and I will review them before merging. Make sure you follow community guidelines.
💎 Acknowledgements
Useful resources and dependencies that are used in MeetAI.
- Thanks to CodeWithAntonio: https://codewithantonio.com/
- @babel/eslint-parser: ^8.0.6
- @dicebear/collection: ^9.2.4
- @dicebear/core: ^9.4.3
- @eslint/eslintrc: ^3
- @hookform/resolvers: ^5.7.1
- @ianvs/prettier-plugin-sort-imports: ^4.7.1
- @inngest/agent-kit: ^0.13.2
- @neondatabase/serverless: ^1.0.2
- @polar-sh/better-auth: ^1.8.4
- @polar-sh/sdk: ^0.47.1
- @radix-ui/react-avatar: ^1.2.6
- @radix-ui/react-dialog: ^1.2.0
- @radix-ui/react-dropdown-menu: ^2.1.24
- @radix-ui/react-label: ^2.1.15
- @radix-ui/react-progress: ^1.1.16
- @radix-ui/react-scroll-area: ^1.2.18
- @radix-ui/react-separator: ^1.1.15
- @radix-ui/react-slot: ^1.3.0
- @radix-ui/react-tabs: ^1.1.21
- @radix-ui/react-tooltip: ^1.2.16
- @stream-io/node-sdk: ^0.8.6
- @stream-io/openai-realtime-api: ^0.4.2
- @stream-io/video-react-sdk: ^1.39.2
- @t3-oss/env-nextjs: ^0.13.10
- @tailwindcss/postcss: ^4.3.3
- @tanstack/react-query: ^5.104.1
- @tanstack/react-table: ^9.1.2
- @trpc/client: ^11.18.0
- @trpc/server: ^11.18.0
- @trpc/tanstack-react-query: ^11.18.0
- @types/humanize-duration: ^3.27.4
- @types/lodash.debounce: ^4.0.9
- @types/node: ^26.6.1
- @types/react: ^19
- @types/react-dom: ^19
- @types/react-highlight-words: ^0.20.1
- @vercel/config: ^0.7.1
- baseline-browser-mapping: ^2.11.19
- better-auth: ^1.7.5
- class-variance-authority: ^0.7.1
- client-only: ^0.0.1
- clsx: ^2.1.1
- cmdk: ^1.1.1
- date-fns: ^4.4.0
- dotenv: ^17.3.1
- drizzle-kit: ^0.31.11
- drizzle-orm: ^0.45.1
- eslint: ^9
- eslint-config-next: 16.3.7
- eslint-config-prettier: ^10.1.8
- eslint-plugin-prettier: ^5.5.6
- eslint-plugin-tailwindcss: ^4.4.0
- humanize-duration: ^3.34.1
- inngest: ^4.21.0
- jsonl-parse-stringify: ^1.0.3
- lodash.debounce: ^4.0.8
- lucide-react: ^1.24.0
- media-chrome: ^4.19.2
- mprocs: ^0.9.6
- nanoid: ^6.0.1
- next: 16.3.8
- nuqs: ^2.9.0
- openai: ^7.30.0
- prettier: ^3.9.9
- prettier-plugin-tailwindcss: ^0.8.1
- react: 19.3.0
- react-dom: 19.3.0
- react-error-boundary: ^6.1.6
- react-highlight-words: ^0.21.0
- react-hook-form: ^7.83.0
- react-hot-toast: ^2.6.0
- react-markdown: ^10.1.0
- server-only: ^0.0.1
- stream-chat: ^9.54.0
- stream-chat-react: ^14.8.0
- superjson: ^2.2.6
- tailwind-merge: ^3.6.0
- tailwindcss: ^4.3.3
- tw-animate-css: ^1.4.0
- typescript: ^6
- uploadthing: ^7.7.4
- vaul: ^1.1.2
- zod: ^4.6.5
☕ Buy Me a Coffee
🚀 Follow Me
📚 Learn More
To learn more about Next.js, take a look at the following resources:
- Next.js Documentation - learn about Next.js features and API.
- Learn Next.js - an interactive Next.js tutorial.
You can check out the Next.js GitHub repository - your feedback and contributions are welcome!
📃 Deploy on Vercel
The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.
Check out Next.js deployment documentation for more details.
⭐ Give A Star
You can also give this repository a star to show more people and they can use this repository.
🌟 Star History
来源:GitHub · github.com




