aaarendt/uw-slides
v0.2.0MIT
University of Washington slide deck builder with brand compliance and WCAG 2.1 AA accessibility. Create presentation slides using markdown-per-slide workflow with UW design system, accessibility validation, and reusable layout templates.
Changelog
All notable changes to this project will be documented in this file.
The format follows Keep a Changelog. Versions follow semantic versioning: MAJOR.MINOR.PATCH. Deprecations are noted under the version they are introduced in; scheduled removals name the target version.
[Unreleased]
Added
- The plugin is now an Agent Plugins v1.0.0 package, installable in Claude Code, Codex and GitHub Copilot CLI, with linked-skill instructions for OpenCode (README, Installation). New root
plugin.json(portable manifest) next to.claude-plugin/plugin.json, and a Codex marketplace in.agents/plugins/marketplace.json. tools/validate_plugin.pychecks the manifest rules, that both manifests match, skill front matter, that every skill using<PLUGIN>/paths says how to find the plugin, and both marketplaces.--claudealso runsclaude plugin validate. Tests:tools/test_validate_plugin.py.- Catalog slides
cb-what-is,cb-programs,cb-why-choose,cb-award-tiersandcb-process(CloudBank brand, verbatim,status: review): the standard CloudBank introduction (what it is, services, reasons to choose it, award tiers, application process). On-slide text is condensed; the full wording is in the speaker notes. Eachslide.mdlists its source pages and the facts that still need the owner's check, notably the award-tier figures. - Catalog slide
cb-eligibility(CloudBank brand, verbatim,status: review): who can lead a CloudBank project and recommended uses. Full source wording is kept in the speaker notes.
Changed
- Skills find the plugin through
$UW_SLIDES_HOME, then the plugin they were loaded from (two directories above theirSKILL.md), then~/.claude/plugins/local/uw-slides. Before, an install anywhere but that path neededUW_SLIDES_HOME. Every skill now names plugin files as<PLUGIN>/..., so they're not confused with files in the deck. The deckAGENTS.mdtemplate gives other agents the same order. - Skills pass
--catalog=<PLUGIN>/catalogto the deck's vendoredresolve-catalog.py. The resolver also looks for acatalog/next to its owntools/directory. Theresolveandejectcommands incatalog/README.md,catalog/CURATION.mdand the catalog slides'slide.mdfiles pass the flag too, because a deck's copy of the resolver can't find the catalog of a marketplace install on its own. - Skills read the plugin version from
plugin.jsoninstead of.claude-plugin/plugin.json. - The Claude Code marketplace is renamed from
uw-slides-localtouw-slide-deck, and the homepage and repository URLs now point ataaarendt/uw-slide-deck-plugin(the olduw-slides-pluginURL returns 404). catalog/CURATION.mdnow admits program slides (standard slides for a program such as CloudBank) alongside framing slides, with a brand and ID prefix per program, a size guideline per program, and rules for policy wording that changes.plan-deckchecks a program's catalog slides against planned content slides in decks of that program's brand, not only framing roles.- Catalog
agenda1.1.0 groups slides into parts: slides that share asection:become one item (or, without sections, eachsection-dividerand the slides after it), with their minutes summed. New optionalslide.mdfieldin_agenda: falsekeeps framing catalog slides out of the agenda; the six seeded framing slides set it. - Catalog slides without a
titlenow take theiraria-label, and their agenda label, from their own heading instead of the catalog description.
Fixed
- Slide text was centered on every slide in reveal.js decks, because
reveal.csscenters slide text and neither brand header overrode it. Bothheader-reveal.htmlfiles now settext-align: leftonsection.slide. Layouts meant to be centered (title,closing,stat-calloutand the centered catalog slides) set it themselves and are unchanged. Existing decks pick this up with/uw-slides:update-deck. - The
agendacatalog slide ran off the bottom of the screen in decks with more than about 9 content slides. It now uses two balanced columns past 7 items and caps the list at 12, which fits at 1280×720 even when labels wrap; past 12 the resolver shows 11 plus "and N more" and warns. - The
agendalisted framing catalog slides by their IDs ("title", "land-ack", "funding", "feedback"), ignoredsection: hidden, and used two color tokens no brand defines, so its heading was plain black. All fixed.
[0.2.0] — 2026-10-15
This release completes the restructuring started in v0.1.x (WS0–WS5). Breaking changes are limited to the deprecated SLIDES.md fallback.
Added
- WS1 — Versioning and path independence
- New decks scaffold
tools/deckparse.py(vendored copy) so all skill commands run aspython3 tools/deckparse.py ...with no variable expansion. Recommended allow rule:Bash(python3 tools/deckparse.py *). - New decks write
.uw-slides.json(plugin version, brand, scaffold date) to the deck root. - New
/uw-slides:update-deckskill: diffs and updates managed files (build scripts, shared templates,tools/deckparse.py) against the current plugin; never touchescontent/,slides/, orassets/. UW_SLIDES_HOMEis the canonical way to point to a non-default plugin location;~/.claude/plugins/local/uw-slidesremains the documented default fallback.
- New decks scaffold
- WS2 — Schemas (
references/slide-schema.md,tools/deckparse.py,templates/deck.yml,templates/slides/_example.md) - WS3 — Layout library (12 layouts in
templates/layouts/*.html,references/layouts.md) - WS4 — plan-deck skill (
skills/plan-deck/SKILL.md) - WS5 — Generation and deck.yml build (
skills/generate-slides/SKILL.md, updated build scripts,outline.sh,OUTLINE.mdgeneration) - WS6 — Slide catalog and resolver (
catalog/catalog.yml, 6 seeded slides,tools/resolve-catalog.py,catalog/CURATION.md) - WS7 — Lint and CI (
tools/lint.py,templates/lint.sh,templates/status.sh,templates/.github/workflows/deck.yml) - WS8 — Runtime and export
- Adopted reveal.js 6.0.2 (MIT, ~169 KB) as the presentation runtime. Replaces the homegrown
footer.htmlnavigation for new decks. design-systems/uw-brand/shared/header-reveal.htmlanddesign-systems/cloudbank-brand/shared/header-reveal.html: reveal-compatible headers (.reveal > .slideswrapper;display: flexslide system; speaker-notes hide rule).templates/shared/footer-reveal.html: initialises reveal.js withwidth: '100%', height: '100%'to preservevw-based font sizes.templates/setup-reveal.sh: downloadsreveal.min.js+reveal.min.cssfrom jsDelivr intoassets/reveal/.templates/export.sh: Playwright-based PDF export (optional dependency).skills/generate-slides/SKILL.md:## Notesbrief sections now render as<aside class="notes">for reveal.js presenter view.skills/new-deck/SKILL.md: new decks use reveal variants and runsetup-reveal.shat scaffold time.docs/runtime-evaluation.md: decision record, compatibility analysis, migration guide, vw/font-size note.
- Adopted reveal.js 6.0.2 (MIT, ~169 KB) as the presentation runtime. Replaces the homegrown
- WS9 — Collaboration process
CONTRIBUTING.md: prerequisites, clone-to-preview guide, roles (brief vs HTML), branch/PR workflow, how to lock a slide, regenerating on a branch, model/prompt context in commits, license and attribution notes for Encode Sans (SIL OFL), Open Sans (Apache 2.0), UW brand assets, and deck images..github/CODEOWNERSand.github/pull_request_template.mdfor the plugin repo.templates/.github/CODEOWNERS(pattern for slide ownership) andtemplates/.github/pull_request_template.mdscaffolded into new decks bynew-deck.
- WS11 — Migration and documentation
references/migration-guide.md: step-by-step guide for migrating a legacySLIDES.mddeck todeck.yml+slides/<id>.mdbriefs. Covers the one-shot skill path and manual migration./uw-slides:extract-to-markdown --migrate: new migrate-deck flow — readsSLIDES.md, writesdeck.yml+ briefs +.uw-slides.json, validates withdeckparse.py, then removesSLIDES.md(keeps it in git history). Full rules in the updatedskills/extract-to-markdown/SKILL.md.templates/VISUALS.md: "How to use this file" preamble replaced with a one-line pointer toskills/apply-visuals/SKILL.md, which is the stated authority for pass-2 rules. Deck-specific content (global styling sections, per-slide entries) is unchanged.references/migration-guide.mdadded toreferences/index inCLAUDE.md..claude-plugin/plugin.json:skillsarray added listing all eight skill names;keywordsupdated to includecatalog,reveal-jsandmigration.README.md: "Migrating from SLIDES.md" section added; Skills table updated to includeupdate-deck.
Deprecated
SLIDES.mdas a slide-ordering source. Decks that only haveSLIDES.mdstill build but print a deprecation warning pointing to the migration guide (references/slide-schema.md, section 6). Scheduled removal: v0.3.0.
Changed
- All skill
deckparse.pycalls now usetools/deckparse.py(deck-relative) rather than$UW_SLIDES_HOME/tools/deckparse.py(variable expansion). templates/AGENTS.md: explains plugin path resolution viaUW_SLIDES_HOME/ default fallback instead of hard-coding~/.claude/plugins/local/uw-slides.design-systems/uw-brand/DESIGN.md: font path references updated to reflect plugin-relative locations.
[0.1.0] — 2025
Initial release (WS0 baseline fixes).
Added
- Fragment-based slide architecture (
content/<id>.html, scopedsection[data-slide="..."]CSS). - Two-pass workflow: content (pass 1) → visuals (pass 2) → publish (pass 3).
- UW and CloudBank design systems.
- Skills:
new-deck,generate-slides,apply-visuals,design-review,accessibility-check,extract-to-markdown. - Build scripts:
build.sh,build-visuals.sh,publish.sh,outline.sh. tools/deckparse.py: stdlib-only YAML parser fordeck.ymland slide briefs.deck.yml+slides/<id>.mdbrief architecture (replacesSLIDES.mdfor new decks).
Release and tagging process
- Update the version in
.claude-plugin/plugin.json. - Move
[Unreleased]entries under a new[x.y.z] — YYYY-MM-DDheading. - Commit:
chore(release): bump to vX.Y.Z. - Tag:
git tag -a vX.Y.Z -m "Release vX.Y.Z". - Push tag:
git push origin vX.Y.Z.