An automated morning briefing that emails me weather, calendar, and tasks every weekday at 7 AM Eastern. Runs on GitHub Actions — no server, no local machine dependency.
Full write-up: Claude + GitHub Actions: an integration playbook on coreymark.com.
v2 note: This repo was redesigned in May 2026 to remove all Google OAuth dependencies. The blog post above covers the original OAuth-based approach; a follow-up post documents why the change was made and what replaced it.
A single HTML email each weekday morning covering:
- Current weather + forecast (OpenWeatherMap, Bedford IN)
- Personal + family Google Calendar events for the day (via iCal secret URLs — no OAuth)
- Active task list (pulled from a private GitHub Gist)
- An AI-generated daily greeting (Claude Haiku; template fallback)
GitHub Actions (weekday cron, 7 AM ET)
|
└── briefing.py
├── OpenWeatherMap API → weather
├── Google Calendar iCal → events (personal + family, no OAuth)
├── GitHub Gist API → TASKS.md
├── Anthropic API → daily greeting
└── Gmail SMTP → HTML email (App Password, no OAuth)
No database, no server, no container. One Python script, one cron workflow, all secrets in GitHub Actions. No OAuth tokens — all credentials are static keys or App Passwords that don't expire on a schedule.
| Component | Tech |
|---|---|
| Orchestration | GitHub Actions |
| Language | Python 3.11+ |
| Weather | OpenWeatherMap |
| Calendar | Google Calendar iCal secret URLs + icalendar / recurring-ical-events |
| Tasks | GitHub Gist |
| Email delivery | Gmail SMTP with App Password |
| Greeting | Anthropic API (Claude Haiku) |
briefing.py # main script (data fetch + HTML render + SMTP send)
demo_data.py # synthetic payloads for DEMO_MODE (no credentials)
.github/workflows/
daily-briefing.yml # weekday 7 AM ET cron trigger with DST gate
requirements.txt # Python dependencies
docs/
sample-briefing.png # screenshot embedded above (rendered via DEMO_MODE)
LICENSE
README.md
Set these under Settings → Secrets and variables → Actions:
| Secret | Purpose |
|---|---|
OPENWEATHERMAP_API_KEY |
Weather API key |
GMAIL_ADDRESS |
Your Gmail address (sender and recipient) |
GMAIL_APP_PASSWORD |
Gmail App Password (Google Account → Security → 2-Step Verification → App passwords) |
PERSONAL_CALENDAR_ICAL_URL |
Google Calendar iCal secret URL for your personal calendar |
FAMILY_CALENDAR_ICAL_URL |
Google Calendar iCal secret URL for your family/shared calendar |
GIST_ID |
ID of the private Gist containing your TASKS.md |
GIST_TOKEN |
GitHub PAT with gist scope (set to no-expiry) |
ANTHROPIC_API_KEY |
Claude API key (optional — falls back to template greeting if absent) |
- Fork or clone this repo.
- Gmail App Password — go to myaccount.google.com → Security → 2-Step Verification → App passwords. Create one named "DailyBriefing." This is your
GMAIL_APP_PASSWORDsecret. - Calendar iCal URLs — in Google Calendar, open Settings for each calendar and scroll to "Secret address in iCal format." Copy both URLs. These are your
PERSONAL_CALENDAR_ICAL_URLandFAMILY_CALENDAR_ICAL_URLsecrets. These URLs never expire unless you manually reset them. - OpenWeatherMap — create a free account at openweathermap.org and grab an API key.
- GitHub Gist — create a private Gist with a
TASKS.mdfile. Copy the Gist ID from the URL. Create a GitHub PAT withgistscope (no expiry) forGIST_TOKEN. - Anthropic (optional) — add a Claude API key for the AI greeting. If absent, a deterministic template runs instead.
- Add all secrets to this repo under Settings → Secrets → Actions.
- Enable the workflow under the Actions tab. Trigger it manually once with
workflow_dispatchto verify end-to-end.
To render a sample briefing with synthetic data — no API calls, no credentials, no email send:
DAILYBRIEFING_DEMO=1 python briefing.pyWrites the rendered HTML to docs/sample-briefing.html. Useful for iterating on the template without needing live data.
- Cron runs in UTC. The workflow uses two cron entries with a time-gate step to hit 7 AM Eastern regardless of DST.
- iCal secret URLs are stable indefinitely — Google only resets them if you manually click "Reset" in Calendar settings.
- Gmail App Passwords remain valid as long as 2-Step Verification stays enabled on your account.
- All APIs used are free at the volumes this project generates.
MIT — see LICENSE.
Built by Corey Wininger. Sharing as a reference pattern; not accepting contributions.
