A list of objects
The most common shape: one object per row, keys as columns. Keys missing from some rows leave gaps.
[
{ "week": "2026-07-06", "signups": 182, "activated": 96 },
{ "week": "2026-07-13", "signups": 205, "activated": 112 }
] Paste JSON from an API, a script or a Chart.js config. The builder finds the labels and the numbers, draws the chart, and exports an SVG or a PNG.
Paste any of these as they are. The builder says which shape it found under the text box.
The most common shape: one object per row, keys as columns. Keys missing from some rows leave gaps.
[
{ "week": "2026-07-06", "signups": 182, "activated": 96 },
{ "week": "2026-07-13", "signups": 205, "activated": 112 }
] One list per column, as dataframes and many APIs return them.
{
"week": ["2026-07-06", "2026-07-13"],
"signups": [182, 205]
} Pairs, or an object whose keys are the labels. Good for pie and donut charts.
[{ "label": "Chrome", "value": 62 }, { "label": "Safari", "value": 21 }]
{ "Chrome": 62, "Safari": 21, "Firefox": 9 } The data part of a Chart.js chart, or the whole config. Its chart type carries over; colors and other options don’t.
{
"type": "bar",
"data": {
"labels": ["Q1", "Q2", "Q3"],
"datasets": [{ "label": "Revenue", "data": [412, 448, 501] }]
}
} When the rows sit under one key, like "data" or "results", that list is used.
{ "data": [{ "day": "Mon", "requests": 1200 }, { "day": "Tue", "requests": 1350 }] } The same rules as the CSV reader, so a number means the same thing either way.
JSON numbers, and numbers written as text the way people write them: with thousands separators, % signs or currency symbols.
1200 "1,200" "12%" "$1,200" null, a missing key or an empty string leaves a gap in the series, not a zero.
The first key holding text or ISO dates labels the rows. Choose another under Columns.
Nested objects, lists inside rows and true or false. Flatten them first: one object per row, one number per key.
Arrays of arrays (first row as names), a plain list of numbers, and JSON Lines with one object per line.
Some places can’t run a chart script or take a file upload: email, Slack messages, PDFs, pull request descriptions. A hosted link is a plain image URL that draws your chart when it’s opened.
What it will do:
<img> tag or a Markdown image and the chart shows up, SVG or PNG.Not built yet: we’re checking that enough people want it first. Leave your email and we’ll tell you when it opens. Nothing else.

<img src="https://boringutils.com/c/…/weekly-signups.png"
width="600" height="300" alt="Weekly signups, July to September"> Short answers to the usual ones.
Anything else: hello@boringutils.com
No. It is read and drawn in your browser. Share links carry the data after the # in the address, which browsers never send to a server.
A list of objects, an object of lists, label and value pairs, an object of numbers, Chart.js data or configs, arrays of arrays, a list of numbers, JSON Lines, and any of those wrapped in a single key like "data".
Yes. Paste the config (or just its data), and the labels, datasets and chart type are read. Then use Download PNG.
Colors, scales and plugin options are not carried over: the chart is drawn by our renderer with one of its themes. Doing it in your own code instead? The Chart.js to PNG guide covers that.
Charts need a table: one row per label and one number per series. Reshape nested data into a list of flat objects first, for example with jq: .items | map({ name: .name, visits: .stats.visits }).
The JSON has a syntax error at that spot. The usual suspects are a trailing comma after the last item, single quotes instead of double quotes, and keys without quotes, which JavaScript allows but JSON does not.
Only columns that are mostly numbers can be series. Columns of text become label candidates, and up to 8 series fit on one chart.