Skip to main content

skaldr

Turn one YAML file into one polished, self-contained HTML report page. You describe what the report says — findings, tables, a pipeline, the numbers — and skaldr owns how it looks: layout, spacing, colour, light/dark, all decided once, here. No design work, no CSS, no drift.

See it → sales pipeline · warehouse count (rendered from examples/sales-pipeline.yaml and data/example.yaml).

Install

brew install alex-yanchenko/tap/skaldr     # recommended (macOS/Linux)
uv tool install skaldr                     # or, with uv
pipx install skaldr                        # or, with pipx

All three put a skaldr command on your PATH. (From a checkout, uv run skaldr … works without installing.)

Use

skaldr report.yaml                 # → out/report.html
skaldr report.yaml -o review.html  # choose the output path
skaldr report.yaml --pdf report.pdf  # a ready-to-share PDF (drives a headless Chrome/Chromium)
open review.html                   # a self-contained file — open it, host it, or share it

That's the whole tool: point it at a content file, get an HTML page (or a PDF). A few more commands help you write the content file and share the result:

skaldr --guide                     # the authoring guide: every block, the rules, a full example
skaldr --write-schema page.schema.json   # JSON Schema for your editor's YAML language server
skaldr report.yaml --embed -o out.html   # Artifact-ready fragment (no <html> skeleton) to publish as a claude.ai Artifact

For a PDF, use --pdf (above): it prints the page's print styling with a headless browser you already have — the reliable way to a shareable PDF. (Printing a published Artifact doesn't work: it's a sandboxed frame the browser flattens to a snapshot, so the print CSS never applies.) --pdf needs a Chrome/Chromium/Edge on the machine; set SKALDR_BROWSER to point at one if it isn't auto-found.

There are no styling flags — everything is in the content file.

The content file

version: 1
meta:
  title: "Q3 Warehouse Inventory Count  Discrepancies & Fixes"
  subtitle: ["Reconciled review of the 10,000-unit cycle count."]
  source: "WMS export"          # optional; feeds the provenance footer
  date: "Q3 2026"               # optional; never auto-now (builds are reproducible)
  toc: true                     # optional; auto table-of-contents from level-2 headings
  width: default                # optional; page width cap: default (1600) | wide (1920) | full
  hero: true                    # optional; larger display title + subtitle in a tinted band
badges:                         # author-declared vocabulary (see below)
  FLOOR:  { label: "Floor",  tone: amber, legend: "Fixable on the floor before the next count." }
  SYSTEM: { label: "System", tone: blue,  legend: "Defect in the scanning/labeling pipeline." }
blocks:
  - { type: heading, text: "Overview" }
  - { type: text, body: "Prose with **bold**, *italic*, `code`, ~~strike~~ and [links](https://x)." }
  - { type: cards, items: [{ label: "Matched cleanly", value: 8500, of: 10000, tone: success }] }
  # … more blocks

Top level is version · meta · optional badges · blocks — nothing else. Every block carries a type discriminator; the model is a pydantic discriminated union, so an unknown type, a field from the wrong block, or an unknown key each fails with a precise blocks.3.items.2.value-style error before anything renders.

Blocks: heading · text · list · fact_strip · key_value · cards · badge_row · callout · status_list · meter · table · code · quote · image · timeline · flow (a directional pipeline — arrow or step style, optional loop) · section (collapsible) · grid (bounded 6-column layout, with optional per-cell emphasis panels). The table is the workhorse — typed columns, grouped subtotals, sub-rows, colour-only indicator dots, row-level tone, and a reconcile block that hard-fails the build if the counts don't sum to a declared total. Badges are declared once and chip onto table rows, cards, timeline entries, and flow nodes alike. Prose fields take a small markdown subset (**bold**, *italic*, `code`, ~~strike~~, links); raw HTML is never interpreted.

Full reference: skaldr --guide (source: src/skaldr/skill/GUIDE.md), data/example.yaml (a file exercising every block), and schema/page.schema.json.

Guarantees

  • One self-contained file — inline CSS, system fonts, no external resources; the page carries its own <!doctype> + <meta charset> so it renders correctly from file://, any static host, or a claude.ai Artifact.
  • Validation is the product — structural mistakes fail the build with a field path, never reach the reader's eyes.
  • Derived, not authored — number formatting, percentages, subtotals, the legend, the TOC, and the provenance footer are all computed, so they can't drift from the data.
  • Light & dark — the palette follows the viewer's OS theme; a small corner menu lets the reader switch theme and page width.

Let an AI write it

skaldr ships a Claude skill, so you can skip the YAML and just ask. Install it once:

skaldr --install-skill      # copies the skill into ~/.claude/skills (survives upgrades)

Then in Claude Code (or Cowork), ask in plain language — "make me a skaldr report on this data export: what's clean, what's broken, and the fix" — and it writes the content file and renders the page. The skill reads the current guide from the tool itself (skaldr --guide), so it stays correct across upgrades without reinstalling.

Development

uv run skaldr data/example.yaml -o out/example.html   # run from a checkout
uv run pytest                                          # tests

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skaldr-0.7.0.tar.gz (41.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skaldr-0.7.0-py3-none-any.whl (48.5 kB view details)

Uploaded Python 3

File details

Details for the file skaldr-0.7.0.tar.gz.

File metadata

  • Download URL: skaldr-0.7.0.tar.gz
  • Upload date:
  • Size: 41.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for skaldr-0.7.0.tar.gz
Algorithm Hash digest
SHA256 fd37075db8c6ff9559f2c68898ec41bc59793a231dc1bf7dd003137762d8f1aa
MD5 66de0b6da4be2272e65c3196b3281035
BLAKE2b-256 b1c39b863222d79ebe458d5cdfbaa110dcf63071c18fb8095ea1aee1c799ab41

See more details on using hashes here.

Provenance

The following attestation bundles were made for skaldr-0.7.0.tar.gz:

Publisher: publish.yml on alex-yanchenko/skaldr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file skaldr-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: skaldr-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 48.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for skaldr-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9eca837b62370feeb4def2969582e30cbaab63677cd2b08ffe4c7cdd6f387fdc
MD5 73462ba670ab06970457f41a39d26eb1
BLAKE2b-256 4c86e635c8f4f267e759e866986b6f53dad0672400d8d4026801ffee9a79ff3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for skaldr-0.7.0-py3-none-any.whl:

Publisher: publish.yml on alex-yanchenko/skaldr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2.11.1

2 files

2.11.0

2 files

2.10.0

2 files

2.9.0

2 files

2.8.0

2 files

2.7.0

2 files

2.6.0

2 files

2.5.0

2 files

2.4.0

2 files

2.3.0

2 files

2.2.1

2 files

2.2.0

2 files

2.1.0

2 files

2.0.0

2 files

1.4.0

2 files

1.3.3

2 files

1.3.2

2 files

1.3.1

2 files

1.3.0

2 files

1.2.0

2 files

1.1.0

2 files

1.0.1

2 files

1.0.0

2 files

0.8.0

2 files

This release

0.7.0 This release

2 files

0.6.0

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

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