report-builder

Solid

Build self-contained, single-page HTML reports and dashboards from data using Python + Jinja2 + Bootstrap 5 with Chart.js or Plotly. Use whenever the task is to produce an HTML report, data dashboard, metrics page, status page, or any single-file web artifact rendered from data — even if the user only says "report", "dashboard", "summary page", "visualize this", or hands you a CSV/DataFrame/JSON and wants it shown. Covers the render harness (Jinja2 autoescape discipline, passing data to JS safely with tojson), the Chart.js-vs-Plotly decision, Bootstrap 5 layout, and producing a portable single file. Pairs with markdown-converter (to ingest source docs) and is read by code-builder when it implements front-end report work.

Data & Documents 8 stars 1 forks Updated today MIT

Install

View on GitHub

Quality Score: 81/100

Stars 20%
32
Recency 20%
100
Frontmatter 20%
70
Documentation 15%
100
Issue Health 10%
80
License 10%
100
Description 5%
100

Skill Content

# Report Builder The job is almost always the same shape: **data in → one HTML file out**, rendered by a template, viewable by double-clicking with no server. Keep that shape and the work stays small and reproducible. The two failure modes to design against are (1) non-determinism (charts that fetch live, timestamps that drift) and (2) unsafe data interpolation (raw values dropped into HTML or `<script>`). Both are solved below. ## The pattern ``` data (CSV / DataFrame / JSON) └─ your prep code (pandas, optional) → a plain JSON "context" └─ Jinja2 template (.html.j2) → scripts/render.py └─ one self-contained report.html ``` Separate **prep** (project-specific, may use pandas) from **render** (generic, reusable). `scripts/render.py` is the generic half — point it at a template and a JSON context file and it emits HTML. Don't rewrite it per project. Run `render.py` by its **absolute path** — it lives in this skill's base directory (announced when the skill loads, usually `~/.claude/skills/report-builder`); a relative `report-builder/scripts/render.py` won't resolve from another repo. It has PEP 723 inline deps (jinja2), so it **must** run under `uv` — never bare `python`. Define an `rbuild` function per block (a function passes arguments correctly under bash and zsh, where a plain `$VAR` doesn't word-split; re-declare it per block since shell state doesn't persist between tool calls): ```bash # uv is required here (jinja2); resolve it even wh...

Details

Author
kevin-burns
Repository
kevin-burns/claude-skills
Created
2 months ago
Last Updated
today
Language
Python
License
MIT

Bundled in these plugins

Similar Skills

Semantically similar based on skill content — not just same category