Local meeting-notetaker app using Recall.ai, FastAPI, Claude, Google Calendar, and Gmail.
The app supports two flows:
- Manual: paste a Meet/Zoom/Teams URL and send a Recall.ai bot.
- Calendar V2: connect Google Calendar to Recall.ai, then schedule bots from calendar events.
Create and fill your environment file:
cp .env.example .envRequired values:
RECALL_API_KEY=...
RECALL_REGION=us-west-2
ANTHROPIC_API_KEY=...Install dependencies in your recall conda env:
conda activate recall
pip install -r requirements.txtAdd Google OAuth credentials:
- Create a Google OAuth desktop client in Google Cloud.
- Enable Google Calendar API.
- Enable Gmail API if you want recap emails.
- Download the OAuth client JSON.
- Save it as
credentials.jsonin the project root.
The first Google command will create token.json.
conda activate recall
python -m uvicorn app:app --reloadOpen:
http://localhost:8000
Meeting outputs are saved under:
meetings/
From the web app:
- Open
http://localhost:8000. - Paste the meeting join URL.
- Enter a subject.
- Submit.
- Admit the bot in the meeting.
Or from the terminal:
conda run --no-capture-output -n recall python scripts/dispatch_bot.py "https://meet.google.com/abc-defg-hij" --subject "Team Sync"List upcoming Calendar events and meeting links:
conda run --no-capture-output -n recall python scripts/list_meetings.pyTest Calendar attendee lookup:
conda run --no-capture-output -n recall python -c 'from src.google_auth import attendees_for_url; print(attendees_for_url("PASTE_MEETING_LINK_HERE"))'If Google scopes change, delete token.json and authenticate again:
rm token.json
conda run --no-capture-output -n recall python scripts/list_meetings.pyCalendar V2 lets Recall.ai sync your Google Calendar so bots can be scheduled from calendar events without manually pasting meeting links.
conda activate recall
python -m uvicorn app:app --reloadUsing ngrok:
ngrok http 8000Copy the public HTTPS URL, for example:
https://abc123.ngrok-free.app
conda run --no-capture-output -n recall python scripts/connect_recall_calendar.py --webhook-url "https://abc123.ngrok-free.app/webhooks/recall/calendar"This creates or updates .recall_calendar.json with the Recall calendar id.
In the Recall.ai dashboard, add a webhook endpoint:
https://abc123.ngrok-free.app/webhooks/recall/calendar
Subscribe it to Calendar V2 events:
calendar.sync_events
calendar.update
This dashboard/Svix endpoint is required for real automatic event notifications.
curl -X POST "https://abc123.ngrok-free.app/webhooks/recall/calendar" \
-H "Content-Type: application/json" \
-d '{"event":"test","data":{}}'Then check:
tail -n 20 meetings/_webhooks.jsonlYou should see a test event.
Create or edit a Google Calendar event with a Meet/Zoom/Teams link.
Watch the FastAPI terminal for:
[recall-calendar] webhook calendar.sync_events
[recall-calendar] scheduled ...
The bot should join at the event time. If the event is already happening, the app schedules it to join now.
After the bot finishes, the app downloads the transcript, summarizes it, and shows the meeting on the Meetings page.
Calendar-created meeting folders use the default folder selected on the Meetings page. Create folders there first, then choose the default under Defaults.
Preview schedulable events:
conda run --no-capture-output -n recall python scripts/schedule_calendar_bots.py --days 7 --dry-runSchedule them:
conda run --no-capture-output -n recall python scripts/schedule_calendar_bots.py --days 7Include meetings that started recently:
conda run --no-capture-output -n recall python scripts/schedule_calendar_bots.py --days 7 --lookback-minutes 360Debug raw Recall Calendar V2 event JSON:
conda run --no-capture-output -n recall python scripts/schedule_calendar_bots.py --days 7 --debug-jsonRecall API smoke test:
conda run --no-capture-output -n recall python scripts/smoke_test_recall.pyVerify Recall Calendar V2 connection:
conda run --no-capture-output -n recall python -c 'from src.recall_calendar import default_calendar_id, retrieve_calendar; import json; print(json.dumps(retrieve_calendar(default_calendar_id()), indent=2))'Syntax check:
conda run --no-capture-output -n recall python -m py_compile app.py src/*.py scripts/*.pyGmail API has not been used...
Enable Gmail API in Google Cloud for the project used by credentials.json, wait a few minutes, then retry.
No calendar.sync_events in meetings/_webhooks.jsonl
Your app received no real Calendar V2 webhook. Confirm:
- FastAPI is running.
- ngrok/cloudflared is running.
- Recall dashboard webhook endpoint is configured.
- Endpoint subscribes to
calendar.sync_events. - You edited or created the calendar event after configuring the endpoint.
Bot joined but meeting is not on the Meetings page
The bot may have been scheduled before the local Calendar V2 post-processing code was running. Trigger a fresh calendar update/new event with FastAPI running.
Bot does not join
Confirm the Calendar V2 dry-run sees the event:
conda run --no-capture-output -n recall python scripts/schedule_calendar_bots.py --days 7 --dry-runIf the meeting already ended, create a new event with a fresh Meet link.
Ignored local files:
.env
credentials.json
token.json
.recall_calendar.json
meetings/