☰ 🃏 Datalayer Decks
Slide decks, described as data — and the Reactor plugin that puts them in any Reactor shell.
spec (.ts, YAML-shaped)
↓ validation
template branding, palette, type scale, layout overrides
↓
slide library reusable semantic slide types
↓
@revealjs/react → Reveal.js
A spec says type: metrics; how a metrics slide looks is the template's
business. That is what lets one deck be an application deck, a conference talk
and a dark projection deck by changing one word.
Installation
pip install datalayer_decks
datalayer decks serve # http://127.0.0.1:8797, opens the browser
datalayer decks serve my-deck.yaml # load YAML and open this deck directly
datalayer decks list
Installing the package adds a decks group to the Datalayer CLI — serve,
list, show, delete — through the reactor's datalayer.cli entry-point
group; datalayer-decks is the same group on its own. serve runs the decks
API (/decks, JSON specs on disk) and the interface built from
app/ from one origin. The interface is a Reactor shell: the decks
plugin in the sidebar and main slots, the plugins manager, the command
palette, and — at the header's right edge — the appearance menu of
@datalayer/primer-addons, the color mode and theme chooser the Datalayer
header wears. Set DATALAYER_DECKS_DIR (or --decks-dir) to choose where
decks are stored (~/.datalayer/decks otherwise).
A YAML file passed to serve is loaded into a temporary store and opened at
its deck URL, so trying a file does not alter the user's normal deck catalog.
Pass --decks-dir as well when the imported copy should persist. A diagram is
ordinary spec content, either as a full slide or inside a column:
- type: mermaid
title: From specification to screen
diagram: |
flowchart LR
YAML[Deck YAML] --> Validate
Validate --> Reveal[Reveal.js]
Installed beside any other Reactor host, the same wheel publishes itself as an
extension: the routes join that host, and the Decks plugin — built by
extension/ as a Module Federation container into
share/datalayer/reactor/extensions/decks — is loaded into that host's shell
through federation, no import
needed. See python-packaged extensions.
Usage
import { registerDecks, DeckView, DecksHostProvider } from '@datalayer/decks';
import { DecksPlugin } from '@datalayer/decks/plugin';
@datalayer/decks— the engine: types,validateDeck, the slide library, the templates (datalayer,datalayer-brand,datalayer-ink),DeckRenderer,DeckView,DeckPrintView,DeckAccess, and two registries the host fills — the deck catalog (registerDecks) and the components a spec may name (registerDeckComponents).@datalayer/decks/plugin—DecksPlugin: a list in thesidebarslot, the open deck inmain, a "Decks" entry in the shell's view selector, and commands with keystrokes.
| Command | Keystroke | Does |
|---|---|---|
decks.list |
Mod+Shift+D | close the open deck, show the list |
decks.new |
Mod+Alt+N | the "new deck" dialog |
decks.open |
— | open a deck by id ({ id, slide? }) |
decks.rename |
F2 | rename the open deck (or { id }): title, address, family |
decks.delete |
— | delete the open deck (or { id }), after asking |
decks.goToSlide |
— | move the open deck to a slide ({ slide }) |
decks.nextSlide / decks.previousSlide |
Alt+→ / Alt+← | move through the open deck |
decks.present |
Mod+Shift+F | the open deck, fullscreen |
decks.print |
Mod+Shift+P | the print view, for Save as PDF |
What the engine needs from the application around it — the theme, a footer
logo, whether the reader is signed in — arrives through DecksHostProvider,
with defaults that make a bare mount work.
Agents
Everything an agent may do with decks is declared by this plugin, as one
AgentTools bundle
(src/plugin/agentTools.json): the data — decks_list_decks,
decks_get_deck, decks_create_deck, decks_update_deck, the per-slide
edits, decks_delete_deck — and the screen — decks_open, decks_go_to_slide,
decks_next_slide, decks_previous_slide, decks_present, decks_print,
decks_list. Each is a command the plugin registers (DECKS_DATA_COMMANDS,
DECKS_COMMANDS), run on the page against the catalog and the store — saved
to this server when the plugin was given one — and answering with what the
model needs next. No agentspec
names a deck tool; example-decks declares tools: [] and gets them all from
the plugin it is mounted beside.
The Python half serves the same file from GET /plugins/agent-tools, and
registers the data half of the suite under the same ids
(datalayer_decks/commands.py, through provide_slash_commands) — so on a
host with no browser the commands the bundle names are commands the reactor
actually has, reachable from reactor commands list and reactor commands run decks.getDeck '{"id": "talks/hello"}' as much as from an agent. The seven
that move a deck on screen stay with the browser plugin: a store has no
screen.
In the datalayer decks interface itself, --reactor-plugins ai-agents
puts the Decks agent (example-decks) beside the decks: a floating chat on a
temporary inference key, with the bundle above as its tools, read from the
reactor rather than declared — see plugins/ai-agents.
example-decks and worker-pitcher (the landing's deck editor agent) name
the same frontend toolset, decks, in agentspecs.
In a Loop (@datalayer/agent-runtimes), @datalayer/loop-plugin-decks
mounts this plugin beside the chat — the list in the sidebar, a Deck
editor view, a menu on the composer — and the chat hands the agent the
bundle's commands as tools, so an agent writes and drives a deck with no
server behind it. The DecksAgent example shows it.
Development
make install # pip install -e ".[test]"
make build-lib # tsc → lib/
make build-app # the interface → share/datalayer/reactor/apps/decks
make build-extension # the container → share/datalayer/reactor/extensions/decks
make wheel # both, then the wheel (hatch_build.py builds what is missing)
make test
make dev-app # Rsbuild on :5190, against `datalayer decks serve` on :8797
make example # serve examples/welcome/welcome.yaml directly
The container build needs @module-federation/rsbuild-plugin (a
devDependency): npm install once in this package.
The deck definitions of a product stay with that product: the Datalayer landing keeps its specs, its registry entries and its design-system illustrations, and mounts this package around them.
Release files for datalayer-decks 1.0.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| datalayer_decks-1.0.4.tar.gz | 22.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| datalayer_decks-1.0.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 45.4 MB
Release files / datalayer_decks-1.0.4.tar.gz
| Download URL | datalayer_decks-1.0.4.tar.gz |
|---|---|
| Size | 22.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
49142dbaff8137a08f8fc04140228da8393b9ad08106c7089bac071e8eb6e21b
|
|
BLAKE2b-256 checksum How to use checksums |
93874f321849af9a2bb40cceb38551065ac241aaa40dd1f0a402adabdb6636be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency logRelease files / datalayer_decks-1.0.4-py3-none-any.whl
| Download URL | datalayer_decks-1.0.4-py3-none-any.whl |
|---|---|
| Size | 22.9 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
35bedcfc7e178b2908e9226a5d562344b6a58b79513bb57c27ec238895069aec
|
|
BLAKE2b-256 checksum How to use checksums |
0a73e3156a381ea7bb0b4507a30673fc6423d453142de7cd73b5b369f596770a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.
Transparency log