Agent skill

Malloy Charts

by malloydata in malloydata/publisher

Read before choosing a chart or adding a chart annotation. An agent skill from malloydata/publisher.

MITAuto-check passedData & Analytics

Install Malloy Charts

skills CLI
$ npx skills add malloydata/publisher --skill malloy-charts -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install malloydata/publisher malloy-charts --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/malloydata/publisher.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/malloy-charts .claude/skills/malloy-charts && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
malloy-charts
GitHub stars
116
Token cost
~4.6k tokens
SKILL.md length
1,608 words
Files
1
Skills in repo
29
Repo updated
First seen
Licence
MIT

At a glance

Read before choosing a chart or adding a chart annotation. An agent skill from malloydata/publisher.

  • Tasks that involve Data visualization
  • SKILL.md covers Decision Tree: Which Chart?, Chart Types, Layout Types and Field Formatting Tags, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Tasks that involve OKRs and executive reporting

What it does

Malloy Charts is an agent skill from malloydata/publisher. Read before choosing a chart or adding a chart annotation. Chart types, tag syntax and scale rules, KPI cards, dashboards, sparklines, and the renderer mistakes that fail silently.

Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Data & Analytics, covering Data visualization and OKRs and executive reporting. The repository describes itself as: Publisher is the open-source analytics engine for Malloy. It lets you define data models once — and use them everywhere. The licence is MIT.

When your agent uses it

  • Tasks that involve Data visualization
  • Tasks that involve OKRs and executive reporting

Example prompts

  • “/malloy-charts”

What it can do on your machine

Read from SKILL.md and the folder at commit c43a052. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are malloy).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • docs.malloydata.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Malloy Charts loads about 4.6k tokens when it runs. Until then it costs about 49 tokens; SKILL.md has 1,608 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~49
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from malloydata/publisher at commit c43a052, republished under its MIT licence (© malloydata). 1,608 words, ~4,555 tokens.

Download SKILL.mdSave it as .claude/skills/malloy-charts/SKILL.md (or your agent's skills folder).
name
malloy-charts
description
Read before choosing a chart or adding a chart annotation. Chart types, tag syntax and scale rules, KPI cards, dashboards, sparklines, and the renderer mistakes that fail silently.
<!--
Copyright (c) Credible Data Inc.
SPDX-License-Identifier: MIT
-->

Chart Selection for Malloy

Malloy uses Vega-Lite under the hood. # tags control visualization. Call search_malloy_docs with topic "rendering" for the full tag reference (or see https://docs.malloydata.dev/documentation/visualizations/overview).

This file is about the Malloy renderer's # tags. It applies when the view itself is rendered - a notebook, a dashboard, an explore result. It does not apply to an app that draws its own charts with a vendored chart library: there the tag vocabulary is irrelevant and the full form vocabulary is available, so the approximations below (a funnel as a bar chart, a treemap as a nested table) are the wrong advice. Design to whichever vocabulary the surface actually uses.

Tool names are written bare here - get_context, execute_query, search_malloy_docs. The exact prefixed name depends on the host surface; match each against the tools you actually have.

Decision Tree: Which Chart?

Data ShapeDefault Choice
Aggregates only (no group_by)# big_value
1 time column + 1 measure# line_chart
1 category + 1 measure# bar_chart
2 numeric columns# scatter_chart
Geographic (US states) + 1 measure# shape_map
Route data (lat/lon pairs)# segment_map
Multiple perspectives# dashboard with nest:
Nested query to pivot# pivot
Filtered aggregates side-by-side# flatten
Detailed rowsDefault table (no annotation)
GoalRenderer
Compare categories# bar_chart (sort by value, limit ~15)
Show composition# bar_chart.stack
Trend over time# line_chart
Highlight KPIs# big_value with # label
Correlation# scatter_chart
Compare dimensions# dashboard (nest chart views)
Before/after# transpose or # pivot
Multiple metrics per categoryDefault table, # flatten, or y=['a','b']

Constraints:

  • ONE aggregate per chart view (charts render only the first; use y=['a','b'] for multi-measure)
  • No fixed scale on measure definitions: use # currency not # currency=usd0m. The same measure renders at many granularities, and usd0m turns $500 into $0.0M. Add a scale only in a view, after confirming the value range with a query.
  • One tag per line, each directly above the field it styles. Two # tags on one line do not work.
  • Alias joined fields in group_by before order_by
  • Define measures in source, not in views

Chart Types

# bar_chart

Data shape: group_by = x-axis, aggregate = y-axis, optional 2nd group_by = series.

malloy
# bar_chart
view: by_carrier is { group_by: carrier, aggregate: flight_count, order_by: flight_count desc, limit: 10 }

# bar_chart.stack
view: by_region is { group_by: category, region, aggregate: revenue }

# bar_chart { y=['revenue','cost'] }
view: rev_vs_cost is { group_by: category, aggregate: revenue, cost }

Key properties: .stack, .size (spark/xs/sm/md/lg/xl/2xl), .x, .x.limit, .y (supports y=['a','b']), .series, .series.limit (default 20), .title, .subtitle, .x.independent, .y.independent

Field role tags: # x, # y, # series on individual fields to assign roles explicitly.

# line_chart

Data shape: group_by (temporal/numeric) = x-axis, aggregate = y-axis, optional 2nd group_by = series.

malloy
# line_chart
view: trend is { group_by: order_month, aggregate: revenue, order_by: order_month }

# line_chart { size=spark }
view: mini_trend is { group_by: order_month, aggregate: revenue, order_by: order_month }

Key properties: .zero_baseline, .interpolate (e.g., step), .size, .y (supports y=['a','b']), .series.limit (default 12), .title, .subtitle

# scatter_chart

Data shape: Fields by position: x, y, color, size (bubble), shape.

malloy
# scatter_chart
view: correlation is { group_by: customer_id, aggregate: avg_price, total_quantity }
# shape_map

Choropleth. US states only. Fields: state name, value.

malloy
# shape_map
view: by_state is { group_by: state, aggregate: revenue }
# segment_map

Route map. US only. Fields: start_lat, start_lon, end_lat, end_lon, color.

Layout Types

# big_value

KPI cards. Aggregates only, no group_by.

malloy
# big_value
view: summary is {
  aggregate:
    # label="Revenue"
    # currency
    revenue
    # label="Orders"
    # number=auto
    order_count
}

Properties: .size, .sparkline=<nested_view_name>, .comparison_field, .comparison_label, .down_is_good

Put # label on every measure. Without it the card shows the raw field name, which is often unclear.

# dashboard

Card-based multi-tile layout. Apply to a view whose body is a nested query; the view's own fields lay out automatically:

  • group_by dimensions -> a row header (repeats once per row; omit for a single block)
  • aggregate measures -> KPI cards, one per measure
  • each nest: -> a tile, rendered by the tag above it (# table default, or # bar_chart / # line_chart / # big_value)

Two modes. Flex (default): tiles flow and wrap; # break forces a new row. Columns: # dashboard { columns=N } lays tiles into N equal columns, # colspan=n widens a tile (the old # span is gone), # break starts a new row, overflow wraps.

malloy
// Flex: measures become KPI cards, the nest becomes a tile
# dashboard
view: overview is {
  group_by: category
  # currency
  aggregate:
    avg_retail is retail_price.avg()
    sum_retail is retail_price.sum()
  nest:
    # bar_chart
    by_brand is { group_by: brand, aggregate: avg_retail is retail_price.avg(), limit: 10 }
}

// Columns: # colspan widens tiles, # break ends a row
# dashboard { columns=12 }
view: layout is {
  group_by: category
  # currency
  aggregate:
    # colspan=4
    avg_retail is retail_price.avg()
    # colspan=4
    sum_retail is retail_price.sum()
    # colspan=4
    max_retail is retail_price.max()
  nest:
    # break
    # colspan=6
    # bar_chart
    # subtitle="Top brands"
    by_brand_chart is { group_by: brand, aggregate: avg_retail is retail_price.avg(), limit: 8 }
    # colspan=6
    by_brand_table is { group_by: brand, aggregate: product_count is count(), limit: 8 }
}

Tags: # dashboard { columns=N } (columns mode), { gap=PX } (tile spacing, default 16; never a mode), { table.max_height=PX|none } (cap table tiles). On a measure or nest: # colspan=N (columns mode only), # break (both modes), # subtitle="..." (tile), # borderless (drop card chrome), # label="..." (card title).

For rich KPI cards (sparklines, comparison deltas, several metrics on one card) nest a # big_value view instead of relying on the dashboard's own measures:

malloy
# dashboard
view: kpis is {
  group_by: category
  nest:
    # big_value
    revenue_card is {
      aggregate:
        # label="Revenue"
        # currency
        # big_value { sparkline=trend }
        total_revenue is retail_price.sum()
      # line_chart { size=spark y.independent=true }
      # hidden
      nest: trend is { group_by: bucket is floor(id / 100)::number, aggregate: total_revenue is retail_price.sum(), order_by: bucket, limit: 20 }
    }
}

Rules: # dashboard needs a nested-query view (no effect on a scalar). # colspan works only in columns mode and is ignored (warns) in flex. columns is any positive integer; a # colspan over the column count clamps to a full row. Style tiles via the instance theme, or theme the views inside with # theme.* (see Theming below).

# pivot

Pivot nested results into columns. Max 30 pivot columns.

malloy
view: sales is {
  group_by: product, aggregate: total
  nest: # pivot
    by_quarter is { group_by: quarter, aggregate: revenue }
}
# transpose

Swap rows/columns. Good for period comparisons.

malloy
# transpose
view: comparison is {
  aggregate:
    # label="This Month"
    current_revenue
    # label="Last Month"
    prior_revenue
}
# list / # list_detail

List renders as comma-separated values. List_detail shows value (detail) pairs.

# flatten

Collapse nested record into parent table as columns. Use for side-by-side filtered aggregates:

malloy
view: segments is {
  group_by: product, aggregate: total_revenue
  nest: # flatten
    enterprise is { where: segment = 'Enterprise', aggregate: # label="Enterprise" revenue }
  nest: # flatten
    smb is { where: segment = 'SMB', aggregate: # label="SMB" revenue }
}
# table

Default (implicit). Use explicitly for .size=fill property.

Field Formatting Tags

TagUse ForShorthand
# numberNumeric formatting=auto (K/M/B), =id (no commas), =1k, =1m
# percentPercentages(none needed)
# currencyMoney=usd2m (USD, 2 decimals, millions); scale only in views
# durationTime durations=seconds, =minutes, =hours, =days
# data_volumeStorage sizes=bytes, =kb, =mb, =gb
# linkHyperlinks.url_template="https://example.com/$$"
# imageInline images.height=40px, .width=100px

# image and # link are fine in a model file. A document held as text (one with a model-level ## artifact tag, compiled at scope append) is refused if it writes either; define the field in the model file and check that edit at scope file.

Currency codes: usd ($), eur, gbp. Scale: K/M/B/T/Q or auto. Number suffix styles: word ("42.5 million"), letter ("42.5M"), scientific.

Utility Tags

TagPurpose
# hiddenHide from output (still usable for sorting/references)
# label="..."Override display name
# description="..."Tooltip text
# tooltipInclude nested view in chart tooltip
# breakForce new dashboard row
# column { width=sm }Table column width

Model-Level Defaults

malloy
## viz.line_chart.defaults.y.independent=true
## viz.bar_chart.defaults.stack
Show full SKILL.md (733 more words)Show less

Theming

Publisher styles charts and tables from one structured theme. The instance sets it (in publisher.config.json's theme block or the Settings, then Theme editor); a model overrides it per result with # theme.* annotations, or model-wide with ## theme.*. Per-chart annotations use the same nested palette.* / font.* vocabulary as the config, not flat key names, and they win over the instance theme for the keys they set. The forms:

AnnotationControlsModes
# theme.palette.seriesCategorical series colors (array)shared
# theme.palette.background.{light,dark}Chart canvas + table backgroundper-mode
# theme.palette.tableHeader.{light,dark}Table header text colorper-mode
# theme.palette.tableHeaderBackground.{light,dark}Table header row backgroundper-mode
# theme.palette.tableBody.{light,dark}Table body text colorper-mode
# theme.palette.tile.{light,dark}Dashboard tile backgroundper-mode
# theme.palette.tileTitle.{light,dark}Dashboard tile title colorper-mode
# theme.palette.mapColor.{light,dark}Choropleth gradient (# shape_map / # segment_map)per-mode
# theme.palette.border.{light,dark}Table gridlines and row rulesper-mode
# theme.palette.cardBorder.{light,dark}Dashboard card edge and pinned table header ruleper-mode
# theme.palette.axis.{light,dark}Chart axis domain and tick linesper-mode
# theme.palette.gridline.{light,dark}Chart gridlinesper-mode
# theme.palette.chartText.{light,dark}Chart axis, legend and title textper-mode
# theme.palette.value.{light,dark}Big-value (KPI) number colorper-mode
# theme.font.familyFont for all rendered textshared
# theme.font.sizeTable font size (px)shared

The thirteen per-mode palette.* color keys each take a .light and/or .dark variant so dark mode gets its own value. palette.series, font.family, and font.size are single values shared across modes (a .light or .dark on them does nothing). palette.mapColor recolors choropleths only; heatmaps keep their built-in scheme. No annotation sets the default light or dark mode or the user toggle: that lives in the instance theme. Environment-level theming is not applied yet.

malloy
// Model-wide defaults (## applies to every view in the model):
## theme.palette.series = ["#14b3cb", "#e47404", "#1474a4"]
## theme.font.family = "Inter, sans-serif"

// Per-view override (# applies to this result only; beats the instance theme):
# theme.palette.background.light = "#fafafa"
# theme.palette.background.dark = "#111111"
# theme.palette.tableHeader.dark = "#94a3b8"
view: revenue_by_month is {
  group_by: month
  aggregate: revenue
}

Precedence, highest to lowest, per key: # theme.* on the view, then ## theme.* model default, then the instance theme, then Publisher's built-in defaults. A per-chart annotation overrides the instance for the keys it sets; unset keys fall through to the instance. (This is the reverse of a bare @malloydata/render embed, where the embedder wins: Publisher reads the annotation itself and layers it on top.)

Quote values that contain spaces or a leading #. The light/dark default (defaultMode) and the toggle lock (allowUserToggle) are instance-only: set them in the config theme block or the editor, not as annotations. Annotation forms that look valid but do nothing, such as a flat # theme.tableHeaderColor, are dropped without an error.

Advanced Patterns

Sparklines in KPI Cards

A sparkline needs two things: a # hidden nested view and a .sparkline= property naming it. If it does not show, check that # hidden is on the nested view and that its name matches .sparkline=.

malloy
# big_value { sparkline=trend }
view: revenue_kpi is {
  aggregate:
    # label="Revenue"
    # currency
    revenue
  nest:
    # line_chart { size=spark }
    # hidden
    trend is { group_by: order_date, aggregate: revenue, order_by: order_date }
}
KPIs with Comparison Deltas
malloy
# big_value { comparison_field=prior_month comparison_label="vs Last Month" }
view: rev_delta is {
  aggregate:
    # label="Revenue"
    # currency
    revenue
    # hidden
    prior_month
}

Use down_is_good=true for metrics where decrease is positive (churn, defects).

Inline Mini-Charts in Table Rows
malloy
view: carriers is {
  group_by: carrier, aggregate: flight_count
  nest: # line_chart { size=spark }
    trend is { group_by: month, aggregate: flight_count, order_by: month }
}
Multi-Measure Series
malloy
# bar_chart { y=['revenue','cost'] }
view: rev_vs_cost is { group_by: quarter, aggregate: revenue, cost }
Hierarchical Drill-Down
malloy
# list_detail
view: explorer is {
  group_by: region, aggregate: revenue
  nest: # bar_chart
    by_category is { group_by: category, aggregate: revenue, order_by: revenue desc, limit: 10 }
}
Distribution (Histogram)

There is no auto-binning function: autobin(...) does not exist and fails with Unknown function 'autobin'. Bin by arithmetic, choosing the width from the column's actual range: query min, max and a few percentiles first, and say in the view's doc where the width came from. A bin width nobody derived is a business decision in disguise.

malloy
# bar_chart
view: price_dist is {
  group_by: bucket is floor(price / 20) * 20   // 20 is the bin width, from the observed range
  aggregate: order_count is count()
  order_by: bucket
}

Patterns for Missing Chart Types

DesiredMalloy Approximation
Pie/donut# bar_chart sorted by value
TreemapNested table with order_by: desc
Heatmap# pivot with color values
Stacked area# line_chart with series (overlaid lines)
Funnel# bar_chart with ordered stages
Gauge/bullet# big_value with .comparison_field

Chart Annotations on Queries with nest:

A top-level chart tag (e.g., # bar_chart) renders only the outer query; any nest: views are silently hidden from the rendering (still in raw data). To show nests, use # dashboard on the outer query with chart tags on each nest. Otherwise, drop the nest:.

Common Mistakes

MistakeFix
Two aggregates in chartONE aggregate, or use y=['a','b']
# currency=usd0m on measure# currency (no scale) on defs; scale only in views
Several tags on a nest: lineOne lone tag on the nest: line works; with several, put each tag on its own line above the nested view
Tags on same lineOne tag per line
Sparkline not showingAdd # hidden to nested view AND reference in .sparkline=
Pivot > 30 columnsFilter/limit the nested group_by

NOTE: The term 'constructor' is a reserved term in Vega-Lite. If the word 'constructor' appears in the query, it will cause the rendering to fail. Never use it in a query and avoid using it as a dimension in a model.

For more patterns, call search_malloy_docs with topics like "bar charts", "line charts", "dashboards", "histograms", "percent of total", "comparing timeframes", or "pivots".

Further Reading

© malloydata, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/malloy-charts of malloydata/publisher.

Open the folder on GitHubat commit c43a052

Compare with similar skills

Malloy Charts next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Malloy Charts compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Malloy Charts this skillmalloydata/publisher116—~4.6kAutomated safety check: PassMIT
Creating Dashboardsancoleman/ai-design-components525—~3.5kAutomated safety check: PassMIT
Dashboard Creatormhattingpete/claude-skills-marketplace680—~489Automated safety check: PassApache-2.0
Dashboardasgeirtj/system_prompts_leaks69k—~4.1kAutomated safety check: PassCC0-1.0
Tuftearef-vc/tufte-claude-skill307—~1.3kAutomated safety check: PassMIT
Mvizmatsonj/mviz227—~11kAutomated safety check: PassNone

Similar skills

  • Creating Dashboards

    ancoleman/ai-design-components

    Creates comprehensive dashboard and analytics interfaces that combine data visualization, KPI cards, real-time updates, and interactive layouts.

    525 GitHub stars~3.5k tokensUpdated 10 mo ago
    Data & AnalyticsAuto-check passed
  • Dashboard Creator

    mhattingpete/claude-skills-marketplace

    Create HTML dashboards with KPI metric cards, bar/pie/line charts, progress indicators, and data visualizations.

    680 GitHub stars~489 tokensUpdated 2 mo ago
    Data & AnalyticsAuto-check passed
  • Dashboard

    asgeirtj/system_prompts_leaks

    Use this for a dashboard, metrics page, KPI tracker, scorecard, data visualization or recurring report: a page or scroll story of charts, numbers and tables of data, whatever the data and wherever…

    69k GitHub stars~4.1k tokensUpdated yesterday
    Data & AnalyticsAuto-check passed
  • Tufte

    aref-vc/tufte-claude-skill

    Apply Edward Tufte's principles to any data visualization, chart, dashboard, or infographic.

    307 GitHub stars~1.3k tokensUpdated 3 mo ago
    Data & AnalyticsAuto-check passed
  • Mviz

    matsonj/mviz

    A chart & report builder for AI. An agent skill from matsonj/mviz.

    227 GitHub stars~11k tokensUpdated 4 mo ago
    Data & AnalyticsAuto-check passed
  • Dashboard Builder

    QwenLM/qwen-code-examples

    Build full-stack dashboard applications using React/Next.js + shadcn/ui + Tailwind CSS + Recharts + Express with customizable data sources.

    143 GitHub stars~3.3k tokensUpdated 4 mo ago
    Data & AnalyticsAuto-check passed

More from malloydata/publisher

All 29 skills in this repo
  • Eval Answer

    malloydata/publisher

    Score one analytical answer against a verified golden, and score which of the entities the golden depends on retrieval delivered to the answerer.

    116 GitHub stars~4.3k tokensUpdated yesterday
    Auto-check passed
  • Fix Scan Finding

    malloydata/publisher

    Fix a CRITICAL Trivy finding that is failing CI in this repo (a vulnerability, misconfiguration, or secret from security-scan.yml or image-scan.yml), or add, review, or retire an entry in…

    116 GitHub stars~5.1k tokensUpdated yesterday
    Auto-check passed
  • Eval Import

    malloydata/publisher

    Turn a list of questions into an eval set, whatever shape it arrived in: a JSONL a customer sent, a CSV, a spreadsheet export, a markdown doc, an email thread, or a pull from production logs.

    116 GitHub stars~5.9k tokensUpdated yesterday
    Auto-check passed
  • Eval Loop

    malloydata/publisher

    Conduct a local Publisher evaluation loop in five steps: scrape/run, eval, diagnose, improve, checkpoint.

    116 GitHub stars~7.8k tokensUpdated yesterday
    Auto-check passed
  • Eval Improve

    malloydata/publisher

    Make the smallest safe Malloy model edit that closes a diagnosed model-owned gap, with a probe receipt for every factual claim.

    116 GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed
  • Eval Judge

    malloydata/publisher

    Decide whether ONE answer matches its golden, and say whether you believe the golden.

    116 GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed

Questions about Malloy Charts

What does Malloy Charts do?

Read before choosing a chart or adding a chart annotation. An agent skill from malloydata/publisher. Malloy Charts is an agent skill from malloydata/publisher. Read before choosing a chart or adding a chart annotation.

When should I use Malloy Charts?

Malloy Charts fits situations like: tasks that involve Data visualization; tasks that involve OKRs and executive reporting.

How do I install Malloy Charts in Claude Code?

Run `npx skills add malloydata/publisher --skill malloy-charts -a claude-code`. Or copy the skill folder (skills/malloy-charts in malloydata/publisher) into .claude/skills/malloy-charts in your project. Claude Code loads it when a task matches its description.

How do I install Malloy Charts in Codex?

Run `npx skills add malloydata/publisher --skill malloy-charts -a codex`. Or copy the skill folder (skills/malloy-charts in malloydata/publisher) into .agents/skills/malloy-charts in your project. Codex loads it when a task matches its description.

Can I use Malloy Charts in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add malloydata/publisher --skill malloy-charts -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/malloy-charts, .gemini/skills/malloy-charts, .github/skills/malloy-charts and .opencode/skills/malloy-charts in your project.

What does Malloy Charts need to run?

SKILL.md names no scripts, command-line tools or credentials: Malloy Charts is instructions for the agent only.

Does Malloy Charts access the network?

SKILL.md names 1 domain. As links in the text: docs.malloydata.dev. This is read from the text; nothing was executed.

Is Malloy Charts safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Malloy Charts use?

Malloy Charts is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Malloy Charts use?

About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Malloy Charts?

Skills that share tags, products or a category with Malloy Charts: Creating Dashboards (ancoleman/ai-design-components, 525 stars), Dashboard Creator (mhattingpete/claude-skills-marketplace, 680 stars), Dashboard (asgeirtj/system_prompts_leaks, 69k stars) and Tufte (aref-vc/tufte-claude-skill, 307 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Malloy Charts?

malloydata (a GitHub organization) maintains it in malloydata/publisher, which has 116 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 10, 2026.

Source: malloydata/publisher on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.