rustipo-0.6.0 is not a library.
Rustipo
Rustipo is an open-source, themeable static site generator written in Rust for blogs, notes, docs, personal sites, and other Markdown-first websites.
Rustipo is Markdown-first for content authoring and uses Tera templates for reusable layout.
Rustipo separates layout from color selection: theme controls structure, while palette
controls the generated color tokens.
Status
MVP complete, active post-MVP development.
CLI
rustipo new <site-name>rustipo devrustipo buildrustipo serverustipo theme listrustipo palette listrustipo palette use <id>rustipo theme install <source>rustipo deploy github-pages
Quick Start
Production build:
Layout Without CSS Editing
Use config.toml for basic style controls:
[]
= "98%"
= "2rem"
= "center" # or "start"
[]
= "1.5"
= "\"Inter\", sans-serif"
= "\"Fraunces\", serif"
= "\"JetBrains Mono\", monospace"
[[]]
= "Inter"
= "/fonts/inter.woff2"
= "400"
= "normal"
Current Features
- Markdown content pipeline with YAML frontmatter and draft filtering
- Tera-based theme templates for reusable page layouts
- Theme loading with inheritance support (
extends) and contract validation - Explicit theme IDs for clearer selection and variant naming (
family-variant) - Rich palette token aliases for expressive theme styling with semantic fallbacks
- Config-driven custom font families and local
@font-faceinjection - Refined default typography scale and prose rhythm for the starter theme
- Built-in palettes:
draculadefaultcatppuccin-frappecatppuccin-lattecatppuccin-macchiatocatppuccin-mochagruvbox-darktokyonight-stormtokyonight-moon
- Pretty URL output in
dist/ - Section/tag/archive generation:
/blog/,/projects//tags/<tag>//blog/archive/
- Output artifacts:
dist/rss.xmldist/sitemap.xmldist/search-index.json
- Local preview server with watch mode and live reload (
rustipo serve --watch) - Theme installation from GitHub shorthand/URL or local git repo
- GitHub Pages deploy workflow scaffolding
- Config-driven layout knobs (
content_width,top_gap,vertical_align,line_height) - Optional
static/custom.cssoverride loaded after theme CSS
Anatomy Of A Rustipo Site
Rustipo projects are organized around a simple model:
- Markdown = content
- themes = layout
- palettes = colors
- static = assets
- dist = generated output
Typical project layout:
my-site/
config.toml
content/
index.md
about.md
resume.md
blog/
projects/
palettes/
dracula.toml
static/
fonts/
img/
js/
favicon.svg
custom.css
themes/
default/
theme.toml
templates/
static/
dist/
What each part is for:
config.tomlis the main site configuration file- site title, description, theme, palette, layout, and typography live here
content/is where you write Markdown content- each Markdown file becomes a page
content/index.mdis the homepagecontent/blog/is for blog postscontent/projects/is for project pages- nested custom pages are supported outside
blog/andprojects/
themes/contains reusable layout themestemplates/holds Tera HTML templatesstatic/holds theme CSS and theme assetstheme.tomldescribes the theme
palettes/is for optional local color palettes- built-in palettes are embedded in Rustipo
- local palettes let you add your own color systems with
*.toml
static/is for user assets copied into the final site- images, fonts, JavaScript, favicons, and optional
custom.cssbelong here
- images, fonts, JavaScript, favicons, and optional
dist/is generated output- Rustipo recreates it when you build
Authoring Model
content/is where authors write Markdown contentthemes/<theme>/templates/defines reusable layout with Tera templatesthemes/<theme>/static/contains theme CSS and assetspalette = "..."selects a built-in or local color palette- optional local palettes live under
palettes/<palette>.toml dist/is generated output only
Example Project
Documentation
- CLI reference
- Project structure
- Theme contract
- Theme Tera guide
- Content model
- Release and publish workflow
- Roadmap
- MVP checklist
- CI
- Technical debt
Contributing
See CONTRIBUTING.md.
License
MIT license (LICENSE.md).
Credits
Rustipo was inspired by my friend's project, Nerdfolio, created by @atasoya.