Skip to content

feat(take-notes): add Google Slides as a source - #6

Merged
davertor merged 2 commits into
mainfrom
feat-google-slides-source
Aug 27, 2026
Merged

feat(take-notes): add Google Slides as a source#6
davertor merged 2 commits into
mainfrom
feat-google-slides-source

Conversation

@davertor

Copy link
Copy Markdown
Owner

What and why

/take-notes <presentation URL> now handles a Google Slides deck, and brings its
diagrams into the note.

Google exports any link-visible deck as .pptx without an API key, and a pptx is
a zip of XML — so scripts/slides.py stays 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 the
pasted 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 that
nothing else does.

slides.py also reports per slide how many images, shapes and connectors it
carries. connectors is the strongest signal for a figure worth keeping: boxes
alone are a layout, boxes joined by arrows are an explanation.

Speaker notes come back alongside the slide text, and references/slides.md makes
reading 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 nobody
annotated cannot be mistaken for notes that failed to parse.

Two smaller changes ride along:

  • SKILL.md's Article figures rule becomes Source figures, covering articles,
    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 pages
to confirm its empty speaker notes were genuinely empty rather than a parse miss —
which is what prompted the header line.

slides.py is 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; done passes
  • No new third-party dependency (see CONTRIBUTING.md)
  • English throughout — code, comments, commit messages

If you touched…

  • a note template — untouched; notes.py --selftest still passes
  • SKILL.md Sections — the <li><strong>term</strong> — definition</li> shape is unchanged, so Anki export still finds cards
  • disable-model-invocation — unchanged, so agents/openai.yaml needs no counterpart
  • the version — 1.1.0 in SKILL.md and all three manifests, with a CHANGELOG.md entry
  • anything user-facingREADME.md updated (no README.es.md in 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.md says so. Inlining as data URIs is the upgrade if that starts
to matter.

🤖 Generated with Claude Code

davertor and others added 2 commits August 27, 2026 10:55
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
davertor force-pushed the feat-google-slides-source branch from 4d67f6b to c710987 Compare August 27, 2026 08:56
@davertor
davertor merged commit 2e71c13 into main Aug 27, 2026
1 check passed
@davertor
davertor deleted the feat-google-slides-source branch August 27, 2026 08:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant