Releases: panglesd/slipshow
v0.6.0
I am speechless to announce the new release of Slipshow!
v0.6.0: The King's Slipshow
This release focuses on one specific feature: the speaker view.
(Disclaimer: The text in the left of the gif above was mostly generated by an LLM, mimicking "The King's speech" declaration of war, but turned to praise peace, which we need a lot in this world)
The speaker view includes a timer, speaker notes, and a presentation synced with the main one. Note that a compiled presentation is still a standalone html file that you can just double click on.
To open the speaker view, press s
. To send some text to the speaker notes, use the speaker-note
action, as in the code below:
# The King's Slipshow
{pause speaker-note}
Say it like this: "perhaaaaaaaaps"...
In this grave hour, perhaps the most fateful in our history, I send to every household of my peoples, both at home and overseas, this message, spoken with the same depth of feeling for each one of you as if I were able to cross your threshold and speak to you myself.
{pause speaker-note}
Make a little pause and show a tear, it'll make it more dramatic.
As always, the world finds itself standing on the edge of war.
{pause center=time speaker-note}
Emphasize roar but avoid making everyone uncomfortable.
{#time}
Time after time, we have sought peaceful ways to resolve our differences. Yet too often, dialogue has been drowned out by the roar of weapons.
{pause speaker-note}
Pretend you know what you are speaking about: as a King, you can do that.
We are told that violence is unavoidable, that to be safe we must fight. But this is the old and dangerous lie that “might is right.” If we accept it, we accept the slow destruction of all that makes life worth living.
{pause down=end speaker-note}
DRAMATICALLY POINT FINGERS AT THE AUDIENCE!!!
For the sake of all we cherish, we must find another path. The real challenge before us is not to fight harder, but to imagine peace when anger blinds us, and to choose cooperation when conflict seems easier.
I call on all people, across every border, to remain calm, firm, and united in the higher cause of preserving life. To resist the call of hatred. To remember that in every city, in every nation, there are children who deserve a future unscarred by war.
The road will be hard. There may be days when peace feels impossible. But war spreads beyond the battlefield — it steals homes, divides families, and poisons the generations to come.
{#end}
If we remain steadfast in our refusal to give in to violence, then, with courage and compassion, we will prevail — not by destroying, but by preserving.
Full changelog below:
Engine
- Add a speaker view, opened with
s
. (#147) - Fix
Z
andX
not working (#147) - On step change, move back to the position we left (#148)
Language
- Add a
speaker-note
action. (#147)
v0.5.0
Warning: External files have invaded our world! They raise dead formats like PDF into the liveliness of Slipshow presentations!
Slipshow 0.5.0: Plan 9 from External Files
As subtly hinted by the title, this slipshow release focuses on the integration of external files in a presentation. Rest assured, a compiled Slipshow presentation stays a standalone HTML file!
In effect, you can now include PDFs, videos and audios files in your presentations! Here is a demo:
With the simple source:
{#title}
# Plan 9 from External Files
{pause play-media=mp4}
## Video demo
{#mp4 style="width:100%"}
{pause up}
## PDF demo
{#pdf}
{focus=pdf}
{change-page="~n:all pdf"}
{unfocus up=title}
Here is the full changelog:
Compiler
- Add support for pdfs (#144)
- Add support for audios and videos (#139, #142)
- Fix
enter
action being added to blockquotes
Language
Engine
v0.4.1
Quick fix following the 0.4.0
release, which had a bug where pauses hide the UI.
Engine
- Fix pauses hiding the UI
v0.4.0
It is with bitter joy that I'm announcing the 0.4.0 version of Slipshow:
The slides strike back
The main improvements of this version are the introduction of arguments to actions, a frontmatter, and improvements to slides.
All together, they allow to easily design presentations the slides way:
---
toplevel-attributes: {children:slide children:enter="~duration:0"}
---
# Slide 1
Content
---
# Slide 2
Content
---
# Slide 3
You get it
So, why "bitter joy"?
I was reluctant to add good support for traditional slide-based presentation. There are already very good and mature solutions for this, including some with similar technical foundations as Slipshow. I was more interested in developping the new things: Slips!
However, Slipshow starts to have useful features that competitor don't always have (for instance: a self-contained html output! But more, and more to come). Also, for people who already have slide-based presentations, it makes it easier to migrate them, and use a single tool for old and new presentations!
Finally, I wanted to make Slipshow a bit more versatile and added attributes, frontmatter, and a new options: toplevel-attributes
. The proper slide support is actually just a nice consequence of this versatility! 🥳
Here is the full changelog:
Compiler
- Fix
children:
not working sometimes (#135) - Add
--toplevel-attributes
to control the attributes on the toplevel
container (#137)
Engine
- Render slide titles as slide titles (#137)
Language
v0.3.0
It's my ginormous pleasure to announce the release of:
Slipshow v0.3.0: The return of the subslips
As you can see, a crucial improvement is that releases are now named. Semver is boring, let's add a bit of fun in a serious world.
The release name subtly suggests that subslips are back. Yes, subslips are back! Slipshow allows your presentation to be visually organized. Subslips are slips that are inside a slip. You can then "enter" it, go through it, and exit it to go back to the original slip.
But a gif is worth a ginormous word, so here it is:
To obtain a similar effect, using the new release, you can simply do:
We will discuss three topics:
{style="display:flex" children:slip}
----
# Topic 1
Content of the first topic
---
# Topic 2
Content of the second topic
---
# Topic 3
Content of the third topic
If you want to separate the source in multiple file, it's easy: {include src="file/to/include.md"}
. And did you notice that ---
now act as group separators? At this point, let me just output the changelog (highligting some of them):
Compiler
- Fix file watching issues by vendoring a (modified) irmin-watcher, and watching
all files the presentation depends on (images, themes, ...) (#113) - Adds a favicon to the presentation file (Slipshow now has a logo!) (#115)
- Fix missing attributes on images (#117)
- Fix missing mime type on images that made svg undisplayable (#120)
- Fix detection of math inside inline attributes (#124)
- Add
--dimension
to specify the dimension of the presentation (#131) - Add less boring name for versions (#132)
Language
- Add
{include src="path/to/file.md"}
to include a file in another (#114) - Allow
pause
to have a target (#118) - Remove the need for
step
to execute actions (#118) - Added support for subslips and slides (#118)
- Added pause blocks (#127)
- Use horizontal lines (
---
) to group blocks (#129) - Pass attributes to children with
children:
(#130) - Consistently remove the need for
-at-unpause
(#133)
Engine
- Simplify table of content by removing preview (#118)
- Fix wrong computation of location (#118, #119)
- Improve zooming behaviour (everywhere) and performance (on chrome-based browsers...) (#121)
- If someone has some expertise on how to improve performance on firefox, I'm interested!
- Add PageUp and PageDown as navigation keys, adding support for pointers (#126)
- Do not act when control is pressed (#126)
- Fix wrong positioning on scaled slips (#128)
Credits
Thanks to the NLNet foundation for supporting this project!
v0.2.0
Highlights and summary
This release features several changes changes:
- A proper support for themes. See the docs! And the inclusion of the vanier theme
- A breaking change in the CLI: commands are now grouped: eg
slipshow markdown file.md
instead ofslipshow --markfown-output file.md
. This will allow to have a set of argument "per-command", eg no--theme
argument for themarkdown
subcommand. - Better mobile support, allowing to access all features without a mouse or keyboard.
- Better slipshow API for custom "slip scripts".
List of changes
CLI
- Split commands in groups (#112). Examples:
slipshow file.md
becomesslipshow compile file.md
slipshow --serve file.md
becomesslipshow serve file.md
slipshow --markdown-output file.md
becomesslipshow markdown file.md
- Add a
--theme
argument and a command to list the themes:slipshow themes list
(#109)
Engine
- Allow to focus on multiple elements. Zooms as much as possible so everything
is visible, and center. Backward compatible, focusing on a single
element. (#103) - Pass all actions to slip-scripts, accessible via the
slip
object. (#104) - Introduce
slip.onUndo
,slip.setProp
andslip.state
. (#97) - Improve mobile support, with buttons to navigate and open the table of content
(#106) - Add
scroll
action to scroll up or down, if needed (#107)
Themes
- Add the "vanier" theme from the pre-OCaml era (#109)
v0.1.1
Quick release mostly to allow publishing on opam!
- Vendor modified Brr, instead of pinning.
- Build released binaries in release mode, without QEMU.
- Fix
-dirty
suffix onslipshow --version
.
v0.1.0
Slipshow v0.1.0
Friday 7th, 2025. Lyon.
Note
TLDR:
- Engine rewritten in OCaml
- Fewer bugs when navigating back
- Stronger foundation (eg, for subslips)
- Custom scripts requires minor adjustments
- Breaking change in subslip HTML
- Drawing now in SVG
- No more zoom issues
- Erasing works "per-stroke"
- Revamped table of content
- Now based on title structure rather than subslips
- New
--markdown-output
flag for converting to GFM - Parser bugfixes
- License change: Now GPLv3 (previously MIT)
- npm distribution discontinued.
- Special thanks to NLNet for their sponsorship!
Dear readers,
I am thrilled to announce the 0.1 release of Slipshow, the slip-based presentation tool!
This is a major minor release. While versions 0.0.1
to 0.0.33
have served well to experiment, this release marks a fresh start, aimed at being a solid foundation for a project with a clear direction. A huge thank you to NLNet for sponsoring this milestone!
So, what is new? Quite a lot, the main change being that the engine has been fully rewritten.
The engine
Started as a single file javascript project, the old engine evolved presentation by presentation -- leading to numerous bugs, maintenance challenge or extensibility issue. (In other word, I did all I could not to touch it despite all the bugs)
This release introduces a complete rewrite of the engine in OCaml, with new design choices that improve reliability and expandability. Let's go over the key benefits and breaking changes.
Navigating Forward... and Backward
One of the greatest weakness of the old engine was handling backward navigation. Since it started as a simple "script scheduler", going back wasn't straightforward. The workaround involved taking a snapshot of... everything (the DOM, the state, ...), to be able to go back in time.
This had many bugs, in animations (such as the "focus" action), and in its iteraction with other features (such as drawing).
So, what is new in this engine? The engine now records an undo function for each step of the presentation. While this may not sound much, it is a ton better in terms of development. It's a much stronger foundation to build new features from. It's also much more
efficient for long presentations.
In most cases, your old presentations will work without modification in the new engine. However, there is one case where it needs modification: when you include the execution of a custom script in your presentation. In this case, you need to return the function undo to undo the executed step: see the documentation! (This is not ideal and better solutions are being experimented)
Writing
Previously, live annotations used the excellent atrament library. While great in many cases, its bitmap-based approach caused blurriness when zooming.
This release introduces a custom SVG-based annotation system, which eliminates zoom issues. Another change: erasing now works stroke-by-stroke instead of pixel-by-pixel.
Table of content
The old table of contents was based on the slip structure, which didn’t work well for presentations that primarily used a single slip (as is often the case with compiled presentations).
The new sidebar-style table of contents is now generated from headers, making it more intuitive and aligned with the presentation’s structure—resulting in a much smoother navigation experience!
Breaking change: Subslips
The HTML structure for subslips has evolved, in particuler to avoid having to provide the scale of your subslips.
Support for subslip in the new engine is not mature and will be announced in the next release, but bear in mind that if your presentation relies on them, you might want to wait a bit before migrating to the new engine!
Compiler
While this release focuses on the engine, the compiler has also seen improvements, including bug fixes (particularly in the parser) and a new feature:
--markdown-output
for markdown exports
If you want to print your presentation or host it as a static webpage, the default format can be cluttered with annotations. The new --markdown-output
flag lets you generate a clean, GitHub Flavored Markdown (GFM) file without annotations.
Other
Beyond technical improvements, there are some important project-wide updates:
- License Change: The project has transitioned from MIT to GPLv3, aligning better with its values.
- npm Distribution Discontinued: Maintaining an npm package added unnecessary complexity with minimal benefit. Please use binary releases — or better yet, contribute to getting Slipshow packaged in distributions!
Looking ahead
Several improvements did not make it in this release, but are already quite advanced. So here is a little peek into the future:
- Subslip returns! After having been a little left over since the introduction of the compiler, are coming back, with a better though implementation!
- Full mobile support is on its way! It has already been improved, but is not yet mature enough to be announced in this release.
Conclusion
Looking forward to your bug reports!
v0.0.33
Thanks to all contributors!
Relevant changes
- Fixed
--serve
sometimes not working by using long-polling instead of websockets. - Fixed
--serve
not working on MacOS (#65, @patricoferris)
PRs
- fix typo by @NullVoxPopuli in #49
- Minor typos by @reynir in #60
- Bump braces from 3.0.2 to 3.0.3 by @dependabot in #59
- Switch Inotify to irmin-watcher by @patricoferris in #65
- Bump micromatch from 4.0.5 to 4.0.8 by @dependabot in #62
- Bump actions/download-artifact from 3 to 4.1.7 in /.github/workflows by @dependabot in #63
New Contributors
- @NullVoxPopuli made their first contribution in #49
- @reynir made their first contribution in #60
- @patricoferris made their first contribution in #65
Full Changelog: v0.0.32...v0.0.33
v0.0.32
The additions of this new release is a more seamless reloading in --serve
mode, as well as some bugfixes.
- Use 127.0.0.1 to avoid problem with
localhost
in musl-based compilation - Fix log message in
--serve
- Fix
slip-script
attributes - Fixed file watching for emacs and vim
- Fixed flickering on
--serve
when saving, using slipshow preview - Vendor forked cmarkit