Zorto

Zorto #

The AI-native static site generator (SSG)

with executable code blocks

What is Zorto? #

  • Static site generator written in Rust
  • Python bindings via PyO3 – install with uv or pip
  • Markdown content with TOML frontmatter
  • Executable code blocks – run Python and Bash at build time
  • Built-in search, feeds, and llms.txt
  • MIT licensed, open source forever
Zorto
Zorto

Why another SSG? #

The problem #

  • Existing SSGs aren’t optimized for AI workflows
  • Hard to programmatically create and edit content
  • No built-in executable code blocks
  • Complex configuration and templating

Zorto’s answer #

  • Markdown + TOML = simple, parseable by AI
  • One markdown file per page – easy to generate
  • Code runs at build time, output baked into HTML
  • Minimal configuration, sensible defaults
Zorto

Key features #

16 built-in themes with light and dark mode

Shortcodes – rich content without HTML in markdown

Blog and docs templates with pagination, taxonomies, and search

Live reload dev server with instant browser refresh

Presentations – one markdown file per slide, powered by reveal.js

Images, anywhere #

Zorto
  • slide_image shortcode – absolute or inline
  • Position with top / left / right / bottom
  • Animate with class="logo-float logo-pulse logo-sway logo-glow"
  • Opacity, width, height – all optional
Zorto

Executable code blocks #

Write Python in a fenced block – Zorto runs it at build time and embeds the output:

# Stdlib only -- this demo runs without extra installs.
import statistics

revenue = [12, 15, 13, 17, 21, 24]
costs   = [10, 11, 12, 13, 14, 15]

print(f"Mean revenue: {statistics.mean(revenue):.2f}")
print(f"Mean costs:   {statistics.mean(costs):.2f}")
print(f"Margin:       {statistics.mean(revenue) - statistics.mean(costs):.2f}")
Mean revenue: 17.00
Mean costs:   12.50
Margin:       4.50

Add plotly, matplotlib, altair, or seaborn to your venv to embed live charts the same way.

Zorto

Live visualizations at build time #

# Stdlib only -- a tiny ASCII sparkline of a damped oscillation.
import math

x = [i * 0.4 for i in range(40)]
y = [math.sin(v) * math.exp(-v * 0.12) for v in x]
ramp = " ▁▂▃▄▅▆▇█"
lo, hi = min(y), max(y)
spark = "".join(ramp[round((v - lo) / (hi - lo) * (len(ramp) - 1))] for v in y)

print(f"damped sin(x) * e^(-0.12x), 40 samples")
print(spark)
damped sin(x) * e^(-0.12x), 40 samples
▃▅▇██▇▆▅▃▂▁  ▁▁▂▄▅▅▅▅▅▄▄▃▂▂▂▂▂▃▃▄▄▄▄▄▄▄▃

For real charts, install matplotlib, plotly, altair, or seaborn – Zorto captures Figure objects and embeds them as static HTML automatically.

Zorto

16 built-in themes #

  • zorto
  • dkdc
  • default
  • ember
  • forest
  • ocean
  • rose
  • slate
  • midnight
  • sunset
  • mint
  • plum
  • sand
  • arctic
  • lime
  • charcoal

Every theme supports light and dark mode with a single toggle.

Zorto

Progressive reveal #

Press → or space to reveal one at a time:

  • fade-in – the default, gentle entrance
  • fade-up – slides in from below
  • grow – scales up to emphasize
  • highlight-blue – flashes a color highlight
  • fade-right – slides in from the left
Zorto

AI-native by design #

  • Markdown + TOML – the simplest format for AI to read and write
  • AGENTS.md contracts define how AI agents interact with your site
  • zorto check validates content, links, and structure
  • llms.txt generated at build time for AI consumption
  • One file per page – AI creates, edits, and reorders independently

Full-slide backgrounds #

  • background_image – any URL, sized and positioned by reveal.js
  • background_color – solid fill with hex or CSS color names
  • background_size / background_opacity – tune the watermark
  • reveal_theme – swap the slide’s reveal.js theme (this one is moon)

Everything lives in the slide’s [extra] table – no template edits required.

Zorto

Presentations: one file per slide #

  • Each slide is a markdown file with its own frontmatter
  • weight field controls slide order
  • [extra] controls background, transitions, and layout
  • Shortcodes for columns, fragments, speaker notes, and positioned images
  • Powered by reveal.js – keyboard navigation, fullscreen, speaker view
Zorto

Shortcodes: rich content without HTML #

Built-in #

  • slide_image – positioned or inline images
  • fragment – progressive reveal
  • columns – side-by-side layout
  • speaker_notes – reveal.js speaker view

Custom #

  • Drop a .tera template in shortcodes/
  • Call it from any markdown page
  • Fully sandboxed, deterministic
  • Tested via zorto check

The whole presentation you’re watching is rendered from these shortcodes.

Zorto

Get started #

# Install
uv tool install zorto

# Create a new site
zorto init mysite
cd mysite

# Preview with live reload
zorto preview --open

Or use as a Python library:

import zorto
zorto.build(".")
Zorto

Thank you #

zorto.dev | github.com/dkdc-io/zorto

Install: uv tool install zorto