HangO is a feature-rich, real-time video conferencing platform that enables seamless audio/video calls, screen sharing, and collaborative meetings with an intuitive user interface.
- Multiple Login Options: Email/Password, GitHub OAuth, Google OAuth
- Account Management: User registration with email verification
- Profile Management: Avatar upload, username editing, phone number support
- Session Management: Persistent login sessions across browser restarts
- Password Recovery: Secure password reset via email
- Real-time Media: SFU-based media using LiveKit (recommended). The project previously used a P2P mesh but has migrated to an SFU for scalability and reliability.
- Screen Sharing: Share your entire screen or specific applications
- Meeting Controls: Mute/unmute audio, enable/disable video, toggle screen share
- Multi-participant Support: Join meetings with multiple users simultaneously
- Responsive UI: Works seamlessly on desktop and mobile devices
- Live Chat: Real-time messaging during meetings
- Chat History: Persistent message history for each meeting
- User Presence: See who's online and their media status
- Meeting Notifications: Audio/visual notifications for participant actions
- Easy Meeting Creation: Generate unique meeting codes instantly
- Pre-meeting Lobby: Join meetings with device testing capabilities
- Meeting Analytics: Track meeting duration, participants, and engagement
- Meeting History: View past meetings and statistics in dashboard
- Modern UI: Clean, gradient-based design with smooth animations
- Dark Theme: Eye-friendly dark interface with neon accents
- Responsive Design: Optimized for all screen sizes and devices
- Interactive Elements: Hover effects, smooth transitions, and intuitive controls
- Accessibility: Keyboard navigation and screen reader support
- Node.js - Runtime environment
- Express.js - Web application framework
- Socket.IO - Real-time bidirectional communication
- Passport.js - Authentication middleware
- bcrypt - Password hashing and security
- WebRTC (SFU) - Media handled via LiveKit (SFU) by default for scalability; client uses
public/livekit-client.jsas a helper. - Vanilla JavaScript - Core functionality
- CSS3 - Modern styling with gradients and animations
- HTML5 - Semantic markup
- Airtable - Cloud database for user and meeting data
- Nodemailer - Email service for verification and notifications
- UUID - Unique identifier generation
- GitHub OAuth - GitHub account integration
- Google OAuth - Google account integration
- Email/Password - Traditional authentication
Before running HangO, ensure you have:
- Node.js (v14 or higher)
- npm or yarn package manager
- Airtable Account (for database)
- Email Service (Gmail, SendGrid, etc.)
- OAuth Apps (GitHub and/or Google - optional)
git clone https://github.com/your-username/hango.git
cd hangonpm installCreate a .env file in the root directory:
# Server Configuration
PORT=3000
NODE_ENV=development
SESSION_SECRET=your-super-secret-session-key
# Airtable Configuration
AIRTABLE_API_KEY=your-airtable-api-key
AIRTABLE_BASE_ID=your-airtable-base-id
# Email Configuration
EMAIL_USER=[email protected]
EMAIL_PASS=your-app-password
EMAIL_FROM=[email protected]
# GitHub OAuth
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
GITHUB_CALLBACK_URL=http://localhost:3000/auth/github/callback
# Google OAuth (Optional)
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/callback
# Google Calender Auth
GOOGLE_CALENDAR_CLIENT_ID=your_calendar_client_id_here
GOOGLE_CALENDAR_CLIENT_SECRET=your_calendar_client_secret_hereCreate an Airtable base with a Users table containing these fields:
full_name(Single line text)username(Single line text)email(Email)phone(Phone number)password_hash(Single line text)is_verified(Checkbox)verification_token(Single line text)reset_token(Single line text)reset_token_expires(Date)provider(Single line text)provider_id(Single line text)avatar_url(URL)created_at(Date)updated_at(Date)
Create a Meetings table with:
meeting_code(Single line text)title(Single line text)created_by_user_id(Single line text)created_by_name(Single line text)is_anonymous(Checkbox)participants(Long text)settings(Long text)created_at(Date)ended_at(Date)status(Single select: active, ended)
- Go to GitHub Settings > Developer settings > OAuth Appsh Apps
- Create new OAuth App with callback:
http://localhost:3000/auth/github/callback - Add client ID and secret to
.env
- Go to Google Cloud Console > APIs & Services > Credentialsredentials
- Create OAuth 2.0 Client ID
- Add authorized redirect URI:
http://localhost:3000/auth/google/callback - Add client ID and secret to
.env
npm run dev
npm startrt- Open browser to
http://localhost:3000 - Create an account or login with existing credentials
- Navigate to dashboard to create or join meetings
- Login to your account
- Go to Dashboard
- Click "Start Meeting" to create a new meeting
- Share the meeting code with participants
- Enjoy your video conference!
- Click "Join Meeting" on homepage or dashboard
- Enter the meeting code provided by the host
- Test your camera and microphone in the pre-meeting lobby
- Click "Join Now" to enter the meeting
hango/
βββ server.js # Main server file
βββ package.json # Dependencies and scripts
βββ .env # Environment variables
βββ public/ # Static frontend files
β βββ index.html # Homepage
β βββ auth.html # Authentication page
β βββ dashboard.html # User dashboard
β βββ premeeting.html # Pre-meeting lobby
β βββ meet-webrtc.html # Main meeting interface
β βββ styles.css # Main stylesheet
β βββ app.js # Frontend JavaScript
βββ routes/ # Express routes
β βββ auth.js # Authentication routes
βββ services/ # Backend services
β βββ AirtableService.js # Database operations
β βββ EmailService.js # Email functionality
β βββ MeetingService.js # Meeting management
βββ README.md # This file
# This file
POST /api/user/register- User registrationPOST /api/user/login- User loginGET /api/user/session- Get current sessionPOST /api/user/logout- User logoutPOST /api/user/update-profile- Update user profileGET /api/user/verify- Email verificationPOST /api/user/forgot-password- Password reset requestPOST /api/user/reset-password- Password reset
GET /auth/github- GitHub OAuth loginGET /auth/github/callback- GitHub OAuth callbackGET /auth/google- Google OAuth loginGET /auth/google/callback- Google OAuth callback
POST /api/meeting/create- Create new meetingGET /api/meeting/:code- Get meeting detailsPOST /api/meeting/join- Join existing meeting
- Edit
public/styles.cssfor visual customization - Modify CSS variables for color scheme changes
- Update animations and transitions in the stylesheet
- Add new routes in
routes/directory - Extend database schema in
services/AirtableService.js - Implement additional OAuth providers in
routes/auth.js
- Password Security: bcrypt hashing with 12 salt rounds
- Session Management: Secure session cookies with configurable expiration
- Input Validation: Comprehensive validation on both frontend and backend
- CORS Protection: Configured CORS policies for API security
- Environment Variables: Sensitive data stored in environment variables
- OAuth Security: Secure OAuth implementation with provider validation
NODE_ENV=production
SESSION_SECRET=super-secure-production-secret- Heroku: Add buildpack and configure environment variables
- Vercel: Use serverless functions for API routes
- DigitalOcean: Deploy on droplet with PM2 for process management
- WebRTC Connection Fails: Check firewall settings and STUN/TURN server configuration
- Database Connection Error: Verify Airtable API key and base ID
- Email Not Sending: Check email service credentials and app passwords
- OAuth Login Issues: Verify OAuth app configuration and callback URLs
Enable debug logging by setting NODE_ENV=development in .env
- Fork the repository
- Create feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.