Display your calendar events on Elgato Stream Deck. Visual countdowns and color warnings help you stay on schedule.
Download from Stream Deck Store · Latest Release · Report Bug
- Install the plugin from Stream Deck Store (search "iCal")
- Get your calendar URL (Google | Outlook | Apple)
- Add a button - Drag "Smart Calendar" to your Stream Deck
- Configure - Click Settings → Add Calendar → Paste URL → Save
That's it! Your next meeting countdown appears on the button.
| Action | Best For | Description |
|---|---|---|
| Smart Calendar ⭐ | Most users | Auto-switches between countdown modes. Shows "Time Left" during meetings, "Next Meeting" otherwise. |
| Next Meeting | Anticipating upcoming | Always shows countdown to next meeting. Tap for meeting title. |
| Time Left | During meetings | Shows time remaining in current meeting. Supports concurrent meetings. |
💡 Recommendation: Start with Smart Calendar - it combines both modes intelligently.
Set up named calendars (Work, Personal, Family) and assign different calendars to different buttons.
- Orange when meeting is approaching (default: 5 min, configurable)
- Red when meeting is imminent (default: 30 sec, configurable)
Full support for daily, weekly, monthly patterns (RRULE) with exceptions (EXDATE).
Automatic conversion between Windows and IANA timezones. Works globally.
- Tap to show meeting title (scrolling marquee)
- Double-tap to force refresh calendar
- Tap during meeting to cycle through concurrent meetings
| Provider | Status | Notes |
|---|---|---|
| Google Calendar | ✅ Full support | Including Workspace |
| Microsoft Outlook | ✅ Full support | Outlook.com & Office 365 |
| Apple Calendar | ✅ Full support | iCloud sharing |
| Any iCal URL | ✅ Works | RFC 5545 compatible |
Google Calendar
- Open Google Calendar
- Click ⋮ next to your calendar → Settings and sharing
- Scroll to "Integrate calendar"
- Copy "Secret address in iCal format"
⚠️ Use the "Secret address" - the public address won't show private events.
Microsoft Outlook / Office 365
- Open Outlook Calendar
- Click ⚙️ Settings → View all Outlook settings
- Go to Calendar → Shared calendars
- Under "Publish a calendar", select your calendar
- Click Publish and copy the ICS link
Apple Calendar / iCloud
- Open Calendar app on Mac
- Right-click calendar → Share Calendar
- Check "Public Calendar" and copy the URL
- Replace
webcal://withhttps://when pasting
Click Settings in the Property Inspector to access:
| Setting | Description | Default |
|---|---|---|
| Calendars | Add/remove named calendars | - |
| Default Calendar | Used when button has no selection | First added |
| Orange Warning | Minutes before meeting | 5 min |
| Red Warning | Seconds before meeting | 30 sec |
| Title Duration | How long to show meeting title | 15 sec |
| Flash on Start | Visual alert when meeting begins | Off |
Each button can use a different calendar from your library - just select it from the dropdown in the Property Inspector.
No events showing
- Verify URL is correct (test in browser - should download .ics file)
- Check events are within time window (default: 3 days)
- Double-tap button to force refresh
- Check if "Exclude all-day events" is filtering them out
Wrong times displayed
- Verify your computer's timezone is correct
- For Outlook: Plugin auto-converts Windows timezones
- Try force refresh after timezone change
Button stuck on "Loading"
- Check internet connection
- Verify calendar URL is accessible
- Restart Stream Deck software
- Check Settings for error messages
- Stability Fixes - Capped RRULE expansion, fetch timeouts, concurrent update guards (#26)
- DST-Aware Recurrence - Fixed RECURRENCE-ID matching across daylight saving transitions (#27)
- Export Diagnostics - One-click diagnostic report for easier bug reporting
- Error Isolation - Bad events no longer break the entire calendar
See full changelog for all versions.
| Technology | Purpose |
|---|---|
| TypeScript | Type-safe plugin code |
| Node.js SDK v2 | Stream Deck integration |
| Vitest | 572 unit tests |
| Rollup | Bundle optimization |
| rrule | Recurring event expansion |
| Luxon | Timezone handling |
See CONTRIBUTING.md for:
- Development setup
- Architecture overview
- Testing guidelines
- Pull request process
- 🔧 Upgraded @elgato/streamdeck SDK from v1.4.1 to v2.0.2 for DRM compatibility
- 🐛 Fixed Elgato Marketplace rejection due to manifest reading in DRM-encrypted plugins
- 🐛 Fixed Export Diagnostics not copying to clipboard (caused "No response from plugin" false alarm)
- 🔧 Robust clipboard fallback: execCommand → Clipboard API → manual textarea
- 🐛 Fixed buttons showing "Loading iCal" on every background calendar refresh
- 🐛 Background refresh failures now preserve cached data instead of clearing events
- 🐛 Fixed CPU spike from unbounded RRULE expansion (#26)
- 🐛 Fixed RECURRENCE-ID mismatch across DST boundaries (#27)
- ✨ Export Diagnostics button for one-click bug reports
- ✨ 30-second fetch timeout to prevent hangs
- ✨ Concurrent update guard prevents stacking requests
- ✨ Per-event error isolation for resilient parsing
- ✨ Enhanced debug logging (500-entry buffer, error filtering)
- ✨ Named Calendars with friendly names
- ✨ Per-button calendar selection
- ✨ Configurable warning thresholds
- ✨ Graceful calendar deletion handling
- 🐛 Fixed calendar selection persistence
- ✨ Smart Calendar action (auto-switching)
- ✨ Configurable title display duration
- ✨ Flash on meeting start option
- 🐛 Fixed startup race conditions
- ✨ Recurring events (RRULE/EXDATE)
- ✨ Configurable time window
- ✨ Improved timezone handling
- ✨ Force refresh feature
- 🎉 Initial release
MIT License - see LICENSE
Created by Pedro Fuentes
