Skip to content
stenopressPublic

Repository files navigation

Steno logo

A fast, configurable static site generator powered by Deno.
Sponsored by Tuta

JSR JSR Score GitHub Actions Workflow Status

  • Runs on Deno; no Node.js installation required.
  • Written in TypeScript with unit, integration, and installed-product tests.
  • Built-in dev server with live reload.
  • Flexible themes from JSR, npm, or HTTPS.
  • Zero-config mode or full structured setup.
  • Sub-millisecond compilation per page in recorded benchmarks (4k pages in 0.405s).
  • Custom Tau template engine combining Svelte & Astro.
  • Sandboxed plugins running in isolated Deno subprocesses.
  • Transactional & incremental builds preserving last working site.

Getting Started

Installation

Create a new configured project using the interactive initializer:

deno create jsr:@steno/init

Or run the CLI directly in any site directory:

deno x jsr:@steno/steno build

You can also import Steno programmatically in TypeScript:

import { Steno } from "jsr:@steno/steno";

Zero-Config Mode

Build a single page or experiment with zero setup. Create my-site/content/index.md:

# Hello from Steno

Welcome to my static site!

From my-site, build the site:

deno x jsr:@steno/steno build

Steno automatically detects the Markdown file, applies the default theme, and writes output to dist/index.html.

Configured Project

For full control over content, themes, and plugins, create content/.steno/config.yml:

title: "My Steno Site"
description: "A site built with Steno"
author: "Your Name"
output: "dist"
theme: "jsr:@steno/theme-minimal"

Add content in content/index.md:

---
title: Home
layout: layout
---

# Hello World

Welcome to a site powered by Steno and Tau.

Start the development server with live reload:

deno x jsr:@steno/steno dev

Tau Templates

Themes use Steno's Tau template engine (.tau) supporting expressions, control flow, and components:

{#if title}
  <Header title={title} />
{/if}

<main class="prose">
  {@html content}
</main>

{#each tags as tag}
  <span class="badge">{tag}</span>
{/each}

Plugin Isolation

Secure third-party plugins with fine-grained capability isolation:

plugins:
  - package: "jsr:@steno/plugin-shiki@1.0.0"
    mode: isolated
    options:
      theme: github-dark

  - package: "jsr:@steno/plugin-seo@0.7.0"
    mode: trusted
    options:
      siteUrl: "https://example.com"

Isolated plugins run in separate processes with strictly denied filesystem, network, and environment permissions unless explicitly granted.


CLI Reference

steno [command] [options]
Command Description
build Build the site (default command).
dev Build, watch files, and serve with live reload.
preview Serve an existing production build without watching.
doctor Diagnose configuration and security issues.
help Print CLI usage.
version Print the installed Steno version.
Option Description
-c, --config <path> Path to configuration file (default: content/.steno/config.yml).
-p, --port <number> Preview port; development uses devPort.
-h, --help Show CLI usage.
-v, --version Print installed version.

Documentation


Know your rights

This project is under the MIT License:

  • Permissions: Commercial use, Modification, Distribution, Private use.
  • Limitations: Liability, Warranty.
  • Conditions: License and copyright notice.

Read the full license here.


Contributing

Please read the CONTRIBUTING.md file for more information.

To run the local test suite:

deno task dev        # Run test project with live reload
deno task test       # Run unit tests
deno task check      # Run full linting, formatting, and type checks
deno task bench      # Run performance benchmarks

Sponsors

Releases

Used by

Contributors

Languages