Skip to content

v0.3.0 — WCAG alt-text + domain-context

Latest

Choose a tag to compare

@jbenhart44 jbenhart44 released this 21 Jul 14:49
· 1 commit to main since this release

Captioner adds a plain-language caption under every picture in a PowerPoint deck and, optionally, writes screen-reader WCAG alt-text (the OOXML descr field) for the images that are missing it — across a whole deck in one run, without altering your original file.

Install (copy-paste)

Captioner runs inside Claude Code (which provides the image-reading vision) and needs Python 3.9+ with git. Open your Terminal and run:

git clone https://github.com/jbenhart44/captioner.git
cd captioner
git checkout v0.3.0
pip install -r requirements.txt
bash install.sh

Then restart Claude Code and caption a deck:

/captioner <path-to-.pptx-or-folder>

To also write alt-text, add --write-descr (or --descr-only for alt-text with no visible captions). The installer touches only ~/.claude/skills/captioner, and it prints exactly what it's about to do before it acts.

Updating later

cd captioner
git fetch --tags
git checkout v0.3.0       # replace with a newer tag when one exists
pip install -r requirements.txt
bash install.sh           # safe to re-run — a same-target relink just prints "nothing to do"

Prefer not to use git? Download the Source code (zip) below and unzip it, then run the pip install and bash install.sh steps from inside the folder.


What's new in v0.3.0

Captioner can now write WCAG alt-text (the OOXML descr attribute consumed by screen readers) in addition to the visible on-slide captions, and asks for the deck's subject context up front so both are domain-accurate. Alt-text authoring is opt-in and preserves any alt-text a deck already has.

Added

  • WCAG alt-text engine (--write-descr). Writes the OOXML descr attribute for pictures that have none, preserves any pre-existing alt-text (preserve-by-default, never overwrites), and marks decorative images decorative so screen readers skip them. A per-picture descr audit CSV records prior value, new value, and action.
  • --descr-only writes alt-text and adds no visible caption boxes; --replace-autogen-descr opts in to replacing only narrowly-matched tool-autogenerated placeholder alt-text.
  • verify.py --descr coverage gate — asserts every picture is covered (has a descr or is marked decorative), reporting authored vs. preserved-pre-existing distinctly, exiting non-zero on any gap.
  • Domain-context prompt — captioner asks for a one-line subject context (course/topic) at the start of a run so authored captions and alt-text use the right vocabulary for any discipline.

Changed

  • apply_captions.py handles alt-text ahead of the placement skips, so full-bleed and no-slot pictures still receive descr.
  • install.sh now announces the exact path it will symlink and any pre-existing target it will remove before acting, skips the removal when already linked (routine updates print "nothing to do"), and checks all four dependencies (python-pptx, lxml, Pillow, pyspellchecker) individually.
  • Documentation states plainly what files captioner reads and writes, adds an updating flow, and makes explicit that captioner works across every academic discipline via the --context prompt.

Notes

  • Populating the alt-text field is necessary but does not by itself certify WCAG 2.1 conformance, and the wording captioner generates is not independently verified — an educator should review it (and can correct any caption or alt-text by slide number with fix_captions.py).
  • Captions and alt-text are generated by Claude Code's vision, which runs on Anthropic's API — so the picture content of your slides is sent to Anthropic for processing. Review Anthropic's data-use terms before running it on restricted material (e.g. FERPA-covered student work). Your original .pptx is never modified.

Full details: CHANGELOG.md · Overview: jbenhart44.github.io/captioner