Connect Teams Across Time Zones
A powerful, intuitive web application that helps you find the perfect meeting time across multiple time zones. No more mental math or timezone confusion!
- Features
- Demo
- Quick Start
- Detailed Setup Guide
- How It Works
- Usage Instructions
- API Integration
- Customization
- Browser Support
- Troubleshooting
- Contributing
- License
- Multi-timezone Support: Add unlimited attendees from 418+ time zones worldwide covering all countries and cities
- Visual Timeline: Color-coded 24-hour timeline showing working hours for each attendee
- Smart Recommendations: Algorithm finds the best meeting windows based on:
- Working hours (9 AM - 5 PM local time)
- Lunch breaks (12 PM - 1 PM)
- Early/late hours (8-9 AM, 5-7 PM)
- Night hours (avoid scheduling during sleep time)
- Weekend detection and penalties
- Direct Meeting Platform Integration:
- 📹 Google Meet - Create meetings with OAuth authentication
- 💼 Microsoft Teams - Create Teams meetings directly
- 🎥 Zoom - Schedule Zoom meetings with one click
- Organizer information capture (name, email, timezone)
- Demo mode for testing without OAuth setup
- Calendar Integration:
- Google Calendar direct link generation
- ICS file download for any calendar app (Outlook, Apple Calendar, etc.)
- Responsive Design: Works perfectly on desktop, tablet, and mobile devices
- No Backend Required: Pure client-side application - no server needed!
- 🎨 Beautiful gradient UI with Tailwind CSS
- 🔄 Smooth animations and transitions
- 📱 Mobile-friendly responsive layout
- 🎯 Intuitive drag-and-drop interface
- 💾 No data stored - complete privacy
- Download the
index.htmlfile - Double-click the file to open it in your default browser
- Start adding attendees!
# If you have Python 3 installed:
python -m http.server 8000
# If you have Python 2:
python -m SimpleHTTPServer 8000
# If you have Node.js installed:
npx http-server
# If you have PHP installed:
php -S localhost:8000Then open http://localhost:8000/index.html in your browser.
Upload the single HTML file to any web hosting service:
- GitHub Pages
- Netlify
- Vercel
- AWS S3
- Any traditional web host
Required:
- Modern web browser (Chrome 90+, Firefox 88+, Safari 14+, Edge 90+)
- Internet connection (for Tailwind CSS CDN)
Optional (for development):
- Text editor (VS Code, Sublime Text, Atom, etc.)
- Local web server (Python, Node.js, PHP, etc.)
# Clone from repository
git clone https://github.com/MeetAcross/MeetAcross.github.io.git
cd MeetAcross.github.io
# Or simply download the HTML file directlyMethod A: Direct Open
# On macOS
open index.html
# On Linux
xdg-open index.html
# On Windows
start index.htmlMethod B: Using a Local Server
# Python 3
python3 -m http.server 8000
# Then visit: http://localhost:8000/index.htmlYou should see:
- A gradient blue background
- MeetAcross logo and header
- "Connect Teams Across Time Zones" tagline
- Input fields for adding attendees
- Date selector
If you see these elements, you're all set! 🎉
index.html
├── HTML Structure
│ ├── Header Section (with MeetAcross logo)
│ ├── Attendee Input Form
│ ├── Date Selector
│ ├── Timeline Visualization
│ ├── Best Times Recommendations
│ └── Calendar Integration
├── CSS Styling (Tailwind CSS CDN)
│ ├── Responsive Grid Layout
│ ├── Color Coding System
│ └── Animations
└── JavaScript Logic
├── Timezone Management
├── Timeline Generation
├── Scoring Algorithm
└── Calendar Export Functions
The application uses a smart scoring system to find optimal meeting times:
// Scoring breakdown:
- Working hours (9 AM - 12 PM, 2 PM - 5 PM): +10 points per attendee
- Lunch time (12 PM - 1 PM): +3 points per attendee
- Early/Late hours (8-9 AM, 5-7 PM): +1 point per attendee
- Night hours (7 PM - 8 AM): -20 points per attendee
- Weekend meetings: -50 points totalThe algorithm:
- Generates all 24 possible hourly slots
- Calculates local time for each attendee
- Scores each time slot based on working hours
- Sorts and presents top 5 options
- Highlights the best option with a purple badge
| Color | Meaning | Hours (Local Time) |
|---|---|---|
| 🟢 Green | Optimal working hours | 9 AM - 12 PM, 2 PM - 5 PM |
| 🔵 Blue | Lunch time | 12 PM - 1 PM |
| 🟡 Yellow | Early/Late but acceptable | 8-9 AM, 5-7 PM |
| 🔴 Red | Night hours (avoid) | 7 PM - 8 AM |
| ⬜ Gray | Weekend | Saturday/Sunday |
For direct meeting creation with Google Meet, Microsoft Teams, or Zoom, see our comprehensive Meeting Platform Setup Guide.
Quick Setup Options:
- Demo Mode: Test the interface without OAuth credentials
- Production Mode: Configure OAuth for real meeting creation
- Enter Name: Type the attendee's name (e.g., "John Smith")
- Select Timezone: Choose from 418+ timezones worldwide
- Click "Add Attendee": The attendee appears in the list below
- Repeat: Add as many attendees as needed
Example:
Name: Sarah Chen
Timezone: Asia/Hong_Kong
→ Click "Add Attendee"
Name: Michael Brown
Timezone: America/New_York
→ Click "Add Attendee"
- Select Date: Choose your desired meeting date
- Weekends are automatically detected
- Defaults to today's date
- Click "Generate Timeline": View the 24-hour visualization
- Analyze: Each row shows one attendee's local times
Reading the Timeline:
- Horizontal axis: UTC hours (00:00 to 23:00)
- Each cell shows: Local time for that attendee
- Hover over cells: See detailed time information
- Review Recommendations: Top 5 best times are shown
- Check Details: Each option shows local time for all attendees
- Look for the Purple Badge: "BEST" indicates the optimal choice
- Consider Scores: Higher scores = better meeting times
- Enter meeting title (required)
- Add description (optional)
- Select a recommended time from dropdown
- Click "Add to Google Calendar"
- Google Calendar opens with pre-filled event
- Review and save
- Enter meeting title (required)
- Add description (optional)
- Select a recommended time from dropdown
- Click "Download .ics File"
- Open the downloaded file with your calendar app:
- Outlook: Double-click the .ics file
- Apple Calendar: Double-click or drag to Calendar app
- Gmail: Upload via Settings → Import & Export
- Thunderbird: File → Import → Events
The application currently uses client-side only functionality:
- JavaScript Date API for timezone calculations
- No external API calls needed
- 100% privacy - no data sent to servers
You can enhance the application with direct API integration:
// Add to <head>
<script src="https://apis.google.com/js/api.js"></script>
// Initialize Google Calendar API
function initGoogleCalendar() {
gapi.load('client:auth2', function() {
gapi.client.init({
apiKey: 'YOUR_API_KEY',
clientId: 'YOUR_CLIENT_ID',
discoveryDocs: ["https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest"],
scope: "https://www.googleapis.com/auth/calendar.events"
});
});
}
// Create event directly
function createCalendarEvent(eventDetails) {
gapi.client.calendar.events.insert({
'calendarId': 'primary',
'resource': eventDetails
}).then(function(response) {
console.log('Event created: ' + response.result.htmlLink);
});
}Setup Steps:
- Go to Google Cloud Console
- Create a new project
- Enable Google Calendar API
- Create OAuth 2.0 credentials
- Add authorized JavaScript origins
- Replace
YOUR_API_KEYandYOUR_CLIENT_ID
// Add Microsoft Authentication Library
<script src="https://alcdn.msauth.net/browser/2.14.2/js/msal-browser.min.js"></script>
// Initialize MSAL
const msalConfig = {
auth: {
clientId: 'YOUR_CLIENT_ID',
authority: 'https://login.microsoftonline.com/common',
redirectUri: window.location.origin
}
};
const msalInstance = new msal.PublicClientApplication(msalConfig);
// Create event
async function createOutlookEvent(eventDetails) {
const account = msalInstance.getAllAccounts()[0];
const response = await msalInstance.acquireTokenSilent({
scopes: ['Calendars.ReadWrite'],
account: account
});
const graphResponse = await fetch('https://graph.microsoft.com/v1.0/me/events', {
method: 'POST',
headers: {
'Authorization': `Bearer ${response.accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(eventDetails)
});
return await graphResponse.json();
}Setup Steps:
- Go to Azure Portal
- Register a new application
- Add Microsoft Graph API permissions
- Configure redirect URIs
- Replace
YOUR_CLIENT_ID
The application includes 418 comprehensive timezones covering all countries and cities worldwide:
Complete Global Coverage:
- Africa: 52 timezones including Cairo, Johannesburg, Lagos, Nairobi, and more
- Americas: 147 timezones covering North, Central, and South America
- Antarctica: 11 research station timezones
- Arctic: Longyearbyen
- Asia: 84 timezones including Dubai, Tokyo, Singapore, Hong Kong, and more
- Atlantic: 10 island and coastal timezones
- Australia: 11 timezones covering all territories
- Europe: 62 timezones covering all European countries
- Indian Ocean: 11 island timezones
- Pacific: 30 timezones covering Pacific islands and territories
Major Cities and Countries Include: All capital cities, major metropolitan areas, and countries worldwide are represented.
To add additional timezones, edit the populateTimezones() function:
function populateTimezones() {
const timezones = [
// ... existing timezones ...
'Your/New_Timezone', // Add here
'Another/Timezone' // Add here
];
// ... rest of function
}Finding Valid Timezone Names:
// Run in browser console to see all available timezones:
console.log(Intl.supportedValuesOf('timeZone'));Edit the Tailwind CSS classes in the HTML:
<!-- Change primary color from indigo to purple -->
<button class="bg-purple-600 hover:bg-purple-700">
<!-- Change background gradient -->
<body class="bg-gradient-to-br from-purple-50 to-pink-100">
<!-- Change success color from green to teal -->
<button class="bg-teal-600 hover:bg-teal-700">Edit the getHourColor() function:
function getHourColor(hour, isWeekend) {
if (isWeekend) return 'bg-gray-200';
if (hour >= 10 && hour < 13) return 'bg-green-400'; // Changed to 10 AM - 1 PM
if (hour === 13 || hour === 14) return 'bg-blue-300'; // Changed lunch time
if (hour >= 15 && hour < 18) return 'bg-green-400'; // Changed to 3 PM - 6 PM
// ... rest of logic
}By default, meetings are 1 hour. To change:
// In createGoogleCalendarEvent() and downloadICS()
const endDate = new Date(startDate.getTime() + 120 * 60 * 1000); // 2 hoursModify the scoring algorithm in findBestMeetingWindows():
// Change scoring values
if (localHour >= 9 && localHour < 12) {
score += 15; // Increased from 10 (prioritize morning meetings)
} else if (localHour >= 14 && localHour < 17) {
score += 8; // Decreased from 10 (de-prioritize afternoon)
}The application now uses the MeetAcross logo from Cloudinary. To customize:
<!-- Update the logo source in the header -->
<img src="your-logo-url.png" alt="Your Logo" class="h-16 w-16 md:h-20 md:w-20 object-contain">| Browser | Minimum Version | Status |
|---|---|---|
| Chrome | 90+ | ✅ Fully Supported |
| Firefox | 88+ | ✅ Fully Supported |
| Safari | 14+ | ✅ Fully Supported |
| Edge | 90+ | ✅ Fully Supported |
| Opera | 76+ | ✅ Fully Supported |
| Samsung Internet | 14+ | ✅ Fully Supported |
| IE 11 | N/A | ❌ Not Supported |
- ES6 JavaScript support
- Intl.DateTimeFormat API
- CSS Grid and Flexbox
- Local Storage (optional)
Problem: The timezone selector shows no options.
Solution:
- Check internet connection (Tailwind CSS needs CDN access)
- Verify JavaScript is enabled in browser
- Check browser console for errors (F12)
Problem: Clicking "Generate Timeline" does nothing.
Solution:
// Check if attendees are added:
- Add at least one attendee first
- Ensure both name AND timezone are selected
- Verify date is selectedProblem: Google Calendar link or ICS download fails.
Solution:
- Ensure meeting title is filled
- Select a time from the dropdown
- Check pop-up blocker settings
- For ICS: Check browser download permissions
Problem: Timeline appears without colors or styling.
Solution:
- Check internet connection (Tailwind CSS CDN)
- Clear browser cache (Ctrl+Shift+Delete)
- Try a different browser
- Verify no ad blockers are interfering
Problem: Times shown don't match expected values.
Solution:
- Verify correct timezone selected
- Check system date/time settings
- Consider daylight saving time transitions
- Test with known timezone combinations
Enable console logging for troubleshooting:
// Add to script section
const DEBUG = true;
function debugLog(message, data) {
if (DEBUG) {
console.log(`[DEBUG] ${message}:`, data);
}
}
// Use throughout code:
debugLog('Attendees added', attendees);
debugLog('Timeline generated', attendeeHours);If you encounter issues:
- Check Browser Console: Press F12 and look for errors
- Verify Prerequisites: Ensure modern browser and internet connection
- Test in Different Browser: Rule out browser-specific issues
- Clear Cache: Sometimes old files cause problems
- Create an Issue: Report bugs with:
- Browser and version
- Steps to reproduce
- Console error messages
- Screenshots
# Create repository
git init
git add index.html
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/MeetAcross/MeetAcross.github.io.git
git push -u origin main
# Enable GitHub Pages
# Go to Settings → Pages → Source: main branch → Save
# Access at: https://meetacross.github.io/- Drag and drop the HTML file to Netlify Drop
- Your site is instantly live!
- Optional: Connect to Git repository for continuous deployment
# Install Vercel CLI
npm install -g vercel
# Deploy
vercel
# Follow prompts and your site is live!# Create S3 bucket
aws s3 mb s3://meetacross
# Enable static website hosting
aws s3 website s3://meetacross --index-document index.html
# Upload file
aws s3 cp index.html s3://meetacross/ --acl public-read
# Optional: Set up CloudFront for CDNSimply upload via FTP/SFTP to any web host:
- GoDaddy
- Bluehost
- HostGator
- DreamHost
- Any shared hosting provider
- Load Time: < 1 second
- File Size: ~30 KB (single HTML file with comprehensive timezone support)
- Dependencies: Tailwind CSS CDN (~50 KB gzipped)
<!-- Download Tailwind CSS and host locally -->
<link rel="stylesheet" href="tailwind.min.css"># Use HTML minifier
npm install -g html-minifier
html-minifier --collapse-whitespace --remove-comments index.html -o index.min.html# .htaccess for Apache
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript
</IfModule>// Add offline support
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}- ✅ No data storage: Everything runs in your browser
- ✅ No tracking: No analytics or cookies
- ✅ No external calls: Except calendar export (user-initiated)
- ✅ Open source: Code is transparent and auditable
When deploying:
- Use HTTPS: Always serve over secure connection
- CSP Headers: Add Content Security Policy
- CORS: Configure properly if adding APIs
- Input Validation: Already implemented in code
We welcome contributions! Here's how:
Create an issue with:
- Clear description
- Steps to reproduce
- Expected vs actual behavior
- Browser and version
- Screenshots if applicable
Open an issue with:
- Feature description
- Use case / motivation
- Proposed implementation (optional)
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Make changes and test thoroughly
- Commit:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - Open Pull Request
- Use 4 spaces for indentation
- Comment complex logic
- Follow existing naming conventions
- Test in multiple browsers
MIT License
Copyright (c) 2025 Meeting Time Zone Coordinator
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- Tailwind CSS: For the amazing utility-first CSS framework
- Google Calendar API: For calendar integration capabilities
- IANA Time Zone Database: For accurate timezone information (418 timezones supported)
- MDN Web Docs: For excellent JavaScript documentation
- Cloudinary: For reliable image hosting
- Documentation: GitHub Issues
- Discussions: GitHub Discussions
- Direct meeting creation on Google Meet
- Direct meeting creation on Microsoft Teams
- Direct meeting creation on Zoom
- Organizer information fields (name, email, timezone)
- OAuth2 authentication flow
- Demo mode for testing
- Setup documentation
- Recurring meeting support
- More calendar integrations (Outlook Calendar, Apple Calendar)
- Multiple language support
- Mobile app (PWA)
- Meeting preferences per attendee
- Backend integration option
- User accounts
- Meeting history
- Advanced analytics
- Added direct meeting platform integration
- Integrated Google Meet with OAuth2 authentication
- Integrated Microsoft Teams with OAuth2 authentication
- Integrated Zoom with OAuth2 authentication
- Added organizer information capture (name, email, timezone)
- Added demo mode for testing without OAuth credentials
- Created comprehensive setup documentation
- Enhanced UI with platform connection cards
- Auto-detect and save organizer timezone
- Added comprehensive global timezone support (418 timezones)
- Updated branding to "MeetAcross - Connect Teams Across Time Zones"
- Added MeetAcross logo and favicon
- Enhanced timezone coverage for all countries and cities worldwide
- Initial release
- Multi-timezone support
- Visual timeline
- Smart recommendations
- Google Calendar integration
- ICS file export
- Responsive design
Made with ❤️ for teams working across time zones
Need help? Found a bug? Have a suggestion? Open an issue!