Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.3.5 (2026-06-12)¶
Added¶
- New
containerelement groups child elements in its own %-coordinate box and animates them as one unit; partials can be included from separate files viacontainer_file. - New
templateelement generates child elements from Jinja2 — inline loops for in-place repetition, or reusable*.elements.json.j2files with declared parameters; preview renders withscrolly expand, read contracts withscrolly schema template. - Whole slides can now be stamped from a factory: a
.slide.jsonstub holding justtemplate_file:+with:renders a*.slide.json.j2template into the full slide.
Changed¶
- The
*_filecontent fields (markdown_file,html_file,mermaid_file,iframe_html_file) now appear in element schemas and docs, so they are discoverable instead of word-of-mouth.
Security¶
- File references (slide sources,
*_filefields, image assets) are now confined to the deck directory; grant additional roots explicitly with--allow-path.
0.3.4 (2026-06-12)¶
Changed¶
- Built decks are slightly smaller — the compressed payload stream is now ordered for better compression.
- The help screen's payload statistics are now a per-stage table (input → re-encoded → deduplicated).
0.3.3 (2026-06-11)¶
Added¶
- Built decks re-encode raster images to the smallest of several WebP/AVIF candidates (the original always competes, so a deck never grows), shrinking image-heavy decks; on by default at quality 95, tunable or disabled via
scrolly build --reencode-bitmaps <quality|off>.
0.3.2 (2026-06-11)¶
Changed¶
- Built decks now compress the whole document (slides, styles, runtime, mermaid, and assets) into a single stream behind a small loader, typically shrinking the output by 25% — and far more for decks with mermaid diagrams;
--no-compressstill produces a plain readable page. - Built decks ship the canvas runtime JS and CSS minified — source comments no longer appear in the output HTML, which also shrinks it by ~60 KB.
0.3.1 (2026-06-10)¶
Added¶
scrolly build --out-file <name>.htmlnames the output HTML file (default remainsindex.html).
Fixed¶
- Fenced code blocks in markdown elements render with their grey rounded box again (regression introduced in 0.2.0).
- An explicit
scroll_range: 0now pins the slide static as documented, instead of silently falling back to content-driven scrolling. - Content-driven slides no longer gain a phantom scroll range from anchored, scaled, or rotated elements — height measurement now accounts for CSS transforms.
0.3.0 (2026-06-03)¶
Fixed¶
- Elements with an animated or negative
anchornow render with the correct pivot and offset.
0.2.5 (2026-06-02)¶
Added¶
scrolly --help-for-ai-toolsprints the full CLI reference — commands, schemas, and error codes — as a single markdown document for AI agents.
0.2.4 (2026-06-02)¶
Added¶
scrolly schema elementshows the schema for each slide element type.
Changed¶
- Lighter backdrop behind the help screen.
- Breaking:
scrolly schema <type>is nowscrolly schema file <type>(deck and slide schemas moved under afilesubcommand).
0.2.3 (2026-05-31)¶
Added¶
- Slide-group labels auto-pick a legible black or white color from the group background, with an optional
label_coloroverride.
Fixed¶
- Slide-connector lines and their end dots now keep a constant on-screen size as the deck view zooms out, and carry a soft light outline so they stay legible against dark backgrounds.
- Stepping between snap positions no longer briefly jerks the animation backward before moving toward the target.
0.2.2 (2026-05-30)¶
Added¶
- Mermaid builds no longer require network access.
- New
--offlineflag onscrolly build(andSCROLLY_OFFLINE=1env var) skips the mermaid CDN download for byte-reproducible builds. - Help screen shows the mermaid version used in the build.
- Automation hook for capturing animations.
Changed¶
- Breaking:
image_sequencetiming — the absoluteholdfield is replaced byhold_fraction(a fraction offrame_distance, default0.2). Frames snap to the frame grid, andfade_in/fade_outnow bound the timeline exactly.
Fixed¶
- Image-sequence slides now snap to each frame, not just the slide endpoints.
- Slides positioned at negative row or column indices now render with correct gaps.
- Bezier edge arrows no longer clip on decks whose top-left slide is not at the origin.
- Inline
<code>and<pre>now visually match the size of surrounding body text in slide content. - Mermaid diagrams now scale to fit their element box instead of overflowing.
0.2.1 (2026-05-24)¶
Added¶
- Validation and parse errors now carry numbered codes (e.g.
[E202]); look up cause / example / fix viascrolly errors <code>. --jsonflag onscrolly validatefor machine-readable output.- New
scrolly introspect slides|elements|assetscommands for inspecting a resolved deck. - New
scrolly introspect snaps|timeline|snapshotcommands for inspecting scroll-driven element behavior. - New
scrolly introspect domcommand for inspecting rendered per-element HTML and scoped CSS. - New
scrolly schema --list-typesflag for scripting (bare type names, one per line).
0.2.0 (2026-05-24)¶
Added¶
scroll_rangeis optional everywhere now; omit it for content-driven height.font_scaleis now available on every slide.
Changed¶
- Breaking: the three slide types (
static,scrollimation,storyboard) are unified into a singleslidetype with the.slide.jsonsource suffix.
Removed¶
- Breaking: the
.static.md,.scrollimation.json, and.storyboard.jsonsource formats. Convert each slide to.slide.json— markdown bodies become amarkdownelement, scrollimation contents move under the new top-level shape, and storyboard scenes become elements with explicit opacity keyframes.
Fixed¶
- Builds are now byte-reproducible across runs.
- Slides containing an iframe are now selectable by clicking anywhere on them in deck view.
0.1.13 (2026-05-23)¶
Changed¶
- Inlined assets and iframe HTML are now compressed together, shrinking HTML output for decks with shared or repeated assets.
Fixed¶
- Help-screen statistics now show total vs deduplicated payload counts per type (including iframe HTML), alongside the bundle's compression state and bytes saved.
0.1.12 (2026-05-22)¶
Added¶
- Help screen (
?icon orhkey) with About, keyboard shortcuts, and deck statistics (slide/edge/asset counts, file size). - Inlined assets and iframe content are gzip-compressed when the compressed form is at least 10% smaller, decompressed client-side via
DecompressionStream. Pass--no-compressto disable. - Debug mode (
dkey) shows slide-grid boundaries and cell coordinates in deck view; 10% grid lines, snap-position values, and a live scroll-position readout in slide view.
0.1.11 (2026-05-21)¶
Added¶
- New
iframeelement embeds a self-contained local HTML file in a sandboxed<iframe srcdoc>with its own scrollbar, isolated from slide CSS, optionally framed with a border and outer shadow.
0.1.10 (2026-05-20)¶
Added¶
- Zoom-out control now defaults to a deck mini-map. Pass
--simplified-zoom-controltoscrolly buildto keep the legacy icon.
Fixed¶
- Deck view now centres on the actual slide cluster when the leftmost column or topmost row of the deck is not at zero, instead of including the empty leading columns/rows in its fit-and-centre computation.
0.1.9 (2026-05-19)¶
Fixed¶
- Pressing
sto toggle scroll snapping now brings the scrollbar and snap control back from their idle fade-out, instead of mutating snap state invisibly. - Slide-group tabs in deck view now stay wider than their label text across all viewport sizes and resize sequences, instead of squeezing in around the text after a window resize.
0.1.8 (2026-05-15)¶
Added¶
.avifaccepted as an image asset format alongside the existing.png,.jpg,.svg,.gif, and.webp. README now enumerates the supported set.compositingfield onimage_sequenceelements selects one of three frame-compositing strategies:blend(default, current behaviour — symmetric crossfade),overlay(opaque-frame mode that keeps a fully-opaque underlayer through every transition, eliminating mid-transition background bleed-through), orincremental(additive transparent layers that build up a composite as the sequence advances).
0.1.7 (2026-05-11)¶
Added¶
reverse: trueflag on scrollimation slides — thumb starts at the bottom and rises as scroll advances, for naturally bottom-up content.- Empty
image_sequenceslots —""reserves a slot in the timeline that renders blank, with neighbouring frames fading out before and in after it. - Edge arrows and zoom-out control now auto-fade after 2 seconds of mouse inactivity, independent of the scrollbar fade.
0.1.6 (2026-05-11)¶
Changed¶
- Smaller solid-black snap-position dots and an opaque scrollbar track for clearer visibility against any slide background.
Fixed¶
- README CI badge now reads "CI" instead of the workflow file name.
0.1.5 (2026-05-10)¶
Added¶
- New
image_sequenceelement type: a scroll-driven filmstrip of images that crossfade as the user scrolls. --strictlint warns when animage_sequencetimeline extends outside[0, scroll_range].
0.1.4 (2026-05-07)¶
Added¶
- Slide groups can have a custom
color(#RGBor#RRGGBB), shown on the group tab in deck view.
Changed¶
- Scrollbar and snap control auto-hide after 1 second of inactivity.
Fixed¶
- Bezier edge curves are no longer clipped for slides on the bottom row or far-right column.
- Improved rendering performance in slide view by hiding off-screen slides.
- Improved rendering performance in scrollimation slides by hiding zero-opacity elements.
- Fixed rendering artefacts on animated elements during scroll.
0.1.3 (2026-05-06)¶
Added¶
- Element properties (
position,anchor,opacity,scale,angle,width,height) are now animatable via inline keyframes. - Keyframe positions outside
[0, scroll_range]are now allowed;--strictlint warns on them. --strictflag onbuildandvalidateenables optional lint checks.
Changed¶
size: [w, h]replaced by separatewidthandheightfields (independently animatable).rotaterenamed toangle.translateremoved — use animatedpositioninstead.- Scrollimation JSON simplified: elements are flat objects, no
element/initial/keyframeswrapper.
Fixed¶
- Scroll thumb now shrinks correctly on slides with many snap positions.
0.1.2 (2026-05-05)¶
Added¶
- Animatable
anchorvia keyframes for viewport-independent panning over oversized elements.
0.1.1 (2026-05-05)¶
Added¶
anchorfield on elements (replacestransform_origin); controls position reference and rotation/scale pivot.- Field descriptions on all IR model fields for schema discoverability.
text_alignfield onMarkdownElement("left"|"center"|"right").
Fixed¶
- Scroll thumb sizing now caps at 2/3 of average snap spacing with a 10px floor.
- Image elements with one
"auto"size dimension now render correctly. - Fixed CSS collisions when multiple elements in a slide have no name.
0.1.0 (2026-05-04)¶
Added¶
- Initial release.
- CLI with
build,validate,schema, andinitcommands. - Three slide types: static (Markdown), scrollimation (JSON), storyboard (JSON).
- Storyboard-to-scrollimation compiler.
- 2D-canvas HTML output with keyboard/scroll navigation, bezier transitions, slide groups, and fan layout for edge arrows.
- Worked example deck under
examples/worked-example/. - CI via GitHub Actions (Python 3.11–3.14, ubuntu + macOS).
- PyPI publishing via trusted publishing (OIDC).