A web-based messaging client for Syncre that mirrors the mobile app experience with end-to-end encryption support.
- Tab-based navigation (Chats, Friends, Profile) - matches mobile app layout
- Responsive design optimized for mobile and desktop
- Bottom navigation bar with notification badges
- JWT-based authentication with secure token storage
- Login/Register flow integrated with Syncre API
- E2EE unlock for decrypting messages
- Chat list with unread message counts
- Real-time messaging via WebSocket
- Online/offline status indicators
- Streak indicators for consecutive messaging
- Block/unblock users
- Search users by username or email
- Send/accept/decline friend requests
- View pending requests (incoming and outgoing)
- User status display
- View profile with avatar and status
- Edit profile settings
- Privacy settings page
- Logout functionality
- iOS-inspired dark theme matching mobile app
- Glass morphism effects
- Consistent color palette and typography
- Smooth animations and transitions
- File attachments and media sharing
- Group chat management
- Voice/Video calls
- Push notifications (web)
- Framework: Next.js 15 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS v4
- Icons: React Icons
- State: React Context + Hooks
- E2EE: TweetNaCl, @stablelib libraries
Website/
├── app/
│ ├── app/ # Main app with tab navigation
│ │ ├── layout.tsx # Tab layout with context
│ │ ├── page.tsx # Chats list
│ │ ├── friends/
│ │ │ └── page.tsx # Friends management
│ │ ├── profile/
│ │ │ └── page.tsx # Profile page
│ │ ├── chat/[id]/
│ │ │ └── page.tsx # Individual chat
│ │ └── settings/
│ │ ├── page.tsx # Settings main
│ │ ├── edit-profile/
│ │ │ └── page.tsx # Edit profile
│ │ └── privacy/
│ │ └── page.tsx # Privacy settings
│ ├── chat/ # Existing chat components
│ ├── globals.css # Global styles with mobile design system
│ └── layout.tsx # Root layout
├── lib/ # Utility libraries
└── package.json
- Node.js 18+
- npm or pnpm
# Navigate to Website directory
cd Website
# Install dependencies
npm install
# Run development server
npm run devCreate a .env.local file:
# API URL (optional, defaults to production)
NEXT_PUBLIC_API_URL=https://api.syncre.xyzThe web client uses the same design system as the mobile app:
- Background:
#0B0E14 - Surface:
rgba(255, 255, 255, 0.14) - Accent:
#0A84FF - Success:
#34C759 - Error:
#FF453A - Text:
#F8FAFC - Text Muted:
rgba(248, 250, 252, 0.72)
- Display: 36px, bold
- Title: 22px, semibold
- Body: 15px, regular
- Label: 12px, uppercase
- xs: 8px
- sm: 12px
- md: 16px
- lg: 20px
- xl: 28px
The web client communicates with the Syncre backend API:
- Base URL:
https://api.syncre.xyz/v1 - WebSocket:
wss://api.syncre.xyz/ws - Authentication: JWT Bearer tokens
See the Backend API Documentation for complete API reference.
Real-time features use WebSocket for:
- Message delivery
- Typing indicators
- Online status updates
- Friend request notifications
- End-to-end encryption for all messages
- Secure token storage in localStorage
- XSS protection through React's built-in escaping
- CSRF protection through JWT tokens
- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Mobile Safari/Chrome
This project is licensed under the GNU GENERAL PUBLIC LICENSE.
- Mobile App - React Native mobile client
- Backend - Node.js API server