Skip to main content

Foliate

A static site generator for your markdown vault. A flexible, configurable alternative to Obsidian Publish.

cd my-vault
uvx foliate init    # Create .foliate/config.toml
uvx foliate build   # Generate site to .foliate/build/
uvx foliate watch   # Live preview with auto-rebuild
uvx foliate deploy  # Deploy to GitHub Pages

Why Foliate?

  • Everything in your vault - All content, config, and output stay in your vault
  • Single executable - One tool to generate your website, no complex setup
  • Flexible - Just markdown files in, a website out

Features

  • Zero config - Works out of the box with sensible defaults
  • Vault-native - Everything lives in .foliate/ inside your vault
  • Two-tiered visibility - Control what's public vs. published
  • Incremental builds - Only rebuilds changed files (auto-rebuilds on config/template changes)
  • Watch mode - Auto-rebuild on file changes
  • Works with any markdown - Obsidian, Logseq, or plain markdown files
  • Obsidian syntax - Supports ![alt|width](url) image sizing
  • Quarto support - Preprocess .qmd files (optional)
  • Deploy command - Built-in GitHub Pages deployment

Quick Start

# Initialize in your vault
cd my-vault
uvx foliate init

# Build
uvx foliate build

# Watch mode (build + serve + auto-rebuild)
uvx foliate watch

Directory Structure

my-vault/
├── .foliate/
│   ├── config.toml      # Configuration
│   ├── build/           # Generated site
│   ├── cache/           # Build cache
│   ├── templates/       # Custom templates (optional)
│   └── static/          # Custom CSS/JS (optional)
├── _private/            # Ignored - never built
├── _homepage/           # Site root (/, /about/, etc.)
│   └── about.md         # → example.com/about/
├── assets/              # Images, PDFs
├── Home.md              # → example.com/wiki/Home/
└── Notes/
    └── ideas.md         # → example.com/wiki/Notes/ideas/

Special Directories

Directory Purpose
_private/ Never built, regardless of frontmatter. Configurable via ignored_folders in config.
_homepage/ Content deployed to site root (/) instead of /wiki/ (or other prefix). Excluded from normal wiki generation.

Visibility System

Control what gets built and listed:

---
public: true       # Built and accessible via direct link
published: true    # Also appears in listings and search
---
  • No frontmatter or public: false → Not built (private)
  • public: true → Built, accessible via URL
  • public: true, published: true → Built AND visible in listings

Configuration

.foliate/config.toml:

[site]
name = "My Wiki"
url = "https://example.com"

[build]
ignored_folders = ["_private", "drafts"]
wiki_prefix = "wiki"  # URL prefix for wiki content (set to "" for root)

[nav]
items = [
    { url = "/about/", label = "About" },
    { url = "/wiki/Home/", label = "Wiki" },
]

Commands

foliate init      # Create .foliate/config.toml
foliate build     # Build site
foliate watch     # Build + serve + auto-rebuild
foliate deploy    # Deploy to GitHub Pages
foliate clean     # Remove build artifacts

Options

foliate build --force      # Force full rebuild
foliate build --verbose    # Detailed output
foliate build --serve      # Start server after build
foliate watch --port 3000  # Custom port
foliate deploy --dry-run   # Preview deploy without executing
foliate deploy -m "msg"    # Custom commit message

Deployment

Foliate generates static files in .foliate/build/. Deploy anywhere that serves static files.

GitHub Pages (Built-in)

Configure in .foliate/config.toml:

[deploy]
method = "github-pages"
target = "../username.github.io"  # Path to your GitHub Pages repo
exclude = ["CNAME", ".gitignore", ".gitmodules"]

Then deploy:

foliate deploy           # Sync, commit, and push
foliate deploy --dry-run # Preview changes first

rsync (VPS/Server)

rsync -avz --delete .foliate/build/ user@server:/var/www/mysite/

Simple local copy

cp -r .foliate/build/* /path/to/webserver/

Customization

Foliate is designed to be customized via template and CSS overrides.

Quick Start

my-vault/
└── .foliate/
    ├── templates/     # Override layout.html, page.html
    └── static/        # Override main.css, add custom assets

Files in these directories take precedence over Foliate's defaults.

Documentation

See docs/customization.md for the full guide, including:

Quarto Support (Optional)

Foliate can preprocess .qmd files (Quarto markdown) to .md before building:

# Install with quarto support
pip install foliate[quarto]

Configure in .foliate/config.toml:

[advanced]
quarto_enabled = true
quarto_python = "/path/to/python"  # Optional: Python for Quarto

Development / CI

Foliate uses a cross-platform GitHub Actions CI workflow on pull requests and main pushes:

  • Test matrix: Linux, macOS, Windows on Python 3.12 and 3.13
  • Build + smoke matrix: Linux, macOS, Windows (Python 3.13), including wheel install and CLI smoke checks

Releases remain manual via:

make publish

For the complete maintainer release process, see docs/releasing.md.

License

MIT

Download files

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

Source Distribution

foliate-0.8.0.tar.gz (59.7 kB view details)

Uploaded Source

Built Distribution

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

foliate-0.8.0-py3-none-any.whl (70.7 kB view details)

Uploaded Python 3

File details

Details for the file foliate-0.8.0.tar.gz.

File metadata

  • Download URL: foliate-0.8.0.tar.gz
  • Upload date:
  • Size: 59.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for foliate-0.8.0.tar.gz
Algorithm Hash digest
SHA256 b96667a6208f584a5a53fb41e0f941fdcb8637b8df59a7f77b59a56277499ebd
MD5 854fdd1f3c983b5278b2ddc3d3268133
BLAKE2b-256 eda6552cbd7b055c660920f28aa2e08afaae11f6fa44e82b05f65eae5d924de4

See more details on using hashes here.

File details

Details for the file foliate-0.8.0-py3-none-any.whl.

File metadata

  • Download URL: foliate-0.8.0-py3-none-any.whl
  • Upload date:
  • Size: 70.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for foliate-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 629266c7a59d0507e3f710fc1ba50e8c85446e9780b4c6f2fb2bc467eeef2dd2
MD5 e0bbfa442a140eddcd97c57d7ec1e686
BLAKE2b-256 8b7db67ae502fce84a28ffacf4cc93ef23b4017820a1fe3a2eabb08def46607c

See more details on using hashes here.

Release history Release notifications | RSS feed

0.11.2

2 files

0.11.1

2 files

0.10.0

2 files

0.9.0

2 files

This release

0.8.0 This release

2 files

0.7.6

2 files

0.7.5

2 files

0.7.4

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.3

2 files

0.1.2

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