Build clean, searchable static books from marimo notebooks and markdown
Project description
marimo-book
Build clean, searchable static books from marimo notebooks and Markdown files.
marimo-book is a Jupyter-Book-style static site generator built
specifically for marimo .py notebooks. It produces polished multi-page
sites with:
- Anywidgets that render statically — interactive Canvas/Three.js/Plotly widgets without a marimo kernel
- Static reactivity for discrete sliders (
mo.ui.sliderwith explicit steps) — pre-rendered lookup tables, no kernel - WASM render mode per chapter — opt into Pyodide-driven full reactivity for chapters that need it
- Material for MkDocs theming — full-text search, dark mode, code-copy, breadcrumbs, responsive layout
- Launch buttons per chapter — molab / GitHub / download
.py - Incremental build cache — content-hashed; only changed chapters re-render
- GitHub Pages deploy workflow scaffolded by
marimo-book new
Status
Alpha (0.1.x). Used in production by at least one real course
(dartbrains.org). The book.yml schema is
stable for v0.1; pin a minor version (marimo-book>=0.1.5,<0.2) until
1.0. Major changes always go through a new minor version.
Install
pip install marimo-book
Requires Python 3.11+. Optional extras for opt-in features:
pip install 'marimo-book[social]' # OpenGraph card generation (libcairo)
pip install 'marimo-book[linkcheck]' # external-link verification (htmlproofer)
pip install 'marimo-book[pdf]' # single-PDF export (WeasyPrint)
mkdocs-autorefs (cross-page heading references) ships in the base
install — flip cross_references: true in book.yml to enable.
Quickstart
# Scaffold a new book
marimo-book new mybook
cd mybook
# Live-reload dev server (http://127.0.0.1:8000/)
marimo-book serve
# One-shot static build (emits ./_site/)
marimo-book build
# Validate book.yml + content without building
marimo-book check
# Remove build artifacts
marimo-book clean
Deploy to GitHub Pages by pushing the scaffolded workflow
(.github/workflows/deploy.yml) to the default branch on a repo with
Pages enabled.
How it works
Two-stage build, by design:
content/*.md + *.py + book.yml
→ marimo-book preprocessor
→ _site_src/docs/*.md + _site_src/mkdocs.yml
→ mkdocs build (Material theme)
→ _site/
The preprocessor is not a mkdocs plugin — it emits plain Markdown + inline HTML. This keeps the shell swappable: Material today, zensical (Material's Rust successor) tomorrow, or a hand-rolled Jinja shell as a last-resort fallback.
For each marimo .py it runs marimo export ipynb --include-outputs
and translates the cells into Markdown + inline HTML — embedding
Plotly figures, anywidget mounts, and matplotlib renders directly. For
WASM-mode chapters, it routes through marimo's MarimoIslandGenerator
and ships marimo's runtime + Pyodide bundle.
book.yml minimal example
title: My Book
description: A static site from marimo notebooks + Markdown.
authors:
- name: Your Name
repo: https://github.com/you/yourbook
theme:
palette:
primary: "#1976D2"
launch_buttons:
molab: true
github: true
download: true
# Static reactivity for discrete mo.ui widgets
precompute:
enabled: true
toc:
- file: content/intro.md
- section: Chapters
children:
- file: content/chapter1.py
- file: content/chapter2.py
mode: wasm # this one runs in Pyodide for full reactivity
See marimo-book new for the
full starter template, and the book.yml
reference for every field.
Notebook dependencies
book.yml picks one of two modes:
env(default): re-use the active venv. Pin notebook deps in your book root'spyproject.toml. Fast.sandbox: pass--sandboxtomarimo export. Each notebook declares its own deps via PEP 723 inline metadata; marimo provisions per-notebook envs viauv. Slower on first run; portable.
Override per invocation with --sandbox / --no-sandbox on build or
serve.
Build cache
A content-addressed cache at {book_root}/.marimo_book_cache/ skips
re-rendering chapters whose source + book.yml-relevant fields haven't
changed. Typical incremental rebuilds drop from 100+ s to ~3 s on
real-world books. Reset with marimo-book clean or override per
invocation with marimo-book build --rebuild. CI runners get warm
cache reuse via actions/cache@v4.
Broken-link checking
marimo-book build --strict fails on broken in-tree links and
anchors (use this on CI). For external URL and image src validation,
opt into htmlproofer:
# book.yml
check_external_links: true
pip install 'marimo-book[linkcheck]'
marimo-book build --strict
External link checking hits the live web (~1–3 s per link), so we recommend gating it behind a release-cutting workflow rather than running on every PR.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file marimo_book-0.1.10.tar.gz.
File metadata
- Download URL: marimo_book-0.1.10.tar.gz
- Upload date:
- Size: 183.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28df40daf81f75739ff8aa72410c8c202f2dd86ff3f6dddb5bad80a5f47b7194
|
|
| MD5 |
5ae8a07a97d5069d830f907b0a8707d4
|
|
| BLAKE2b-256 |
a2495fee06acd4babee79d30c666f46b6fbbad9b6c7a56acb065ac0fd878cdf7
|
Provenance
The following attestation bundles were made for marimo_book-0.1.10.tar.gz:
Publisher:
publish.yml on ljchang/marimo-book
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
marimo_book-0.1.10.tar.gz -
Subject digest:
28df40daf81f75739ff8aa72410c8c202f2dd86ff3f6dddb5bad80a5f47b7194 - Sigstore transparency entry: 1396940464
- Sigstore integration time:
-
Permalink:
ljchang/marimo-book@6a03e71731ce9a3c7b525ab5dfdd11de62c1b6f3 -
Branch / Tag:
refs/tags/v0.1.10 - Owner: https://github.com/ljchang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6a03e71731ce9a3c7b525ab5dfdd11de62c1b6f3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file marimo_book-0.1.10-py3-none-any.whl.
File metadata
- Download URL: marimo_book-0.1.10-py3-none-any.whl
- Upload date:
- Size: 93.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3a8970a8c31c6b38563020adf36d827c2b099beda79aa45816c5a99bd025276
|
|
| MD5 |
b09993c147d822f52735f2988ed56e9a
|
|
| BLAKE2b-256 |
07420b95b22afcf750986be216007e182e4bbc399ae037701e235ae1fc523dfd
|
Provenance
The following attestation bundles were made for marimo_book-0.1.10-py3-none-any.whl:
Publisher:
publish.yml on ljchang/marimo-book
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
marimo_book-0.1.10-py3-none-any.whl -
Subject digest:
d3a8970a8c31c6b38563020adf36d827c2b099beda79aa45816c5a99bd025276 - Sigstore transparency entry: 1396940470
- Sigstore integration time:
-
Permalink:
ljchang/marimo-book@6a03e71731ce9a3c7b525ab5dfdd11de62c1b6f3 -
Branch / Tag:
refs/tags/v0.1.10 - Owner: https://github.com/ljchang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6a03e71731ce9a3c7b525ab5dfdd11de62c1b6f3 -
Trigger Event:
push
-
Statement type: