Skip to content

Releases: jbenhart44/captioner

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

Choose a tag to compare

@jbenhart44 jbenhart44 released this 21 Jul 14:49

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

v0.2.3 — text-aware placement

Choose a tag to compare

@jbenhart44 jbenhart44 released this 30 May 00:10

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-bottom fallback: when no text-clear external slot exists, the caption goes in the picture's own bottom strip rather than over text or skipped.
  • verify.py is 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

Choose a tag to compare

@jbenhart44 jbenhart44 released this 15 May 12:28

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 --descr mode 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.sh

See CHANGELOG.md.

captioner v0.1.0

Choose a tag to compare

@jbenhart44 jbenhart44 released this 15 May 11:36

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.sh

Then 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.