Skip to main content

Beautiful slides from SVG. Your editor, your style.

Try the live demo Read the docs

Early-stage software. Expect bugs, missing features, and breaking changes.

The idea

Every presentation tool makes you choose.

Visual editors (PowerPoint, Keynote, Google Slides) give you a canvas. Drag shapes, resize freely, iterate until it looks right. But your work lives in proprietary formats tied to a platform or subscription, and exporting to anything else means fighting a lossy conversion.

Code-based tools (Beamer, Slidev, reveal.js) keep everything as plain text. Files are diffable, version-controlled, reproducible. But you describe layout in markup instead of drawing it. Creativity suffers when moving a box means editing a coordinate. The blank page is a text cursor, not a canvas.

Inkflow gives you both. Your authoring environment is a proper vector editor. Draw freely, iterate visually. Your source files are SVG, Markdown, and Python: open formats, plain text, not tied to any software or service.

How it works

A deck is a plain Python file:

from inkflow import (
    Deck,
    Image,
    MediaFit,
    Overlay,
    Slide,
    Video,
    animations,
    transitions,
)


def main() -> Deck:
    return Deck(
        # Chrome composited on top of every slide, whatever layout it uses
        overlays=[Overlay("footer")],
        slides=[
            # SVG slide: draw freely in Inkscape, animate elements by id
            Slide(
                "title.svg",
                # Opt a single slide out of the deck's chrome
                overlays=[],
                # Each cue's Trigger decides when it fires (default: on next click)
                animations=[
                    animations.FadeIn("headline"),
                    animations.FadeIn("subtitle"),
                ],
            ),
            Slide(
                "diagram.svg",
                # Fill predefined content zones using Markdown
                md="diagram.md",
                # Set a transition for the whole slide, and multiple animations for individual elements
                transition=transitions.Crossfade(),
                animations=[
                    animations.Bounce("box-a"),
                    animations.Bounce("box-b"),
                ],
            ),
            Slide(
                # Reuse a built-in, theme or project-local layout
                "media-right",
                md="image.md",
                # Fill a named zone with an image, or a video with playback control
                # (autoplay, loop, mute, trim, and a PlayVideo cue to start on a step)
                zones={"media": Image("assets/photo.jpg", fit=MediaFit.COVER)},
            ),
            Slide(
                "media-left",
                md="clip.md",
                zones={"media": Video("assets/demo.mp4", autoplay=True, loop=True)},
            ),
        ],
    )

When you run inkflow serve, Inkflow reads the slides as defined in the Python file and processes them into a web-based presentation. It will inject the Markdown and media files into the SVGs, apply the transitions and animations, and serve the result to your browser.

Quick start

uvx inkflow init my-deck # or: pip install inkflow && inkflow init my-deck
cd my-deck
uv run inkflow serve # or, without uv: inkflow serve
# press "o" in the tui to open http://localhost:7777 in your browser,
# press ? in the presenter for keyboard shortcuts

To try the bundled demo:

git clone https://github.com/ll-nick/inkflow
cd inkflow
uv run inkflow serve --deck demo/deck.py

No SVG editor is invoked at serve time. Inkscape or any other tool writes the files, Inkflow reads them. Saving a slide reloads the presenter automatically.

Acknowledgements

Slidev is an excellent presentation tool and a direct inspiration for this project. It's a Node.js project with a very different architecture and feature set, including many things Inkflow will never do.

This project was built making heavy use of coding agents and would not have been possible without them. Does that make it "slopware"? I'll let you be the judge of that but I can say that I try my best to keep the agents in check. Every architectural decision is mine, there's a CI to ensure a certain level of code quality, and before merging, I spend a good amount of time reviewing all changes in good old-fashioned manual labor.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

inkflow-0.3.0.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

inkflow-0.3.0-py3-none-any.whl (173.3 kB view details)

Uploaded Python 3

File details

Details for the file inkflow-0.3.0.tar.gz.

File metadata

  • Download URL: inkflow-0.3.0.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.5 {"installer":{"name":"uv","version":"0.12.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}

File hashes

Hashes for inkflow-0.3.0.tar.gz
Algorithm Hash digest
SHA256 4cc15924eb56c1289ab49589e52f012d755317fc6c547031d545ba977e1a13e9
MD5 b8f1b7cffb755417a342ec712119d9e5
BLAKE2b-256 3db0dec02ecc6ccac42efa01aa64a301b773d0721e1300fd99a15eefb64f1329

See more details on using hashes here.

File details

Details for the file inkflow-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: inkflow-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 173.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.5 {"installer":{"name":"uv","version":"0.12.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}

File hashes

Hashes for inkflow-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f01fc5214edbe81d034d3299dd5cb325c699053149fda1f793dbc210b6cb9c22
MD5 8a348660ca7221210ee5a129b7d576b8
BLAKE2b-256 c5f62c7a86c372cc4c378febfc0494ae9d43967368b7951c61c9e47c9929f091

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.0

2 files

This release

0.3.0 This release

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

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