<?xml version='1.0' encoding='utf-8'?>
<rss version="2.0"><channel><title>Sprezzature — Release notes</title><link>https://sprezzature.ai</link><description>Combined, date-sorted release notes from the sprezzature-* packages (accessibility, audio, CLI-to-GUI, colors, figures, maps, UX laws) and the main sprezzature skills repository.</description><lastBuildDate>Thu, 20 Aug 2026 00:00:00 +0000</lastBuildDate><item><title>sprezzature-ux-laws Unreleased: `scripts/audit_laws_of_ux.py`: `Walker.handle_endtag` unwound the entire…</title><link>https://github.com/warith-harchaoui/sprezzature-ux-laws/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-ux-laws-Unreleased</guid><description>Fixed
`scripts/audit_laws_of_ux.py`: `Walker.handle_endtag` unwound the entire open-element stack on a stray closing tag with no matching opener (a common artifact in hand-written or templated HTML), instead of ignoring it. That silently corrupted every later ancestor-based check (Hick's `&lt;nav&gt;` counting, the Jakob label-wrapped-control exemption) for the rest of the file. Now searches for a match before mutating the stack, and ignores a stray tag when none exists.
`check_aesthetic_usability`: a comment claimed `&lt;input type="submit"&gt;` was exempt from the focus-ring check, but the only `continue` in that branch fired for `type="hidden"`; a submit button still fell through to the normal check. Removed the dead branch: only `type="hidden"`, which is genuinely non-interactive, is exempt.
…</description><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-maps Unreleased: Maintenance pass: no behavior change to the two generators or any of their five…</title><link>https://github.com/warith-harchaoui/sprezzature-maps/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-maps-Unreleased</guid><description>Maintenance pass: no behavior change to the two generators or any of their five access surfaces.
Fixed
`LICENSE` was missing even though `pyproject.toml` declares BSD-3-Clause. Added.
Seven docstrings and comments across `sprezzature_maps/api.py`, `scripts/_relief.py`, `scripts/make_choropleth.py`, and two test files pointed at `.private/*.md`, files that are deliberately gitignored and never shipped. Removed the dead pointers; the substantive claim each comment made (a check was actually run, not just asserted) stays.
Five `except Exception:` blocks in `scripts/make_situation_map.py`'s admin-boundary clipping loops had no explanatory comment, unlike two identical blocks earlier in the same file. Added the same "skip a malformed geometry rather than fail the plate" rationale to all seven, so a broad catch is never left unexplained.
…</description><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-maps 0.1.0: Initial standalone release, extracted from `sprezzature-figures`' catalogue of…</title><link>https://github.com/warith-harchaoui/sprezzature-maps/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-maps-0.1.0</guid><description>Initial standalone release, extracted from `sprezzature-figures`' catalogue of chart kinds (`adc0fbb`).
Added
`scripts/make_choropleth.py`: world choropleth, hand-authored SVG, no Vega, no matplotlib. Equal Earth projection (closed-form forward, vectorised Newton-Raphson inverse for relief sampling), OKLCH sequential and diverging colour ramps, antimeridian-aware country outlines, native `&lt;title&gt;` tooltips plus an on-canvas hover bubble, rank and share-of-total enrichment.
…</description><pubDate>Sun, 16 Aug 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-figures 1.1.0: **The last live Vega code path.** `scripts/make_figure.py` (a legacy…</title><link>https://github.com/warith-harchaoui/sprezzature-figures/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-figures-1.1.0</guid><description>Removed
**The last live Vega code path.** `scripts/make_figure.py` (a legacy CSV/x/y/kind dispatcher emitting Vega-Lite JSON or matplotlib) predated the one-generator-per-kind SVG architecture and was never wired to any console-script entry point, but stayed directly runnable and documented in `references/publication-presets.md`. Both are deleted, along with `_style.vega_config` (its only caller) and `references/figure-catalog.md` (an obsolete "prefer Vega-Lite" policy doc). All 126 chart kinds are hand-authored SVG; the only Vega left anywhere in the repo is `render_diagram.py` rasterising a caller-supplied external spec.
Fixed
…</description><pubDate>Thu, 06 Aug 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-ux-laws 1.0.0: `scripts/audit_laws_of_ux.py`: static Laws-of-UX auditor for HTML. Stdlib only…</title><link>https://github.com/warith-harchaoui/sprezzature-ux-laws/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-ux-laws-1.0.0</guid><description>Added
`scripts/audit_laws_of_ux.py`: static Laws-of-UX auditor for HTML. Stdlib only, no browser. Eight checks: Hick, Choice Overload, Miller, Jakob, Fitts, Aesthetic-Usability, Selective Attention, Tesler. Text and JSON output, `--only`, `--ignore`, `--strict`, `--fix`, and `--dry-run` modes. Auto-fixers for Fitts, Aesthetic-Usability, Miller, and Jakob; idempotent by design.
`scripts/_argparse.py`: shared argparse parser factory.
`references/laws-of-ux.md`: sourced restatement of Jon Yablonski's canonical Laws of UX set, in the skill's trigger, action, and Tailwind/HTML hook format.
`sprezzature_ux_laws/__init__.py`: package metadata.
6 tests in `tests/`, all passing. ruff clean.</description><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-figures 1.0.1: 6 new chart types: bell curve (bellcurve), column range (columnrange), funnel…</title><link>https://github.com/warith-harchaoui/sprezzature-figures/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-figures-1.0.1</guid><description>Added
6 new chart types: bell curve (bellcurve), column range (columnrange), funnel, sunburst, treemap, waterfall.
FIGURES.md catalogue expanded with when-to-use guidance for new entries.
---</description><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-figures 1.0.0: Initial public release.</title><link>https://github.com/warith-harchaoui/sprezzature-figures/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-figures-1.0.0</guid><description>Initial public release.
84 chart types across Vega-Lite, full Vega, matplotlib, and SVG renderers.
`make_figure(kind, data, **kwargs)` unified dispatcher.
`list_kinds()` returns all available chart types.
`make-figure` CLI (argparse) always installed; Click CLI via `[cli]` extra.
Ralph Eyeball Loop integration for autonomous visual QA (`audit_figure.py`).
Full type annotations, ruff-clean, pytest test suite.</description><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-cli-gui 1.0.0: Initial standalone release, extracted from the `sprezzature` monorepo.</title><link>https://github.com/warith-harchaoui/sprezzature-cli-gui/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-cli-gui-1.0.0</guid><description>Initial standalone release, extracted from the `sprezzature` monorepo.
Package
`sprezzature_cli_gui/loader.py`: resolves a `module:factory` or `path.py:factory` spec down to a parser object.
`sprezzature_cli_gui/schema.py`: the shared parser-tree shape and the `walk()` dispatcher.
`sprezzature_cli_gui/adapters/`: one adapter per supported framework (argparse, Click and, through Click, Typer) plus the `--from-help` fallback that works on any CLI, Python or not.
`sprezzature_cli_gui/renderer.py`: turns the parser tree into a single self-contained HTML page.
`sprezzature_cli_gui/cli.py`: the `sprezzature-cli-gui` command-line entry point.
`scripts/cli_to_gui.py`: a thin facade re-exporting the package's public API, kept for anyone already scripting against the pre-split single-file layout.</description><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-audio 1.0.0: Initial standalone release, extracted from the `sprezzature` monorepo.</title><link>https://github.com/warith-harchaoui/sprezzature-audio/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-audio-1.0.0</guid><description>Initial standalone release, extracted from the `sprezzature` monorepo.
Scripts included
`captions_from_whisper.py`: WebVTT / SRT / plain transcript via local Whisper (vocal-helper backend).
`diarize_from_nemo.py`: RTTM + JSON turns via NeMo Sortformer.
`identify_from_titanet.py`: Speaker identity verification via NeMo TitaNet.
`caption_diarize.py`: Combined captioning + diarization pipeline.
`name_from_transcript.py`: Speaker name inference (regex pass + optional LLM pass).
`translate_captions.py`: VTT/SRT translation via a local LLM.
`install_captions.py`: Pre-download Whisper GGML weights.
`install_diarize.py`: Pre-download NeMo Sortformer and TitaNet checkpoints.
`_argparse.py`, `_click.py`, `_lang.py`, `_vocab.py`: Shared helpers.</description><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-accessibility 1.0.0: Initial release extracted from the sprezzature monorepo.</title><link>https://github.com/warith-harchaoui/sprezzature-accessibility/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-accessibility-1.0.0</guid><description>Added
Initial release extracted from the sprezzature monorepo.
`scripts/lint_a11y.py`: 14-rule static HTML accessibility linter with text and JSON output, `--ignore`, `--fix`, and `--dry-run` modes.
`scripts/_lang.py`: shared language detection helper (stdlib + optional langdetect) used by the html-missing-lang auto-fixer.
`scripts/_argparse.py`: shared argparse factory used across all scripts.
Rules: img-missing-alt, img-redundant-aria, a-missing-href, a-empty, button-empty, div-onclick, input-missing-label, dialog-missing-close, html-missing-lang, tabindex-positive, aria-hidden-interactive, heading-skip, color-only-state, motion-no-reduce-guard.
Auto-fixers for: html-missing-lang, img-redundant-aria, tabindex-positive, aria-hidden-interactive, motion-no-reduce-guard.</description><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 1.0.1: Three-layer architecture, standalone repos, writing charters</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-1.0.1</guid><description>Added
**Three-layer architecture.** The monorepo now splits into three explicit layers: (1) pip-installable tool packages (`sprezzature-*`), (2) the agentic layer (this repo: `SKILL.md` + `references/` + `web/`), and (3) the local runtime (`sprezzature-local`, separate repo). Each layer has its own release cycle.
**Standalone tool repos on GitHub** under `warith-harchaoui/`:
`sprezzature-figures` (84 chart types, SHAP, DoWhy, Ralph Eyeball Loop)
`sprezzature-local` (pluggable LLM backend: Ollama / OpenAI-compatible / LangChain)
`best-engine-ai-helper` (hardware detection, model selection, VLM/LLM gates)
`sprezzature-colors` (WCAG contrast auditing, CVD simulation, Tailwind palette export)
`sprezzature-accessibility` (14-rule static a11y lint, stdlib only)
`sprezzature-cli-gui` (CLI to single-page GUI emitter)
`sprezzature-ux-laws` (Laws-of-UX audit)
…</description><pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature-colors 1.0.0: Initial release extracted from the sprezzature monorepo.</title><link>https://github.com/warith-harchaoui/sprezzature-colors/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-colors-1.0.0</guid><description>Added
Initial release extracted from the sprezzature monorepo.
`scripts/_colors.py`: shared color primitives — sRGB transfer, hex parsing, WCAG luminance and contrast (including alpha-aware compositing), OKLab/OKLCH conversion, perceptual `lighten`/`darken`, the Machado et al. (2009) CVD matrices, and the curated palette accessors (Apple base, emotion, concept, and psychology projections).
`scripts/audit_contrast.py`: WCAG contrast audit over a JSON palette, with an OKLCH-neighbour fix suggester for failing pairs.
`scripts/simulate_cvd.py`: protanopia/deuteranopia/tritanopia image simulation via Pillow, with a side-by-side mosaic mode and an optional grayscale panel.
`scripts/palette_to_tailwind.py`: renders `references/palette.csv` as a Tailwind `theme.extend.colors` block or a full `tailwind.config.js`.
…</description><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 1.0.0: Renamed `front` → `sprezzature`</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-1.0.0</guid><description>The `front` project is frozen; `sprezzature` is its canonical successor. This is a major bump because the on-disk skill folders change name (`front-*` → `sprezzature-*`), so users re-copy them into `~/.claude/skills/` (or `~/.opencode/skills/`).
Changed
**Renamed the whole suite `front-*` → `sprezzature-*`**, the Python package `front_cli` → `sprezzature_cli`, and the cli-gui package `front_cli_gui` → `sprezzature_cli_gui`. Brand tokens, identifiers, URLs (`warith-harchaoui/sprezzature`, `harchaoui.org/warith/sprezzature`), CLI program names, the shared JavaScript fullscreen event (`sprezzature:fullscreenchange`), and the Markdown-viewer `localStorage` key are all on the new name.
**CLI entry point** is now `sprezzature`. The old `front` command stays as a deprecated alias (to be removed in a later major).
…</description><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.33.0: OS-adaptive, everywhere</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.33.0</guid><description>Added
**Dark mode across the whole figure catalogue.** Every hand-authored figure gains an additive `prefers-color-scheme: dark` block: the shared house inks invert (paper to near-black, ink to off-white) via attribute selectors, `mix-blend-mode: multiply` flips to `screen` so overlaps lighten on dark, and per-figure extras darken light panels, gridlines and white pills. Data hues and perceptual ramps are left alone; white keylines stay. A new `_style.os_dark_style` helper emits the block.
…</description><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.32.0: OS-adaptive figures</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.32.0</guid><description>Added
…</description><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.31.0: accessibility levels, colour-vision viewer, unified fullscreen</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.31.0</guid><description>Added
**Accessibility palette levels.** `sprezzature-colors/scripts/accessibility_levels.py` maps the canonical palette to `universal` (default), `high-contrast`, `monochrome`, or a `deuteranopia` / `protanopia` / `tritanopia` variant. `sprezzature-figures` generators take an `accessibility` argument (and `--accessibility`) that flows through `_style.load_palette` / `_style.leveled_colors`; `universal` is the identity, so default figures are byte-for-byte unchanged. Perceptual colour maps (viridis, single-hue ramps) keep their colours as a documented no-op.
…</description><pubDate>Sun, 26 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.30.1: idiomatic French pass</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.30.1</guid><description>Repo-wide French copy pass on `LISEZMOI.md`, `PAYSAGE.md` and the `web/fr/` pages: fixed mistranslations (*defaults* rendered as « défauts » → « choix par défaut », *vendored* → « embarqué », the non-word « réécrivain » → « réécriture ») and de-calqued anglicisms, without touching any link, URL, code span or version.</description><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.30.0: bilingual site, competitive positioning, real-data maps</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.30.0</guid><description>**Website is now multi-page.** `web/` gains an on-site detail page per skill (make / audit / triggers / reference library) so the home cards link on-site instead of to thin GitHub docs, plus a dedicated `figures.html` gallery that renders the whole `sprezzature-figures` catalog (charts, statistical plots, SVG escape hatch, thematic maps). One shared shell with a working 🌞/🌛 theme toggle (`web/js/theme.js`); every page passes sprezzature-accessibility.
**Six more everyday charts** in `sprezzature-figures`: box plot, 100% stacked bar, stacked area, donut, annotated heatmap, ECDF, plus **Gaussian-process regression** and **violin** plots, Vega-Lite, house palette, catalogued in `docs/FIGURES.md`.
…</description><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.29.0: human docs, a deployable website, editorial-grade maps</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.29.0</guid><description>Added
**`docs/`, a human-facing guide per skill** (UI, CLI, PUBLISH, ACCESSIBILITY, COLORS, VISION, AUDIO, UX-LAWS + FIGURES). Each is a thin landing page that points to that skill's `SKILL.md`, `references/`, and `EXAMPLES.md` recipe: no duplication. `SKILL.md` stays the agent-facing spec; `docs/` is for humans. `FIGURES.md` moved here from `sprezzature-figures/`.
**`web/`, a deployable static site**, built with the `front-*` skills themselves and publishing to &lt;https://sprezzature.ai/&gt;: sprezzature-ui house style (Tailwind + self-hosted three-Roboto + Apple palette + dark mode), full SEO (canonical, Open Graph, Twitter, Schema.org JSON-LD), GEO (`llms.txt`), favicons / webmanifest + `robots.txt` / `sitemap.xml` / `humans.txt`, and a clean `sprezzature-accessibility` pass. Skill cards link to the docs.
…</description><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.28.0: Ralph Eyeball Loop, Vega-first, SVG engine, publication-grade maps</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.28.0</guid><description>Added, sprezzature-figures: Vega replaces the plotting toolboxes
**`references/vega-gallery.md` now maps the base API of matplotlib, seaborn, and pyplot to Vega**, with an honest three-column coverage matrix (pyplot | seaborn | Vega verdict). The plots people assume need matplotlib are worked out and rendered through the Ralph Eyeball Loop: `regplot` CI band, `hexbin`, 2D-KDE `contourf` (full-Vega `kde2d`+`isocontour`), `swarmplot` (`force`+`collide`), `clustermap` (scipy linkage + reordered heatmap), `quiver`, and a **static 3D `plot_surface`** (offline isometric projection + shaded full-Vega polygons). Runnable specs in `assets/vega-examples/`.
…</description><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.27.0: the Ralph Eyeball Loop + Vega-first (sprezzature-figures)</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.27.0</guid><description>Added: the Ralph Eyeball Loop + Vega-first (sprezzature-figures)
**`sprezzature-figures/scripts/render_diagram.py`**: render a declarative graphical *source* to an image for the **Ralph Eyeball Loop** (render → look → refine the source). Three kinds, auto-detected: **Vega-Lite/Vega** (rasterised with `vl-convert`, the real spec that ships, not a matplotlib re-draw), **TikZ** (tectonic/pdflatex + pdftoppm/magick), and **Mermaid** (mmdc). Palette-themed from `sprezzature-colors/references/palette.csv` (`\definecolor` for TikZ, injected `%%{init}%%` theme for Mermaid); `--background white|transparent|dark|auto|#hex`; `--format png|svg|pdf` for vector print. Fails loud with install hints; no GUI, no MCP, no model.
…</description><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.26.1: any-language alt-text + captions (best-of-both with md2star)</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.26.1</guid><description>**Alt-text + captions now handle any detected language (best-of-both with md2star).** Added a shared `language_name()` + `LANGUAGE_NAMES` (28 languages) to `_lang.py` (byte-identical across all 5 copies). sprezzature-vision previously produced **English** alt text for any language outside its 10 curated native-language instructions (e.g. Korean, Polish, Hindi); it now keeps the native-language phrasing for those 10 and names the language to the model for the rest, so a document in any common language gets alt text in that language. sprezzature-audio's `translate_captions.py` reuses the same helper for its prompt + track labels (28 language names instead of 11 + raw codes). sprezzature-vision keeps its edge over md2star's version: all-references + Markdown/HTML surrounding context with heading prefix, and the full per-purpose W3C decision tree. sprezzature-vision description/body updated
…</description><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.26.0: two-track captions + helper packages on PyPI</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.26.0</guid><description>**sprezzature-audio: two-track captions (native + translation).** New `scripts/translate_captions.py` turns one caption file into two `&lt;track&gt;`s: the native-language `captions` plus a translated `subtitles` track in the **surrounding-text language** (the same signal `sprezzature-vision` uses for alt-text language), translated by the one authorized LLM (`gemma3:4b` via Ollama). Cues are translated in batched windows for cross-cue context and re-attached to their original timestamps 1:1 (per-cue fallback on a count mismatch; aborts loudly rather than misalign). Runs on the produced `.vtt`/`.srt` only (no audio, decoupled from the caption backend) and prints the ready-to-paste two-track snippet. Skips when the surrounding language already equals the audio language. New trigger phrases: "translate captions", "translated subtitles". Covered by `tests/test_translate_captions.py` and wired into
…</description><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.25.0: one-LLM lock, 100% docstrings, progressive disclosure</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.25.0</guid><description>Second ralph-loop conformance round (fresh from-scratch `.private/ASSESSMENT.md`). Closes the last real inconsistency the prior round flagged, takes docstrings to 100%, and pays down the progressive-disclosure debt on the two longest skills.
…</description><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.24.0: dual-runtime + coding-standard conformance pass</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.24.0</guid><description>A ralph-loop conformance round driven by a from-scratch `.private/ASSESSMENT.md` rewrite (two fresh sub-audits: the coding-standards gist, and dual-runtime / skill-standard / trigger conformance). Applies the cheap, high-value fixes the audit surfaced; the structural debt (SKILL.md body → `references/` progressive disclosure) is logged for its own round.
**Dual-runtime fix (Claude Code *and* OpenCode).** `sprezzature-cli-gui/SKILL.md` hardcoded `~/.claude/skills/sprezzature-ux-laws/scripts/...`, which fails under OpenCode (`~/.opencode/skills/`). Rewritten to the relative `sprezzature-ux-laws/scripts/...` form. Zero absolute skill paths remain in any SKILL.md: both runtimes now run every documented command verbatim.
…</description><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.23.0: one shared body-text extractor across skills</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.23.0</guid><description>Consolidates the duplicated HTML/Markdown text-extraction into a single, tested helper: the foundation for content-based language detection.
**`_lang.extract_body_text(content, fmt)`**: one canonical, stdlib-only extractor: HTML (`html.parser`, skips `&lt;script&gt;`/`&lt;style&gt;`/`&lt;svg&gt;`/ `&lt;noscript&gt;`), Markdown (drops syntax, keeps prose + link/list labels), or plain; `fmt="auto"` sniffs. Plus `detect_language(content, fmt)` = extract + `detect_text_language`. Duplicated byte-identical across every skill's `_lang.py` (self-contained), enforced by a **sync-guard test**.
**Consumers rewired** off their private extractors: `lint_a11y`'s `&lt;html lang&gt;` fixer (was a local `_VisibleText`), `meta_from_ollama` (was a local `extract_text`), `make_figure` (was `resolve_lang`; now detects from the chart's title/labels). No configured default language anywhere.
…</description><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.22.0: language is always detected; `lang_pair` removed</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.22.0</guid><description>No configured default language anywhere. The output language is **detected from the content** via `langdetect`, never from a per-project setting.
**Removed `lang_pair` / `FRONT_LANG_PAIR` entirely**: the `metadata.lang_pair` SKILL.md frontmatter token, the "Changing the language pair" sections (all 7 skills), `lang_pair_default()` in every `_lang.py`, and all doc/env references (README, LISEZMOI, references, make_figure). No almost-empty stub functions left behind.
**Always detect from content.** The AI-backed scripts detect the language from the text they process: surrounding/context text (alt), extracted page text (meta), the input itself (plain-language), the transcript/vocabulary (captions), the chart title/labels (figures).
…</description><pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.21.0: one authorized LLM: `gemma3:4b` (no MLX), enforced</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.21.0</guid><description>Fixes the biggest fresh-user onboarding blocker and locks the model policy down.
**`gemma3:4b` is now the single authorized LLM**, served through Ollama, across every Ollama-backed script (alt text, meta tags, plain-language, narration, speaker-naming). It is multimodal (vision + text) and in the public registry, so `ollama pull gemma3:4b` works on any box.
**Removed the `-mlx` auto-suffix**: the previous default appended `-mlx` on Apple silicon, naming a maintainer-local build (`gemma4:e4b-mlx`) that 404'd on a fresh machine. Dropped `OLLAMA_MODEL_BASE` and every alternative-model example (gemma4, gemma3:12b, gemma3n, llava, qwen, …) from sprezzature's own scripts and docs. `OLLAMA_MODEL` remains only as a bare test escape hatch.
…</description><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.20.0: unified i18n make + audit (`locales/i18n.yaml`)</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.20.0</guid><description>New **sprezzature-ui** capability, built to the make/audit paradigm: translatable strings (GUI labels **and** LLM prompts) live in one per-project catalog, `locales/i18n.yaml`, never in JS or inlined in Python.
**make**: `sprezzature-ui/scripts/i18n_make.py` scaffolds `locales/i18n.yaml` (`gui:` + `prompts:` namespaces), compiles it to `locales/i18n.json` (the browser can't read YAML), and emits `locales/i18n.js`, a framework-free loader with `initI18n()` + `t(id)`.
**audit**: `sprezzature-ui/scripts/audit_i18n.py` flags **I18N001** (a translation dict embedded in JS/HTML) and **I18N002** (an LLM prompt inlined in Python), JSON + exit codes, wired as the `sprezzature-ui-i18n-audit` pre-commit hook.
…</description><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.19.0: exhaustive trigger phrases + version sync</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.19.0</guid><description>Improves **skill activation** (Claude Code + OpenCode) and fixes a version drift. No behavioural change to any script.
**Trigger-phrase exhaustiveness.** Every skill's `description` gained user-language trigger phrases covering capabilities that previously had no activation keyword: so a skill is less likely to "go under the rug". E.g. sprezzature-ui (+`dark mode toggle`, `dashboard`, `data table`, `empty state`), sprezzature-accessibility (+`missing alt`, `WCAG compliance`, `fix accessibility`), sprezzature-figures (+`bar / line / scatter chart`, `Vega-Lite`, `visualize data`), sprezzature-cli-gui (+`Typer / clap / cobra to GUI`, `GUI for my Go or Rust CLI`), and similar for colors / ux-laws / publish / vision / audio. All descriptions stay within the repo's 1024-char cap; `TRIGGERS.md` regenerated.
…</description><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.18.0: `ruff` + `mypy` gates, `EXAMPLES.md`, gallery adoption</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.18.0</guid><description>Documentation + tooling. No on-disk skill layout change: the per-skill tarballs are unchanged; this release adds repo-root docs, CI gates, and dev config.
**`EXAMPLES.md`** at the repository root: a runnable cookbook, one recipe per skill (deterministic 🟢 vs local-AI 🤖) anchored on `tests/fixtures/`, each showing expected output. Linked from `README.md` and `LISEZMOI.md`.
**`ruff` lint gate** (CODING_ALL.md rule 3, lint half): a pinned `ruff.toml` plus a blocking `ruff check` CI job (`lint`), following the suite's own make/audit pattern (audit = `ruff check`; make = `ruff check --fix`). Implicit re-exports now use the PEP 484 `name as name` form; ~18 genuinely-unused imports removed; 5 undefined-name (F821) typing defects fixed.
…</description><pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.17.0: `sprezzature-audio` captions on `vocal-helper` + pinned helper releases</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.17.0</guid><description>Minor release. The `sprezzature-audio` captions tier now delegates speech-to-text to the author's `vocal-helper` over-layer instead of driving `pywhispercpp` directly, and the audio / video extraction path is repaired against the helpers' latest tagged releases. No on-disk folder layout change: upgrading is the usual overwrite of `sprezzature-audio/`.
What changed
…</description><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.16.0: `sprezzature-figures` skill + audio diarization tier</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.16.0</guid><description>Minor, additive release. Two new capabilities ship as their own tiers; no existing on-disk folder changes, so upgrading is a copy of the new `sprezzature-figures/` folder plus the usual overwrite of `sprezzature-audio/`.
What changed
**New skill `sprezzature-figures`.** Static data-viz auditor (`audit_figure.py`, stdlib + PyYAML) for Vega-Lite v5 JSON, matplotlib SVG and HTML `&lt;figure&gt;` blocks: flags missing axis titles, dual-y-axis, truncated baselines, pie-3d, rainbow palettes, CVD-unsafe encodings, missing polarity and chartjunk. Ships optional `make_figure.py` (dataviz tier), `causal_estimate.py` (DoWhy + EconML) and `explain_model.py` (SHAP / Shapash / TimeSHAP / LIME) behind their own `requirements-*.txt`. Wired into `.pre-commit-hooks.yaml` (`sprezzature-figures-audit`), `validate_all.py`, the `sprezzature-ui-validate-skill` args and `TRIGGERS.md`.
…</description><pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.15.1: restore `gemma3:4b` default</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.15.1</guid><description>Patch release reverting the model-name swap that briefly landed in v0.15.0. ``gemma3:4b`` (with the ``-mlx`` variant on Apple Silicon) is the maintainer's canonical default and was always available; the v0.15.0 swap to ``gemma3:4b`` was a misread of the tag's availability.
What changed
…</description><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.15.0: TRIGGERS.md + drift hook</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.15.0</guid><description>Two coherent moves since v0.14.0: a generated trigger-phrase index that humans can browse, and an automated drift gate that keeps the index honest.
Note on `gemma3:4b` default
An intermediate commit during v0.15.0 development swapped the ``sprezzature-vision`` default from ``gemma3:4b`` to ``gemma3:4b`` on the (mistaken) assumption the former was a forward-looking tag. The maintainer reverted the swap before the next release: ``gemma3:4b`` (with the ``-mlx`` variant on Apple Silicon) is the canonical default and was always available. The ``install_alt_ai.py`` script no longer auto-falls-back to the non-MLX base on a failed pull; it now exits with an actionable message telling the user to ``ollama pull &lt;tag&gt;`` themselves when the registry doesn't have a fresh tag yet, rather than silently downgrading model quality / perf characteristics.
`TRIGGERS.md`: generated trigger-phrase reference
…</description><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.14.0: cli_to_gui shape protocol + BSD-3-Clause</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.14.0</guid><description>Two coherent moves landed since the v0.13.0 cut.
cli_to_gui: adapter protocol (argparse + Click + --from-help)
The make-side emitter introduced in v0.12.0 was argparse-only. v0.14.0 generalises the introspection to a small shape-adapter protocol: the HTML renderer now consumes a canonical ``ParserTree`` dict (``prog`` / ``description`` / ``actions`` / ``sub_commands``) regardless of the source framework. Three adapters ship today:
**argparse** (stdlib, default; ``walk_parser``).
**Click** (opt-in, imported lazily; ``walk_click``). Typer apps work via their underlying Click group. Bumps the deprecated ``click.BaseCommand`` to ``click.Command`` for Click 9 compatibility. Click 8.2's ``Sentinel.UNSET`` default is treated as "no default" so the HTML emitter does not stamp the sentinel into ``value="…"``.
…</description><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.13.0: make-side completion + user-activation surface</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.13.0</guid><description>Continues the autonomous overnight build-out that v0.12.0 opened. Four more moves: the third `--fix` mode, a real-user activation surface, a safety note for the new local-execution scripts, and the law-keyed snippet catalog that closes the make-side on sprezzature-ui.
`lint_markdown.py --fix` extended for MD009
The existing `--fix` flag was scoped to Mermaid PNG insertions; it now also fixes MD009 (trailing whitespace). Preserves the canonical two-space Markdown `&lt;br&gt;`; idempotent; leaves prose untouched.
This brings the markdown lint into the same audit↔make pattern as `sprezzature-ux-laws --fix` and `sprezzature-accessibility --fix`. New `tests/test_lint_markdown_fix.py` (11 tests) covers every shape the spec cares about plus a CLI integration test that confirms the re-lint shows zero MD009 findings after a single `--fix` pass.
…</description><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.12.0: make-side build-out + repo plumbing</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.12.0</guid><description>Investments executed against `.private/ASSESSMENT.md`'s ranked priorities. Four moves landed in one session.
CI repair
`fix(ci): repoint per-skill requirements glob to post-rename folders`: `.github/workflows/ci.yml` still globbed `sprezzature-a11y/scripts/ requirements-*.txt`, which has not existed since the 0.9.0 rename. Bash without `nullglob` expanded the empty glob to the literal pattern, pip choked, every push since the rename failed. Fix: `shopt -s nullglob` + a glob across the seven skill folders that ship requirements. CI is now green.
`SKILLS.txt`: single source of truth
`refactor(skills): single SKILLS.txt manifest at repo root`: the shipped skill list lived in seven hand-maintained tuples (`release.sh`, `validate_all.py`, `conftest.py`, `test_validate_skill.py`, `test_release_packaging.py`, `test_two_modes_discipline.py`, `test_cli_help.py`). Adding skill
…</description><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.9.0: `sprezzature-audio` split + `sprezzature-a11y` renamed to `sprezzature-accessibility`</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.9.0</guid><description>After the v0.7.0 (`sprezzature-colors`) and v0.8.0 (`sprezzature-vision`) splits, the remaining `sprezzature-a11y` skill was unbalanced: an HTML lint script plus a WIP whisper.cpp captions pipeline that has nothing to do with HTML. This release ships the final split and a long-overdue rename.
New skill: `sprezzature-audio`
`scripts/captions_from_whisper.py`: moved from `sprezzature-a11y/scripts/`. Same CLI, new program name `sprezzature-audio-captions`. WebVTT / SRT / plain-text captions via local whisper.cpp with project-vocab biasing: semantics unchanged.
`scripts/install_captions.py`: moved from `sprezzature-a11y/scripts/`. Same CLI, new program name `sprezzature-audio-install`. Installs `pywhispercpp` and pre-downloads a GGML model.
`scripts/_argparse.py` / `_click.py` / `_lang.py` / `_vocab.py`: copied (per the established per-skill autonomy convention).
…</description><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.8.0: `sprezzature-vision` skill split out of `sprezzature-a11y`</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.8.0</guid><description>The AI alt-text path (Ollama vision model, per-purpose YAML prompts, surrounding-text + vocabulary biasing, on-disk cache) was always a distinct concern from static HTML accessibility linting and audio captions. This release ships the split, alongside a default-model bump.
New skill: `sprezzature-vision`
`scripts/alt_from_ollama.py`: moved from `sprezzature-a11y/scripts/`. Same CLI, new program name `sprezzature-vision-alt`. Per-purpose decision tree (informative / decorative / functional / text / complex / group), surrounding-text + vocabulary biasing, on-disk cache, EN/FR default (configurable via `lang_pair`): all unchanged.
`scripts/install_alt_ai.py`: moved from `sprezzature-a11y/scripts/`. Same CLI, new program name `sprezzature-vision-install`. Installs the Ollama daemon (brew on macOS, official installer on Linux, winget on Windows) and pulls the default vision model.
…</description><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.7.0: `sprezzature-colors` skill split out of `sprezzature-a11y`</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.7.0</guid><description>Color tooling (WCAG contrast audit, OKLCH-neighbour fix suggester, CVD simulation) was always a separate concern from accessibility lint and AI content drafting. This release ships the split, plus the curated palette that previously lived as an external Python library ([`colors-helper`](https://github.com/warith-harchaoui/colors-helper)): now archived in favour of the new skill.
New skill: `sprezzature-colors`
`scripts/audit_contrast.py`: moved from `sprezzature-a11y/scripts/`. Same CLI, new program name `sprezzature-colors-contrast`. The fix suggester (OKLCH L-axis walk) is unchanged.
`scripts/simulate_cvd.py`: moved from `sprezzature-a11y/scripts/`. Same CLI, new program name `sprezzature-colors-cvd`. Machado et al. 2009 matrices unchanged.
…</description><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.11.0: make ↔ audit discipline + palette emitter</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.11.0</guid><description>The front-* repo's design principle (every skill belongs to either the *make* side or the *audit* side of a single loop) is now codified in three places and enforced by tests.
New: repo-level make / audit matrix
`README.md` and `LISEZMOI.md` gain a "Two modes: make and audit" table listing every shipped skill against both axes. Empty cells are marked `_(roadmap)_` rather than omitted so the gaps are honest.
Every shipped `SKILL.md` (eight in total) carries a small "Two modes: make and audit" subsection mapping its scripts / assets / references to the side they live on.
New: `tests/test_two_modes_discipline.py`
Enforces the convention on every commit:
Every shipped `SKILL.md` carries the canonical `## Two modes — make and audit` header.
The subsection names both `Make` and `Audit` (case-insensitive).
`README.md` + `LISEZMOI.md` matrices list every shipped skill exactly once.
…</description><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.10.0: new skill `sprezzature-ux-laws`</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.10.0</guid><description>A new skill that adds the canonical **Laws of UX** (Jon Yablonski, [lawsofux.com](https://lawsofux.com/)) to the front-* ecosystem in both modes the repo already supports: **making** UI and **auditing** the result.
New skill: `sprezzature-ux-laws`
`SKILL.md`: frontmatter validates against the Anthropic skill spec (kebab-case name, description under 1024 chars with explicit What + When, no XML brackets, no reserved name, no `README.md` inside the folder).
…</description><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.6.5: staleness sweep across SKILL descriptions + README status</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.6.5</guid><description>Patch release. Doc and frontmatter hygiene only: no script behaviour changes. Caught while sweeping the repo for decayed claims after the 0.5.x → 0.6.x string.
Changed: `sprezzature-ui/SKILL.md` description
Rewrote the typography sentence to match the 0.6.4 carve-out. Before: *"Three-Roboto typography rule: Roboto (sans), Roboto Serif (serif), Roboto Mono (code/monospace); no other downloaded webfont."*: that last clause is wrong post-0.6.4 (audits respect existing fonts; user-named typefaces are honored). Now: *"Default typography is the three-Roboto rule (Roboto sans + Roboto Serif + Roboto Mono); honors user-specified fonts and respects existing typefaces when auditing existing UI."*
Changed: `sprezzature-publish/SKILL.md` description
The description had drifted behind the skill's actual scope. Now mentions:
…</description><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.6.4: three-Roboto rule carve-out for audits</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.6.4</guid><description>Patch release. Re-scopes the three-Roboto typography rule from "hard constraint" to "default for generation", so audits and user-specified fonts no longer get hijacked.
Changed: hard rule 3 in `sprezzature-ui/SKILL.md`
The three-Roboto rule now applies **only** when generating fresh UI / site output **and the user has not specified a typeface**. It does NOT apply when:
…</description><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.6.3: Anthropic skill-spec compliance audit</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.6.3</guid><description>Patch release. Audited the four skills against *The Complete Guide to Building Skills for Claude* (Anthropic) and brought everything into spec.
Fixed: README.md inside skill folders (spec violation)
The spec is explicit: "Don't include README.md inside your skill folder. All documentation goes in SKILL.md or references/. Note: when distributing via GitHub, you'll still want a repo-level README for human visitors." The repo-level `README.md` and `LISEZMOI.md` are fine and required; the nested ones were not.
…</description><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.6.2: SEO + GEO foundations from Google's official docs</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.6.2</guid><description>Minor release. New canonical reference adapting Google's search-foundations guidance to the artifacts `sprezzature-publish` already emits, plus explicit SEO / GEO routing in the SKILL decision tree.
Added
**`sprezzature-publish/references/seo-essentials.md`**: the canonical adaptation of:
[Google Search Essentials](https://developers.google.com/search/docs/essentials) (technical requirements + spam policies + six key best practices)
[Google AI Optimization Guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) ("Apply foundations" section: same foundations as Search Essentials for AI Overview / generative search; no new meta tag for AI)
[Google "Third-party SEO"](https://developers.google.com/search/docs/fundamentals/third-party-seo) (how to recognize legitimate vs. questionable third-party advice and tools)
…</description><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.6.1: CI + release workflow fixes</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.6.1</guid><description>Patch release. No skill content changes. Repairs the two GitHub Actions workflows that broke during the v0.6.0 publish.
Fixed: `ci` workflow (failing since v0.5.0)
`sprezzature-publish/scripts/requirements-narrate-openvoice.txt` pins `openvoice @ git+https://github.com/myshell-ai/OpenVoice.git@main`, but upstream renamed the package's `pyproject.toml` metadata name from `openvoice` to `myshell-openvoice` between v0.5.0 and v0.6.1. Modern pip rejects the mismatch with `Requested myshell-openvoice from git+… has inconsistent name: expected 'openvoice', but metadata has 'myshell-openvoice'`, which broke the install step on every push to `main` since the audio-narration feature landed.
…</description><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.6.0: typography overhaul</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.6.0</guid><description>**The three-Roboto rule.** Replaced the previous Montserrat-default / Inter-alternate typography stack with a hard-coded three-family rule: **Roboto** (sans / UI / body), **Roboto Serif** (editorial / longform / prose-heavy landings), **Roboto Mono** (`&lt;code&gt;`, `&lt;pre&gt;`, terminal panels, log output). No other downloaded webfont is allowed.
…</description><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.5.0: Minor release. New optional editorial feature in `sprezzature-publish`: **audio…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.5.0</guid><description>Minor release. New optional editorial feature in `sprezzature-publish`: **audio narration of long-form posts** via two MIT-licensed local TTS engines (OpenVoice v2 + ChatterboxTTS: both shipping MIT licences on code AND model weights, no licensing trap). Structural narration hints derived from the Markdown tree; optional enrichment via the same local Ollama daemon already used for alt-text and meta tags; voice cloning from a 6-30 s designer-supplied sample. RSS feed auto-becomes a podcast feed.
**Honest framing**: pre-recorded audio for long-form text is **not a WCAG 2.x requirement** (screen readers already cover that case). The feature targets multitasking audience, podcast positioning, and the "alternative format" direction of WAI-COGA / WCAG 3.0 drafts. The narration scripts live in `sprezzature-publish`, not `sprezzature-a11y`, to keep this distinction visible.
…</description><pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.4.1: Hardening release. Closes a critical correctness gap audit found in the…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.4.1</guid><description>Hardening release. Closes a critical correctness gap audit found in the validation layer, plus a doc lie. **All four `SKILL.md` frontmatters were silently YAML-invalid for every release through 0.4.0**: `yaml.safe_load` rejected them with `mapping values are not allowed here` because of unquoted `:` characters in `description` (`Trigger phrases: "..."`). The regex frontmatter check in `sprezzature-ui/scripts/validate.py` saw the `---...---` delimiters and reported PASS, so CI never noticed. Claude / OpenCode runtimes call a real YAML parser; depending on the client this either reduced the skill to a bare slug or rejected it outright. No behaviour change in any shipped script.
Fixed: SKILL.md YAML frontmatters
…</description><pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.4.0: Minor release. Adds the three-state colour-scheme toggle component (`🌞 Light` /…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.4.0</guid><description>Minor release. Adds the three-state colour-scheme toggle component (`🌞 Light` / `🌚 Dark` / `🌗 Auto`, Auto-by-default) to the sprezzature-ui assets, ships a reusable headless-screenshot helper, and opens `GALLERY.md` with the first real-site entry.
Added: theme toggle component
**`sprezzature-ui/assets/components/theme-toggle.html`**: copy-pasteable HTML+JS, three variants in one file:
**A. Segmented radio control** (3 buttons, emoji + label, `role="radiogroup"` / `role="radio"` / `aria-checked`, arrow-key roving focus). Used on ≥ `sm` screens.
**B. Icon-only cycle button** (`Auto → Light → Dark → Auto`, glyph reflects current mode, next mode announced via `aria-label`). Used on narrow viewports.
…</description><pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.3.2: Cosmetic / hygiene patch release. Closes three of the five roadmap items from…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.3.2</guid><description>Cosmetic / hygiene patch release. Closes three of the five roadmap items from 0.3.1: LISEZMOI parity, `references/` reshape re-assessment, and `sprezzature-cli-gui` production-hardening notes. No behaviour change for any script.
Added: `sprezzature-cli-gui/references/hardening.md`
…</description><pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.3.1: Patch release. Documents the current status of each surface, marks audio…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.3.1</guid><description>Patch release. Documents the current status of each surface, marks audio captions explicitly **WiP** so users don't expect a finished WER gate, and ships one defensive fix for Ollama 0.30 MLX vision quantizations. No behaviour change for the stable scripts.
Added: status and roadmap
**`README.md` → "Status" section** spells out where each of the five surfaces (`sprezzature-ui`, `sprezzature-cli`, `sprezzature-cli-gui`, `sprezzature-publish`, `sprezzature-a11y`) stands today and isolates the one WiP area (captions / audio). Replaces the implicit "everything is stable" reading of the previous README.
**`README.md` → "Inputs → outputs" table** now flags the audio / video row as **WiP** and links back to "Status". Users won't be surprised by the missing per-language WER baselines or the user-supplied `vocab-biasing-clip.wav`.
…</description><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.3.0: **`sprezzature-cli/` package** ships a Click-based top-level driver. A single…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.3.0</guid><description>Added: unified driver and ergonomics
**`sprezzature-cli/` package** ships a Click-based top-level driver. A single `sprezzature` executable maps `sprezzature &lt;skill&gt; &lt;action&gt; [...]` onto each per-skill script via `subprocess`. Shell completion is documented for bash/zsh/fish in `sprezzature-cli/README.md`. Stdlib-only validators stay zero-dep when invoked directly; the driver is additive.
**Four Ollama-backed scripts migrated from argparse to Click**: `alt_from_ollama.py`, `captions_from_whisper.py`, `meta_from_ollama.py`, `plain_language.py`. Behaviour preserved (all 323 deterministic tests unchanged); `--help` now formatted by Click. `install_alt_ai.py` gained `-h/--help` and `--model` flags.
…</description><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate></item><item><title>sprezzature 0.2.0: **Split the single `sprezzature/` skill into four focused skills.** The…</title><link>https://github.com/warith-harchaoui/sprezzature/blob/main/CHANGELOG.md</link><guid>tag:sprezzature.ai,2026:sprezzature-0.2.0</guid><description>Changed: the big restructure
**Split the single `sprezzature/` skill into four focused skills.** The previous `sprezzature/SKILL.md` had a description listing twelve trigger phrases (build a UI, wrap this CLI, turn markdown into a site, audit, alt text, captions, favicons, meta, site indexes, plain language, contrast, CVD). Activation was sloppy and maintenance compounded. The new layout:
`sprezzature-ui/`: UI generation core (stack rules, components, design system, checklist, dataviz). Always install.
`sprezzature-cli-gui/`: CLI → GUI flagship.
`sprezzature-publish/`: Markdown → website + meta + favicons + site indexes + plain language.
`sprezzature-a11y/`: a11y lint + contrast audit + CVD sim + alt text + captions.
…</description><pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate></item></channel></rss>
