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.mdteaches them the format. - Live editor in Chrome: press
Eto 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(orR) 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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| keyframes-0.1.0.tar.gz | 298.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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.