To run this application:
pnpm install
pnpm run startThis project uses Biome for linting and formatting. To run both linter & formater just run:
pnpm run check:fixβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND β
β (React + TanStack Router + Vite) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββ βββββββββββββββββββββββββ βββββββββββββββββββββββββββ β
β β Auth0Provider β β ConvexReactClient β β TanStack Query β β
β β (auth state) β β (real-time sync) β β (data caching) β β
β ββββββββββ¬ββββββββββ βββββββββββββ¬ββββββββββββ ββββββββββββββ¬βββββββββββββ β
β β β β β
β ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββ β
β β chat.tsx β β
β β ββββββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββββββ β β
β β β useQuery() β β useMutation() β β useChat() β β β
β β β β’ getConversations β β β’ createWith... β β β’ sendMessage() β β β
β β β β’ getMessages β β β’ addUserMessage β β β’ messages state β β β
β β ββββββββββ¬ββββββββββββ ββββββββββ¬ββββββββββ ββββββββββββ¬βββββββββββ β β
β βββββββββββββΌβββββββββββββββββββββββββΌβββββββββββββββββββββββββΌβββββββββββββββ β
β β β β β
ββββββββββββββββΌβββββββββββββββββββββββββΌβββββββββββββββββββββββββΌβββββββββββββββββββββ
β β β
β WebSocket β WebSocket β HTTP POST
β (real-time) β (mutations) β /api/chat
βΌ βΌ βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββ
β CONVEX BACKEND β β TANSTACK START SERVER β
β (Real-time Database) β β (api/chat.ts) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ€ ββββββββββββββββββββββββββββββββ€
β β β β
β βββββββββββββββββββ ββββββββββββββββββββββββ β β ββββββββββββββββββββββββββ β
β β AUTH CONFIG β β QUERIES β β β β streamText() β β
β β (Auth0 JWT) β β β’ getConversations β β β β google/gemini-2.0 β β
β βββββββββββββββββββ β β’ getMessages β β β βββββββββββββ¬βββββββββββββ β
β β β’ getConversation β β β β β
β βββββββββββββββββββ ββββββββββββββββββββββββ β β onFinish() β β
β β MUTATIONS β β β βΌ β
β β β’ createWith β ββββββββββββββββββββββββ β β ββββββββββββββββββββββββββ β
β β FirstMessage β β HTTP ACTIONS β ββββΌβββ POST /saveAssistant β β
β β β’ addUserMsg β β (http.ts) β β β β Message β β
β β β’ updateTitle β β /saveAssistantMsg β β β ββββββββββββββββββββββββββ β
β βββββββββββββββββββ ββββββββββββββββββββββββ β β β
β β ββββββββββββββββββββββββββββββββ
β βββββββββββββββββββ ββββββββββββββββββββββββ β β
β β INTERNAL ββββββ addAssistantMessage β β β
β β MUTATIONS β β (no auth check) β β β
β βββββββββββββββββββ ββββββββββββββββββββββββ β β
β β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β DATABASE β β
β ββββββββββββββββββββββββββββββββββββββββββββββ β β
β β ββββββββββββ ββββββββββββββββ βββββββββ β β β
β β β users ββββconversations ββββmessageβ β β β
β β β β β β β β β β β
β β β β’ token β β β’ userId β ββ’ role β β β β
β β β β’ name β β β’ title β ββ’ text β β β β
β β β β’ email β β β’ model β ββ’ meta β β β β
β β ββββββββββββ ββββββββββββββββ βββββββββ β β β
β ββββββββββββββββββββββββββββββββββββββββββββββ β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββ
β EXTERNAL SERVICES β β
β ββββββββββββββββββββββββββ βββββββββββββββββββββ΄ββββββββββββ β
β β AUTH0 β β GOOGLE AI (Gemini 2.0) β β
β β β’ User authentication β β β’ LLM inference β β
β β β’ JWT tokens β β β’ Streaming responses β β
β β β’ OAuth flow β β β β
β ββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ-β
| Flow | Path | Description |
|---|---|---|
| Auth | User β Auth0 β Convex | JWT-based authentication via Auth0Provider |
| Real-time queries | Frontend β Convex (WebSocket) | Conversations & messages sync in real-time |
| User messages | Frontend β Convex mutation | createWithFirstMessage or addUserMessage |
| LLM request | Frontend β /api/chat β Gemini API |
Streaming chat via Vercel AI SDK |
| Save AI response | Server β HTTP Action β Internal Mutation | Persists assistant messages with metadata |
- Frontend: React, TanStack Router/Query, Vite, Flowbite, AI SDK (
@ai-sdk/react) - Backend: Convex (BaaS), TanStack Start (SSR/Server Functions)
- Auth: Auth0 with Convex integration
- LLM: Google Gemini 2.0 Flash
- Hosting: Netlify