A comprehensive real-time chat application built with Flutter (Riverpod) frontend and TypeScript/Express backend.
- ✅ Text messaging
- ✅ Typing indicators ("X is typing...")
- ✅ Read/delivered receipts (sent, delivered, read)
- ✅ Message history (persisted / archived)
- ✅ Multiple participants in one conversation
- ✅ Admin roles (add/remove members)
- ✅ Group naming / group avatar
- ✅ Mute / unmute notifications for group members
- ✅ Reactions (emoji reactions to messages)
- ✅ Ability to remove your reaction
- ✅ Tracking count of reactions per message
- ✅ Edit your own messages (with "edited" tag)
- ✅ Delete your own messages
- ✅ "Delete for everyone" option
- ✅ Send images, videos, audio, files/documents
- ✅ Preview of media (thumbnails, in-chat display)
- ✅ Tagging users in group chats with "@" mentions
- ✅ Search within chats (by message content, by sender)
- ✅ Messages are stored when a user is offline, then delivered when they reconnect
- ✅ Syncing message edits and deletions when the user is back online
- ✅ Notify users of new messages, @mentions, when someone reacts
- ✅ Presence / Online Status (show whether users are online, offline, or last seen)
- ✅ Typing indicators
- ✅ Read receipts
- Runtime: Node.js with TypeScript
- Framework: Express.js
- Database: PostgreSQL with Prisma ORM
- Real-time: Socket.io
- Authentication: JWT
- Framework: Flutter
- State Management: Riverpod
- Real-time: Socket.io Client
- HTTP Client: http package
- Storage: SharedPreferences, Hive
- Navigate to the backend directory:
cd Backend- Install dependencies:
npm install- Set up environment variables:
Create a
.envfile in theBackenddirectory:
DATABASE_URL=your_postgresql_connection_string
JWT_SECRET=your_jwt_secret_key
PORT=4000
- Run Prisma migrations:
npx prisma migrate dev- Generate Prisma client:
npx prisma generate- Start the development server:
npm run devThe backend will run on http://localhost:4000
- Navigate to the frontend directory:
cd frontend- Install dependencies:
flutter pub get- Update API and Socket URLs:
Edit
lib/services/api_service.dartandlib/services/socket_service.dart:
- Change
localhostto your backend IP address for mobile testing - Or keep
localhostfor web/emulator testing
- Run the app:
flutter runPOST /api/auth/register- Register a new userPOST /api/auth/login- Login user
GET /api/conversations- Get all conversationsPOST /api/conversations- Create or get private conversationPOST /api/conversations/group- Create group conversationPUT /api/conversations/group/:conversationId- Update group (name, avatar)POST /api/conversations/group/:conversationId/members- Add membersDELETE /api/conversations/group/:conversationId/members/:memberId- Remove memberPUT /api/conversations/group/:conversationId/members/:memberId/role- Update member rolePUT /api/conversations/group/:conversationId/mute- Toggle mutePOST /api/conversations/group/:conversationId/leave- Leave group
GET /api/messages?conversationId=:id- Get messagesPOST /api/messages- Send messagePUT /api/messages/:messageId- Edit messageDELETE /api/messages/:messageId- Delete messagePOST /api/messages/reaction- Add reactionPOST /api/messages/read- Mark as readGET /api/messages/search?query=:query- Search messages
joinConversation- Join a conversation roomleaveConversation- Leave a conversation roomsendMessage- Send a messageeditMessage- Edit a messagedeleteMessage- Delete a messagetyping- Typing indicatoraddReaction- Add reaction to messagemarkAsRead- Mark message as readupdatePresence- Update online status
newMessage- New message receivedmessageUpdated- Message was editedmessageDeleted- Message was deletedtyping- User is typingreactionAdded- Reaction addedreactionRemoved- Reaction removedmessageRead- Message was readpresenceUpdate- User presence changedmention- User was mentioned
The application uses Prisma with PostgreSQL. Key models:
User- User accounts with presence statusConversation- Both private and group conversationsGroupMember- Group membership with rolesMessage- Messages with media supportMessageReaction- Emoji reactionsMessageMention- User mentionsReadReceipt- Read receiptsContact- User contacts
- The backend uses Socket.io for real-time communication
- Authentication is handled via JWT tokens
- Messages support multiple types: text, image, video, audio, file
- Group chats support admin roles and member management
- Presence status is tracked and updated in real-time
- Read receipts track when messages are read
- Reactions support multiple emojis per message
- Push notifications setup (Firebase/APNs)
- File upload service (AWS S3, Cloudinary, etc.)
- End-to-end encryption
- Voice/video calls
- Message forwarding
- Message pinning
- Custom emoji support
MIT