CSV Story
Drop a spreadsheet and read it as a narrative rather than a grid. A KPI strip, then a scene apiece for the trend, where value concentrates, how it splits, how it is distributed, which rows stand apart and what moves with what. Every scene carries one sentence of arithmetic you can check against the chart above it.
Drop a CSV here to build the story
Read in this tab. Nothing is uploaded, and nothing is stored.
Arithmetic, not adjectives
Plenty of tools will now write a paragraph about your spreadsheet. The paragraphs read well and they cannot be checked, which is a bad combination for anything you are going to forward to somebody. A model that says revenue showed strong growth driven by the West region has produced a sentence, not a finding, and you have no way to know whether it read the numbers or the vibe.
Every sentence here is a template with arithmetic in the holes. The trend takeaway divides the last bucket by the first and states the percentage, the period it covers and where the peak fell. The concentration takeaway states the top category's exact share and the top three combined. The outlier takeaway counts rows past two standard deviations, gives that as a percentage of the file and names the furthest value with its sigma. Every one of those numbers is on the chart directly above the sentence, so disagreeing with it takes ten seconds.
The other half of the discipline is silence. A scene that the data cannot support is not written. No date column means no trend scene, rather than a trend scene hedged into meaninglessness. No correlation above 0.25 means no relationship scene, rather than a scatter with the word weak doing all the work. A short file with no repeating categories gets an opening scene and nothing else, which is the honest report.
Worked example: the sample sales file
Seven columns, 180 rows, a year of orders:
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
Press the sample button and the story assembles. The KPI strip reads ROWS 180, TOTAL · REVENUE with the year's total and an average per order underneath, TOP · REGION naming the leading region with its share, and RANGE · DATE 12mo with the first and last date spelled out.
Then the scenes. Trend draws revenue by month as an area chart and says how much it moved between the first month and the last, and where the peak landed. Where it concentrates is a horizontal bar chart of revenue by region, and the sentence gives the leader's exact percentage and the top three combined. The split is a donut by channel with the largest and smallest shares stated. Distribution is a histogram of order values, and its sentence compares the median against the mean and says outright which direction the skew runs. Outliers only appears if there are any, and it names the largest with its sigma. Relationship plots units against revenue with the correlation coefficient and a reminder that correlation is not causation.
The whole thing takes about a second on a laptop, and it is the same second whether the file has 180 rows or 180,000, because every scene is an aggregate.
Two ways to keep it
- Copy the share link. The rows and the story travel in the URL hash. Paste the link into a message and the recipient sees the same story rebuilt in their browser. Nothing passes through a server, because browsers do not transmit the part of a URL after the hash. The ceiling is 200 KB encoded and the button tells you when a file is over it rather than silently truncating.
- Save as HTML. A single self-contained document holding every scene, every takeaway and the exact table behind each chart, with no scripts and no external requests. It opens from a folder, an attachment or a network share, and it will still open in five years. This is the version to attach to a report.
Neither route involves an account, and neither leaves anything behind on our side. That also means a story you did not save is gone when you close the tab, which is the honest tradeoff for a tool with no storage.
What this will not do
- No editing. The reading order is fixed and the scenes are not configurable. When one is nearly right, open the file on the matching chart tool, where everything is adjustable.
- No causal claims. The relationship scene reports a coefficient and immediately says correlation is not causation, because a story that implies a cause is a story that will be quoted as one.
- No forecast. There is no dashed continuation off the end of the trend. A projection drawn from a year of noisy data looks authoritative and is not.
- One file. No joining, no comparing two exports. Join first in the app, or compare with CSV diff.
- Strict date parsing. ISO dates, slash dates and month labels are read; free text with a date inside it is not. That strictness is why the trend scene never mislabels its buckets.
- A header row is required. The scenes are built from column names, so a file whose first line is data produces a story about columns named after values.
Frequently Asked Questions
Is the writing generated by an AI model?
No, and that is the point. Every sentence is a template filled with arithmetic that ran on your rows: a percentage change between the first and last bucket, the share of the total held by the top category, the count of rows beyond two standard deviations, a correlation coefficient. Nothing is inferred, nothing is guessed, and no request leaves your browser. If a claim in a takeaway looks wrong, the chart above it and the numbers behind it are right there to check it against.
Which scenes will I get?
Up to seven, and only the ones your data supports. An opening scene describing the file always appears. A trend scene needs a date column and a measure. A concentration scene needs something to group by. A split scene needs a second categorical column with between two and twelve values. A distribution scene needs at least eight numeric values. An outlier scene appears only if there are rows beyond two sigma. A relationship scene appears only if two numeric columns correlate at 0.25 or better. A file that supports none of them gets the opening scene and an honest silence rather than filler.
How does sharing a story work?
Copy the share link deflates your rows, encodes them and puts them in the URL after the hash. Send that link and the recipient sees the same story, rebuilt in their own browser from the link. Because browsers never transmit the part of a URL after a hash, the data never reaches a server on the way. The practical ceiling is 200 KB encoded, which is thousands of rows of typical CSV; past that the button says so rather than handing you a truncated link.
What is in the saved HTML file?
A single self-contained document with every scene, every takeaway and the exact table of numbers behind each chart, styled to be readable in light and dark mode. It has no scripts and no external requests, so it opens from a folder, an email attachment or a network share years later. The charts are not in it as pictures; the numbers are, which is the version that stays useful.
Why does my story have no trend scene?
Because no column parsed as a date. Dates are read strictly on purpose: ISO forms like 2024-03-15 always work, as do slash forms and month labels like Mar 2024, but a column of free text with dates buried in it is not treated as a date column. If your dates live in a format that is not being read, convert the column first and the scene appears.
How big a file can it handle?
Reading and charting are comfortable into the hundreds of thousands of rows, because every scene is an aggregate and the work scales with distinct values rather than with rows. Sharing is the tighter constraint: the link carries every column, so a wide file hits the 200 KB ceiling long before the charts struggle. Save the HTML instead when the file is large, or share a trimmed slice.
Can I change what a scene shows?
Not on this page. A story is a fixed reading order, and giving every scene its own controls would turn it back into a chart builder with extra steps. When a scene is close but not quite right, open the same file on the matching chart tool, where measure, dimension, aggregate, top N and grain are all adjustable.
Does anything get uploaded or stored?
No. The file is read with the browser's own file reader, every number is computed in the tab, and the charts are drawn locally. There is no upload endpoint, no cookie set by the tool and nothing written to storage. Closing the tab discards everything, which is also why a story cannot be recovered later unless you kept the link or the saved HTML.