sprezzature-publish
A folder of Markdown becomes a site somebody can find.
Point it at a README.md and a docs/ folder and it emits pages, the meta
tags that make them shareable, a favicon and app-icon set from one logo, the
indexes crawlers and language models look for — robots.txt, sitemap.xml,
llms.txt, an Atom feed, humans.txt — and, when asked, a narrated audio
track with a read-along that highlights the sentence being spoken.
It is sized for a site you can hold in your head: a README, some docs, a blog. For a hundred versioned pages, reach for MkDocs Material, Hugo or Astro instead; this does not compete with them and says so.
What's here
sprezzature-publish-lint |
audit — read the Markdown before anything renders it. Standard library only, milliseconds, pre-commit shaped. --fix repairs what has one safe repair. |
sprezzature-publish-html |
Markdown → standalone HTML pages, Mermaid diagrams rendered. |
sprezzature-publish-icons |
one logo → favicon, app icons, PWA icons, and the <head> snippet that references them. |
sprezzature-publish-indexes |
robots.txt, sitemap.xml, llms.txt, llms-full.txt, Atom, humans.txt. |
sprezzature-publish-meta |
Open Graph, Twitter Card and Schema.org JSON-LD, drafted by a local model. |
sprezzature-publish-plain |
rewrite prose at a target reading grade, keeping the terms you name. |
sprezzature-publish-changelog |
a CHANGELOG.md becomes dated posts and a feed. |
sprezzature-publish-narrate |
narrate a post with a local voice, and write the timed track beside the audio. |
sprezzature-publish-readalong |
bind that narration to the page, so the sentence being spoken is highlighted. |
Two front doors over all nine: make-site <tool> (argparse) and
sprezzature-publish <tool> (click). Both read one table, so a tool cannot
appear in one and be missing from the other.
Install
pip install sprezzature-publish # the lint: zero dependencies
pip install "sprezzature-publish[html]" # + the renderer
pip install "sprezzature-publish[icons]" # + Pillow, for the icon set
pip install "sprezzature-publish[prose]" # + the local-model tools
pip install "sprezzature-publish[all]" # everything above
pip install "sprezzature-publish[api,mcp]" # + the HTTP and agent surfaces
The lint having no dependencies at all is deliberate, and it is the reason this package is worth putting in a pre-commit hook: it runs in milliseconds in a minimal container, with no image library and no model client behind it. Everything heavier is an extra, named after the tool that needs it, so an install says what it is for.
Use
Gate the Markdown first
sprezzature-publish-lint docs/ # exit 1 on any finding
sprezzature-publish-lint docs/ --fix # repair what has one safe repair
Then build
sprezzature-publish-html README.md docs/ --out-dir site/
sprezzature-publish-icons logo.png --out-dir site/icons/
sprezzature-publish-indexes site/ --base-url https://example.com
From Python
from sprezzature_publish import lint_file, convert_one
A site is built by a script somebody wrote, in a loop, on a schedule. That caller should import rather than shell out and parse stdout.
Over HTTP
pip install "sprezzature-publish[api]"
uvicorn sprezzature_publish.api:app --port 8000
curl -s localhost:8000/health
Three routes — lint, render, plain-language — because those are the ones that cross a network boundary cleanly: text in, text out. The favicon set is a folder of binaries keyed by filename and stays a command rather than being offered here with an invented download protocol.
In containers
docker compose up -d
curl -s localhost:8000/health
docker compose --profile prose up -d # adds the local model server
The model server is a separate profile: two tools of nine need it, and someone who only wants pages should not be made to run one.
What it does not own
The voices. Narration synthesis lives in sprezzature-audio — captions turn sound into timed text and narration turns text into timed sound, so one package owns that modality in both directions. This one owns the document and the page, and invokes those as subprocesses so their heavy imports never enter its graph.
pip install "sprezzature-audio[narrate]"
sprezzature-audio-install-voice --engine kokoro
sprezzature-publish-narrate post.md --out-dir site/audio/
No voice is named above and none needs to be: the default engine reads the text, works out what language it is in, and picks the voice that speaks it. That is not a convenience — the detected language is what the phonemiser works from, so a French page read as English is not French in an American accent, it is an American spelling the words out.
See also
- sprezzature-accessibility — lint the HTML this emits, and draft the alt text it tells you is missing.
- sprezzature-audio — the voices, and the captions audit.
- sprezzature — the suite, and the skills that drive it from Claude.
License
BSD-3-Clause. See LICENSE.
Author
Metadata
Release files for sprezzature-publish 1.2.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 |
|---|---|---|---|---|
| sprezzature_publish-1.2.0.tar.gz | 259.0 kB | Without provenance | Details for sprezzature_publish-1.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sprezzature_publish-1.2.0-py3-none-any.whl | Python 3 | none | any | Details for sprezzature_publish-1.2.0-py3-none-any.whl |
Total release size: 462.7 kB
Release files / sprezzature_publish-1.2.0.tar.gz
| Download URL | sprezzature_publish-1.2.0.tar.gz |
|---|---|
| Size | 259.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ce8059faa5024c94e4c7b3ba233f149c265143c5473a8117bb9efd89d880e390
|
|
BLAKE2b-256 checksum How to use checksums |
fc759c175a20f30b3747b6cf0f4eafaa6591d621aa7924d17793fc56346de376
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.13
|
Release files / sprezzature_publish-1.2.0-py3-none-any.whl
| Download URL | sprezzature_publish-1.2.0-py3-none-any.whl |
|---|---|
| Size | 203.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
43e70d9af2b6169971ea7734f30c93b2222038eebfd916c5577474e078b219fe
|
|
BLAKE2b-256 checksum How to use checksums |
5ac683beba9f1676f02d023ca97ef68a229d1ee1706569e5c574777eaf1b2217
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.13
|
Security for sprezzature-publish 1.2.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.