I needed a bar chart from a client spreadsheet. Names, invoice totals, a few formulas. Every “paste your CSV” tool I opened wanted an account, a POST, or both. The data wasn’t secret in a compliance sense — it just wasn’t something I wanted sitting in someone else’s temp bucket for a week.
So I built the pipeline in the tab: parse → choose encodings → render → export. No upload step. The file never leaves the machine.
This isn’t a product pitch. It’s the shape of a local-first chart path that frontend folks keep reinventing, and the places it usually breaks.
What “local-first” means for charts
Local-first here is boring and specific:
Parse in the browser — FileReader / drag-drop / paste from Sheets
Infer or pick columns — which field is the category, which is the measure
Render with a client library — ECharts, Chart.js, Observable Plot, whatever you already ship
Export as a blob — PNG / SVG / CSV download via URL.createObjectURL
Nothing in that list needs a chart SaaS.…