Generate interactive HTML dashboards and visualizations from LimaCharlie data using Jinja2 templates and D3.js charts. Creates professional, self-contained HTML reports with pie charts, bar charts, line graphs, gauges, sortable tables, and responsive layouts. Supports MSSP multi-tenant dashboards, single-org details, sensor health reports, detection analytics, and billing summaries. Integrates with reporting, sensor-health, and detection-engineering skills. Built with strict data accuracy guardrails - NEVER fabricates, estimates, or infers data. Use for "visual report", "dashboard", "HTML output", "interactive charts", "export HTML", "generate visualization", "graphical report".
Generates interactive HTML dashboards from LimaCharlie data using D3.js charts and Jinja2 templates.
/plugin marketplace add refractionPOINT/lc-ai/plugin install refractionpoint-lc-essentials-marketplace-plugins-lc-essentials@refractionPOINT/lc-aiThis skill is limited to using the following tools:
schemas/billing-summary.jsonschemas/custom-report.jsonschemas/mssp-report.jsonschemas/security-overview.jsonstatic/js/lc-charts.jstemplates/base.html.j2templates/reports/billing-summary.html.j2templates/reports/custom-report.html.j2templates/reports/mssp-dashboard.html.j2templates/reports/security-overview.html.j2Generate interactive HTML dashboards and visualizations from structured LimaCharlie data. This skill transforms JSON report data into professional, self-contained HTML documents with D3.js charts and interactive elements.
Core Philosophy: Visualize ONLY what exists. This skill has strict guardrails that make data fabrication impossible. Every chart, number, and label must come directly from the input data.
Prerequisites: Run
/init-lcto initialize LimaCharlie context.
| Rule | Wrong | Right |
|---|---|---|
| Data Fabrication | Generate, estimate, or infer missing data | Show "N/A" or "Data unavailable" |
| Data Modification | Round, truncate, or rename values | Display values exactly as provided |
| Missing Fields | Show zero for missing values | Show empty state with clear messaging |
Absolute Rules:
Always:
Absolute Rules:
Display Formatting Allowed:
NOT Allowed:
Every visualization MUST indicate:
Example:
Data Source: reporting skill (org-reporter agents)
Collected: 2025-11-27 14:32:45 UTC
Time Window: Nov 1-30, 2025 (30 days)
Note: 4 organizations hit detection limit - actual counts higher
When data is missing or unavailable:
For Charts:
For Metrics/Cards:
For Tables:
All warnings from source data MUST be displayed:
Warnings must be:
Do NOT perform:
Exception: The following display-only calculations are permitted:
Before rendering any visualization, verify:
[ ] Every value traces to input data
[ ] No fields contain fabricated content
[ ] Missing data shows as "N/A" not zero
[ ] All warnings from input are displayed
[ ] Data source and timestamp shown
[ ] Time window clearly indicated
[ ] Detection limits flagged if present
[ ] Failed organizations documented
If the skill detects a guardrail violation:
ERROR: Data Accuracy Violation
Attempted to render chart with fabricated data.
Field 'detection_trend' was not provided in input.
Resolution: Either provide the required data from a source skill,
or use a template that doesn't require this field.
This skill will NOT generate placeholder, example, or estimated data.
Use this skill when the user needs to:
reporting skill - visualize the collected datasensor-health skill - create health dashboarddetection-engineering testing - visualize test resultsThis skill:
html-renderer subagent to generate HTMLOutput Characteristics:
| Template | Description | Best For |
|---|---|---|
mssp-dashboard | Multi-tenant overview with aggregate metrics, org table, charts | MSSP/multi-org reports |
security-overview | Single-org comprehensive security report with platform breakdown, MITRE coverage, detection timeline, rules inventory | Individual org deep-dive |
billing-summary | Multi-tenant billing roll-up with per-tenant breakdown, SKU details, cost distribution charts | Billing/cost analysis |
custom-report | Component-based flexible reports - build any report by specifying which components to include | Ad-hoc/custom reports |
Note: Use custom-report when none of the predefined templates fit your needs. It supports composable components that can be arranged in any order.
The custom-report template supports these component types:
| Component | Description |
|---|---|
summary_cards | Grid of metric cards with icons, values, labels |
chart | Pie, doughnut, bar, or line charts |
two_column | Side-by-side charts layout |
table | Data tables with optional sorting |
metric_grid | Compact grid of small metrics |
platform_table | Platform breakdown with sensors/detections |
alert_banner | Info/warning/danger/success banners |
text_section | Free-form HTML content |
divider | Visual separator |
Example custom report request:
"Create a report with 3 summary cards showing sensors, detections, and rules, then a pie chart of platform distribution, and a table of my top 5 detection categories"
Before using this skill, you need:
Each template has required and optional fields. The skill will:
The graphic-output skill requires structured JSON data. This typically comes from:
IMPORTANT: The skill will ONLY visualize data that exists. It will NOT:
If integrating with the reporting skill, the data structure should include:
{
"metadata": {
"generated_at": "2025-11-27T14:32:45Z",
"time_window": {
"start": 1730419200,
"end": 1733011199,
"start_display": "2025-11-01 00:00:00 UTC",
"end_display": "2025-11-30 23:59:59 UTC",
"days": 30
},
"organizations": {
"total": 14,
"successful": 12,
"failed": 2,
"success_rate": 85.7
}
},
"data": {
"aggregate": { ... },
"organizations": [ ... ]
},
"warnings": [ "4 organizations hit detection limit" ],
"errors": [ { "org": "...", "error": "..." } ]
}
Choose the appropriate template based on data type:
mssp-dashboardorg-detailsensor-healthdetection-summarybilling-summaryUse the Task tool to spawn the html-renderer subagent:
Task(
subagent_type="lc-essentials:html-renderer",
model="haiku",
prompt="Render HTML dashboard with the following parameters:
Template: mssp-dashboard
Output Path: /tmp/lc-mssp-report-2025-11-27.html
Data:
{
\"metadata\": { ... },
\"data\": { ... },
\"warnings\": [ ... ],
\"errors\": [ ... ]
}
IMPORTANT: Apply strict data accuracy guardrails.
- Visualize ONLY data provided in the input
- Show 'N/A' for any missing fields
- Display all warnings prominently
- Do NOT fabricate any data
Return the file path and rendering summary when complete."
)
IMPORTANT: When generating any HTML report, always open it in the user's browser as the default completion action.
# On ChromeOS/Linux with garcon:
garcon-url-handler "http://localhost:8080/report.html"
# Alternative for other systems:
xdg-open "/tmp/report.html"
# or
open "/tmp/report.html" # macOS
Before opening, ensure an HTTP server is running to serve the file:
# Start server if not already running
cd /tmp && python3 -m http.server 8080 --bind 0.0.0.0 &
This ensures the user immediately sees their report without manual steps.
After the renderer completes and browser is opened, inform the user:
Interactive HTML dashboard generated successfully!
File: /tmp/lc-mssp-report-2025-11-27.html
Size: 245 KB
Data Provenance:
- Source: reporting skill
- Collected: 2025-11-27 14:32:45 UTC
- Time Window: Nov 1-30, 2025 (30 days)
- Organizations: 12 of 14 successful
Contents:
- Executive summary with 4 metric cards
- Platform distribution pie chart
- Organization health bar chart
- Detection category breakdown
- Daily detection trend line chart
- Sortable organization details table
- 2 warnings displayed (detection limits)
- 2 failed organizations documented
Data Accuracy:
- All visualizations show actual data from source
- No values were estimated or fabricated
- Missing data marked as "N/A"
Open this file in any web browser to view the interactive dashboard.
mssp-dashboard)Purpose: Multi-tenant overview for MSSPs managing multiple organizations
Visualizations:
Required Data Fields:
metadata.generated_at # When data was collected
metadata.time_window.start_display # Time range start
metadata.time_window.end_display # Time range end
metadata.organizations.total # Total org count
metadata.organizations.successful # Successful org count
data.aggregate.sensors.total # Total sensor count
data.aggregate.sensors.online # Online sensor count
data.aggregate.sensors.platforms # Platform breakdown object
data.aggregate.detections.retrieved # Detection count
data.aggregate.detections.top_categories # Array of {label, value}
data.aggregate.rules.total # Total rules
data.aggregate.rules.enabled # Enabled rules
data.organizations # Array of org objects
Optional Data Fields (shown if present, "N/A" if missing):
data.aggregate.detections.daily_trend # For trend chart
data.aggregate.detections.limit_reached # Limit warning flag
data.aggregate.detections.orgs_at_limit # Count of orgs at limit
data.aggregate.usage.* # Usage metrics
warnings # Array of warning strings
errors # Array of error objects
Guardrail Behavior:
daily_trend missing: Shows "Trend data not available" instead of chartplatforms empty: Shows "Platform data not available"warnings displayed in dedicated sectionerrors displayed with remediation stepssecurity-overview)Purpose: Comprehensive single-organization security report with platform breakdown, MITRE coverage, detection timeline, and rules inventory.
Visualizations:
Required Data Fields:
metadata.generated_at # When data was collected
metadata.time_window.start_display # Time range start
metadata.time_window.end_display # Time range end
metadata.org_name # Organization name
metadata.oid # Organization ID
data.summary.sensors_total # Total sensor count
data.summary.detections_total # Detection count
data.summary.rules_total # Total rules
Optional Data Fields (shown if present, "N/A" if missing):
data.summary.sensors_online # Online sensor count
data.summary.detections_24h # 24h detection count
data.summary.rules_enabled # Enabled rules
data.summary.mitre_coverage # MITRE coverage percentage
data.active_threats[] # Active threat alerts
data.platforms[] # Platform breakdown
data.hourly_detections[] # Detection timeline
data.top_detections[] # Top detection categories
data.mitre_techniques[] # MITRE technique coverage
data.rules.* # Rule inventory breakdown
data.attack_analysis.* # Attack pattern analysis
warnings # Array of warning strings
errors # Array of error objects
Guardrail Behavior:
hourly_detections missing: Shows "Timeline data not available"platforms empty: Shows "Platform data not available"mitre_techniques missing: MITRE section hiddenwarnings displayed prominentlyAll warnings MUST be displayed. The skill will:
Warning Types:
Example Warning Display:
⚠️ Data Limitations
• 4 organizations hit the 5,000 detection limit
Actual detection counts are higher than shown.
Affected: Acme Corp, GlobalTech, Nexus, Pinnacle
• 2 organizations failed completely
See Errors section for details.
• Billing data unavailable for 3 organizations
Required permission: billing:read
The skill will NOT render if required fields are missing:
Error: Cannot render mssp-dashboard
Missing required fields:
- data.aggregate.sensors.total
- data.aggregate.detections.top_categories
Resolution:
1. Ensure the source skill collected this data
2. Check for API errors in the source skill output
3. Use a different template that doesn't require these fields
Error: Invalid data type
Field: data.aggregate.sensors.total
Expected: number
Received: string ("unknown")
Resolution:
The source data contains invalid types. Check the source skill output.
When some data is available but not all:
Warning: Partial data available
Rendering with available data. The following are unavailable:
- Detection trend chart (daily_trend not provided)
- Billing status (billing data missing for 5 orgs)
These sections will show "Data unavailable" messages.
Generated HTML files are:
Data Provenance Section (Always Included):
<footer class="data-provenance">
<h3>Data Provenance</h3>
<dl>
<dt>Generated</dt>
<dd>2025-11-27 14:32:45 UTC</dd>
<dt>Time Window</dt>
<dd>Nov 1-30, 2025 (30 days)</dd>
<dt>Organizations</dt>
<dd>12 of 14 (85.7% success rate)</dd>
<dt>Data Source</dt>
<dd>LimaCharlie API via reporting skill</dd>
</dl>
<p class="accuracy-note">
All values shown are from actual API responses.
No data has been estimated, interpolated, or fabricated.
</p>
</footer>
skills/graphic-output/
├── SKILL.md # This file
├── IMPLEMENTATION_PLAN.md # Detailed implementation plan
├── templates/
│ ├── base.html.j2 # Base template with CSS, Chart.js utilities
│ └── reports/
│ ├── mssp-dashboard.html.j2 # Multi-tenant MSSP dashboard
│ ├── security-overview.html.j2 # Single-org security report
│ ├── billing-summary.html.j2 # Multi-tenant billing report
│ └── custom-report.html.j2 # Component-based flexible reports
├── static/
│ └── js/
│ └── lc-charts.js # Chart.js utility functions
└── schemas/
├── mssp-report.json # Schema for mssp-dashboard data
├── security-overview.json # Schema for security-overview data
├── billing-summary.json # Schema for billing-summary data
└── custom-report.json # Schema for custom-report components
This skill should be used when the user asks about libraries, frameworks, API references, or needs code examples. Activates for setup questions, code generation involving libraries, or mentions of specific frameworks like React, Vue, Next.js, Prisma, Supabase, etc.