Skip to main content

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

License

BSD-3-Clause. See LICENSE.

Author

Warith HARCHAOUI, Ph.D.

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)

Source distribution for sprezzature-publish 1.2.0
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)

Table of built distributions (wheels) for sprezzature-publish 1.2.0
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page