name: wwdc-catalog description: Fetch the WWDC session catalog from Apple's CDN by extracting the catalog URL embedded in one of the Developer.app's binaries. Use this skill whenever the user asks about WWDC sessions, WWDC videos, WWDC catalog, Apple developer conference content, or wants to browse, search, list, or look up any WWDC session or talk — even if they just say something like "what sessions are there about SwiftUI" or "find me that WWDC video about concurrency". Also use this when the user wants to download or work with WWDC session metadata.
WWDC Catalog
This skill fetches the full WWDC session catalog from Apple's CDN. The catalog includes all events from WWDC14 through the latest year, along with videos, labs, articles, topics, and media URLs (video downloads, HLS streams, slides).
How it works
The Apple Developer app (/Applications/Developer.app) embeds a CDN URL pointing to the session catalog inside one of its binaries. The exact binary has changed across versions of the app — historically it lived in a WWDCCore framework, while current versions ship it in the main executable (Contents/MacOS/Developer). The bundled script tries the known locations first, then falls back to recursively scanning every file under Contents/, finding the URL by searching for the https://devimages-cdn.apple.com/wwdc-services/ prefix, and appends contents.json to fetch the full catalog.
The catalog is normalized after fetching: older WWDCs (<=2019) used "Session" as the content type while newer ones use "Video" — the script rewrites all "Session" types to "Video" so you can always filter on type == "Video" regardless of year.
Prerequisites
- macOS with
/Applications/Developer.appinstalled (free from the Mac App Store) - Python 3
Fetching the catalog
Run the bundled script to fetch the catalog as JSON:
python3 <skill-dir>/scripts/wwdc_catalog.py
This prints a summary to stdout and the catalog URL to stderr. To capture the full catalog as JSON, use the script as a module:
python3 -c "
import sys; sys.path.insert(0, '<skill-dir>/scripts')
from wwdc_catalog import get_wwdc_catalog
import json
catalog = get_wwdc_catalog()
print(json.dumps(catalog, indent=2))
" > /tmp/wwdc_catalog.json
Or import the individual functions for more control:
import sys; sys.path.insert(0, '<skill-dir>/scripts')
from wwdc_catalog import read_wwdccore_binary, extract_contents_url, fetch_catalog, normalize_catalog
data = read_wwdccore_binary("/Applications/Developer.app")
url = extract_contents_url(data)
catalog = normalize_catalog(fetch_catalog(url))
Replace <skill-dir> with the actual path to this skill's directory (the parent of this SKILL.md).
Catalog structure
The catalog JSON has these top-level keys:
| Key | Description |
|---|---|
events |
List of WWDC events (WWDC14–WWDC25, Tech Talks, etc.) |
contents |
All content items — videos, labs, articles, etc. |
rooms |
Rooms where events/sessions take place |
topics |
Topics like "SwiftUI", "Machine Learning", etc. |
topicCategories |
Groupings of topics |
resources |
Linked resources |
imageTypes |
Image type definitions |
updated |
Last update timestamp |
snapshotId |
Catalog snapshot identifier |
Content items (videos, labs, etc.)
Each item in contents has:
id,title,description,type— always"Video"for session videos (normalized across all years)eventId— which event it belongs to (e.g. "wwdc2025")webPermalink— link to the session page on developer.apple.comtopicIds— associated topic IDsplatforms— e.g. ["iOS", "macOS"]media.hls— HLS video stream URLmedia.downloadHD/media.downloadSD— direct video download URLsmedia.slides— slide deck URLmedia.duration— duration in secondsmedia.chapters— chapter markers with timestampskeywords— search keywordsstartTime/endTime— for scheduled content like labs
Filtering examples
To find all videos for a specific year:
wwdc25_videos = [c for c in catalog["contents"]
if c["eventId"] == "wwdc2025" and c["type"] == "Video"]
To search by keyword in title/description:
query = "swiftui"
matches = [c for c in catalog["contents"]
if query in c["title"].lower() or query in c["description"].lower()]
To get video download URLs:
for video in wwdc25_videos:
media = video.get("media")
if media and media.get("downloadHD"):
print(f"{video['title']}: {media['downloadHD']}")
Tips
- The catalog is large (~3000+ items). Filter by
eventIdandtypeto narrow results before presenting to the user. - Topic names are in the
topicslist — join ontopicIdsfrom content items to get human-readable topic names. - Not all content items have video — articles and labs typically don't have a
mediafield.