Releases: jbenhart44/captioner
Release list
v0.3.0 — WCAG alt-text + domain-context
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.shThen 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 OOXMLdescrattribute 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-picturedescraudit CSV records prior value, new value, and action. --descr-onlywrites alt-text and adds no visible caption boxes;--replace-autogen-descropts in to replacing only narrowly-matched tool-autogenerated placeholder alt-text.verify.py --descrcoverage gate — asserts every picture is covered (has adescror 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.pyhandles alt-text ahead of the placement skips, so full-bleed and no-slot pictures still receivedescr.install.shnow 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
--contextprompt.
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
.pptxis never modified.
Full details: CHANGELOG.md · Overview: jbenhart44.github.io/captioner
v0.2.3 — text-aware placement
Captions are now guaranteed never to cover text.
- Every text frame (title, body, plain text boxes / auto-shapes) is a 2D obstacle, narrowed to its estimated visible-text region (anchor-aware).
- Auto-sized caption height is accounted for, so a multi-line caption never spills onto a neighbour.
- The own picture is matched by geometry (not the non-unique pic_id), so a caption never lands inside a different stacked picture.
- New
inside-bottomfallback: when no text-clear external slot exists, the caption goes in the picture's own bottom strip rather than over text or skipped. verify.pyis now a five-pattern gate (text-overlap, footer, in-picture, caption-caption, missing-caption).
Verified across a 49-deck corpus: 0 text-overlap / in-picture / caption-caption / off-slide / footer defects, confirmed by an independent adversarial cross-check. See CHANGELOG.md.
captioner v0.1.1
Documentation-only release. No code or behavior changes — captioning output is byte-identical to v0.1.0.
Changed
- README and the project landing page now describe only shipped capabilities. The speculative "Roadmap" / "Extending captioner" sections (forward-looking feature ideas, including a prospective
--descrmode and PyPI packaging) were removed so every documentation surface conveys one consistent message.
Install (unchanged except the version pin):
git clone https://github.com/jbenhart44/captioner.git
cd captioner
git checkout v0.1.1
pip install -r requirements.txt
bash install.shSee CHANGELOG.md.
captioner v0.1.0
Captioner adds a brief, subject-identifying caption under every picture in a PowerPoint deck — with an auditable trail.
Built and hardened across a production run of 1,132 captions over 32 PowerPoint decks in three graduate engineering courses.
Install
git clone https://github.com/jbenhart44/captioner.git
cd captioner
git checkout v0.1.0
pip install -r requirements.txt
bash install.shThen restart Claude Code and run: /captioner <path-to-.pptx-or-folder>
Requirements
- Claude Code (provides the vision capability the workflow depends on)
- Python 3.9+, python-pptx
What's in 0.1.0
Subject-identifying captions, category-aware prefixes, white-card fill for dark slides, SmartArt per-icon captioning, three positioning fallbacks, decorative triage, idempotent re-runs, per-deck audit CSV, dry-run mode. See CHANGELOG.md.
MIT licensed.