Catalog copy, frozen at v1.0.0. The canonical source is glukicov/slideops, which also carries the deck template, the two citation scripts, the reference docs, and the companion
slides-to-pdfskill. Install from there; this page summarizes the workflow.
SlideOps has two jobs, and the second one is the point. Build: turn a repository into a single self-contained HTML slide deck whose every claim came from the code, not from a model's impression of the code. Keep in sync: make that deck able to prove, months later, whether it still matches the repository.
The mechanism joining them is a citation. Every quoted snippet records the file, the line
range, and a hash of those source lines at build time, and the deck records the commit it
was built from. "Are these slides still accurate?" becomes a command instead of a
re-read: a standard-library Python script diffs each citation against the current code
and reports CURRENT, MOVED, CHANGED, or MISSING. No model, no network, no tokens,
milliseconds to run.
In Claude Code, as a plugin (both skills, background updates):
/plugin marketplace add glukicov/slideops
/plugin install slideops@slideops
Or for Codex CLI, Copilot CLI, and OpenCode, one installer covers all of them:
git clone https://github.com/glukicov/slideops && cd slideops
git checkout ba43e89bc7936649be36a1796a62203f704f8c60 # the v1.0.0 release commit
./install.sh
The checkout pins the exact commit this catalog copy froze at, which is what a reader
can verify independently. (The canonical repo also blocks retargeting of v* tags with
an active tag ruleset, but a SHA does not ask you to trust that.) install.sh symlinks
the two skills into ~/.claude/skills (read by Claude Code and OpenCode) and
~/.agents/skills (read by Codex CLI and Copilot CLI).
The skill walks a fixed pipeline: a two-minute repo scan, one compact intake (topic,
audience, length, theme, scope, extras), an outline checkpoint before any HTML is
written, then slide-by-slide construction from a verified template. Every snippet is
cited as it is written. Run the citation script from inside the repository being
presented, via its installed path (an agent resolves scripts/ against the skill's own
directory automatically; the paths below are for running it yourself after
install.sh):
python3 ~/.agents/skills/slideops/scripts/cite.py app/main.py:40-58 --repo . --snippet # prints data-src + data-sha256
python3 ~/.agents/skills/slideops/scripts/cite.py --stamp deck.html --repo . # stamps the build commit
--repo always points at the repository the deck is about, never at the SlideOps
checkout.
Every slide is then rendered with headless Chrome and visually verified before the deck is considered done.
From inside the repository being presented, same path convention as Step 2:
python3 ~/.agents/skills/slideops/scripts/check.py docs/slides/ --repo .
Real output, from the demo deck that ships with the skill:
Deck: skill-demo.html
Built: commit=179bbdb date=2026-08-28 repo=slideops
slide 9 THEMING skills/slideops/assets/template.html:22-45 CURRENT
slide 14 MERMAID skills/slideops/references/diagrams.md:55-59 CURRENT
2 current, 0 stale, 2 cited in total.
MOVED means only line numbers shifted (update two attributes, leave the prose).
CHANGED means the quoted code was edited (read the diff, decide whether the slide's
claim survived). MISSING means the file is gone (the slide is probably obsolete). The
--json flag emits a complete repair brief per stale citation, so an agent can fix
drift without re-reading the repository.
User: make slides about this repo
Agent: [scans repo, proposes 3-4 concrete topics with a "why now" each,
asks one compact intake, shows an outline, then builds and
visually verifies a cited HTML deck at docs/slides/]
python3 tools/slideops-check.py docs/slides/ --repo . --exit-zero # report-only PR annotation
The canonical repo's references/automation.md has the PR-check workflow, advisory hook
variants, and a delegated-refresh recipe. check.py is one dependency-free file, meant
to be vendored into the deck's own repo.
cite.py, never by hand: a hand-computed hash silently reports CHANGED
months later and nobody can tell whether the code moved or the build was sloppy.check.py against a PDF export: citations live in the HTML, so the PDF
reports "No citations found in this deck".--no-verify.npx download) and
brand-color extraction from a live style guide.install.sh, creating skill
symlinks in the user's home directory, downloading an optional npx package, or
writing deck output. Show the exact pinned commit and destination paths first, and
preserve any existing skill entries instead of overwriting them silently.allowed-tools, deliberately: the host agent's own permission
model stays in charge, and headless Chrome keeps its sandbox..env files, production logs, or customer data; redact internal
hostnames and identifiers; and finish with a redaction scan of the rendered slides,
because decks are documents that leave the repository.docs/slides/) plus its
companion README.check.py on an exported PDF reports no citations.
Solution: Run it against the HTML deck; the PDF is a derived artifact from the
companion slides-to-pdf skill.CHANGED.
Solution: That is a build defect, not a future problem: a snippet was quoted and
then edited, or a hash was hand-computed. Re-cite with cite.py before shipping.references/verification.md has the cross-platform
discovery recipe (Playwright cache first, then system installs).slides-to-pdf (same canonical repo): screenshots every slide at 2x, prints a
page-per-slide PDF, and verifies the result by rendering the PDF back to images.@2slides-ppt-generator: API-driven deck generation from text or documents; use it
when the source material is not a code repository.