Five minutes from a spreadsheet to a conversation

2026-09-20 · 5 min

"I have the numbers. I just don't have the time to find out what they say."
Every second person who has ever owned a spreadsheet
A penguin and a small robot sit on the same side of a desk, a spreadsheet between them, the robot pointing at one highlighted row while the penguin nods
Same desk, same file. One of them writes the SQL.

This is the demo we send to everyone who asks what tableski does. It fits in five minutes, it uses a real two-sheet workbook, and every step is a command you can copy. At the end you are asking a spreadsheet questions in plain words and getting answers that were computed over every row, not estimated.

Everything below lives in the demo folder of the open-source repository: the workbook, the script, the config.

Minute one: the file

sample.xlsx has two sheets. People lists names, cities and a couple of other columns; Orders lists names and amounts. The question worth asking joins them: who spent the most? In a spreadsheet that is a lookup, a helper column and a pivot. Here it is one query.

Minute two: in it goes

Sign in at tableski.io, create a token on the Tokens page, and run the script:

export TABLESKI_TOKEN=tsk_...
./demo.sh

It uploads the workbook through the API, asks the server what tables it now has, and asks the first question. The two sheets came back as two tables, people and orders, with typed columns, and the answer looks like this:

+-------+-------+
| name  | total |
+-------+-------+
| ada   | 150.5 |
| linus | 99.99 |
+-------+-------+

No account? Run the engine on your own machine instead. It is one binary, and the same script talks to it with TABLESKI_URL=http://127.0.0.1:8080/.

Minute three: a look around

Open the Query page. The two tables are on the left; clicking one shows its first rows. This is the same engine, the same guard and the same limits an AI gets, just with you typing. Try SELECT city, count(*) FROM people GROUP BY city. If you have never written SQL, the three example buttons are a start, and the next step means you never have to.

Minutes four and five: plain words

Now the part that makes it a conversation. kowalski is our agent runtime; it speaks the Model Context Protocol, so it can use tableski as a tool. Install it, point it at a chat model (any OpenAI-compatible endpoint; the key stays in your environment, or use a local model through Ollama for free) and at the tableski server from the demo config:

curl -fsSL https://raw.githubusercontent.com/yarenty/kowalski/main/install.sh | bash
cp kowalski.toml ~/.config/kowalski/config.toml     # put your token in
export OPENAI_API_KEY=...                            # the model's key, never in the file
kowalski-cli mcp tools -c ~/.config/kowalski/config.toml
kowalski-cli run -c ~/.config/kowalski/config.toml

The first command lists the tools kowalski now sees: list_tables, get_schema, query_sql, column_statistics, export_result. The second opens a prompt. Type:

Who spent the most, across both sheets? Then save the totals per person as totals.xlsx.

The agent calls list_tables to learn the names, writes the JOIN you saw above, runs it through query_sql, answers with the rows, and calls export_result for the file. The SQL it wrote is in the tool call, so when a number looks odd you can check the question that was actually asked. That is the difference from pasting a sheet into a chat window: the model never sees your cells, it only sees the result of a computation over them.

Prefer Claude Desktop, Claude Code or Cursor? The Connect page prints the config for each with your token already in it. The conversation is the same.

Now your own file

Swap sample.xlsx for the workbook you actually fight with, upload it the same way, and ask the question you have been putting off. Free accounts take one file up to 1 MB and 100,000 rows and keep it for 24 hours, which is enough to find out whether this changes your week. If it does, tell us what you asked; that is what the beta is for.

Start with a file.