๐Ÿ“… Calendar Voice Reminders

In the busy workday, itโ€™s easy to forget upcoming meetings. Let Rose monitor your calendar and remind you with voice notifications at important momentsโ€”like having a thoughtful assistant by your side.


Scenario Description

Use Cases

ScenarioReminder TimingReminder Method
๐Ÿ“ž Client Meetings15 minutes beforeVoice + Text
๐Ÿ‘ฅ Team Meetings10 minutes beforeVoice reminder
๐ŸŽฏ Important Deadlines1 day beforeVoice + detailed info
โœˆ๏ธ Travel Itineraries2 hours before departureVoice + weather info
๐Ÿ’Š Regular RemindersDaily at fixed timesBrief voice message

Expected Results

  • ๐Ÿ”” Never Miss Meetings: Early reminders give you time to prepare
  • ๐ŸŽ™๏ธ Voice is More Noticeable: Harder to ignore than text notifications
  • ๐Ÿ“ฑ Receive While on the Move: Voice plays on your phone, works even while driving
  • โฐ Multi-Tier Reminders: Layered reminders at 1 day, 1 hour, and 15 minutes before

Calendar Connection

Supported Calendar Sources

SourceConnection MethodSetup Difficulty
Google CalendarGoogle APIโญโญ
Microsoft OutlookMicrosoft Graph APIโญโญ
CalDAVUniversal protocolโญโญโญ
Local calendar filesRead .ics filesโญ

Google Calendar Connection Setup

{`1. Go to Google Cloud Console
   https://console.cloud.google.com/

2. Create a new project or select an existing one

3. Enable Google Calendar API
   - Go to "APIs & Services" โ†’ "Library"
   - Search for "Google Calendar API"
   - Click "Enable"

4. Create credentials
   - Go to "APIs & Services" โ†’ "Credentials"
   - Click "Create Credentials" โ†’ "OAuth 2.0 Client ID"
   - Application type: "Desktop App"
   - Download the JSON credentials file

5. Save credentials file to:
   ~/.config/realvco/google-credentials.json`}

Calendar Sync Script

{`// Calendar sync script

const { google } = require('googleapis');
const fs = require('fs');

async function getUpcomingEvents() {
  // Load credentials
  const credentials = JSON.parse(
    fs.readFileSync(process.env.GOOGLE_CREDENTIALS_PATH)
  );
  
  // Create OAuth2 client
  const { client_secret, client_id, redirect_uris } = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
    client_id, client_secret, redirect_uris[0]
  );
  
  // Set tokens (must run authorization flow first to obtain)
  oAuth2Client.setCredentials({
    access_token: process.env.GOOGLE_ACCESS_TOKEN,
    refresh_token: process.env.GOOGLE_REFRESH_TOKEN
  });
  
  // Call Calendar API
  const calendar = google.calendar({ version: 'v3', auth: oAuth2Client });
  
  const now = new Date();
  const tomorrow = new Date(now);
  tomorrow.setDate(tomorrow.getDate() + 1);
  
  const response = await calendar.events.list({
    calendarId: 'primary',
    timeMin: now.toISOString(),
    timeMax: tomorrow.toISOString(),
    singleEvents: true,
    orderBy: 'startTime'
  });
  
  return response.data.items;
}

module.exports = { getUpcomingEvents };`}

Voice Reminder Setup

Voice Reminder Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Check Calendarโ”‚ โ†’  โ”‚ Determine    โ”‚ โ†’  โ”‚ Generate     โ”‚
โ”‚               โ”‚     โ”‚ Reminder Timeโ”‚     โ”‚ Voice Contentโ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค     โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค     โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Every 5 min  โ”‚     โ”‚ โ€ข 15 min     โ”‚     โ”‚ โ€ข Event name โ”‚
โ”‚ Read events  โ”‚     โ”‚ โ€ข 1 hour     โ”‚     โ”‚ โ€ข Start time โ”‚
โ”‚              โ”‚     โ”‚ โ€ข 1 day      โ”‚     โ”‚ โ€ข Location   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                                  โ”‚
                                                  โ–ผ
                                           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                                           โ”‚   Send       โ”‚
                                           โ”‚   Reminder   โ”‚
                                           โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
                                           โ”‚ โ€ข Text msg   โ”‚
                                           โ”‚ โ€ข Voice msg  โ”‚
                                           โ”‚ โ€ข Push notif โ”‚
                                           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Voice Content Templates

{`# 15 minutes before meeting

โฐ Meeting starting soon!

"Boss, your meeting starts in 15 minutes.
Event: {meeting_title}
Time: {start_time}
Location: {location}

Ready?"

---

# 1 hour before meeting

๐Ÿ“… Meeting Reminder

"Boss, you have a meeting in 1 hour.
{meeting_title}, starting at {start_time}.
{description}

Don't forget to prepare relevant materials!"

---

# Daily morning preview

๐Ÿ“‹ Today's Schedule

"Good morning, Boss! You have {count} events today:

{for each event}
- {time}: {title}
{/for}

Have a great day!"`}

Voice Sending Configuration

{`# Voice reminder settings

tts:
  provider: elevenlabs  # or google, azure
  voice_id: nova        # Voice selection
  language: zh-TW       # Traditional Chinese
  
reminders:
  - name: meeting_15min
    trigger: "event.start - 15 minutes"
    message_template: "meeting_15min"
    channels:
      - telegram_voice
      - telegram_text
      
  - name: meeting_1hour
    trigger: "event.start - 1 hour"
    message_template: "meeting_1hour"
    channels:
      - telegram_text
      
  - name: daily_briefing
    trigger: "08:00 daily"
    message_template: "daily_morning"
    channels:
      - telegram_voice
      
  - name: deadline_alert
    trigger: "deadline - 1 day"
    message_template: "deadline_reminder"
    channels:
      - telegram_voice
      - telegram_text`}

Scheduling Configuration

Heartbeat Periodic Checks

{`// Heartbeat reminder check

const { getUpcomingEvents } = require('./calendar-sync');
const { sendVoiceMessage } = require('./telegram-bot');
const { generateTTS } = require('./tts-service');

async function checkReminders() {
  const now = new Date();
  const events = await getUpcomingEvents();
  
  for (const event of events) {
    const startTime = new Date(event.start.dateTime);
    const diffMinutes = (startTime - now) / (1000 * 60);
    
    // Check if 15-minute reminder should be sent
    if (diffMinutes > 14 && diffMinutes < 15) {
      await sendMeetingReminder(event, '15min');
    }
    
    // Check if 1-hour reminder should be sent
    if (diffMinutes > 59 && diffMinutes < 60) {
      await sendMeetingReminder(event, '1hour');
    }
  }
}

async function sendMeetingReminder(event, timing) {
  const templates = {
    '15min': `Boss, your meeting starts in 15 minutes. Event: ${event.summary}. Time: ${formatTime(event.start.dateTime)}.`,
    '1hour': `Boss, you have a meeting in 1 hour. ${event.summary}, starting at ${formatTime(event.start.dateTime)}.`
  };
  
  const message = templates[timing];
  
  // Generate voice
  const voiceBuffer = await generateTTS(message);
  
  // Send voice message
  await sendVoiceMessage({
    chat_id: process.env.ADMIN_CHAT_ID,
    voice: voiceBuffer,
    caption: message
  });
  
  console.log(`โœ… Sent ${timing} reminder: ${event.summary}`);
}

// Check every 5 minutes
setInterval(checkReminders, 5 * 60 * 1000);

module.exports = { checkReminders };`}

Cron Scheduling

{`# Send today's schedule preview every morning at 8 AM
0 8 * * * cd /home/node/.openclaw/workspace && node scripts/daily-briefing.js

# Check upcoming meetings every 5 minutes
*/5 * * * * cd /home/node/.openclaw/workspace && node scripts/check-reminders.js

# Preview tomorrow's schedule every evening at 9 PM
0 21 * * * cd /home/node/.openclaw/workspace && node scripts/tomorrow-preview.js`}

Advanced Applications

Smart Reminder Upgrades

{`# Smart contextual reminders

## Travel Reminder
"Boss, you need to leave for the airport in 2 hours.
Flight: {flight_number}
Destination: {destination}
Local weather: {weather}

Don't forget your passport and charger!"

## Client Meeting Prep
"Boss, you have a meeting with {client_name} in 30 minutes.

Last conversation summary:
{last_conversation_summary}

Items to confirm:
{pending_items}

Related documents:
{relevant_documents}`}

Multi-Layer Reminder System

Important Meetings (marked as important):
โ”œโ”€โ”€ 1 day before: Detailed prep reminder + related documents
โ”œโ”€โ”€ 1 hour before: Departure reminder + traffic info
โ”œโ”€โ”€ 15 minutes before: Immediate preparation reminder
โ””โ”€โ”€ 1 minute before: Final confirmation

Regular Meetings:
โ””โ”€โ”€ 15 minutes before: Standard reminder

Deadlines:
โ”œโ”€โ”€ 3 days before: Early preparation reminder
โ”œโ”€โ”€ 1 day before: Deadline tomorrow reminder
โ””โ”€โ”€ Morning of: Today deadline reminder

Integration with Other Systems

{`# Integrate with weather API
When meeting location is in another city, automatically append:
"It's raining in Taipei tomorrow, remember to bring an umbrella!"

# Integrate with traffic API
When meeting location differs, remind:
"Estimated travel time is 30 minutes, recommend leaving at 2:30"

# Integrate with CRM
Before client meetings, automatically remind:
"This is the third meeting with XX Company,
last time discussed {previous_topic},
main goal this time is {meeting_goal}`}

FAQ

Q: What if the voice reminder is unclear?

  1. Choose a clearer voice model
  2. Adjust speech rate (recommend 0.9-1.1x)
  3. Send text version as backup simultaneously
  4. Test in different environments (quiet/noisy)

Q: Can reminder times be adjusted?

Yes! Modify the config file:

reminders:
  - trigger: "event.start - 30 minutes"  # Change to 30 minutes before

Q: How to pause a specific reminder?

Add tags to calendar events:

  • #no-reminder: No reminders at all
  • #silent: Text only, no voice

Q: Which voice platforms are supported?

Currently supported:

  • ElevenLabs (best quality)
  • Google Cloud Text-to-Speech
  • Azure Cognitive Services
  • System built-in TTS (free but lower quality)

Summary

๐Ÿ“… Calendar Voice Reminders ensure you never miss an important moment:

  • Calendar Connection: Google/Outlook automatic sync
  • Multi-Tier Reminders: Reminders at 1 day, 1 hour, and 15 minutes before
  • Voice Notifications: More noticeable than text, works even while driving
  • Smart Upgrades: Combine weather, traffic, and CRM for complete information