Product demo · by Grady Davis
Ask a spreadsheet a question.
Get the answer, and the SQL.
Drop in any CSV. Sift reads it in a background thread, works out what every column is, flags what looks wrong, and answers plain-English questions with a chart, a table and the query it ran. Your file never leaves this tab.
A made-up coffee chain, generated in your browser, with real-world mess planted on purpose: blanks, duplicates, “$4.75” and “10%” text, a comma inside a product name.
Paste CSV text instead
- Plain-English questions“which store has the highest revenue”, “latte sales by weekday”, “orders over $50 without a rating”
- Shows its workingEvery word it used is highlighted, every guess is listed, and the SQL is right there to copy
- Finds things on its ownPeaks, leaders, outliers, duplicates and blanks, each one a click away from the rows behind it
Reading…
In a Web Worker, so this page stays responsive.
What Sift noticed
Computed from your data when it loaded. Each one opens the question that shows it.
Rows
Click a column name to sort (again to reverse). Rows tinted pink repeat an earlier row exactly. Only the rows on screen exist in the page, so scrolling 300,000 of them stays smooth.
Columns
What Sift decided each column is, and what’s in it.
Under the hood
How it’s built
No frameworks, no libraries and no server. About 1,879 lines of JavaScript and CSS, covered by 56 automated tests. AI does most of the typing; the engineering is mine.
- Worker threadParseHand-written RFC 4180 reader: quotes, escaped quotes, newlines inside fields, BOMs, four delimiters sniffed automatically.
- Worker threadTypeSamples each column to decide number, date, category, text, ID or yes/no. Reads “$1,234.50”, “(12)”, “15%”, ISO and US dates, 12-hour times.
- Worker → pageStoreColumnar: numbers and dates in Float64Arrays, text dictionary-encoded into Int32Arrays. Transferred to the page without copying.
- PageUnderstandYour question is matched against this file’s own column names and values, then turned into a query by a small set of rules.
- PageRunFilters compile to tight loops over the typed arrays; grouping, sums, averages, medians, time buckets and sorting run in milliseconds.
Why not send it to an AI model?
For this job a rule-based reader is the better tool. It answers instantly and offline, the same question always gives the same answer, it can be tested question by question, and the data never goes anywhere. When it guesses, it tells you, and you can check the SQL. A language model fits on top of this for the questions rules can’t reach, with this engine doing the counting so the numbers stay exact.
How it’s tested
56 tests run in Node against the same file the page uses: CSV edge cases, number and date formats, type detection, every engine result checked against a brute-force pass over the raw text, 34 real questions with the reading each one must produce, every suggested question, and a timing test on 300,000 rows.
Private by construction
The page’s Content-Security-Policy is connect-src 'none': the browser itself refuses any network request from this page, so a file you open here can’t be sent anywhere, by this code or anything else.
What it doesn’t do yet
Joins across files, two measures in one question, relative dates like “last 3 months”, or editing data. Questions it can’t place get a plain “I couldn’t match that” instead of a confident wrong answer.