Declarative slide authoring for Scala

Build polished presentations with a small, readable Scala DSL.

DeclSlides lets you describe decks in plain Scala, keep them close to your code, and render them to HTML, text, or Markdown with a lightweight jar-based workflow.

What it solves

Slides that live in version control and feel native to a Scala codebase.

Formats

HTML / Text / Markdown

Runtime

Single jar workflow

The visual direction of this landing page takes inspiration from the minimal, editorial layout in your reference: large typography, soft geometric framing, and a sharp light/dark contrast between sections.

Why teams like it

Author slides the same way you shape the rest of your system: clearly, compositionally, and with source control in mind.

Readable by default

A tiny DSL with obvious building blocks.

Presentation, slide, content, text, bullets, code, image, spacer, footer. The surface stays small and easy to teach.

Practical outputs

Generate the format you need for the moment.

HTML for presentation mode, text for quick previews, Markdown for docs or handoff. One source, multiple outputs.

Fits release workflows

Ship the jar, then render decks anywhere.

Download the release artifact, point it to a .sc file, and generate presentation output without installing a full frontend toolchain.

The DSL

Write decks in plain Scala, without losing structure.

The goal is not to invent a clever syntax. The goal is to make presentation code feel boring in the best possible way: explicit, composable, and easy to scan.

Example deck Scala
import declslides.dsl.DSL.*
import declslides.domain.*

presentation("Hello DeclSlides")
  .use(Theme.conference)
  .withFooter("DeclSlides · internal demo") {
    deck(
      slide("Intro") {
        content(
          text("This presentation is authored in Scala."),
          bullets(
            "Readable DSL",
            "Static validation",
            "Multiple output formats"
          )
        )
      },
      slide("Media", Layout.Centered) {
        content(
          image("./images/network.jpg", "Network visualization"),
          text("Images, layout hints, and footers are all first-class.")
        )
      },
      slide("Code") {
        content(
          code(
            "scala",
            """val speed = optimize(network)"""
          )
        )
      }
    )
  }

Composition

Decks are assembled with small builders instead of hidden magic.

Validation

Empty titles, invalid blocks, and duplicate slide names are caught early.

Outputs

Render the same source to HTML, text, or Markdown depending on the use case.

Run it with the jar

Download the release, then render directly from the CLI.

  1. 01Download declslides.jar from GitHub Releases.
  2. 02Create a deck in a .sc file.
  3. 03Render to the format you need with one command.
Terminal Jar-based workflow
# Render HTML
java -jar declslides.jar   --input examples/HelloPresentation.sc   --format html   --output dist/hello.html

# Render plain text
java -jar declslides.jar   --input examples/HelloPresentation.sc   --format text   --output dist/hello.txt

# Render Markdown
java -jar declslides.jar   --input examples/HelloPresentation.sc   --format markdown   --output dist/hello.md
Minimal file HelloPresentation.sc
import declslides.dsl.DSL.*
import declslides.domain.*

presentation("Release demo") {
  deck(
    slide("First slide") {
      content(
        text("Generated from a jar."),
        bullets("Simple", "Portable", "Versioned")
      )
    }
  )
}