Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
61bf67f
Calendar ability first commit.
Mmiless Feb 23, 2026
8fc6abd
Change names.
Mmiless Feb 23, 2026
e64bc87
Hot words in readme.
Mmiless Feb 23, 2026
a7bcb22
Second PR attempt.
Mmiless Feb 27, 2026
f96686a
style: auto-format Python files with autoflake + autopep8
github-actions[bot] Feb 27, 2026
a77f6dc
Extra space in register_capability
Mmiless Feb 27, 2026
5ba56d0
Merge branch 'google-calendar' of github.com:Mmiless/abilities_miles …
Mmiless Feb 27, 2026
21fbf35
style: auto-format Python files with autoflake + autopep8
github-actions[bot] Feb 27, 2026
6bb3a0d
Update main.py
Mmiless Feb 27, 2026
b234143
style: auto-format Python files with autoflake + autopep8
github-actions[bot] Feb 27, 2026
70e47ed
Merge branch 'dev' into google-calendar
Mmiless Feb 27, 2026
9b7367e
Merge branch 'dev' into google-calendar
abubakar4360 Mar 2, 2026
7300437
Merge branch 'dev' into google-calendar
abubakar4360 Mar 2, 2026
5847d17
Merge branch 'dev' into google-calendar
abubakar4360 Mar 2, 2026
89480d3
Update README.md
Mmiless Mar 3, 2026
ebf0198
Update README.md
Mmiless Mar 3, 2026
f5e2668
expanded background functionality.
Mmiless Mar 28, 2026
bee1a47
Merge remote, keeping local README
Mmiless Mar 28, 2026
9f5838b
style: auto-format Python files with autoflake + autopep8
github-actions[bot] Mar 28, 2026
7fea04e
Merge branch 'dev' into google-calendar
uzair401 Mar 30, 2026
ff3fcef
Merge branch 'dev' into google-calendar
uzair401 Mar 31, 2026
d8fe6de
Refactor Google Calendar token handling
uzair401 Mar 31, 2026
dcb3247
Refactor token retrieval to use capability worker
uzair401 Mar 31, 2026
6e44d72
Delete community/google-calendar/token_gen.py
uzair401 Mar 31, 2026
83300f6
Update timezone management and error handling in calendar
uzair401 Mar 31, 2026
d528ed2
Update LOCAL_TZ initialization and assignment
uzair401 Mar 31, 2026
8ed3717
Update README.md
uzair401 Mar 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions community/google-calendar/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# Google Calendar Ability

Voice-controlled Google Calendar integration for OpenHome. Supports scheduling, rescheduling, deleting events, managing attendees, listing schedules, querying who's on a meeting, and conflict detection.

## Setup

### Google Account

Link your Google account in OpenHome settings. The ability uses the platform's built-in Google authentication — no API keys or tokens to configure manually.

### contacts.json

Place a `contacts.json` file in the ability directory (next to `main.py`). This maps names to email addresses so the ability can resolve spoken names to calendar invitees.

Two formats are supported:

**Simple** -- just name-to-email:

```json
{
"Dude": "dude@example.com",
"Buddy": "buddy@example.com"
}
```

**With aliases** -- for names that speech-to-text frequently mishears:

```json
{
"Friend": {
"email": "friend@example.com",
"aliases": ["Fren", "Frind", "Fred"]
}
}
```

Aliases are matched phonetically by the LLM, so STT errors like "Von" for "Vaughn" get resolved correctly. Without this file, attendee features (invite, remove, query) are disabled.

## Supported Intents

| Intent | Example phrases |
|---|---|
| Schedule | "Schedule a meeting with Mark tomorrow at 3 PM", "Schedule a call with Jim Friday at noon" |
| Reschedule | "Move the standup to 4 PM", "Reschedule test meeting to Friday" |
| Delete | "Cancel the meeting tomorrow", "Delete the standup" |
| Rename | "Rename the standup meeting to team sync", "Change the name of that call" |
| Make recurring | "Make that a weekly recurring", "Set the standup to repeat every week" |
| List | "What's on my calendar tomorrow", "What do I have at 2 PM" |
| Invite | "Add Tim to the standup", "Invite Jessica to that meeting" |
| Remove attendee | "Take Gus off the invite", "Remove Sophia from the weekly standup" |
| Query attendees | "Who's on the standup?", "Who's attending the meeting tomorrow?" |
| Accept invite | "Accept that invite", "Accept the shared meeting" |
| Decline invite | "Decline the invite", "Turn down that meeting" |
| Set reminder | "Remind me 20 minutes before my workout session", "Set a 60 minute reminder for the board meeting" |

## Key Behaviors

**Active capability (main.py)**

Handles all user-initiated calendar actions above. At any confirmation step the user can append a
follow-on request — "Sounds good, but also invite John" — and both actions execute. After any
operation, vague references like "that meeting" or "this event" resolve to the last touched event
without re-searching.

When scheduling or rescheduling, overlapping events are detected and the user is warned before
proceeding. List queries like "what do I have at 2 PM" find events spanning that time, not just
events starting then.

If an event name isn't recognized, the ability asks for clarification and retries the lookup up to
twice — it does not drop context or treat the clarification as a new scheduling request.

Per-meeting reminder preferences are stored persistently and survive restarts. Contacts are resolved
by first name from a local contact list. Timezone is automatically detected from your OpenHome profile.

**Background daemon (background.py)**

Polls the calendar every 30 seconds and maintains a local events cache and `upcoming_schedule.md`.
Proactively interrupts with spoken notifications for:

- New invites received from other organizers — "You got an invite to Shared Meeting today at 8 PM"
- Events cancelled by the organizer
- Events renamed or rescheduled externally
- Attendees accepting or declining
- New attendees added to an event you're on

Meeting reminders fire based on per-event preferences stored in `user_preferences.md`. The default
lead time is configurable, and individual meetings can have their own override (e.g.
`Standup meeting: 30 min`, `HR meeting: 60 min`).

## Recommended Hotwords

Calendar
Schedule
What is on my
Reschedule
Invite
Uninvite
Push back
What do I have going on
Who's on
Who's going to be
Cancel
Meeting
Remind me about
Empty file.
Loading
Loading