Asteria
Asteria is a static site generator that builds your pages and blog posts
straight from OpenDocument Text (.odt) files. Write in LibreOffice
Writer, Word, or any ODT-compatible editor — Asteria converts it into a
fast, themeable static site.
Looking for the full configuration reference? See MANUAL.md for a complete guide covering every setting, front matter field, and template variable.
Features
- Write in ODT, not Markdown. Headings, lists, tables, and images convert automatically — no learning curve for non-technical writers.
- Pages and posts, with tags, categories, pagination, and RSS/Atom feeds out of the box.
- Multi-language content. Translate any page or post with a simple filename convention; Asteria handles URL prefixes, per-language blog indexes, feeds, and a ready-made language switcher.
- Cache-safe by default. Static assets are automatically content-hashed, so browsers never serve a stale CSS/JS file during development or after a deploy.
- Internal cross-references (
[[page-id]]) between your own content, validated at build time. - Live-reloading dev server (
asteria serve) that rebuilds on save. - Fully themeable with plain Jinja2 templates.
Requirements
- Python 3.11+
Installation
pip install asteria
(or, from a local checkout: pip install -e .)
Quick start
# Scaffold a new project (defaults to ./my_site if no path is given)
asteria new my-blog
cd my-blog
# Serve locally with auto-rebuild on changes
asteria serve
# -> http://127.0.0.1:8000
# Build the final static site
asteria build
Project structure
my-blog/
└── source/
├── site.yaml # site configuration
├── content/
│ ├── pages/ # standalone pages (*.odt)
│ └── posts/ # blog posts (*.odt)
├── static/ # copied as-is to the site root
└── themes/
└── minimal/ # the active theme
asteria build writes the generated site to my-blog/result/ by default.
Basic usage
Writing a page or post
Create an .odt file under content/pages/ or content/posts/. Start it
with a front matter block, then write your content normally:
---
title: My First Post
date: 2024-03-15
author: Jane Doe
tags: hello, first-post
---
Welcome to my new blog! This is a regular paragraph, written like any
other document in your ODT editor.
The filename (without extension) becomes the page's unique ID and, by
default, its URL slug — content/posts/my-first-post.odt becomes
/blog/my-first-post/.
Configuring your site
Edit source/site.yaml:
site:
title: "My Blog"
description: "Thoughts on things I like."
url: "https://myblog.example.com"
home_page: "welcome"
blog:
posts_per_page: 10
You only need to set the keys you want to change — everything else falls back to sensible defaults. See MANUAL.md for the full list of options (multi-language setup, feeds, sitemap, URL patterns, asset fingerprinting, and more).
Linking to your own content
See the [[getting-started]] guide for more details.
CLI commands
| Command | What it does |
|---|---|
asteria new [path] |
Scaffold a new project (default: ./my_site) |
asteria build |
Build the full static site |
asteria serve |
Build and serve locally, rebuilding on changes |
asteria check |
Validate content and configuration without writing any files |
asteria clean |
Remove the generated output (and optionally the build cache) |
Run asteria <command> --help for all available flags.
Documentation
The complete manual covers:
- Every
site.yamloption, with examples - Front matter reference
- Multi-language content (i18n)
- Internal references
- Blog excerpts (
[[more]]) - Asset fingerprinting / cache busting
- Theming: required templates, available context variables, filters
- Known limitations
License
AGPL-3.0.
Contributing
Issues and pull requests are welcome.
Metadata
Release files for asteria-ssg 1.0.0
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 |
|---|---|---|---|---|
| asteria_ssg-1.0.0.tar.gz | 152.9 kB | Without provenance | Details for asteria_ssg-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| asteria_ssg-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for asteria_ssg-1.0.0-py3-none-any.whl |
Total release size: 321.5 kB
Release files / asteria_ssg-1.0.0.tar.gz
| Download URL | asteria_ssg-1.0.0.tar.gz |
|---|---|
| Size | 152.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ffb372b8aa9eb4665ab118b56518d419c0692d06f24c1db5ac47ad1cb0bdf3c
|
|
BLAKE2b-256 checksum How to use checksums |
e24eff547f08f1ed873ab4cb977a70522a3699502a2016ca6116e95ed7a4cf8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / asteria_ssg-1.0.0-py3-none-any.whl
| Download URL | asteria_ssg-1.0.0-py3-none-any.whl |
|---|---|
| Size | 168.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c84894f868d751dbdc33f9b7d83f97e382dab9e1cc4607761a9a32e80738b6a7
|
|
BLAKE2b-256 checksum How to use checksums |
72f996816c67de3e21189fd5fcfccbcde90ba597b2c44ecddf68074c150b8496
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Security for asteria-ssg 1.0.0
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.