An open API service indexing awesome lists of open source software.

https://github.com/unicolab/holysheet

HolySheet is a Python package that generates beautiful, self-contained, interactive HTML dashboards powered by React โ€” without requiring the end user to install Node.js, npm, or any frontend tooling.
https://github.com/unicolab/holysheet

Last synced: 21 days ago
JSON representation

HolySheet is a Python package that generates beautiful, self-contained, interactive HTML dashboards powered by React โ€” without requiring the end user to install Node.js, npm, or any frontend tooling.

Awesome Lists containing this project

README

          


HolySheet Mascot

๐Ÿ“Š HolySheet


Python-first report compiler that turns raw data into stunning,
interactive React dashboards โ€” zero frontend knowledge required.


HolySheet โ€” Data to Dashboard


PyPI
Downloads
Python
License
CI
Docs


๐Ÿ“– Documentation โ€ข
Screenshots โ€ข
Quickstart โ€ข
Installation โ€ข
Block Reference โ€ข
Examples โ€ข
Architecture โ€ข
Development

---

## ๐Ÿ“ธ See It In Action

> **Don't take our word for it โ€” see what HolySheet generates:**

๐ŸŒ™ Dark Theme

HolySheet Dark Theme Dashboard

โ˜€๏ธ Light Theme

HolySheet Light Theme Dashboard

๐Ÿ‘” Executive Theme

HolySheet Executive Theme Dashboard


All dashboards above are generated from Python code โ€” zero frontend knowledge required.
Each is a single, self-contained HTML file that opens in any browser.

๐Ÿ“Š Basic Report

HolySheet Basic Report

KPI cards + line chart ยท Light theme

๐Ÿ’ผ Sales Analytics

HolySheet Sales Dashboard

Tabbed charts + KPIs ยท Executive theme

๐Ÿข Portfolio Report

HolySheet Portfolio Report

Columns layout + data table ยท Dark theme

๐Ÿš€ Full Showcase

HolySheet Full Showcase

37 blocks, all chart types ยท Dark theme

---

## โœจ What is HolySheet?

**HolySheet** generates stunning, self-contained, interactive HTML dashboards powered by **React** + **Apache ECharts** โ€” without requiring Node.js, npm, or any frontend tooling.

> *Write your dashboard in Python. Get a gorgeous interactive report as a single HTML file.*
> *No server. No dependencies. Just open it in a browser. Holy Sheet, that's easy!*

### โšก Key Highlights

- ๐Ÿงฑ **57 block types** โ€” 18 charts, 6 metrics, 14 content/data, 8 layout, 9 interactive, AI insights + SQL
- ๐ŸŽจ **3 premium themes** โ€” Dark, Light, and Executive with full design systems
- ๐Ÿ“ฆ **Single-file export** โ€” One `.html` file (~1.5 MB) with everything embedded
- ๐Ÿผ **Any data source** โ€” Pandas, Polars, dicts, lists, Google Sheets
- ๐Ÿค– **AI-powered insights** โ€” OpenAI, Anthropic, Google Gemini integration
- ๐Ÿ” **Enterprise features** โ€” Password protection, expiring reports, PDF export
- ๐Ÿ”ง **Developer tools** โ€” CLI, hot-reload dev server, linting, report diff
- ๐Ÿ“ฑ **Responsive & PWA** โ€” Works on mobile, supports offline mode

```python
from holysheet import Report, KPI, LineChart, DataTable

report = Report(title="Executive Portfolio Report", theme="dark")

report.add(KPI(label="Revenue", value=1_250_000, unit="โ‚ฌ", delta="+12%", status="positive"))
report.add(LineChart(title="Revenue Trend", data=revenue_df, x="date", y="revenue"))
report.add(DataTable(title="Projects", data=projects_df))

report.export_html("report.html") # โ† That's it. Open in any browser.
```

---

## ๐Ÿ™ Why HolySheet?

| ๐Ÿ˜ฉ The Problem | ๐Ÿ˜‡ The HolySheet Way |
|---|---|
| Dashboards require complex frontend setup | **Zero** frontend knowledge needed |
| Reports need a running server | Self-contained HTML files โ€” open anywhere |
| Visualization libraries produce basic charts | Enterprise-grade React UI with interactive ECharts |
| Sharing reports is painful | Single HTML file โ€” email it, Slack it, embed it |
| Python-to-dashboard tools look dated | Modern Material UI design with dark/light/executive themes |
| Data wrangling across libraries | Native **Pandas**, **Polars**, dict, and list support |

---

## ๐Ÿš€ Quickstart

### 1. Install

```bash
pip install holysheet
```

### 2. Build a dashboard

```python
from holysheet import Report, KPI, LineChart, BarChart, PieChart, DataTable, Section

report = Report(
title="Q4 Business Review",
subtitle="Revenue & Operations Dashboard",
theme="dark",
author="Data Team",
)

# KPI cards โ€” they auto-arrange in a responsive grid
report.add(KPI(label="Total Revenue", value=2_450_000, unit="โ‚ฌ", delta="+18%", status="positive"))
report.add(KPI(label="Active Clients", value=142, delta="+12", status="positive"))
report.add(KPI(label="Churn Rate", value=3.2, unit="%", delta="-0.5%", status="positive"))
report.add(KPI(label="NPS Score", value=72, delta="+5", status="positive"))

# Charts โ€” pass any DataFrame or list of dicts
report.add(LineChart(title="Monthly Revenue", data=revenue_data, x="month", y="revenue"))
report.add(BarChart(title="Revenue by Region", data=region_data, x="region", y="revenue"))
report.add(PieChart(title="Revenue Split", data=split_data, name="category", value="amount"))

# Searchable, paginated data table
report.add(DataTable(title="Top Clients", data=clients_data, columns=["name", "revenue", "status"]))

# Export โ†’ a single portable HTML file
report.export_html("q4_review.html")
```

### 3. Open & share

```bash
open q4_review.html # macOS
xdg-open q4_review.html # Linux
start q4_review.html # Windows
```

The HTML file is fully standalone โ€” no server, no internet, no Node.js. Send it via email, upload to S3, embed in Confluence โ€” it just works.

---

## ๐Ÿ“ฆ Installation

```bash
# Core (zero extras)
pip install holysheet

# With Pandas support
pip install holysheet[pandas]

# With PDF export
pip install holysheet[pdf]

# With AI insights (OpenAI / Anthropic / Google)
pip install holysheet[ai]

# With cloud publishing (S3 / GCS)
pip install holysheet[cloud]

# With Google Sheets data source
pip install holysheet[gsheets]

# Everything
pip install holysheet[all]
```

**Requirements:**
- ๐Ÿ Python **3.11+**
- ๐Ÿšซ No Node.js required
- ๐Ÿšซ No frontend build step
- ๐Ÿšซ No running server

**Core dependencies:** `pydantic v2` ยท `jinja2` ยท `orjson` ยท `loguru` ยท `click`

---

## ๐Ÿงฑ Block Reference

HolySheet ships with **57 block types** organized into seven categories.

๐Ÿ–ผ๏ธ Block Preview โ€” Charts & Data Tables

HolySheet Chart Types

18 chart types: line, bar, pie, radar, heatmap, funnel, and more

HolySheet Data Table

Interactive tables with search, sort, pagination & conditional formatting

๐Ÿ–ผ๏ธ Block Preview โ€” KPI Cards Across Themes



HolySheet KPI Cards โ€” Dark, Light, Executive


KPI cards automatically adapt to your chosen theme

### ๐Ÿ“Š Charts (18)

| Block | Description | Key Props |
|---|---|---|
| `LineChart` | Multi-series line chart | `data`, `x`, `y`, `series`, `annotations` |
| `AreaChart` | Filled area chart | `data`, `x`, `y`, `series`, `annotations` |
| `BarChart` | Grouped/stacked bar chart | `data`, `x`, `y`, `series`, `annotations` |
| `PieChart` | Pie / donut chart | `data`, `name`, `value` |
| `ScatterChart` | Scatter / bubble plot | `data`, `x`, `y`, `size`, `category` |
| `RadarChart` | Radar / spider chart | `data`, `indicators` |
| `GaugeChart` | Speedometer gauge | `value`, `min`, `max`, `thresholds` |
| `FunnelChart` | Conversion funnel | `data`, `name`, `value` |
| `TreemapChart` | Hierarchical treemap | `data`, `name`, `value`, `category` |
| `HeatmapChart` | 2D heatmap with color gradient | `data`, `x`, `y`, `value` |
| `CandlestickChart` | Financial OHLC chart | `data`, `x`, `open`, `close`, `low`, `high` |
| `SankeyChart` | Flow / energy diagram | `nodes`, `links` |
| `WaterfallChart` | Waterfall / bridge chart | `data`, `category`, `value` |
| `BoxPlotChart` | Statistical box plot | `data`, `categories` |
| `MapChart` | Geographical scatter | `data`, `lat`, `lng`, `value`, `name` |
| `GanttChart` | Project timeline ๐Ÿ†• | `tasks` `[{name, start, end, progress}]` |
| `DAGChart` | Directed acyclic graph ๐Ÿ†• | `nodes`, `edges`, `layout` |
| `CorrelationMatrix` | Correlation heatmap ๐Ÿ†• | `matrix`, `labels` |

### ๐Ÿง  AI & Data Sources (3)

| Block | Description | Key Props |
|---|---|---|
| `AIInsight` | LLM-powered data narrative ๐Ÿ†• | `data`, `provider`, `prompt`, `api_key` |
| `GoogleSheet` | Google Sheets data source ๐Ÿ†• | `spreadsheet_id`, `sheet_name`, `range` |
| `SqlBlock` | Client-side SQL queries ๐Ÿ†• | `query`, `data`, `output` |

### ๐Ÿ“ˆ Metrics (6)

| Block | Description | Key Props |
|---|---|---|
| `KPI` | Key metric card with delta + tooltips | `label`, `value`, `unit`, `delta`, `status`, `tooltip_detail` |
| `Metric` | Compact inline metric | `label`, `value`, `unit`, `icon` |
| `ProgressBar` | Progress indicator | `label`, `value`, `max`, `color` |
| `StatComparison` | Side-by-side comparison | `title`, `items` |
| `Scorecard` | Conditional color metric grid ๐Ÿ†• | `data`, `columns`, `thresholds` |
| `DataProfile` | Auto-EDA summary cards ๐Ÿ†• | `columns` `[{name, dtype, count, ...}]` |

### ๐Ÿ“ Content (12)

| Block | Description | Key Props |
|---|---|---|
| `DataTable` | Searchable table + conditional formatting | `data`, `columns`, `formatting`, `downloadable` |
| `Markdown` | Rich text content | `content` |
| `CodeBlock` | Syntax-highlighted code | `code`, `language`, `title` |
| `Image` | Image display | `src`, `alt`, `caption` |
| `Alert` | Callout / notification | `severity`, `title`, `message` |
| `Timeline` | Vertical event timeline | `events` `[{date, title, description}]` |
| `Callout` | Styled quote / highlight | `content`, `author`, `variant` |
| `JsonViewer` | Interactive JSON tree | `data`, `collapsed_depth` |
| `UserCard` | Team member card | `name`, `role`, `avatar_url`, `stats` |
| `StatusList` | Status indicators list | `items` `[{label, status, value}]` |
| `InfoList` | Key-value pair display | `items` `[{key, value, icon}]` |
| `Sparkline` | Tiny inline chart | `data`, `color`, `show_area` |
| `NarrationBlock` | Voice narration (Web Speech API) ๐Ÿ†• | `text`, `autoplay` |

### ๐Ÿ“ Layout (8)

| Block | Description | Key Props |
|---|---|---|
| `Section` | Group blocks with a heading | `title`, `description`, `children` |
| `Columns` | Multi-column responsive grid | `children`, `widths` |
| `Tabs` | Tabbed content panels | `tabs` (list of `{label, children}`) |
| `Divider` | Visual separator line | `label`, `variant` |
| `Accordion` | Collapsible content panels | `panels` (list of `{title, children}`) |
| `Stepper` | Process / wizard steps | `steps` `[{label, description, status}]` |
| `TagList` | Colored tag/badge chips | `tags` `[{label, color}]` |
| `Compare` | Side-by-side comparison layout ๐Ÿ†• | `left_label`, `right_label`, `left_children`, `right_children` |

### ๐ŸŽฎ Interactive (9)

| Block | Description | Key Props |
|---|---|---|
| `Slider` | Range slider input | `label`, `min`, `max`, `default_value` |
| `NumberInput` | Numeric input field | `label`, `default_value`, `step` |
| `Toggle` | On/off switch | `label`, `default_value` |
| `Dropdown` | Select from options | `label`, `options`, `default_value` |
| `TextInput` | Text / textarea input | `label`, `placeholder`, `multiline` |
| `CheckboxGroup` | Multiple checkboxes | `label`, `options`, `default_values` |
| `RadioGroup` | Single-select radio buttons | `label`, `options`, `default_value` |
| `Embed` | Iframe embed | `url`, `height`, `aspect_ratio` |
| `Video` | HTML5 video player | `src`, `poster`, `controls` |

---

## ๐ŸŽจ Themes

Three built-in themes ship out of the box:

```python
report = Report(title="Report", theme="dark") # ๐ŸŒ™ Deep dark, vibrant accents
report = Report(title="Report", theme="light") # โ˜€๏ธ Clean, professional, airy
report = Report(title="Report", theme="executive") # ๐Ÿ‘” Premium serif with rich greens
```

Each theme defines a complete design system: colors, typography (Inter / Georgia), spacing, shadows, and an 8-color chart palette.

๐ŸŒ™ Dark

Dark Theme

Glassmorphism cards, vibrant accents
Ideal for internal dashboards

โ˜€๏ธ Light

Light Theme

Clean, professional, print-ready
Ideal for client-facing reports

๐Ÿ‘” Executive

Executive Theme

Gold accents, serif typography
Ideal for board presentations

---

## ๐Ÿ“š Examples

### Minimal Status Page

```python
from holysheet import Report, KPI, Markdown, Alert

report = Report(title="System Status", theme="dark")

report.add(Alert(severity="success", title="All Systems Operational", message="Last checked: 2 minutes ago"))
report.add(KPI(label="Uptime", value=99.97, unit="%", status="positive"))
report.add(KPI(label="Response Time", value=142, unit="ms", status="neutral"))
report.add(KPI(label="Error Rate", value=0.03, unit="%", delta="-0.01%", status="positive"))
report.add(Markdown(content="Monitored endpoints: **API**, **Auth**, **CDN**, **Database**"))

report.export_html("status.html")
```

### Executive Dashboard with Sections & Columns

```python
from holysheet import Report, KPI, LineChart, BarChart, DataTable, Section, Columns, Markdown

report = Report(
title="AIFlow Executive Report",
subtitle="Portfolio risk and delivery intelligence",
theme="executive",
author="Strategy Team",
)

# Executive summary
report.add(Markdown(content="""
## Executive Summary

Portfolio health remains strong with 42 active projects delivering on schedule.
Risk-adjusted returns are trending positively, with a 12% improvement in delivery confidence.
"""))

# Note: Variables like risk_df, team_df, projects_df should be your DataFrames

# KPI grid inside a section
report.add(Section(
title="Key Metrics",
children=[
KPI(label="Active Projects", value=42, delta="+3", status="positive"),
KPI(label="On-Track", value=87, unit="%", status="positive"),
KPI(label="At-Risk", value=5, status="negative"),
KPI(label="Budget Utilization", value=76, unit="%", status="neutral"),
],
))

# Side-by-side charts
report.add(Columns(children=[
LineChart(title="Risk Score Trend", data=risk_df, x="date", y="score"),
BarChart(title="Delivery by Team", data=team_df, x="team", y="delivered"),
]))

# Detailed data
report.add(DataTable(
title="Project Details",
data=projects_df,
columns=["project", "owner", "risk", "status", "completion"],
))

report.export_html("executive_report.html")
```

### Multi-Chart Analytics with Tabs

```python
from holysheet import Report, Tabs, LineChart, BarChart, PieChart, FunnelChart

report = Report(title="Sales Analytics", theme="dark")

report.add(Tabs(tabs=[
{
"label": "๐Ÿ“ˆ Trends",
"children": [
LineChart(title="Monthly Sales", data=sales_df, x="month", y="total"),
LineChart(title="Customer Growth", data=growth_df, x="month", y="customers"),
],
},
{
"label": "๐Ÿ“Š Breakdown",
"children": [
BarChart(title="Sales by Region", data=region_df, x="region", y="sales"),
PieChart(title="Product Mix", data=product_df, name="product", value="revenue"),
],
},
{
"label": "๐Ÿ”„ Pipeline",
"children": [
FunnelChart(title="Sales Funnel", data=funnel_df, name="stage", value="count"),
],
},
]))

report.export_html("sales_analytics.html")
```

๐Ÿ–ผ๏ธ Example Output โ€” Sales Dashboard (Executive Theme)



Sales Dashboard Output


Generated by examples/sales_dashboard.py โ€” a single self-contained HTML file

> ๐Ÿ’ก **More examples** in the [`examples/`](examples/) directory โ€” including a full showcase with every block type.

---

## ๐Ÿ“ค Export Modes

### Standalone HTML *(default)*

```python
report.export_html("report.html")
```

Generates a **single, self-contained HTML file** (~1.5 MB) with embedded React, CSS, and data. Zero external dependencies. Open directly in any browser.

### Folder Export

```python
report.export_folder("dist/")
```

Generates a deployable folder structure:

```
dist/
index.html โ† Entry point
assets/
app.js โ† React bundle
app.css โ† Styles
report.json โ† Dashboard spec
```

Ideal for hosting on a web server, S3, or CDN.

### PDF Export

```python
report.export_pdf("report.pdf", landscape=True, margin="0.5in")
```

Requires Playwright (`pip install holysheet[pdf]`) or Chrome/Chromium.

### JSON Export

```python
report.export_json("report.json")
```

Exports just the dashboard specification as JSON. Useful for debugging, version control, or feeding into external rendering pipelines.

---

## ๐Ÿ—„๏ธ Data Formats

HolySheet auto-detects and converts data from multiple formats:

```python
# โœ… List of dicts
data = [{"name": "Alice", "score": 95}, {"name": "Bob", "score": 87}]

# โœ… Dict of lists
data = {"name": ["Alice", "Bob"], "score": [95, 87]}

# โœ… Pandas DataFrame
import pandas as pd
data = pd.DataFrame({"name": ["Alice", "Bob"], "score": [95, 87]})

# โœ… Polars DataFrame
import polars as pl
data = pl.DataFrame({"name": ["Alice", "Bob"], "score": [95, 87]})
```

All formats are normalized to records internally via `holysheet.data.to_records()`.

---

## ๐Ÿ’ป CLI

```bash
# Validate a report spec
holysheet validate report.json

# Serve a report locally (opens browser)
holysheet serve report.json

# Hot-reload dev server โ€” auto-refreshes on Python script changes
holysheet dev my_report.py --port 8000

# Lint a report for best practices
holysheet lint my_report.py --strict

# Compare two report versions
holysheet diff old_report.json new_report.json

# Show version
holysheet version

# Publish to S3 or Google Cloud Storage
holysheet publish report.html -t s3://my-bucket/reports/q4.html --public
holysheet publish report.html -t gs://my-bucket/reports/q4.html
```

---

## ๐Ÿ”ฅ Advanced Features

### Custom Themes

```python
from holysheet import Report, Theme

brand = Theme(name="acme", primary="#FF6B00", background="#0A0A0F", font="Satoshi")
report = Report(title="Acme Report", theme=brand)
```

### Multi-Page Reports

```python
report.add_page("Overview", [KPI(label="Revenue", value="$1.2M")])
report.add_page("Details", [DataTable(title="Breakdown", data=df)])
```

### Chart Annotations

```python
report.add(LineChart(
title="Revenue", data=df, x="month", y="revenue",
annotations=[{"x": "Mar", "text": "Product Launch", "color": "#22d3ee"}]
))
```

### Global Filters

```python
report.add_filter("region", type="dropdown", options=["NA", "EU", "APAC"])
```

### Jupyter Integration

```python
report.show() # Renders inline in Jupyter notebook
```

### Password Protection & Expiry

```python
report.export_html("secure.html", password="s3cret") # AES-256 encrypted
Report(title="Temp", expires="2025-12-31") # Auto-expires
```

### Report Templates

```python
from holysheet.templates import SalesDashboard, ExecutiveSummary, OpsMonitor

blocks = SalesDashboard(data={"kpis": {"revenue": "$1.2M", "deals_won": 42}})
```

### Anomaly Detection

```python
report.add(LineChart(
title="Server Latency", data=metrics, x="time", y="latency_ms",
anomaly_detection=True, # Auto-detect and annotate outliers
))
```

### AI-Powered Insights

```python
from holysheet import AIInsight
report.add(AIInsight(title="Key Findings", data=df, provider="openai"))
```

### SQL Block

```python
from holysheet import SqlBlock
report.add(SqlBlock(
query="SELECT region, SUM(revenue) FROM data GROUP BY region",
data=sales_df,
))
```

### Voice Narration

```python
from holysheet import NarrationBlock
report.add(NarrationBlock(text=report.auto_narrate()))
```

---

## ๐Ÿ—๏ธ Architecture

```
Python API โ†’ Pydantic v2 Schema โ†’ JSON Spec โ†’ React Renderer โ†’ HTML Dashboard
```

HolySheet operates in two distinct phases:

### ๐Ÿ”ง Build Time *(Python โ€” your machine)*

1. You define blocks using the Python API
2. HolySheet validates everything with **Pydantic v2** models
3. Generates a versioned JSON dashboard specification
4. Injects the spec into a **prebuilt React application**
5. Exports a self-contained HTML file via **Jinja2** templates

### ๐ŸŒ Runtime *(Browser โ€” any machine)*

1. Browser opens the HTML file (no server needed)
2. React reads the embedded dashboard spec from ``
3. Renders each block through a **component registry** (`type` โ†’ React component)
4. Charts become interactive via **Apache ECharts**
5. Tables support real-time search and pagination

> **The key insight:** The React app is **prebuilt and bundled inside the Python package**. End users never need Node.js, npm, or any frontend tooling.

### Project Structure

```
HolySheet/
src/holysheet/ # Python package
__init__.py # Public API (20 block types + Report)
blocks.py # Pydantic v2 block models
schema.py # Report schema model
report.py # Main Report class + export methods
data.py # Data normalization (pandas/polars/dict/list)
exporters.py # HTML / folder / JSON exporters
themes.py # Theme system (light / dark / executive)
exceptions.py # Custom exception hierarchy
cli.py # Click-based CLI (validate, serve, version)
renderer/ # Prebuilt React assets (JS + CSS)
templates/ # Jinja2 HTML templates

frontend/ # React source (development only)
src/
components/ # React block components
theme.ts # MUI theme definitions
registry.tsx # Block type โ†’ component mapping
types.ts # TypeScript interfaces

tests/ # Python test suite
examples/ # Example scripts
```

---

## ๐Ÿ› ๏ธ Development

### Prerequisites

- Python **3.11+**
- Node.js **18+** *(frontend development only)*
- Make

### Setup

```bash
git clone https://github.com/UnicoLab/HolySheet.git
cd HolySheet

# Full development setup (frontend + Python)
make dev

# Or step by step:
make frontend-install # Install frontend npm dependencies
make frontend-build # Build React app โ†’ src/holysheet/renderer/
make install # Install Python package in editable mode
```

### Common Commands

```bash
make test # Run Python test suite
make lint # Lint with ruff
make typecheck # Type-check with mypy (strict mode)
make format # Auto-format with ruff
make build # Build distributable wheel + sdist
make clean # Clean all build artifacts
```

### Releases

HolySheet uses [python-semantic-release](https://github.com/python-semantic-release/python-semantic-release) with conventional commits:

| Prefix | Effect |
|---|---|
| `feat:` | Minor version bump |
| `fix:` / `perf:` | Patch version bump |
| `BREAKING CHANGE:` | Major version bump |

---

## ๐Ÿ—บ๏ธ Roadmap

- [x] ๐Ÿ“Š Advanced chart types (Sankey, Gantt, DAG, Correlation Matrix)
- [x] ๐Ÿ” Interactive filters and global filter bar
- [x] ๐Ÿ“‘ Multi-page tabbed report navigation
- [x] ๐ŸŽจ Custom theme API + enterprise branding
- [x] ๐Ÿ” Password-protected & expiring reports
- [x] ๐Ÿ“ฅ CSV download buttons on tables & charts
- [x] ๐Ÿ““ Jupyter notebook integration
- [x] ๐ŸŽฏ Chart annotations (vertical lines, point markers)
- [x] ๐Ÿ“ฝ๏ธ Presentation mode (sections as slides)
- [x] ๐ŸŒ— Dark/Light theme toggle in viewer
- [x] ๐Ÿ—๏ธ Report templates (SalesDashboard, ExecutiveSummary, OpsMonitor)
- [x] ๐Ÿ”ง Hot-reload dev server + report linting + report diff CLI
- [x] ๐Ÿค– AI narrative blocks (AIInsight with OpenAI / Anthropic / Google)
- [x] ๐Ÿ“„ PDF export (Playwright / Chrome)
- [x] ๐Ÿ—„๏ธ SQL Block (client-side query engine)
- [x] ๐Ÿ”Š Voice narration (Web Speech API)
- [x] ๐Ÿ“ˆ Anomaly detection on charts (IQR + MAD)
- [x] โ˜๏ธ Cloud publish CLI (S3 / GCS)
- [x] ๐Ÿ“Š Google Sheets data source
- [x] ๐Ÿ”„ Cross-block reactive filtering
- [x] ๐Ÿ“œ Virtual scrolling for large tables
- [x] ๐Ÿ—บ๏ธ Report navigator (minimap)
- [x] ๐Ÿ“ฑ PWA mode + responsive layouts
- [ ] ๐Ÿ“Š PowerPoint export
- [ ] ๐Ÿงฉ Custom React component injection
- [ ] ๐Ÿ’ฌ Local chatbot over report data

---

## ๐Ÿค Contributing

Contributions are welcome! Here's how to get started:

1. **Fork** the repository
2. **Create** a feature branch: `git checkout -b feat/amazing-feature`
3. **Write** your changes with tests
4. **Check** everything passes: `make lint && make typecheck && make test`
5. **Commit** with [conventional commits](https://www.conventionalcommits.org/): `feat:`, `fix:`, `docs:`, etc.
6. **Open** a Pull Request

See the [Contributing Guide](CONTRIBUTING.md) for detailed instructions.

---

## ๐Ÿ“„ License

MIT License โ€” see [LICENSE](LICENSE) for details.

---

<p align="center">
Built with โค๏ธ by <a href="https://github.com/UnicoLab">UnicoLab</a>
</p>

<p align="center">
<sub>Holy Sheet, that's a beautiful dashboard! ๐Ÿ™Œ</sub>
</p>

<p align="center">
<sub>
<a href="https://pypi.org/project/holysheet">PyPI</a> ยท
<a href="https://unicolab.github.io/holysheet">Documentation</a> ยท
<a href="https://github.com/UnicoLab/holysheet/issues">Issues</a> ยท
<a href="https://github.com/UnicoLab/holysheet/discussions">Discussions</a>
</sub>
</p>