Skip to main content

keyframes

HTML slide decks that LLMs write and you arrange by hand.

  • Slides are plain HTML files on a fixed 1920×1080 canvas. Claude Code, Codex & co. write them from your references; a generated AGENTS.md teaches them the format.
  • Live editor in Chrome: press E to drag, resize, snap and nudge blocks. Changes are written straight back into the slide source (only the touched attributes change), so your layout and the LLM's edits never fight.
  • Rich embeds as web components: three.js scenes, MuJoCo WASM physics, editable/runnable code (JS + Python via Pyodide), Excalidraw figures, KaTeX math, video.
  • Present anywhere: presenter view with notes and timer, offline-safe dependency cache, PDF export, static site export.

Quick start

uv init my-talk && cd my-talk
uv add keyframes            # or: uv add 'keyframes[export]' for pdf/shot/check --render
uv run keyframes init .
uv run keyframes dev        # opens Chrome; edit slides/*.html or ask your LLM to

Then ask your agent something like "Using the papers in references/, draft a 12-slide talk on X. Put the MuJoCo demo from assets/ on slide 5." and rearrange the result with E.

For exports install the browser once: uv run playwright install chromium (or have Chrome).

In the browser

key action
→ / Space, ← next / previous (build steps included)
E toggle the layout editor
S presenter view (notes, next slide, timer)
F fullscreen · B blackout

Editor: drag to move (Shift locks axis, Alt disables snapping), handles resize (Shift keeps aspect), arrows nudge (Shift ×10), [/] z-order, double-click to interact with a live embed, C copies a block reference like slides/04-results.html#sim for your next prompt, ⌘Z / ⌘⇧Z undo/redo, ? for help.

Edit mode also opens a resizable side panel (toggle with `):

  • Source: the current slide's HTML. Selecting a block jumps to its tag; edits save and hot-reload as you type; drags and LLM edits flow back in.
  • Claude / Codex / Shell: real terminals running in the deck folder (whichever CLIs are installed). Sessions survive page reloads. + ref (or R) types the selected blocks' reference into the prompt, e.g. @slides/04-problem.html (block "figure").

The dev server only accepts editor/terminal requests from its own page, but it does give that page a shell: keep it bound to 127.0.0.1 (the default).

Commands

keyframes init [path]        new deck from the scaffold
keyframes dev                live server + editor
keyframes present            serve without the editor
keyframes check [--render]   lint; --render adds browser errors and text overflow
keyframes shot [N ...]       PNG screenshots → .keyframes/shots/
keyframes pdf                PDF export (one page per slide, all builds shown)
keyframes build              static site → dist/
keyframes guide              full authoring reference (for LLMs)
keyframes themes             list built-in themes
keyframes eject-theme        copy the theme into the deck to customize it

Deck layout

my-talk/
  deck.toml        title, theme, canvas size, extra <head> tags, extra ES module imports
  AGENTS.md        authoring rules for LLMs (CLAUDE.md imports it)
  slides/          01-title.html, 02-motivation.html, ...  (ordered by filename)
  assets/          images, video, MJCF models, three.js scene modules, .excalidraw files
  references/      papers/notes for the LLM to draw from (never exported)
  .keyframes/    dependency cache + screenshots (gitignored)

Themes

  • default: a clone of Google Slides' "simple-light" template (Google Sans + Roboto Light, orbit artwork on title/section slides, split layouts with a grey media panel).
  • minimal: plain Inter/JetBrains Mono theme.

A theme is a folder with theme.css (CSS variables + text/container classes), STYLE_GUIDE.md (rules the LLM follows) and layouts/*.html (starting-point slides). Use theme = "./theme" in deck.toml for a deck-local theme.

Development

uv sync --all-extras
uv run pytest
uv run ruff check src tests && uv run ruff format src tests
cd examples/showcase && uv run keyframes dev   # every component in one deck

Metadata

Release files for keyframes 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for keyframes 0.1.0
File Size Uploaded Provenance
keyframes-0.1.0.tar.gz 298.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for keyframes 0.1.0
File Interpreter ABI Platform
keyframes-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 620.2 kB

Release files / keyframes-0.1.0.tar.gz

Download URL keyframes-0.1.0.tar.gz
Size 298.8 kB
Tags Source
SHA-256 checksum
How to use checksums
ab8583f6ee6f9f24c38d858c4aad66ac3428ef01fd3435219ed8bd8a0534355e
BLAKE2b-256 checksum
How to use checksums
f54d820768191303675d888e93851f3aab63f40507bc7fa17ddd6561e4b51ec5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / keyframes-0.1.0-py3-none-any.whl

Download URL keyframes-0.1.0-py3-none-any.whl
Size 321.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8f2230b99c460e6c44b104082a6bde401a651abb0ebb2cce3489f578a35fc1d8
BLAKE2b-256 checksum
How to use checksums
4a673c6ba21da1d6678a33194aafcc56b5632da7f618ec1d87a2b4d6104c3a0f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for keyframes 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page