feat(take-notes): add Google Slides as a source - #6
Merged
Conversation
Google exports any link-visible deck as .pptx without an API key, and a pptx is a zip of XML, so the reader stays stdlib only. The part worth explaining: each slide's Google page id is recoverable only from the shape names on its notes page, and that id addresses a full-slide render at export/png?pageid=<id>. Rendering the slide rather than pulling ppt/media is what makes a diagram built from native shapes reach the note — boxes and arrows live in no image file, so media extraction would return the screenshots and silently miss every drawn diagram. Speaker notes come back with the text, and the header states whether any exist, so a deck nobody annotated cannot be mistaken for notes that failed to parse. Also fixes the figure check in web.md, which lacked -L and so read any redirecting image host as a failure. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The README version badge was still on 1.0.0 — it was missed in the 1.0.1 release, and nothing checks it. Brought in line with the rest. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
davertor
force-pushed
the
feat-google-slides-source
branch
from
August 27, 2026 08:56
4d67f6b to
c710987
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
/take-notes <presentation URL>now handles a Google Slides deck, and brings itsdiagrams into the note.
Google exports any link-visible deck as
.pptxwithout an API key, and a pptx isa zip of XML — so
scripts/slides.pystays stdlib only, per the house rule.The part that took the work: a deck's diagrams are frequently the entire
argument, and most of them exist in no image file. A pipeline drawn as boxes
and arrows is native Slides shapes, so extracting
ppt/media/would return thepasted screenshots and silently miss every drawn diagram. Rendering the whole
slide catches both — and the slide's Google page id, which
export/png?pageid=needs, turns out to be recoverable only from the shape names on its notes page
(
Google Shape;117;<id>:notes). That is the one thing the pptx export gives thatnothing else does.
slides.pyalso reports per slide how many images, shapes and connectors itcarries.
connectorsis the strongest signal for a figure worth keeping: boxesalone are a layout, boxes joined by arrows are an explanation.
Speaker notes come back alongside the slide text, and
references/slides.mdmakesreading them a requirement rather than a tip — the bullets are what the audience
sees, the notes are what the presenter was going to say. The header states whether
any exist (
on 12 of 16 slides/none written on any slide) so a deck nobodyannotated cannot be mistaken for notes that failed to parse.
Two smaller changes ride along:
papers and decks under one cap of 3.
references/web.md's figure check lacked-L, so any redirecting image host(a CDN, or Google's own export) read as a failure and a good figure got dropped.
Verified end to end
Ran the whole flow against a real 16-slide deck: three figures embedded, each
confirmed
200 image/png. Also checked the raw XML of that deck's 16 notes pagesto confirm its empty speaker notes were genuinely empty rather than a parse miss —
which is what prompted the header line.
slides.pyis new to the self-check loop, so it is added to CI, CONTRIBUTING.md,and both issue/PR templates (which had already drifted apart on
retag).Checks
for s in render notes gallery export transcript tags retag slides; do uv run skills/take-notes/scripts/$s.py --selftest; donepassesIf you touched…
notes.py --selfteststill passesSKILL.mdSections — the<li><strong>term</strong> — definition</li>shape is unchanged, so Anki export still finds cardsdisable-model-invocation— unchanged, soagents/openai.yamlneeds no counterpartSKILL.mdand all three manifests, with aCHANGELOG.mdentryREADME.mdupdated (noREADME.es.mdin the tree)Known trade-off
Figures hotlink Google's export endpoint rather than being downloaded and inlined.
The deck has to be publicly fetchable for acquisition to work at all, so this costs
nothing today, and it keeps the Markdown export clean. It does mean a figure renders
the deck's current slide and breaks if sharing is later tightened —
references/slides.mdsays so. Inlining as data URIs is the upgrade if that startsto matter.
🤖 Generated with Claude Code