3.9 KiB
3.9 KiB
Update this file when making significant changes.
See also: CONVEX_RULES.md | CONVEX_EXAMPLES.md
Architecture
- Backend: Convex (reactive database + serverless functions)
- Frontend: React + Vite (Electron app)
- Auth: Zero-knowledge custom auth via Convex mutations (getSalt, verifyUser, createUserWithProfile)
- Real-time: Convex reactive queries (
useQueryauto-updates all connected clients) - Voice/Video: LiveKit (token generation via Convex Node action)
- E2E Encryption: Client-side via Electron IPC (
window.cryptoAPI) - File Storage: Convex built-in storage (
generateUploadUrl+getUrl)
Key Convex Files (convex/)
schema.ts- Full schema: userProfiles, channels, messages, messageReactions, channelKeys, roles, userRoles, invites, dmParticipants, typingIndicators, voiceStatesauth.ts- getSalt, verifyUser, createUserWithProfile, getPublicKeyschannels.ts- list, get, create, rename, remove (with cascade delete)channelKeys.ts- uploadKeys, getKeysForUsermessages.ts- list (with reactions + username), send, removereactions.ts- add, removetyping.ts- startTyping, stopTyping, getTyping, cleanExpired (scheduled)dms.ts- openDM, listDMsinvites.ts- create, use, revokeroles.ts- list, create, update, remove, listMembers, assign, unassign, getMyPermissionsvoiceState.ts- join, leave, updateState, getAllvoice.ts- getToken (Node action, livekit-server-sdk)files.ts- generateUploadUrl, getFileUrlgifs.ts- search, categories (Node actions, Tenor API)
Frontend Structure (FrontEnd/Electron/src/)
main.jsx- ConvexProvider + VoiceProvider + HashRouterpages/Login.jsx- Convex auth (getSalt + verifyUser)pages/Register.jsx- Convex auth (createUserWithProfile + invite flow)pages/Chat.jsx- useQuery for channels, channelKeys, DMscomponents/ChatArea.jsx- Messages, typing, reactions via Convex queries/mutationscomponents/Sidebar.jsx- Channel creation, key distribution, invites via Convexcontexts/VoiceContext.jsx- Voice state via Convex + LiveKit room managementcomponents/ChannelSettingsModal.jsx- Channel rename/delete via Convex mutationscomponents/ServerSettingsModal.jsx- Role management via Convex queries/mutationscomponents/FriendsView.jsx- User list via Convex querycomponents/DMList.jsx- DM user picker via Convex querycomponents/GifPicker.jsx- GIF search via Convex actioncomponents/VoiceRoom.jsx- LiveKit token via Convex action
Important Patterns
- Channel IDs use Convex
_id(notid) - all references usechannel._id - Auth: client hashes DAK -> HAK before sending, server does string comparison
- First user bootstrap: createUserWithProfile creates Owner + @everyone roles
- Vite config uses
envDir: '../../'to pick up root.env.local socket.io-clientfully removed, all socket refs replaced with Convex- No Express backend needed -
Backend/directory is legacy and can be deleted - Convex queries are reactive - no need for manual refresh or socket listeners
- File uploads use Convex storage:
generateUploadUrl-> POST blob ->getFileUrl - Typing indicators use scheduled functions for TTL cleanup
Environment Variables
In .env.local at project root:
CONVEX_DEPLOYMENT- Convex deployment URL (set bynpx convex dev)VITE_CONVEX_URL- Convex URL for frontend (set bynpx convex dev)VITE_LIVEKIT_URL- LiveKit server URLLIVEKIT_API_KEY- LiveKit API key (used in Convex Node action)LIVEKIT_API_SECRET- LiveKit API secret (used in Convex Node action)TENOR_API_KEY- Tenor GIF API key (used in Convex Node action)
Running the App
npm install && npm run install:frontendnpx convex dev(starts Convex backend, creates.env.local)- In another terminal:
cd FrontEnd/Electron && npm run dev(ornpm run electron:dev)