Skip to main content

Minimal static site generator for markdown vaults

Project description

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/

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
  • Watch mode - Auto-rebuild on file changes
  • Works with any markdown - Obsidian, Logseq, or plain markdown files

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 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

Deployment

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

rsync (VPS/Server)

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

GitHub Pages

Separate repo - e.g., push to a dedicated username.github.io repo:

# Clone your GitHub Pages repo alongside your vault
git clone git@github.com:username/username.github.io.git ../username.github.io

# Copy build output and push
cp -r .foliate/build/* ../username.github.io/
cd ../username.github.io && git add . && git commit -m "Deploy" && git push

Same repo - If your vault is the GitHub Pages repo:

# Option 1: Use docs/ folder (configure GitHub Pages to serve from docs/)
cp -r .foliate/build/* docs/

# Option 2: Use gh-pages branch (requires Node.js)
npx gh-pages -d .foliate/build

Simple local copy

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

License

MIT

Project details


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.2.0.tar.gz (27.5 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.2.0-py3-none-any.whl (35.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: foliate-0.2.0.tar.gz
  • Upload date:
  • Size: 27.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.12

File hashes

Hashes for foliate-0.2.0.tar.gz
Algorithm Hash digest
SHA256 6be4a9fa0e4cbd4f9457d8b5e2848f60f0310559767b06e2b5058514bf9df347
MD5 12fb1b3e2ff4195a6facb765c1474f54
BLAKE2b-256 0c56ab1c0e9d622cdc6a4e43c7e03fc5098460c26dd0629aec53e0c66e263f7c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: foliate-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 35.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.12

File hashes

Hashes for foliate-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0f2e4efc27a0b312c7020caf27429507b539b4963f031abf5ffe89133def5d0e
MD5 1fe107ff8372ffbe37a0a5d814c6bf9a
BLAKE2b-256 c04b15c59f019cac8e71f92710be64baf6e4d76d855db3d28f569b3467627843

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page