rockgarden
A Python static site generator that builds sites from Markdown content. Point it at a directory of Markdown files and get a navigable HTML site: no config required.
Rockgarden supports Obsidian vaults out of the box — wiki-links, embeds, and callouts all work without changing how you write.
Philosophy
Progressive customization. Start with zero config and add complexity only when you need it:
- Zero config: Point at a folder, get a site
- Convention: Drop CSS in
_styles/, templates in_templates/ - Configuration: Define collections, navigation, themes in
rockgarden.toml - Full control: Custom templates, build hooks, data pipelines
The goal is to scale from a personal wiki to a full-featured site without switching tools.
Installation
With uv (recommended):
uv tool install rockgarden
Or with pip:
pip install rockgarden
Quick Start
rockgarden build # build your site
rockgarden serve # preview locally
Features
Navigation & discovery:
- Auto-generated sidebar, breadcrumbs, folder index pages (with optional
_folder.mdfor per-folder nav metadata) - Per-page table of contents
- Backlinks
- Client-side full-text search
- Tag display and tag index pages (
/tags/<tag>/) - Sitemap generation
- Broken link detection with visual indication
Customization:
- Built-in theme with dark/light mode
- Template overrides via
_templates/ - Layout system with named Jinja2 blocks
- Custom CSS (
_styles/) and JS (_scripts/) auto-injected - Theme export for full customization (
rockgarden theme export)
Obsidian support:
- Wiki-links (
[[page]],[[page|text]],[[page#section]]) - Note transclusions (
![[note]]) - Media embeds (images, audio, video, PDF)
- Callouts (all Obsidian callout types)
Collections:
- Named content subsets scoped by directory
- Load data from YAML, JSON, and TOML files
- Pydantic model validation via
_models/ - Per-collection templates, URL patterns, and page generation
- Collection entries available in all templates
Build pipeline:
- Build hooks (
pre_build,post_collect,post_build) - Content exported to
.rockgarden/content.jsonfor hook scripts - Base path prefix for subdirectory deploys
- SEO meta tags from frontmatter (description, Open Graph)
Other:
- Clean URLs (
/page/instead of/page.html) - Accessibility (skip links, ARIA landmarks, focus styles)
CLI Commands
rockgarden build # build your site
rockgarden serve # local dev server
rockgarden init # initialize a new project
rockgarden theme export # export theme for customization
rockgarden icons update # download Lucide icons for local override
Configuration
Optional. Create rockgarden.toml to customize:
[site]
title = "My Site"
source = "content"
output = "_site"
[nav]
sort = "files-first"
[theme]
name = "default"
[[collections]]
name = "speakers"
source = "speakers"
template = "speaker.html"
url_pattern = "/speakers/{slug}/"
[hooks]
post_build = ["echo 'Build complete'"]
Development
just install # install dependencies
just test # run tests
just check # lint and format check
just format # auto-fix lint and formatting
just ci # lint + tests (run before submitting)
just build # build the demo site
just serve # serve output directory
just css # compile Tailwind CSS
Requirements
Python 3.13+
Acknowledgements
Rockgarden was inspired by Quartz, a static site generator for Obsidian vaults. Check it out as it might be more appropriate for your use case. When I found myself increasingly customizing my installation I decided to start building my own implementation, with the features I always wanted in a static site generator.
Contributing
Contributions may be welcome if they fit the vision of this project. Please open an issue before submitting PRs. See CONTRIBUTING.md for details.
Security
To report a vulnerability, please use GitHub's private security reporting. See SECURITY.md for details.
License
MIT. See LICENSE.
Metadata
Release files for rockgarden 0.7.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| rockgarden-0.7.8.tar.gz | 660.9 kB | Without provenance | Details for rockgarden-0.7.8.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| rockgarden-0.7.8-py3-none-any.whl | Python 3 | none | any | Details for rockgarden-0.7.8-py3-none-any.whl |
Total release size: 1.2 MB
Release files / rockgarden-0.7.8.tar.gz
| Download URL | rockgarden-0.7.8.tar.gz |
|---|---|
| Size | 660.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
02954072a2d9f7cac3a3299d4e78fa6261d3d713ce4390d223a6741d20e0877b
|
|
BLAKE2b-256 checksum How to use checksums |
39083081d845c03e9f2ab15d67f5011a243c8133ab555220df9219a171107209
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","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}
|
Release files / rockgarden-0.7.8-py3-none-any.whl
| Download URL | rockgarden-0.7.8-py3-none-any.whl |
|---|---|
| Size | 551.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6b6407821c6e25bedf75231480ed8a07a3312c32a1c8da84152ebf67ee6b48cb
|
|
BLAKE2b-256 checksum How to use checksums |
8899e588d6c24f3b86e8c48c7d83336f266815953d5f57ead7b5ba9b4fcf7fd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","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}
|
Security for rockgarden 0.7.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.