llms-full.txt@web · git:20261014.d8fb516 · 2026-10-14 · sha256 9dd7b07696dd17f0

llms-full.txt@web git:20261014.d8fb516A

Immutable. This exact content never changes and is served at /api/v1/blob/9dd7b07696dd17f0.

# Sprezzature — full-text corpus

> Concatenated plain text of every English page, for single-request ingestion by an LLM/agent. French pages are translations of the same content (see llms.txt) and are not duplicated here.

---

# Accessibility — Sprezzature

Source: https://sprezzature.ai/accessibility.html

sprezzature-accessibility

# Accessibility

Pre-commit static HyperText Markup Language (HTML) accessibility lint for vanilla-JavaScript (JS) + Tailwind output: fifteen rules decidable from source, no browser, no runtime Document Object Model (DOM).

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

JavaScript Object Notation (JSON) / stdout / exit codes for pre-commit and continuous integration (CI)

An opt-in "comfortable reading" CSS toggle at the WCAG 1.4.12 Text Spacing minimums, for pages that ship it as a reader-facing setting

## Audits

Missing alt, unlabelled inputs, button-without-text, clickable div

Missing dialog close, lang attribute, heading order

Color-only state, motion-reduce guards, tight letter-spacing on running text

A fast, deterministic gate (fifteen rules total), not a replacement for axe-core / Pa11y / Lighthouse

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

a11y lint
check this HTML for accessibility
static a11y check
WCAG-friendly lint
missing alt
unlabelled input
ARIA / keyboard check
fix accessibility

## Reference library

The knowledge the skill draws on: read them straight from the repo.

The fifteen rules

---

# Audio — captions — Sprezzature

Source: https://sprezzature.ai/audio.html

sprezzature-audio

# Audio: captions

Local artificial intelligence (AI) captions, speaker diarization and speaker identification for video / audio. WebVTT / SubRip subtitle format (SRT) from a local whisper.cpp, who-spoke-when via NeMo, who-is-who via embeddings or a transcript pass. The audio never leaves the machine.

Work in progress: the caption backend is still settling and accuracy baselines are being collected, so captions are drafts to review.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

World Wide Web Consortium (W3C) WebVTT / SRT / plain-text captions from a local whisper.cpp build

"Who spoke when" via NVIDIA NeMo Sortformer diarization

"Who is who" via TitaNet embeddings or a transcript-mined pass

Speaker-labelled WebVTT caption format (VTT) with named voice cues; bilingual EN/FR default

## Audits

Project-vocab biasing on the caption path

Translated subtitles

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

captions
transcribe video / audio
WebVTT
SRT
diarization
who spoke when
identify speakers
translate captions

## Reference library

The knowledge the skill draws on: read them straight from the repo.

Captions with AI
Diarization

---

# Case studies — Sprezzature

Source: https://sprezzature.ai/case-studies.html

sprezzature · case studies

# Case studies

Three advanced examples, empowered by our Ralph Eyeball Loop .

Animation

## Tribute to Hans ROSLING

The famous income-versus-lifespan bubble
chart, animated across the decades, with a play button and hover, the way he showed the world getting
better.

Open the tribute →

Cartography

## Situation & thematic maps

Publication-grade Equal-Earth maps: layered
situation maps with borders, named rivers and labels, and choropleths on a curated, colour-blind-safe
palette. Work in progress: illustrations of the method, not operational assessments.

See the maps →

Dashboard

## Financial markets

A systematic portfolio that resizes itself,
told in ten interactive SVG panels. Hover for a trader's figures, colour-blind-safe throughout, with a
favourable and an adverse draw.

Open the dashboard →

---

# CLI → GUI — Sprezzature

Source: https://sprezzature.ai/cli.html

sprezzature-cli-gui

# command-line interface (CLI) → graphical user interface (GUI)

Wrap an existing command-line tool in a single-page vanilla-JavaScript (JS) + Tailwind GUI: read the arg parser, emit forms, file inputs and a streaming log panel.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

One index.html + app.js + Tailwind config wrapping your CLI

Sub-commands and flags mapped to forms, segmented controls, file inputs

A streaming log panel for long-running runs

Reads argparse, click/Typer, clap, commander, cobra

## Audits

Follows the sprezzature-ui stack rules: install sprezzature-ui alongside for the full design tokens

Hardening guidance for shipping the wrapper safely

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

wrap this CLI in a GUI
argparse to GUI
click to web UI
GUI for my Python script
Typer / clap / cobra to GUI
frontend for a CLI
streaming log panel

## Reference library

The knowledge the skill draws on: read them straight from the repo.

Hardening

---

# Colors — Sprezzature

Source: https://sprezzature.ai/colors.html

sprezzature-colors

# Colors

Color tooling, make and audit: Web Content Accessibility Guidelines (WCAG) contrast with fixes in the perceptual OKLCH color space (Lightness, Chroma, Hue of the OKLab model), colour-vision-deficiency simulation, a curated palette, and a Tailwind config emitter. Deterministic: no model, no network.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

A curated palette comma-separated values (CSV) file with semantic projections

A Tailwind theme.extend.colors config from the canonical palette

Perceptual lighten / darken on the OKLCH L axis

## Audits

WCAG contrast audit with OKLCH-neighbour fix suggestions

Protanopia / deuteranopia / tritanopia simulation on screenshots

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

contrast audit
is my palette accessible
colorblind preview
deuteranope / CVD
lighten this color
OKLCH
brand colors
palette to tailwind
color-blind safe

## Reference library

The knowledge the skill draws on: read them straight from the repo.

Contrast audit
CVD simulation
The palette CSV

---

# Figures — Sprezzature

Source: https://sprezzature.ai/figures.html

sprezzature-figures

# Figures

## How to get a figure

Ask our tool:

"make a figure"

"chart this"

"treemap"

"candlestick"

"heatmap"

"sankey"

"SHAP plot"

"render this diagram"

Every figure below carries a kit: a zip with the data as a CSV, the generator that reads it, and the interactive SVG it writes. Two Python files, no build step, and for most of them nothing to install at all. The two animated Gapminder generators complete the 127-generator catalogue on the Hans ROSLING tribute .

FIGURES.md catalog
Give a ⭐️ on GitHub

See it for

normal vision
a reader with deuteranopia
a reader with protanopia
a reader with tritanopia
no colour (grayscale)

Simulates the default figure through a reader's eyes (normal vision for zoom).

Search figures

## Comparison & ranking

Rank and contrast categories: bars, lollipops, dumbbells and their kin.

Dual axis : Two units, one frame, the caveat printed.
↓ Python + CSV + SVG kit (55 KB)

Bar chart : Ranked categories, one house color each.
↓ Python + CSV + SVG kit (52 KB)

Grouped bar : Categories split by a second variable.
↓ Python + CSV + SVG kit (54 KB)

Lollipop : A lighter bar chart for ranked values.
↓ Python + CSV + SVG kit (52 KB)

Dumbbell chart : Two points per row joined by a segment showing change.
↓ Python + CSV + SVG kit (58 KB)

Slope chart : Before and after, two points.
↓ Python + CSV + SVG kit (51 KB)

Bullet graph : Measure bar, target tick and qualitative bands.
↓ Python + CSV + SVG kit (57 KB)

Pareto chart : Sorted bars, a cumulative line and an 80% mark for the vital few.
↓ Python + CSV + SVG kit (60 KB)

Radar / spider : Many criteria on radial axes.
↓ Python + CSV + SVG kit (59 KB)

Variable-width columns : Height, width and area each carry a variable.
↓ Python + CSV + SVG kit (58 KB)

Column range : High-low intervals per category; temperature ranges, confidence intervals.
↓ Python + CSV + SVG kit (55 KB)

Population pyramid : Age and sex, back to back.
↓ Python + CSV + SVG kit (52 KB)

Parliament hemicycle : One dot per seat, coloured by party, with a majority line.
↓ Python + CSV + SVG kit (80 KB)

Waterfall : A running total, step by step.
↓ Python + CSV + SVG kit (54 KB)

## Time series & trends

How a value moves over an ordered axis: lines, areas and event timelines.

Sparklines : Twenty metrics, one screen.
↓ Python + CSV + SVG kit (59 KB)

Small multiples : One panel each, one scale for all.
↓ Python + CSV + SVG kit (60 KB)

Line chart : A value over an ordered axis, one line per series.
↓ Python + CSV + SVG kit (56 KB)

Multi-line : Two series over time with points.
↓ Python + CSV + SVG kit (56 KB)

Area chart : How a whole made of categories evolves over time.
↓ Python + CSV + SVG kit (54 KB)

Stacked area : Composition of series over time.
↓ Python + CSV + SVG kit (52 KB)

Step / stairs : A value that changes at discrete points.
↓ Python + CSV + SVG kit (51 KB)

Horizon chart : Banded, folded area for dense time series.
↓ Python + CSV + SVG kit (65 KB)

Streamgraph : Stacked areas on a wiggle baseline over time.
↓ Python + CSV + SVG kit (67 KB)

Candlestick (open-high-low-close) : Open-high-low-close price bars.
↓ Python + CSV + SVG kit (55 KB)

Bollinger bands : A price series with a 20-day average and ±2σ bands, a squeeze then a breakout.
↓ Python + CSV + SVG kit (84 KB)

Connected scatter : A trajectory through points ordered by time, with year labels and end markers.
↓ Python + CSV + SVG kit (61 KB)

Calendar heatmap : A value per day across weeks.
↓ Python + CSV + SVG kit (59 KB)

Timeline : Dated milestones on a spine with alternating callouts.
↓ Python + CSV + SVG kit (63 KB)

Gantt : A schedule, start to end.
↓ Python + CSV + SVG kit (52 KB)

Spectrogram : Time x frequency x power heatmap of a clip.
↓ Python + CSV + SVG kit (119 KB)

Difference chart : Two series with the gap shaded bicolour.
↓ Python + CSV + SVG kit (77 KB)

ACF correlogram : How far back a series remembers, and how much of that is direct.
↓ Python + CSV + SVG kit (64 KB)

Seasonal decomposition : The climb, the year's shape, and the month that is neither.
↓ Python + CSV + SVG kit (76 KB)

Forecast fan : A forecast drawn with the width of its own uncertainty.
↓ Python + CSV + SVG kit (61 KB)

Control chart : A process behaving, until it stops.
↓ Python + CSV + SVG kit (63 KB)

Missing-data matrix : Where the holes are, and whether they fall together.
↓ Python + CSV + SVG kit (112 KB)

Cohort retention : Who stays, by when they arrived.
↓ Python + CSV + SVG kit (63 KB)

Permutation importance : What the model loses when a column is shuffled.
↓ Python + CSV + SVG kit (57 KB)

SHAP waterfall : One prediction, taken apart.
↓ Python + CSV + SVG kit (57 KB)

SHAP beeswarm : Every row's explanation, and when the colour lies.
↓ Python + CSV + SVG kit (90 KB)

Partial dependence and ICE : The average effect, and the rows that disagree with it.
↓ Python + CSV + SVG kit (78 KB)

Causal DAG : The graph, and what it says to adjust for.
↓ Python + CSV + SVG kit (59 KB)

OHLC bars : The session as a bar, and what the axis closes up.
↓ Python + CSV + SVG kit (66 KB)

Bump chart : Rank over time, and what rank throws away.
↓ Python + CSV + SVG kit (61 KB)

Stem plot : A discrete signal, and where its floor is.
↓ Python + CSV + SVG kit (61 KB)

Event raster : One tick per event, and which rows burst after the moment.
↓ Python + CSV + SVG kit (64 KB)

3-D path : A trajectory, with depth you can read.
↓ Python + CSV + SVG kit (116 KB)

3-D vector field : Where length alone cannot be trusted.
↓ Python + CSV + SVG kit (66 KB)

## Distributions

The shape, spread and skew of one variable: histograms, boxes, densities.

Point plot : The estimate, its interval, and its n.
↓ Python + CSV + SVG kit (58 KB)

2-D histogram : Count the points, do not draw them.
↓ Python + CSV + SVG kit (82 KB)

Histogram : A single distribution, binned.
↓ Python + CSV + SVG kit (55 KB)

Box plot : Spread, quartiles and outliers per group.
↓ Python + CSV + SVG kit (54 KB)

Violin plot : KDE density per group, mirrored.
↓ Python + CSV + SVG kit (56 KB)

Density (KDE) : A smoothed distribution curve.
↓ Python + CSV + SVG kit (52 KB)

Rug + density : Raw values as ticks beneath a density curve.
↓ Python + CSV + SVG kit (58 KB)

Ridgeline / joyplot : Stacked, overlapping densities, one per group.
↓ Python + CSV + SVG kit (69 KB)

Strip plot : Every point, jittered by group.
↓ Python + CSV + SVG kit (58 KB)

Wilkinson dot plot : One dot per observation, binned and stacked.
↓ Python + CSV + SVG kit (56 KB)

Letter-value (boxen) : Nested quantile boxes for large samples.
↓ Python + CSV + SVG kit (59 KB)

ECDF : empirical cumulative distribution function (ECDF), stepped.
↓ Python + CSV + SVG kit (54 KB)

Error bars : A mean with its uncertainty interval.
↓ Python + CSV + SVG kit (51 KB)

Bell curve : Normal distribution with configurable mean and standard deviation.
↓ Python + CSV + SVG kit (53 KB)

Q-Q plot : Is this sample normal?
↓ Python + CSV + SVG kit (56 KB)

P-P plot : Empirical vs theoretical CDF probabilities.
↓ Python + CSV + SVG kit (66 KB)

Beeswarm : One dot per observation, nudged apart so width reads as density.
↓ Python + CSV + SVG kit (56 KB)

## Correlation & multivariate

Relationships between two or more measures: scatters, pair matrices, projections.

Scatter : Two variables, colored by group.
↓ Python + CSV + SVG kit (57 KB)

Bubble : Four variables at once.
↓ Python + CSV + SVG kit (58 KB)

Hexbin density : Many points binned into hexagons.
↓ Python + CSV + SVG kit (103 KB)

Joint plot : Scatter with marginal histograms.
↓ Python + CSV + SVG kit (67 KB)

Pair plot / SPLOM : A scatterplot matrix of several variables.
↓ Python + CSV + SVG kit (81 KB)

Parallel coordinates : Many variables on shared axes.
↓ Python + CSV + SVG kit (53 KB)

Andrews curves : Each row a Fourier-series curve, coloured by class.
↓ Python + CSV + SVG kit (142 KB)

RadViz : Points spring-embedded inside a ring of features.
↓ Python + CSV + SVG kit (77 KB)

Regression + confidence-interval (CI) band : A fitted line with a 95% confidence band.
↓ Python + CSV + SVG kit (60 KB)

Residual plot : Residuals vs fitted, with a zero rule.
↓ Python + CSV + SVG kit (70 KB)

Gaussian process : Posterior mean, 95% band and sampled functions.
↓ Python + CSV + SVG kit (55 KB)

Convex hull : A grouped scatter with a hull around each cluster.
↓ Python + CSV + SVG kit (68 KB)

Ternary plot : Three parts summing to 100% on a triangle.
↓ Python + CSV + SVG kit (58 KB)

2-D density contours : Isocontour rings over a raw bivariate scatter.
↓ Python + CSV + SVG kit (87 KB)

## Matrices & heatmaps

Values on a grid, colour-encoded: heatmaps, clustermaps, confusion and correlation.

Contour : A field, with its altitudes written on.
↓ Python + CSV + SVG kit (111 KB)

Annotated heatmap : A value matrix with per-cell labels.
↓ Python + CSV + SVG kit (64 KB)

Clustermap : Heatmap reordered by hierarchical clustering.
↓ Python + CSV + SVG kit (56 KB)

Interpolated heatmap : A smoothly interpolated value field (imshow).
↓ Python + CSV + SVG kit (108 KB)

Correlation matrix : Which variables move together.
↓ Python + CSV + SVG kit (53 KB)

Confusion matrix : Where a classifier is right and wrong.
↓ Python + CSV + SVG kit (53 KB)

Interruption matrix : Who cuts whom, at a glance (hover the crosshair).
↓ Python + CSV + SVG kit (57 KB)

## Part-to-whole & composition

Slices and nested parts of a whole: donuts, treemaps, waffles, flows into stages.

Donut : A compact part-to-whole.
↓ Python + CSV + SVG kit (51 KB)

Pie : A whole, read at a glance.
↓ Python + CSV + SVG kit (56 KB)

100% stacked bar : Parts of a whole across quarters.
↓ Python + CSV + SVG kit (52 KB)

Waffle chart : A proportion as a grid of squares.
↓ Python + CSV + SVG kit (56 KB)

Pictorial unit chart : An ISOTYPE icon array where one icon encodes a fixed count.
↓ Python + CSV + SVG kit (61 KB)

Mosaic / marimekko : Column width and segment height each encode a share.
↓ Python + CSV + SVG kit (56 KB)

Treemap : Hierarchical parts, area by size.
↓ Python + CSV + SVG kit (56 KB)

Sunburst : Hierarchy as nested rings.
↓ Python + CSV + SVG kit (55 KB)

Icicle : Rectangular partition of a hierarchy.
↓ Python + CSV + SVG kit (59 KB)

Circle packing : Nested circles for a sized hierarchy.
↓ Python + CSV + SVG kit (69 KB)

Nightingale rose : Polar-area wedges, radius by value.
↓ Python + CSV + SVG kit (62 KB)

Cycle wheel : Directed ring of proportional arcs for a recurring process.
↓ Python + CSV + SVG kit (60 KB)

Funnel : Stage-to-stage drop-off.
↓ Python + CSV + SVG kit (52 KB)

## Hierarchies, networks & flows

Nodes, edges and movement: trees, graphs, chords, Sankeys.

Node-link network : Force-directed graph, hover to highlight.
↓ Python + CSV + SVG kit (64 KB)

Arc diagram : Nodes on a line, links as arcs above.
↓ Python + CSV + SVG kit (58 KB)

Dendrogram : Hierarchical clustering with a merge-height axis.
↓ Python + CSV + SVG kit (60 KB)

Tree diagram : A tidy node-link hierarchy.
↓ Python + CSV + SVG kit (62 KB)

Org chart : Top-down boxes for role and headcount, coloured by division.
↓ Python + CSV + SVG kit (61 KB)

Radial tree : A hierarchy laid out on concentric rings.
↓ Python + CSV + SVG kit (61 KB)

Force-directed graph : A 318-author co-authorship network in six communities.
↓ Python + CSV + SVG kit (86 KB)

Edge bundling : Relations bundled along a radial hierarchy.
↓ Python + CSV + SVG kit (65 KB)

Elbow detection : Kneedle finds the elbow of a diminishing-returns curve (choosing k).
↓ Python + CSV + SVG kit (59 KB)

Chord diagram : Ribbons between categories; arc size is the total.
↓ Python + CSV + SVG kit (60 KB)

Dependency wheel : Directed circular flows, arcs sized by throughput, ribbons by origin.
↓ Python + CSV + SVG kit (64 KB)

Sankey diagram : Flows between stages, width proportional to volume.
↓ Python + CSV + SVG kit (58 KB)

Alluvial / parallel sets : Category membership flowing across axes.
↓ Python + CSV + SVG kit (61 KB)

Parallel sets : Categorical ribbons across class, sex, age and survival, width by count.
↓ Python + CSV + SVG kit (63 KB)

Packed bubbles : Circles sized by value, packed and coloured by group.
↓ Python + CSV + SVG kit (60 KB)

## Maps & spatial

Values in geographic or directional space: thematic maps, spike maps, wind and vector fields.

Binned grid map : Values counted into square grid cells over a place.
↓ Python + CSV + SVG kit (71 KB)

Hexbin tile map : Values binned into a hex tessellation of a place.
↓ Python + CSV + SVG kit (101 KB)

Geographic hexbin : Point events binned into hexagons on a world map.
↓ Python + CSV + SVG kit (275 KB)

Spike map : Vertical spikes sized by value at map points.
↓ Python + CSV + SVG kit (131 KB)

Dot-density map : One dot per N people, showing where a population lives.
↓ Python + CSV + SVG kit (368 KB)

Quiver : A vector field of arrows by direction and magnitude.
↓ Python + CSV + SVG kit (60 KB)

Streamplot : Integrated streamlines with arrowhead markers.
↓ Python + CSV + SVG kit (131 KB)

Wind-barb station plot : Staffs point from the wind, pennant 50kt, barb 10kt, half 5kt, across a cold front.
↓ Python + CSV + SVG kit (67 KB)

Wind rose : Stacked polar bars of frequency by direction.
↓ Python + CSV + SVG kit (66 KB)

Polar plot : A line or scatter on an angular axis.
↓ Python + CSV + SVG kit (58 KB)

## Model evaluation & science

Diagnostics and scientific plots: ROC, calibration, survival, forest, volcano.

Silhouette : Which cluster is not a cluster.
↓ Python + CSV + SVG kit (60 KB)

Validation curve : Not the peak — the simplest value that ties it.
↓ Python + CSV + SVG kit (58 KB)

Loss curve : The epoch you should have stopped at.
↓ Python + CSV + SVG kit (56 KB)

Learning curve : Would more data help? It says so.
↓ Python + CSV + SVG kit (58 KB)

ROC curve : Classifier trade-off, with AUC.
↓ Python + CSV + SVG kit (60 KB)

Precision-recall curve : Precision against recall, with the average precision.
↓ Python + CSV + SVG kit (199 KB)

Calibration curve : Predicted probability against observed frequency.
↓ Python + CSV + SVG kit (62 KB)

Ablation matrix : Which components a variant keeps, and what dropping one costs.
↓ Python + CSV + SVG kit (60 KB)

Cumulative gain : Model vs baseline vs perfect targeting.
↓ Python + CSV + SVG kit (59 KB)

Manhattan plot : −log10 p-values across the genome, peaks above the significance line.
↓ Python + CSV + SVG kit (101 KB)

Volcano : Effect size versus significance.
↓ Python + CSV + SVG kit (72 KB)

Kaplan–Meier : Survival over time, per arm.
↓ Python + CSV + SVG kit (55 KB)

Forest plot : Per-study effect sizes and a pooled estimate.
↓ Python + CSV + SVG kit (58 KB)

Bland-Altman : Agreement: difference vs mean of two methods.
↓ Python + CSV + SVG kit (65 KB)

## Gauges, 3-D, sets & the rest

KPI gauges, projected 3-D, set intersections, and one-of-a-kind figures.

Venn / Euler : Overlapping sets, each region sized by its count.
↓ Python + CSV + SVG kit (56 KB)

UpSet plot : Set intersections as bars over a matrix, Venn beyond three sets.
↓ Python + CSV + SVG kit (55 KB)

Voronoi tessellation : Catchment cells coloured by group, with seed points.
↓ Python + CSV + SVG kit (64 KB)

Embedding projector : 2D word-embedding map; hover a word for its nearest neighbours.
↓ Python + CSV + SVG kit (94 KB)

Diffusion trajectory : A point cloud carried through a noise schedule, forward then back.
↓ Python + CSV + SVG kit (121 KB)

Word cloud : Words sized by frequency, coloured by theme.
↓ Python + CSV + SVG kit (62 KB)

Speaking time : Who spoke, and for how long (donut).
↓ Python + CSV + SVG kit (54 KB)

Radial gauge : A needle over coloured zones with a big readout.
↓ Python + CSV + SVG kit (56 KB)

Liquid gauge : A disc filled with wavy liquid to a percentage, a reservoir at 63%.
↓ Python + CSV + SVG kit (58 KB)

Radial bar : Bars wrapped around a polar axis.
↓ Python + CSV + SVG kit (59 KB)

3D surface : A static 3-D surface via offline projection.
↓ Python + CSV + SVG kit (77 KB)

Manifold path : Gradient ascent on a two-coordinate surface, stalling on a lesser peak.
↓ Python + CSV + SVG kit (110 KB)

3D wireframe : A projected surface mesh, slowly rotating.
↓ Python + CSV + SVG kit (176 KB)

3D scatter : Projected 3D points with a slow turntable.
↓ Python + CSV + SVG kit (77 KB)

3D bar : Depth-shaded bars on a grid; use sparingly.
↓ Python + CSV + SVG kit (62 KB)

No figure matches. Try another term.

×

---

# Four short films — Sprezzature

Source: https://sprezzature.ai/films.html

# Four short films

One on the suite, three on what it is made of. Nothing in them is a mock-up: the figures are the shipped SVG files, the form was generated by the tool from a real parser, and the colour vision simulations came out of sprezzature-colors .

the whole suite

## Sprezzature 25 s

A sentence can be proofread by reading it back. A chart cannot. So the suite renders the figure, looks at it, looks again with the colour taken away, and only then ships. The same discipline runs one level up: before it trusts a local model, it seeds a known flaw into a text and a known defect into an image, and hires only the model that catches both.

Your browser cannot play this video.
Download the MP4 .

What it shows: the shipped bar-grouped.svg , the ten skills, and the two gates the model has to pass.

sprezzature-figures · sprezzature-maps

## Figures & maps 18 s

127 chart kinds and three map generators, every line written as SVG directly. No plotting library sits underneath any of it, and the SVG is the deliverable rather than an export.

Your browser cannot play this video.
Download the MP4 .

What it shows: six real figures from the gallery, then four real maps on a genuine geographic projection.

accessibility · colors · vision · audio

## Accessibility 21 s

A person with ordinary colour vision cannot see their own chart the way a colour blind reader does, and no amount of care changes that, because the information is not in their eye. The simulator renders those other viewpoints so the loop can look through them.

Your browser cannot play this video.
Download the MP4 .

What it shows: all four simulations in turn, produced by the project's own simulate_cvd.py : protanopia, deuteranopia, tritanopia, grayscale.

ui · cli-gui · publish · ux-laws

## Interface 18 s

A command line is a wall for most people. Point this at an argparse, Click or Typer parser and every flag becomes a field, in one self-contained page.

Your browser cannot play this video.
Download the MP4 .

What it shows: a page the tool actually generated from a real parser, scrolled end to end so every field is shown.

## About these films

They are narrated in English. Subtitles are available in English and in French: pick them in the player's caption menu.

Each one also exists vertical (1080×1920) and square (1080×1080). The versions here are the 1920×1080 cut.

They were built with the same discipline they describe. Every frame was rendered to a still and looked at before the video was encoded, which is how seven defects that passed the automated checks were caught, including a caption sliding under a rule and a cropped chart title.

---

# Financial markets — Adverse case — Sprezzature

Source: https://sprezzature.ai/financial-markets-adverse.html

sprezzature · financial markets

# Case study: financial markets

Net return
-26%
net of fees

vs buy & hold
-27 pts
benchmark +2%

Sharpe ratio
-0.61
net, annualised

Max drawdown
-40%
below the peak

Winning sessions
38%
cumulative cost 1.9%

On a phone, each chart fits the width. Tap ⤢ on any panel for fullscreen, then pinch to zoom into the detail.

1 Net wealth compared ⤢ Base 100 index · us (auto Kₜ), buy & hold and fixed K
Net wealth compared, base 100 40 60 80 100 120 140 160 index (base 100) us index 74 Buy & hold index 102 K = 1 index 72 K = 3 index 52 K = 5 index 70 2024 2025 2026

2 Automatic size Kₜ ⤢ Number of holdings over time
Automatic portfolio size, number of holdings Kt 0 5 10 15 20 holdings average 11 holdings 2024 2025 2026

3 The 100 stocks ⤢ Prices indexed to 100 · logarithmic scale
The 100 stocks, indexed to 100, log scale 50 100 200 400 index (base 100) the 100 stocks median of the 100 3 eventual winners 2024 2025 2026

4 Daily net P&L ⤢ Net return (%) per session · blue up, red down
Daily net P&L, return per session -1.8% +0.0% +1.8% up down 20-day avg 2024 2025 2026

5 Per-rebalance and cumulative cost ⤢ Dual axis · basis points and percent
Per-rebalance cost in basis points and cumulative cost in percent 0 5 10 15 0.0% 2.0% 4.0% per rebalance (bps) cumulative (%) 2024 2025 2026

6 Return distribution ⤢ Density of daily net return (%), by year
Distribution of daily net returns, by year 2024 2025 2026 -2% -1% +0% +1% +2% daily net return (%)

7 Monthly returns ⤢ Blue positive, red negative (%)
Monthly returns, blue positive red negative J F M A M J J A S O N D 2024 +0 +0 +0 +0 +0 +5 +3 +10 +2 -6 -3 +4 2025 -9 -9 +3 -8 -9 +4 -1 +11 -8 +2 +1 +2 2026 -5 -6 -4 +1 +6 -5 -6

8 Turnover at rebalances ⤢ Dual axis · share of the book traded (%)
Turnover at rebalances and its moving average 0% 50% 100% 150% 40% 60% 80% 100% 120% turnover (%) average (%) 22 rebalances, first to last

9 Drawdown ⤢ Distance (%) below the running peak (drawdown)
Drawdown, distance below the running peak -60% -40% -20% 0% distance (%) drawdown max drawdown -40% 2024 2025 2026

10 Risk-adjusted performance ⤢ Sharpe ratio and total return vs benchmark
Risk-adjusted performance, Sharpe ratio and total return 0 1.5 3 -0.61 Sharpe ratio (Rp − Rf) / σ · risk-free rate assumed nil · annualised Total net return vs benchmark -26% buy & hold +2%

1 Net wealth compared ⤢ Base 100 index · us (auto Kₜ), buy & hold and fixed K
Net wealth compared, base 100 40 60 80 100 120 140 160 index (base 100) us index 74 Buy & hold index 102 K = 1 index 72 K = 3 index 52 K = 5 index 70 2024 2025 2026

2 Automatic size Kₜ ⤢ Number of holdings over time
Automatic portfolio size, number of holdings Kt 0 5 10 15 20 holdings average 11 holdings 2024 2025 2026

3 The 100 stocks ⤢ Prices indexed to 100 · logarithmic scale
The 100 stocks, indexed to 100, log scale 50 100 200 400 index (base 100) the 100 stocks median of the 100 3 eventual winners 2024 2025 2026

4 Daily net P&L ⤢ Net return (%) per session · blue up, red down
Daily net P&L, return per session -1.8% +0.0% +1.8% up down 20-day avg 2024 2025 2026

5 Per-rebalance and cumulative cost ⤢ Dual axis · basis points and percent
Per-rebalance cost in basis points and cumulative cost in percent 0 5 10 15 0.0% 2.0% 4.0% per rebalance (bps) cumulative (%) 2024 2025 2026

6 Return distribution ⤢ Density of daily net return (%), by year
Distribution of daily net returns, by year 2024 2025 2026 -2% -1% +0% +1% +2% daily net return (%)

7 Monthly returns ⤢ Blue positive, red negative (%)
Monthly returns, blue positive red negative J F M A M J J A S O N D 2024 +0 +0 +0 +0 +0 +5 +3 +10 +2 -6 -3 +4 2025 -9 -9 +3 -8 -9 +4 -1 +11 -8 +2 +1 +2 2026 -5 -6 -4 +1 +6 -5 -6

8 Turnover at rebalances ⤢ Dual axis · share of the book traded (%)
Turnover at rebalances and its moving average 0% 50% 100% 150% 40% 60% 80% 100% 120% turnover (%) average (%) 22 rebalances, first to last

9 Drawdown ⤢ Distance (%) below the running peak (drawdown)
Drawdown, distance below the running peak -60% -40% -20% 0% distance (%) drawdown max drawdown -40% 2024 2025 2026

10 Risk-adjusted performance ⤢ Sharpe ratio and total return vs benchmark
Risk-adjusted performance, Sharpe ratio and total return 0 1.5 3 -0.61 Sharpe ratio (Rp − Rf) / σ · risk-free rate assumed nil · annualised Total net return vs benchmark -26% buy & hold +2%

Illustrative data, no real value, no investment advice.

---

# Financial markets — Favourable case — Sprezzature

Source: https://sprezzature.ai/financial-markets.html

sprezzature · financial markets

# Case study: financial markets

Net return
+123%
net of fees

vs buy & hold
+87 pts
benchmark +35%

Sharpe ratio
2.05
net, annualised

Max drawdown
-10%
below the peak

Winning sessions
48%
cumulative cost 1.8%

On a phone, each chart fits the width. Tap ⤢ on any panel for fullscreen, then pinch to zoom into the detail.

1 Net wealth compared ⤢ Base 100 index · us (auto Kₜ), buy & hold and fixed K
Net wealth compared, base 100 50 100 150 200 250 300 index (base 100) us index 223 Buy & hold index 135 K = 1 index 267 K = 3 index 240 K = 5 index 261 2024 2025 2026

2 Automatic size Kₜ ⤢ Number of holdings over time
Automatic portfolio size, number of holdings Kt 0 5 10 15 20 holdings average 10 holdings 2024 2025 2026

3 The 100 stocks ⤢ Prices indexed to 100 · logarithmic scale
The 100 stocks, indexed to 100, log scale 50 100 200 400 800 index (base 100) the 100 stocks median of the 100 3 eventual winners 2024 2025 2026

4 Daily net P&L ⤢ Net return (%) per session · blue up, red down
Daily net P&L, return per session -1.6% +0.0% +1.6% up down 20-day avg 2024 2025 2026

5 Per-rebalance and cumulative cost ⤢ Dual axis · basis points and percent
Per-rebalance cost in basis points and cumulative cost in percent 0 5 10 15 20 0.0% 2.0% 4.0% per rebalance (bps) cumulative (%) 2024 2025 2026

6 Return distribution ⤢ Density of daily net return (%), by year
Distribution of daily net returns, by year 2024 2025 2026 -2% -1% +0% +1% +2% daily net return (%)

7 Monthly returns ⤢ Blue positive, red negative (%)
Monthly returns, blue positive red negative J F M A M J J A S O N D 2024 +0 +0 +0 +0 +0 +4 +2 +1 -4 +6 +11 -4 2025 +1 +1 +8 +2 +0 +17 +13 -0 -2 +4 +5 -1 2026 +6 -0 +4 +4 -1 +4 +4

8 Turnover at rebalances ⤢ Dual axis · share of the book traded (%)
Turnover at rebalances and its moving average 0% 50% 100% 150% 40% 60% 80% 100% 120% turnover (%) average (%) 22 rebalances, first to last

9 Drawdown ⤢ Distance (%) below the running peak (drawdown)
Drawdown, distance below the running peak -15% -10% -5% 0% distance (%) drawdown max drawdown -10% 2024 2025 2026

10 Risk-adjusted performance ⤢ Sharpe ratio and total return vs benchmark
Risk-adjusted performance, Sharpe ratio and total return 0 1.5 3 2.05 Sharpe ratio (Rp − Rf) / σ · risk-free rate assumed nil · annualised Total net return vs benchmark +123% buy & hold +35%

1 Net wealth compared ⤢ Base 100 index · us (auto Kₜ), buy & hold and fixed K
Net wealth compared, base 100 50 100 150 200 250 300 index (base 100) us index 223 Buy & hold index 135 K = 1 index 267 K = 3 index 240 K = 5 index 261 2024 2025 2026

2 Automatic size Kₜ ⤢ Number of holdings over time
Automatic portfolio size, number of holdings Kt 0 5 10 15 20 holdings average 10 holdings 2024 2025 2026

3 The 100 stocks ⤢ Prices indexed to 100 · logarithmic scale
The 100 stocks, indexed to 100, log scale 50 100 200 400 800 index (base 100) the 100 stocks median of the 100 3 eventual winners 2024 2025 2026

4 Daily net P&L ⤢ Net return (%) per session · blue up, red down
Daily net P&L, return per session -1.6% +0.0% +1.6% up down 20-day avg 2024 2025 2026

5 Per-rebalance and cumulative cost ⤢ Dual axis · basis points and percent
Per-rebalance cost in basis points and cumulative cost in percent 0 5 10 15 20 0.0% 2.0% 4.0% per rebalance (bps) cumulative (%) 2024 2025 2026

6 Return distribution ⤢ Density of daily net return (%), by year
Distribution of daily net returns, by year 2024 2025 2026 -2% -1% +0% +1% +2% daily net return (%)

7 Monthly returns ⤢ Blue positive, red negative (%)
Monthly returns, blue positive red negative J F M A M J J A S O N D 2024 +0 +0 +0 +0 +0 +4 +2 +1 -4 +6 +11 -4 2025 +1 +1 +8 +2 +0 +17 +13 -0 -2 +4 +5 -1 2026 +6 -0 +4 +4 -1 +4 +4

8 Turnover at rebalances ⤢ Dual axis · share of the book traded (%)
Turnover at rebalances and its moving average 0% 50% 100% 150% 40% 60% 80% 100% 120% turnover (%) average (%) 22 rebalances, first to last

9 Drawdown ⤢ Distance (%) below the running peak (drawdown)
Drawdown, distance below the running peak -15% -10% -5% 0% distance (%) drawdown max drawdown -10% 2024 2025 2026

10 Risk-adjusted performance ⤢ Sharpe ratio and total return vs benchmark
Risk-adjusted performance, Sharpe ratio and total return 0 1.5 3 2.05 Sharpe ratio (Rp − Rf) / σ · risk-free rate assumed nil · annualised Total net return vs benchmark +123% buy & hold +35%

Illustrative data, no real value, no investment advice.

---

# Tribute to Hans ROSLING — Sprezzature

Source: https://sprezzature.ai/hans-rosling.html

sprezzature-figures · Case Study

# Tribute to Hans ROSLING

Hans ROSLING turned a bubble chart into a
story the whole world could feel.

Best seen in landscape. Tap ↗ for fullscreen, then pinch to zoom.

## Wealth & Child Survival

↗
Fullscreen

⏸
Pause
↻
◀
1950
▶

Speed
0.5×
1×
2×
Jump to
1950
1976
Vietnam
1990
Germany
1991
USSR
2020
Pandemic

Follow a country

—

## Wealth & Health

↗
Fullscreen

⏸
Pause
↻
◀
1950
▶

Speed
0.5×
1×
2×
Jump to
1950
1976
Vietnam
1990
Germany
1991
USSR
2020
Pandemic

Follow a country

—

## Fertility and Life Expectancy

↗
Fullscreen

⏸
Pause
↻
◀
1950
▶

Speed
0.5×
1×
2×
Jump to
1950
1976
Vietnam
1990
Germany
1991
USSR
2020
Pandemic

Follow a country

—

---

# Sprezzature — ten Claude / OpenCode skills for vanilla JS + Tailwind

Source: https://sprezzature.ai/

# Sprezzature

in the broadest sense
Create and audit figures, visualizations for app and web content
faithful to a standard of accessibility, chromatic rigor, and usability.

Explore
the ten skills
See
the gallery
Give a ⭐️ on GitHub

## Twenty-five seconds

What the suite does, and the one thing nothing
else does: it refuses to trust a figure it has not looked at. Narrated in English, subtitled in English
and French.

Your browser cannot play this video.
Download the MP4 .

Four
more films, one per part of the suite →

## Getting started

Sprezzature is a set of skills for
Claude Code or OpenCode . Install the ones you want, then ask in plain
language. The skill both makes the artifact and audits it.

*]:min-w-0">

### 1 · Install

Grab the latest release, copy the skills you
want into your runtime.

VERSION=$(curl -fsSL https://api.github.com/repos/warith-harchaoui/sprezzature/releases/latest \
| sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p') # the latest release, resolved
curl -L https://github.com/warith-harchaoui/sprezzature/releases/download/v${VERSION}/sprezzature-skills-${VERSION}.tar.gz | tar xz

mkdir -p ~/.claude/skills # OpenCode: ~/.opencode/skills
cp -r sprezzature-ui sprezzature-figures ~/.claude/skills/
Just want one tool, no agent? Each deterministic tool also ships as a standalone pip package. See Packages .

### 2 · Ask, in plain English

Trigger phrases route the request; the skill
makes it, then audits it against the rules.

"make this page accessible" → sprezzature-accessibility lints the HTML and reports what to fix.

"make a figure of this CSV" → sprezzature-figures draws it, then audits the chart.

"wrap this CLI in a GUI" → sprezzature-cli-gui scaffolds a usable interface.

Full install options (checksums, OpenCode + local Ollama, upgrades) →

## The tool ecosystem

Each skill's scripts also ship as a standalone package, reachable five ways : a self-contained zip, a Python library, an HTTP API, MCP tools for an agent, or the skill itself. Same implementation behind all of them.

sprezzature-figures : 127 chart types

sprezzature-colors : WCAG + CVD + Tailwind

sprezzature-audio : speech-to-text, diarization

sprezzature-accessibility : a11y lint

sprezzature-cli-gui : CLI to GUI

sprezzature-ux-laws : Laws of UX audit

sprezzature-maps : choropleth + situation

## The ten skills

## A taste of what it renders

A few frames from sprezzature-figures : our house style and images made with care, on a fitting palette. The full catalog of charts and statistical plots has its own page.

See
the full gallery →

## What's unusual

### Make and audit

Build from scratch or on an existing codebase, then
audit the result against the rules.

### The models can run on your machine

The text, audio and vision models could run locally if you ask for it; nothing has to leave the
machine.

### Opinionated graphical choices

Skills cover accessibility, colors, typography,
languages, search-engine optimization (SEO), and generative-engine optimization (GEO).

### Runtime-portable

Skills serve Claude Code and OpenCode or completely locally and free.

## Highlights

### 👁️ Look at the figure before you ship it

You can proofread a sentence by reading it back. You
can't do that with a chart: whether it's right lives in the pixels, not the code. So the Ralph
Eyeball Loop takes whatever you made (an SVG figure, a TikZ figure, a Mermaid diagram, a whole web
page) and renders it to an image with a deterministic tool, no model involved. Then something actually looks
at it: by default the agent itself, the same one that wrote the code, or, fully offline, an optional local
vision model. It catches what a code check never will: a label cut off at the edge, a legend that slid off
the canvas, two nodes sitting on top of each other, colors that vanish for a colorblind reader. Fix the
source, render again, look again. It's a prescribed review loop, not an autonomous critic. Everyone else
aims this at web pages. We aim it at charts and diagrams too.

How the Ralph Eyeball Loop works →

### 📐 The figure is a real SVG, not a picture

A figure ships as carefully written scalable vector graphics
(SVG). The generators emit the markup directly, each with a matching viewBox , so the graphic scales to any size without a blurry pixel and the
text stays selectable. The generator writes SVG directly, so there is no separate chart-description spec to
export, and the Portable Network Graphics (PNG) is only an export for
places that can't take vector art. The SVG is the deliverable.

## State of the Art

The full landscape (15 category matrices) lives in
LANDSCAPE.md
( français ).

## Acknowledgments

Special thanks to
Audrey DEJOUX ,
Laurent PANTANACCE ,
Auguste BAUM ,
Julien BOYER and
Jérôme GOMBERT
for fruitful discussions.

Color palettes from deraison.ai/colors , shipped here as the colors skill .

The three Roboto families are bundled under the SIL Open Font License.

We also drew on the
Human Interface
Guidelines ,
Google Material Design and
Laws of UX .

---

# Maps — Sprezzature

Source: https://sprezzature.ai/maps.html

sprezzature · case studies

# Maps

Good-quality cartography, reproducible on data of your choice.

Work in progress: the generators are versioned and every map below is rebuilt from them in one command, but the cartographic judgement is still being revised plate by plate — label placement, relief strength and the confidence scale have all changed this month. Read these as illustrations of the method, not as operational assessments.

← All case studies

## Choropleth

One value per country on a hand-written, closed-form Equal Earth projection: it restores the equal-area property a plain equirectangular map quietly loses (Greenland does not read fourteen times its real size here). Color comes from an OKLCH-interpolated ramp, not a naive per-channel RGB lerp, verified colour-vision-deficiency-safe by actually running the simulation rather than asserting it. A diverging ramp switches on automatically when the data has a meaningful zero. A warm/cool duotone relief layer, real GMTED2010 elevation rather than a flat hillshade, sits under the fills.

Sequential ramp : pale-to-navy blue, magnitude reads by lightness alone.
↓ CSV + Python + PNG kit (49 KB)

Diverging ramp : auto-detected from the data's sign, terracotta ↔ navy through a real neutral zero.
↓ CSV + Python + PNG kit (47 KB)

At scale : the relief layer (Andes, Rockies, Alps, Himalaya) reads clearly once rendered larger.
↓ CSV + Python + PNG kit (52 KB)

From sprezzature-maps , the cartography package split out of sprezzature-figures.

## Thematic maps

Further glyph and cartogram techniques from sprezzature-figures, layered over the same offline Natural Earth basemap.

Bivariate choropleth : Two variables blended on a 3×3 color key.

Proportional-symbol map : Area-true √-scaled bubbles on a world basemap.

Connection / flow map : Great-circle arcs weighted by volume.

Pie-glyph map : A small pie chart placed at each region.

Bar-glyph map : Mini bar charts placed at each region.

Tile-grid cartogram : One equal tile per country, geographic layout.

Diverging + annotated : Signed change, no-data gray, key countries labeled.

Small multiples : One panel per year, class breaks frozen.

## Situation maps

A layered reference plate for any region: coastline, international frontiers, country labels, a bathymetry contour halo, dual-unit scale bar and north arrow, on an auto-centred Lambert Conformal Conic projection (conformal, so shapes and angles stay true at city/province scale). Borders switch automatically between Natural Earth's 50m and 10m tiers depending on how zoomed in the region is: a whole continent doesn't need 10m detail invisible at that scale, while a single country does. The same relief technique as the choropleth above (real elevation, texture-shaded, warm/cool duotone) carries every plate.

Western Europe : the built-in reference demo, 50m borders, the Alps in full relief texture.
↓ YAML + Python + PNG kit (225 KB)

Iberia : Spain and Portugal, the clearest single example of the texture-shading relief technique.
↓ YAML + Python + PNG kit (213 KB)

Himalaya : an all-land plate with no sea to contrast against, so relief carries the whole plate.
↓ YAML + Python + PNG kit (209 KB)

Switzerland, zoomed : a small enough bbox switches to the 10m border tier automatically.
↓ YAML + Python + PNG kit (208 KB)

### Applied: areas of control

The same reference plate becomes a geopolitics-desk product once thematic layers go on top: classed pastel fills with white boundary casing, letter-spaced place labels, flashpoint markers, tapered axes of advance, and a floating legend. Every plate below is schematic, says so on its own face, and keeps its claim lines in readable Python rather than an opaque data file: a reader who disagrees can see exactly which coordinates to argue with. None of it is intelligence.

Ukraine : government, occupied and contested along an approximate 2024 contact line. The Kakhovka Reservoir is drawn as former: it drained after the dam breach of 6 June 2023.
↓ YAML + Python + PNG kit (149 KB)

Sudan : the war’s east–west partition in five classes, with the fighting in Kordofan. One assessed and one reported axis of advance, drawn differently.
↓ YAML + Python + PNG kit (164 KB)

Eastern DRC : who holds the Kivus. Goma and Bukavu face each other across Lake Kivu, which is why the lake has to be on the map at all.
↓ YAML + Python + PNG kit (288 KB)

Syria : a four-way split, an illustrative snapshot from around 2018.
↓ YAML + Python + PNG kit (178 KB)

Libya : loyalist, rebel and the contested oil crescent, around spring 2011.
↓ YAML + Python + PNG kit (194 KB)

Every plate here is generated by sprezzature-maps , from the builders in scripts/build_situation_examples.py .

## For conflict research: ACLED and UCDP, at the precision they record

The two datasets peace-and-conflict research runs on — ACLED and the UCDP Georeferenced Event Dataset — each record, beside every coordinate, how well that coordinate is known . ACLED codes geo_precision 1–3; UCDP codes where_prec 1–7. Those are not file metadata: ACLED’s 3 is a provincial capital standing in for a whole province, and UCDP’s 6 means only the country is known and the coordinates are a representative point for an entire state.

Maps of this data draw all of them as the same dot. That asserts a street corner the source never gave, once per row, several hundred times a figure. Here the code reaches the mark:

A named location
A solid disc with a white casing. The mark means what it has always meant: we know the place.

A place standing in for an area
A hollow ring. The old cartographic signal for “about here”, and unlike a disc of invented radius it claims nothing it cannot support. Where the dataset states a radius — UCDP’s where_prec 2 says about 25 km — it is drawn, to the plate’s own scale.

A region pinned to its capital
A hollow broken ring: one step further from “a place”. The date is spoken the same way, from time_precision — “week of”, “month of”, “in 2023”.

Rows that cannot be placed honestly are not placed . A UCDP where_prec 6 row is refused a dot by default, and the count goes onto the plate’s own method line rather than disappearing — a silent drop being the other half of the same dishonesty.

The step between the file and the mark is one call. acled_events("sudan-2024.csv", derive_region=True) returns a config fragment whose every key the generator already read, so cfg.update(...) is the whole integration and a hand-written config keeps everything it says. ucdp_events does the same for GED.

Column names, code ranges and the wording of each code are taken from the ACLED codebook and the UCDP GED codebook, read rather than recalled. What this package deliberately leaves to CShapes, PRIO-GRID, geoBoundaries and GeoPandas is listed in LANDSCAPE.md .

## How the choropleth and situation maps are built

Every map above is a hand-authored SVG document: no chart-grammar library, no headless browser, no external tiles fetched at render time. Everything geographic is a vendored, offline Natural Earth asset.

Equal Earth, not equirectangular
A closed-form polynomial projection (Šavrič, Patterson & Jenny, 2018), equal-area, so a choropleth's colored surface isn't quietly lying about country size.

OKLCH color, not RGB lerp
Ramps interpolate in a perceptually-uniform space (Björn Ottosson's OKLab), verified colour-vision-deficiency-safe by actually simulating protanopia/deuteranopia/tritanopia on the rendered output.

Natural Earth, 50m and 10m
Public-domain vector borders, vendored offline. Situation maps pick the tier automatically from how zoomed-in the requested region is.

Real elevation, not a flat hillshade
Situation maps compute their relief from real GMTED2010 elevation: a directional hillshade blended with texture shading (Brown, 2010: a fractional-order Laplacian applied in the frequency domain), which draws out ridgelines and drainage networks at every scale at once, then retinted warm-highlight/cool-shadow instead of flat grey. Reprojected pixel-by-pixel into each map's own projection (an exact analytic inverse for Lambert Conformal Conic; Newton-Raphson for the world choropleth's Equal Earth, which has no closed-form inverse).

## Real data: the last five French presidential runoffs

The same carefully authored SVG map engine, on real data from the French Ministère de l'Intérieur: the winner's second-round vote share by département across the last five presidential elections, on one frozen blue scale so the panels compare. 2002 (the republican sprezzature against the far right) is near-uniform; 2012 (the closest) is the palest; 2017 and 2022 show the lighter départements where Marine Le Pen ran strongest.

Real data: the last five French presidential runoffs

Year
Winner
%
Runner-up
%

2002 Jacques Chirac 82.21 Jean-Marie Le Pen 17.79

2007 Nicolas Sarkozy 53.06 Ségolène Royal 46.94

2012 François Hollande 51.64 Nicolas Sarkozy 48.36

2017 Emmanuel Macron 66.10 Marine Le Pen 33.90

2022 Emmanuel Macron 58.55 Marine Le Pen 41.45

Source: Ministère de l'Intérieur (2nd-round results by département).

## Map techniques (carefully authored SVG)

When a projection or a glyph falls outside a chart grammar, the same loop drives a carefully drawn Scalable Vector Graphics (SVG) map instead.

Dot-density map : One dot per N people inside real regions.

Hexbin map : Hexagonal binning of point density over a map.

Spike map : Vertical spikes at locations, height by value.

Hexbin map : Earthquakes binned into hexagons by count, tracing the Ring of Fire.

Binned grid map : Square-bin aggregation over geography, cells coloured by count.

×

---

# Packages — Sprezzature

Source: https://sprezzature.ai/packages.html

standalone packages

# Packages

Every tool here is one implementation reached five different ways. Which way you want depends on what you are doing: sending a colleague a single file, importing a function, calling it from another language, handing it to an agent. None of those should require a different tool.

Each package is BSD-3-Clause, local-first, and independently versioned. All eight are published on PyPI, so a plain pip install is enough.

## Five ways in

The rule is that these are surfaces , never re-implementations. A route, a tool description and a command line all call the same function; when they disagree, one of them is a bug rather than a variant.

zip

### A single self-contained kit

One folder that runs on a machine with nothing installed: the generator, the drawing engine in one file, the data, a page that opens the result, and a README. No network, no clone, no account. This is the form you can attach to an email.

library

### Python functions

Import them and call them. Typed, documented, and free of any plotting or charting dependency: the SVG is written directly, so the only thing you install is the thing you asked for.

api

### HTTP, via FastAPI

The same functions over HTTP, so any language that can make a request can use them. Comes with OpenAPI docs at /docs , which is also how the argument names stay honest: they are generated from the signatures, not written by hand.

mcp

### Agent tools, via FastAPI MCP

The HTTP routes republished as Model Context Protocol tools, so an assistant calls them as first-class tools rather than by guessing at a shell command. Deliberately a wrapper over the existing routes: a hand-written MCP server would be a second copy of the surface, free to drift from it.

skills

### Skills, for Claude and for OpenCode

The judgement that is not in the code: when to reach for a chart type, what makes a title honest, which check to run before shipping. MCP gives an agent the ability ; a skill gives it the taste . Both runtimes read the same source material.

## Where each surface actually exists

Five ways in is the target, and most of it is now built. Every package with a library has an HTTP API and an MCP surface over it: the same functions, never a second copy. Six of the seven packages ship a runnable zip, 125 of them for the figure gallery and one each for the rest; audio is the one still without. The skills need no second version for OpenCode: both runtimes read the same SKILL.md .

Package
Zip
Library
API
MCP
Claude skill
OpenCode skill

sprezzature-figures 125 kits ● yes ● yes ● yes ● yes ● yes

sprezzature-maps 1 kit ● yes ● yes ● yes ● yes ● yes

sprezzature-colors 1 kit ● yes ● yes ● yes ● yes ● yes

sprezzature-accessibility 1 kit ● yes ● yes ● yes ● yes ● yes

sprezzature-audio — not yet ● yes ● yes ● yes ● yes ● yes

sprezzature-cli-gui 1 kit ● yes ● yes ● yes ● yes ● yes

sprezzature-ux-laws 1 kit ● yes ● yes ● yes ● yes ● yes

sprezzature-ui — not yet — not yet — not yet — not yet ● yes ● yes

sprezzature-vision — not yet — not yet — not yet — not yet ● yes ● yes

sprezzature-publish — not yet — not yet — not yet — not yet ● yes ● yes

The last three rows are skills with no standalone package: they describe judgement rather than wrap a tool, so there is nothing to pip install .

## Deterministic tools

sprezzature-figures

### Figures

127 hand-authored SVG chart types, plus the Ralph Eyeball Loop, explainability, and causal DAGs.

pip install sprezzature-figures
Repository →

sprezzature-maps

### Maps

Hand-authored SVG cartography split out of sprezzature-figures: an Equal Earth choropleth with an OKLCH ramp, and layered Lambert Conformal Conic situation maps, both with a real-elevation warm/cool relief.

pip install sprezzature-maps
Repository → ↓ Runnable kit (748 KB)

sprezzature-colors

### Colors

WCAG contrast auditing with OKLCH-neighbour fixes, colour-vision-deficiency simulation, a curated palette, and Tailwind export.

pip install sprezzature-colors
Repository → ↓ Runnable kit (23 KB)

sprezzature-accessibility

### Accessibility

A static HTML accessibility linter: source-decidable WCAG/WAI rules, no browser, no runtime DOM. A fast pre-commit gate.

pip install sprezzature-accessibility
Repository → ↓ Runnable kit (25 KB)

sprezzature-cli-gui

### CLI → web GUI

Auto-generate a single-file HTML GUI from any Python CLI: it introspects argparse, Click, or Typer, with no build step.

pip install sprezzature-cli-gui
Repository → ↓ Runnable kit (29 KB)

sprezzature-ux-laws

### Laws of UX

A static Laws-of-UX auditor for HTML: Hick, Miller, Fitts, Jakob, Tesler and more, decidable from source.

pip install sprezzature-ux-laws
Repository → ↓ Runnable kit (22 KB)

sprezzature-audio

### Audio

Local captions (whisper.cpp), speaker diarization and who-is-who, narration and translation. ML backends are optional extras.

pip install sprezzature-audio
Repository →

Looking for the agent skills instead? The SKILL.md layer ships together as the skills bundle on the Getting started section.

---

# Publishing — Sprezzature

Source: https://sprezzature.ai/publish.html

sprezzature-publish

# Publishing

Turn a folder of Markdown into a static site: per-page meta tags, a full favicon / progressive web app (PWA)-icon set from one logo, robots + sitemap + llms.txt + feeds, plain-language rewrites, and local text-to-speech (TTS) narration.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

Per-page Open Graph + Twitter Card + Schema.org JSON for Linking Data (JSON-LD)

A full favicon / app-icon / PWA-icon set from one logo, plus a webmanifest

robots.txt, sitemap.xml, llms.txt, Atom / Really Simple Syndication (RSS), humans.txt

Plain-language rewrites and audio (MP3) narration via local open-source (OSS) TTS

## Audits

Lint Markdown and catch broken links before publishing

Readability / grade-level checks on the copy

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

markdown to website
meta tags
OG card
SEO
GEO
favicons
robots.txt
sitemap
llms.txt
Atom feed
plain language
narrate this post
lint markdown

## Reference library

The knowledge the skill draws on: read them straight from the repo.

SEO essentials
Meta tags
Site indexes
Plain language
Narration
i18n
Lint Markdown

---

# The Ralph Eyeball Loop — Sprezzature

Source: https://sprezzature.ai/ralph-eyeball-loop.html

👁️ the idea

# The Ralph Eyeball Loop

You can proofread a sentence by reading it back. You can't do that with a chart. So look at the chart, fix what your eye caught, and look again.

Render, look, critique, edit, then round again. Click to enlarge.

In Sprezzature , an AI agent runs this loop itself, refusing to trust a figure it hasn't looked at.

## Whether it's right lives in the pixels

Code that draws a chart can be correct and the chart still be wrong. A label slides off the edge. A legend lands on top of the data. Two points sit exactly on each other. A red-and-green palette turns into one muddy colour for a reader who can't tell them apart. None of that shows up when you read the source. It only shows up when you see the result.

Text is easy this way: you read it back and the mistake is right there. A picture is not. The only honest test of a picture is to look at it.

## The loop, in four steps

1 Render. Turn whatever you made (a chart, a diagram, a map, a whole web page) into a plain image with a deterministic tool. No model, no guessing. The same input gives the same picture every time.

2 Look. Actually study the image. Is the point you're making the first thing the eye finds? Is anything cut off, cramped, or on top of something else?

3 Fix the source. Change the spec, never the picture. The picture is only ever the evidence.

4 Do it again. Render, look, fix, until there is nothing left to catch. Then ship.

## Make, audit, then look

Three moves sit under everything in Sprezzature . You make the thing from code, so it reproduces exactly and carries its own data. You audit it with a static pass over the source that catches what the markup can already tell you: a rainbow scale, a blur filter, a missing title. Then you look , because whether it is actually right lives in the pixels.

Make proves it runs. Audit proves the source is clean. The Eyeball Loop proves the result reads. Each move catches what the other two let through, and together they turn "the file exported" into "the figure holds up." That is where the power is: a short, honest circuit you run until nothing is left to catch.

The loop reaches into accessibility too. Right after the render, a colour-vision simulator redraws the image the way a colour-blind reader sees it, and in plain grayscale. If a series or a plus-or-minus sign disappears once the colour is gone, that is a bug you fix before shipping, not a footnote.

## Eyes you don't have

This is the part worth dwelling on. A person with normal colour vision cannot see their own chart the way a colour-blind reader does, and no amount of care changes that, because the information is not in their eye. The simulator renders those other viewpoints, and the loop lets you look at them, so accessibility stops being a checklist you take on trust and becomes something you can see and correct. A review a person cannot physically perform turns into an ordinary step.

Grayscale is the sharpest single test. Total colour blindness is rare, but a figure that reads with no colour at all reads under every milder deficiency too. If the story survives grey, it survives everyone.

The palette also carries an accessibility level. The default is universal, already safe for colour vision, and high-contrast, monochrome, and per-deficiency variants are there on demand. One figure becomes a short ladder of renders, and the loop climbs it: render each level, simulate, look. You confirm the default reads for everyone, and that each stronger level does what it promises, with the same eyes in the same loop.

## Who does the looking?

By default, the agent that wrote the code does the looking, now checking its own output instead of trusting it. A small vision model can do the looking too if you ask for it.

Either way, the step that turns code into a picture is plain and deterministic. It holds no opinions. It's a prescribed review loop, not a black box that grades your work. You stay in charge; the loop just makes sure someone actually looked.

## Why we built the whole thing around it

Plenty of tools will screenshot a web page and check it. We point the same discipline at the harder stuff: charts, statistical plots, diagrams, and maps. These are the things people usually ship without ever looking, because the code ran and the file saved.

That habit is the difference between a figure that merely exports and one that actually reads. It is how every figure in the gallery reached print quality: we looked at the result and refused to ship until it held up.

See the gallery

×

---

# UI generation — Sprezzature

Source: https://sprezzature.ai/ui.html

sprezzature-ui

# user interface (UI) generation

Vanilla JavaScript (JS) + Tailwind UI: components, pages, forms, dialogs, dashboards, for solo devs shipping internal tools without a designer.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

Semantic HyperText Markup Language (HTML) + Tailwind: forms, modals, nav, dashboards, data tables, settings, empty states, skeletons

Dark-mode peers, focus rings, reduced-motion guards on by default

The three-Roboto type rule (sans + serif + mono), honoring any font you name

i18n extracted to a single YAML configuration format shared by graphical user interface (GUI) and prompts

## Audits

Audit existing UI against the stack + ergonomics rules

Audit i18n coverage and surface untranslated strings

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

build a UI
create a component
make a form / modal / nav
scaffold a landing
dashboard / data table
dark mode toggle
responsive layout
audit this UI
i18n to YAML

## Reference library

The knowledge the skill draws on: read them straight from the repo.

Tailwind stack
Vanilla JS
Anti-patterns
Ship checklist
UX psychology
Ergonomics
Dashboards
Material
Chart selection
Dataviz palettes
Dataviz maps
Charts in SVG
Color psychology
Examples

---

# Laws of UX — Sprezzature

Source: https://sprezzature.ai/ux-laws.html

sprezzature-ux-laws

# Laws of user experience (UX)

Apply the canonical Laws of UX (Jon YABLONSKI) to vanilla-JavaScript (JS) + Tailwind: both when making new user interface (UI) and when auditing existing HyperText Markup Language (HTML). Reference covers 30 laws with trigger / action / Tailwind hook.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

Design a screen with Hick / Fitts / Miller / Peak-End in mind

Each law paired with a concrete Tailwind hook

## Audits

Static auditor flags the mechanically-detectable subset: Hick, Miller, Fitts, Jakob, Tesler, Aesthetic-Usability, Selective Attention, Choice Overload (eight checks)

Severity + JavaScript Object Notation (JSON) output for pre-commit / continuous integration (CI)

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

audit for Laws of UX
design this screen using Hick / Fitts
is my nav too Hick-heavy
too many choices
cognitive load
Doherty threshold
reduce clutter

## Reference library

The knowledge the skill draws on: read them straight from the repo.

The 30 laws

---

# Vision — alt text — Sprezzature

Source: https://sprezzature.ai/vision.html

sprezzature-vision

# Vision: alt text

World Wide Web Consortium (W3C)-compliant alt-text drafting via a local Ollama vision model: a per-image decision tree, output in any detected language, deterministic on-disk cache. The one model is qwen3-vl:8b. Nothing leaves the machine.

Work in progress: every output is a draft requiring human review, not finished alt text.

SKILL.md (the agent spec)
Give a ⭐️ on GitHub

## Makes

Alt-text drafts for informative / decorative / functional / text / complex / group images

Output in any detected language, native phrasing for common ones

Surrounding-text and project-vocabulary biasing

A deterministic on-disk cache: same image never hits the model twice

## Audits

Flags images with no alt

Drafts are starting points; verify before committing

## Say one of these

The skill triggers itself on phrasing like this, no command to memorize.

alt text
describe this image
draft alt
image description
img has no alt
decorative image
figure / chart description
batch alt text

## Reference library

The knowledge the skill draws on: read them straight from the repo.

Alt-text with AI