CSV to Embed

Turn a spreadsheet into a chart you can paste into any page. The rows and the settings are compressed into the link itself, so there is no account to make, no server to call and nothing stored anywhere. Copy the iframe, paste it into your post, and the chart draws in your reader's browser from the URL and nothing else.

An embed with no back end behind it

Every hosted charting service works the same way underneath. You upload a file, they keep it, they hand you an identifier, and the iframe you paste is a request for that identifier. That arrangement has three consequences people usually discover later. Your data is on somebody else's disk. Your chart can stop working when a free tier changes. And the frame in your page is a beacon: it reports every reader who loads it, on a page you do not control, to a company they never chose.

This page does it the other way around. When you press copy, the rows the chart reads are serialized to JSON, deflated, encoded as base64url and appended to the embed URL after a hash. Browsers never transmit the part of a URL after the hash to a server. The rows go from your machine into the snippet, from the snippet into your page's HTML, and from there into the reader's browser, where the chart is drawn. At no point does anything holding your numbers reach us.

The trade is honest and worth stating plainly. There is no dashboard listing your embeds, because there is nothing to list. There is no view count, because nothing is counted. There is no way to update every copy of a chart at once, because each copy is complete in itself. What you get instead is an embed that nobody can take away, meter, or quietly instrument.

Worked example: revenue by product in a blog post

Start from a sales export with seven columns:

date,region,product,channel,units,unit_price,revenue
2024-01-02,West,Doohickey,Direct,58,211.64,12275.12
2024-01-04,West,Sprocket,Partner,13,40.73,529.49
2024-01-06,North,Widget,Online,41,95.33,3908.60

Drop it on the builder and a bar chart appears with revenue as the measure. Set Dimension to product, leave the aggregate on Sum, pick the ocean palette, choose 720 by 420 and leave the theme on Follow the reader. The preview is not an approximation, it is the embed at the size you chose, with the credit line exactly where it will sit.

The size meter underneath says something like Link payload 2.1 KB, 1% of the safe budget. Two kilobytes for 180 rows, because a chart embed carries only the two columns the chart reads, and repetitive text deflates hard. The snippet looks like this, shortened here:

<iframe src="https://exploremydata.com/embed#1eJyNkE1Lw0AQhv..."
        width="720" height="420"
        style="border:0;border-radius:12px"
        loading="lazy" title="Revenue by product"></iframe>

Paste that into a custom HTML block and you are finished. To change the chart later, come back, load the file again, adjust, and replace the snippet. There is no version of this where the old link mysteriously changes under you, which is the point.

Every control, and why it is there

  • Embed: chart or table. A chart when the shape is the message, a table when the exact numbers are. The table embed right aligns numeric columns and applies the same role-aware formatting as the rest of the site, so money reads as money.
  • Chart, Measure, Dimension, Aggregate. The same four controls as the chart tools, deliberately. An embed is not a different product, it is the same chart in a smaller frame.
  • Palette. Four sets, because an embed lives inside somebody else's design. The default is the site's machine-validated palette; ocean and ember shift the temperature; single hue drops categorical color entirely, which is the right choice more often than people expect.
  • Theme. Follow the reader reads the reader's own light or dark setting, so the chart matches a site that also respects it. Pin it to light or dark when your page does not have a dark mode, or when a screenshot of the embed has to look consistent.
  • Size. Three fixed presets plus Full width, which sets the iframe width to 100 percent so the frame tracks its container. Height stays fixed either way, because an iframe cannot grow to fit its own content without a script talking across the frame boundary, and that script would be exactly the kind of thing this page exists to avoid.
  • Attribution. A single grey mono line reading made with ExploreMyData, linking back here. You can turn it off with one click and no nag screen. It is left on by default because it is how anyone else finds this page, and off is a legitimate choice.
  • Title. Overrides the automatic title, which is otherwise generated from the columns, as in revenue by product. The title also becomes the iframe's title attribute, which is what a screen reader announces when it reaches the frame.

What this will not do

  • No live data. The embed is a snapshot of the rows you loaded. It does not poll a URL, read a Google Sheet or refresh overnight. When the numbers change, rebuild the snippet.
  • No editing after the fact. There is no console where you open an existing embed and tweak it. Keep the source CSV; rebuilding takes under a minute.
  • A hard size ceiling. Past 200 KB encoded, the builder refuses and says so. Aggregate the file first, or chart a slice of it.
  • Not a secret. Anyone with the link has the rows, because the rows are the link. Never embed data you would not paste into the page as text.
  • No cross-filtering between embeds. Each frame is an island by design. Two embeds on a page cannot talk to each other.
  • Some platforms strip iframes. Medium and several hosted builders will not render one at all. Use the link on those.

See what the finished article looks like in the embed gallery, where every example on the page is a live frame with its snippet next to it.

Frequently Asked Questions

Where does the data actually live?

In the link. The rows the chart reads and the settings you chose are turned into JSON, deflated with a standard compressor, encoded as base64url and hung on the end of the embed URL after the hash. A browser never sends the fragment after a hash to a server, so the rows travel from your page to your reader's browser and to nowhere else. There is no row in a database, no file on a CDN and no key to revoke.

How much data can one embed carry?

The builder caps the encoded payload at 200 KB, which is well inside what browsers, content management fields and mail clients handle. In practice that is thousands of rows, because a chart embed carries only the columns the chart actually reads and CSV-shaped text compresses hard. The size meter under the snippet shows the current payload in kilobytes and as a percentage of the budget, and the builder refuses to hand you a snippet that would exceed it rather than producing a link that silently truncates.

Will the embed break if you take the page down?

It stops rendering, the same as any hosted embed would. The tradeoff runs the other way too: because nothing is stored, nobody can delete your chart, change it under you, meter it, or start charging for it. If long-term durability matters more than convenience, export the SVG from any chart tool and host the image yourself.

Does the embed track anyone who sees it?

No. The embed page loads its own JavaScript and the chart library, and makes no other request. There is no analytics call, no cookie, no local storage write and no identifier of any kind in the frame. It cannot count views, because there is nothing on our side that would receive the count.

Can I match the embed to my site's colors?

Partly. Four palettes are offered: the site default, an ocean set, a warmer ember set, and a single-hue set for charts that need no categorical color at all. Theme can follow the reader's own light or dark preference, or be pinned so the chart looks the same everywhere. Arbitrary hex colors are not supported yet; if you need an exact brand match, take the SVG export from the chart tool and recolor it once.

What is the table embed for?

For the times a chart is the wrong answer. A short reference table, a pricing grid, a set of results where the exact numbers matter more than the shape. Switch Embed to Table and the frame renders the rows with numeric columns right aligned and role-aware formatting, so a money column reads as currency rather than as a long decimal. A table embed carries every column, so its payload is larger than a chart's.

Which pages accept an iframe?

Most self-hosted and static setups: WordPress with a custom HTML block, Ghost, Webflow, Notion via an embed block, Confluence with the HTML macro, plain HTML pages, Astro, Next, Hugo, and every static site generator. Some hosted platforms strip iframes for security, and Medium and the free tier of some site builders are among them. On those, use the Copy the link only button and let the platform unfurl a link instead.

Is the embed responsive?

The height is fixed and the width can be. Pick a preset size or Full width, which sets the iframe width to 100 percent so the frame tracks its container while the height stays where you put it. The chart inside redraws on every resize, so a full-width embed reflows properly on a phone. A very short frame with many categories will still be cramped; the practical floor is around 260 pixels of height.

Build your embed

Drop the CSV, shape the chart, copy the iframe. No account, no server, nothing stored.

Back to the builder