health-charts

Generate and configure Chart.js health data visualizations including severity timelines, frequency bar charts, trigger correlation charts, and calendar heatmaps. Use when building or modifying charts in any healthcare or wellness tracking app.

7 stars

Best use case

health-charts is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Generate and configure Chart.js health data visualizations including severity timelines, frequency bar charts, trigger correlation charts, and calendar heatmaps. Use when building or modifying charts in any healthcare or wellness tracking app.

Teams using health-charts should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/health-charts/SKILL.md --create-dirs "https://raw.githubusercontent.com/heldernoid/agentic-build-templates/main/projects/healthcare-wellness/symptom-journal/skills/health-charts/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/health-charts/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How health-charts Compares

Feature / Agenthealth-chartsStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Generate and configure Chart.js health data visualizations including severity timelines, frequency bar charts, trigger correlation charts, and calendar heatmaps. Use when building or modifying charts in any healthcare or wellness tracking app.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# health-charts

Chart.js patterns and configurations for health tracking data visualizations.

## When to use

- Building a severity-over-time line chart
- Creating a symptom frequency bar chart
- Rendering a trigger correlation horizontal bar chart
- Building a calendar heatmap for symptom intensity
- Displaying a radar chart for body-part or time-of-day distribution

## Chart.js global health config

Apply these global defaults in your app initialization to match the health theme:

```typescript
import { Chart, defaults } from 'chart.js';

defaults.font.family = "'Instrument Sans', system-ui, sans-serif";
defaults.font.size = 12;
defaults.color = '#57534e'; // --text-secondary
defaults.borderColor = '#e7e5e4'; // --border
defaults.plugins.legend.labels.usePointStyle = true;
defaults.plugins.legend.labels.pointStyleWidth = 10;
defaults.plugins.tooltip.backgroundColor = '#ffffff';
defaults.plugins.tooltip.borderColor = '#e7e5e4';
defaults.plugins.tooltip.borderWidth = 1;
defaults.plugins.tooltip.titleColor = '#1c1917';
defaults.plugins.tooltip.bodyColor = '#57534e';
defaults.plugins.tooltip.cornerRadius = 8;
defaults.plugins.tooltip.padding = 10;
```

## Severity color helper

Map a numeric severity (1-10) to the appropriate CSS variable color:

```typescript
function severityColor(value: number): string {
  if (value <= 3) return '#16a34a'; // --severity-low
  if (value <= 6) return '#d97706'; // --severity-mid
  return '#dc2626';                  // --severity-high
}

function severityBgColor(value: number): string {
  if (value <= 3) return '#f0fdf4';
  if (value <= 6) return '#fffbeb';
  return '#fef2f2';
}
```

## Severity timeline (line chart)

```typescript
const config: ChartConfiguration = {
  type: 'line',
  data: {
    labels: dates, // ISO date strings
    datasets: [{
      label: 'Severity',
      data: severities,
      borderColor: '#0891b2',
      backgroundColor: 'rgba(8, 145, 178, 0.1)',
      borderWidth: 2.5,
      pointRadius: 4,
      pointBackgroundColor: severities.map(severityColor),
      pointBorderColor: '#ffffff',
      pointBorderWidth: 2,
      tension: 0.3,
      fill: true,
    }, {
      label: '7-day average',
      data: rollingAvg,
      borderColor: '#06b6d4',
      borderWidth: 2,
      borderDash: [5, 5],
      pointRadius: 0,
      fill: false,
      tension: 0.4,
    }],
  },
  options: {
    responsive: true,
    maintainAspectRatio: false,
    scales: {
      y: {
        min: 0,
        max: 10,
        ticks: {
          stepSize: 2,
          callback: (v) => `${v}`,
        },
        grid: { color: '#e7e5e4' },
      },
      x: {
        type: 'time',
        time: { unit: 'day', displayFormats: { day: 'MMM d' } },
        grid: { display: false },
      },
    },
    plugins: {
      tooltip: {
        callbacks: {
          label: (ctx) => `Severity: ${ctx.parsed.y}/10`,
        },
      },
    },
  },
};
```

## Frequency bar chart

```typescript
const config: ChartConfiguration = {
  type: 'bar',
  data: {
    labels: symptomNames,
    datasets: [{
      label: 'Occurrences',
      data: counts,
      backgroundColor: ['#0891b2', '#67e8f9', '#a5f3fc', '#cffafe', '#e0f9ff'],
      borderRadius: 4,
      borderSkipped: false,
    }],
  },
  options: {
    responsive: true,
    maintainAspectRatio: false,
    plugins: { legend: { display: false } },
    scales: {
      y: { beginAtZero: true, grid: { color: '#e7e5e4' } },
      x: { grid: { display: false } },
    },
  },
};
```

## Trigger correlation (horizontal bar)

```typescript
const config: ChartConfiguration = {
  type: 'bar',
  data: {
    labels: triggerNames,
    datasets: [{
      label: 'Co-occurrence %',
      data: rates,
      backgroundColor: '#0891b2',
      borderRadius: 4,
    }],
  },
  options: {
    indexAxis: 'y',
    responsive: true,
    maintainAspectRatio: false,
    scales: {
      x: {
        min: 0, max: 100,
        ticks: { callback: (v) => `${v}%` },
        grid: { color: '#e7e5e4' },
      },
      y: { grid: { display: false } },
    },
    plugins: {
      legend: { display: false },
      tooltip: {
        callbacks: {
          label: (ctx) => `Present in ${ctx.parsed.x}% of entries`,
        },
      },
    },
  },
};
```

## Calendar heatmap

Calendar heatmap is not natively supported by Chart.js. Use a custom canvas drawing approach or a library like `chartjs-chart-matrix`.

### With chartjs-chart-matrix

```bash
pnpm add chartjs-chart-matrix
```

```typescript
import { MatrixController, MatrixElement } from 'chartjs-chart-matrix';
Chart.register(MatrixController, MatrixElement);

const config = {
  type: 'matrix' as const,
  data: {
    datasets: [{
      label: 'Symptoms',
      data: heatmapData, // Array of { x: week, y: dayOfWeek, v: avgSeverity, d: date }
      backgroundColor: (ctx: ScriptableContext<'matrix'>) => {
        const v = (ctx.dataset.data[ctx.dataIndex] as any).v as number;
        if (!v) return '#e7e5e4';
        if (v <= 3) return '#cffafe';
        if (v <= 5) return '#67e8f9';
        if (v <= 7) return '#0891b2';
        return '#0e7490';
      },
      width: (ctx) => (ctx.chart.chartArea?.width / 53) - 2,
      height: (ctx) => (ctx.chart.chartArea?.height / 7) - 2,
      borderRadius: 3,
    }],
  },
  options: {
    plugins: {
      tooltip: {
        callbacks: {
          title: (items) => (items[0].dataset.data[items[0].dataIndex] as any).d,
          label: (ctx) => {
            const v = (ctx.dataset.data[ctx.dataIndex] as any).v;
            return v ? `Avg severity: ${v.toFixed(1)}` : 'No entries';
          },
        },
      },
      legend: { display: false },
    },
    scales: {
      x: { display: false },
      y: {
        type: 'category',
        labels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
        reverse: false,
        grid: { display: false },
        offset: true,
      },
    },
  },
};
```

## Time-of-day radar chart

```typescript
const config: ChartConfiguration = {
  type: 'radar',
  data: {
    labels: ['Morning', 'Afternoon', 'Evening', 'Night'],
    datasets: [{
      label: 'Occurrence %',
      data: [60, 20, 15, 5],
      backgroundColor: 'rgba(8, 145, 178, 0.15)',
      borderColor: '#0891b2',
      borderWidth: 2,
      pointBackgroundColor: '#0891b2',
    }],
  },
  options: {
    responsive: true,
    maintainAspectRatio: false,
    scales: {
      r: {
        beginAtZero: true,
        max: 100,
        ticks: { callback: (v) => `${v}%`, stepSize: 25 },
        grid: { color: '#e7e5e4' },
      },
    },
    plugins: { legend: { display: false } },
  },
};
```

## Rolling average calculation

```typescript
function rollingAverage(data: number[], window: number): (number | null)[] {
  return data.map((_, i) => {
    if (i < window - 1) return null;
    const slice = data.slice(i - window + 1, i + 1).filter((v) => v !== null);
    if (slice.length === 0) return null;
    return slice.reduce((a, b) => a + b, 0) / slice.length;
  });
}
```

## Accessibility notes

- Always provide `aria-label` on `<canvas>`: `aria-label="Chart showing symptom severity over time"`
- Add a `<table>` with the same data below the chart for screen reader users (visually hidden with `sr-only` class)
- Do not rely on color alone to communicate severity: include numeric labels in tooltips

Related Skills

sleep-charts

7
from heldernoid/agentic-build-templates

No description provided.

health-records-vault

7
from heldernoid/agentic-build-templates

Encrypted personal health document storage system. Use when you need to upload, browse, download, or share encrypted health documents, generate share links, export a backup archive, or understand the AES-256-GCM security model. Triggers include "upload health record", "encrypt document", "share medical file", "vault backup", "download record", "health record storage", or any task involving personal medical documents.

progress-charts

7
from heldernoid/agentic-build-templates

Recharts-based WPM progress visualization for typing-trainer. Use when implementing or modifying the WPM over time chart, sessions per day bar chart, or any data visualization in the progress dashboard.

health-records

7
from heldernoid/agentic-build-templates

Manage per-animal health event records, follow-up scheduling, and treatment cost tracking. Use when asked to add a vet visit note, record a treatment with cost, set a follow-up date, view all events for one animal, filter events by type across the herd, or export health history to CSV. Triggers include "vet visit", "treatment record", "follow-up date", "health event log", "export health history", "cost tracking", or any task focused on individual health event documentation rather than vaccination scheduling.

Skill: Uptime Monitoring

7
from heldernoid/agentic-build-templates

## Overview

Skill: Status Page

7
from heldernoid/agentic-build-templates

## Overview

Skill: unit-conversion

7
from heldernoid/agentic-build-templates

## Overview

Skill: recipe-scaler

7
from heldernoid/agentic-build-templates

## Overview

reading-list

7
from heldernoid/agentic-build-templates

Operate the reading-list API to save, manage, tag, search, and export articles.

email-digest

7
from heldernoid/agentic-build-templates

Configure, test, and troubleshoot the reading-list daily email digest delivered via nodemailer.

websocket-realtime

7
from heldernoid/agentic-build-templates

Use the WebSocket connection in poll-builder to receive live vote updates. Use when you need to stream real-time poll results, monitor a poll for new votes, or build a live dashboard. Triggers include "live results", "real-time updates", "stream votes", "watch poll", or "WebSocket".

poll-builder

7
from heldernoid/agentic-build-templates

Self-hosted poll creation tool with real-time results. Use when you need to create a poll, check vote counts, close a poll, export results, or get the shareable link for a poll. Triggers include "create poll", "vote", "poll results", "survey", "collect votes", "share poll", or any task involving polling or voting.