A comprehensive team collaboration platform built with Spring Boot, PostgreSQL, WebSocket, and LiveKit for real-time communication and video meetings.
- User registration with email and password
- Login with JWT token generation
- Spring Security configuration with role-based access (USER, ADMIN)
- Password encryption using BCrypt
- Session management with JWT
- Create/edit/delete workspaces (teams)
- Create public and private channels within workspaces
- User invitation to workspaces via invite links
- Channel membership management
- Direct messaging between users
- WebSocket connection using STOMP protocol
- Send/receive text messages in real-time
- Message persistence in PostgreSQL database
- Display message history when joining channel
- Typing indicators
- Online/offline user status
- Message timestamps and read receipts
- File attachment support (images, documents)
- Generate LiveKit room tokens from backend
- Create meeting rooms for channels
- Join/leave meeting functionality
- Display active participants
- Screen sharing support
- Meeting invite links
- Responsive layout with sidebar navigation
- Channel list with unread message indicators
- Message thread view
- User profile page
- Settings page
- Dark/light theme toggle
- Backend: Spring Boot 4.0.0
- Database: PostgreSQL
- Security: Spring Security with JWT
- Real-time: WebSocket/STOMP
- Video: LiveKit Server SDK
- Frontend: Thymeleaf, HTMX, Vanilla JavaScript
- Build Tool: Maven
- Java 25 or higher
- PostgreSQL 12 or higher
- Maven 3.6+
- LiveKit server (optional for video meetings)
Create a PostgreSQL database:
CREATE DATABASE teamup_db;Edit src/main/resources/application.properties:
# Database Configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/teamup_db
spring.datasource.username=your_postgres_username
spring.datasource.password=your_postgres_password
# JWT Configuration
jwt.secret=ChangeThisToYourOwnSecretKeyAtLeast256BitsLong123456789
# LiveKit Configuration (if using video meetings)
livekit.api.key=your-livekit-api-key
livekit.api.secret=your-livekit-api-secret
livekit.url=ws://localhost:7880mvn clean installmvn spring-boot:runThe application will start on http://localhost:8080
src/main/java/com/codehuntspk/teamup/
├── config/ # Configuration classes
│ ├── SecurityConfig.java
│ └── WebSocketConfig.java
├── controller/ # REST and Web Controllers
│ ├── AuthController.java
│ ├── ChatController.java
│ ├── MeetingController.java
│ ├── WebController.java
│ └── WorkspaceController.java
├── dto/ # Data Transfer Objects
│ ├── AuthResponse.java
│ ├── LoginRequest.java
│ ├── MessageDto.java
│ └── RegisterRequest.java
├── entity/ # JPA Entities
│ ├── Channel.java
│ ├── Invitation.java
│ ├── Meeting.java
│ ├── Message.java
│ ├── User.java
│ ├── Workspace.java
│ └── WorkspaceMember.java
├── repository/ # JPA Repositories
│ ├── ChannelRepository.java
│ ├── InvitationRepository.java
│ ├── MeetingRepository.java
│ ├── MessageRepository.java
│ ├── UserRepository.java
│ ├── WorkspaceMemberRepository.java
│ └── WorkspaceRepository.java
├── security/ # Security Components
│ ├── CustomUserDetailsService.java
│ ├── JwtAuthenticationFilter.java
│ └── JwtTokenProvider.java
├── service/ # Business Logic
│ ├── AuthService.java
│ ├── ChannelService.java
│ ├── InvitationService.java
│ ├── LiveKitService.java
│ ├── MeetingService.java
│ ├── MessageService.java
│ └── WorkspaceService.java
└── TeamUpApplication.java
src/main/resources/
├── static/
│ ├── css/
│ │ └── style.css
│ └── js/
│ ├── auth.js
│ ├── meeting.js
│ └── workspace.js
└── templates/
├── layout.html
├── login.html
├── meeting.html
├── register.html
└── workspace.html
POST /api/auth/register- Register new userPOST /api/auth/login- Login user
POST /api/workspaces- Create workspaceGET /api/workspaces/user/{userId}- Get user's workspacesGET /api/workspaces/{workspaceId}- Get workspace detailsPUT /api/workspaces/{workspaceId}- Update workspaceDELETE /api/workspaces/{workspaceId}- Delete workspaceGET /api/workspaces/{workspaceId}/members- Get workspace members
GET /api/messages/channel/{channelId}- Get channel messages
POST /api/meetings/channel/{channelId}- Create meetingGET /api/meetings/{meetingId}/token- Get meeting tokenPOST /api/meetings/{meetingId}/end- End meetingGET /api/meetings/{meetingId}- Get meeting details
/ws- WebSocket endpoint/app/chat/{channelId}- Send message/topic/channel/{channelId}- Subscribe to channel messages
- id, username, email, password, firstName, lastName, avatar, status, roles, createdAt, updatedAt
- id, name, description, ownerId, imageUrl, createdAt, updatedAt
- id, name, description, workspaceId, type, isDirectMessage, createdAt, updatedAt
- id, channelId, senderId, content, attachmentUrl, attachmentType, timestamp, edited
- id, workspaceId, userId, role, joinedAt
- id, workspaceId, inviterId, inviteeEmail, token, status, createdAt, expiresAt
- id, channelId, roomName, livekitRoomId, createdById, status, startedAt, endedAt
- Register/Login: Navigate to
http://localhost:8080and create an account - Create Workspace: Click "New Workspace" to create your team workspace
- Create Channels: Add channels for different topics or projects
- Chat: Select a channel and start messaging in real-time
- Video Meetings: Click "Start Meeting" to create a video room
- Invite Members: Use invite links to add team members to your workspace
For video meeting functionality, you need to run LiveKit server:
- Download LiveKit server from https://livekit.io/
- Run the server:
livekit-server --dev
- Update
application.propertieswith your LiveKit credentials
- Change the JWT secret in production
- Use environment variables for sensitive configuration
- Enable HTTPS in production
- Configure CORS properly for your domain
- Regular security updates for dependencies
- File upload and storage (AWS S3 integration)
- Push notifications
- Email notifications
- Advanced user presence tracking
- Message reactions and threads
- Voice channels
- Screen recording
- Calendar integration
- Task management
- Analytics dashboard
This project is open source and available under the MIT License.
Contributions are welcome! Please feel free to submit a Pull Request.
For issues and questions, please open an issue on the GitHub repository.