Silvi

Your first report

Ask Claude for a report on one of your tables, look at it, and steer it in plain words.

This takes about twenty minutes. You need the app running, as in the Quickstart. Your own data helps, but a CSV or Excel export of one table is enough: give it to Claude first (“Here is orders.csv. Put it in the CSV folder.”). Connect your own data has the details, and the database route.

Pick one table and one question

Start small: one table, one question. For example, a CSV export of your orders and the question “How many orders do we get each week, and for how much?”

If you are not sure what the columns are called, ask Claude to look first:

“Look at orders.csv and tell me which columns could give a weekly order count and amount.”

Ask for it

Say four things: the question, the table, the figures, and the period.

“Make a report called Orders from orders.csv. Show the number of orders and their total amount per week, with tiles for the totals and a line chart over time. Follow the date filter.”

What you see

After a minute or two, Claude answers in plain words: it made the Orders report, checked it, and opened it in your browser at http://localhost:9923/reports/orders. The page has tiles with the totals, a line chart of orders per week, and the date filter at the top. The report is also in the Reports list from now on. Here is its chart:

Orders

Oct 1, 2025 – Oct 8, 2026

Orders per week

W292026W302026W312026W322026W332026W342026W352026W362026W372026W382026W392026W4020260100200300400500

Claude wrote two files for it. You never need to read them; they are under What Claude wrote at the end of this page.

Look and steer

Check one figure against a number you trust. Then ask for changes in plain words:

  • “Show the amount in thousands.”
  • “Start the chart at the beginning of the year.”
  • “Add a table of the last twelve weeks under the chart.”

If something looks wrong, say what you expected:

“Last week shows 40 orders, but our shop had about 400. Check the SQL.”

Claude reads the SQL (the query behind the figure), explains the difference, and either fixes it or writes the rule into the report’s dialog, the one the (i) button at the top opens, where readers see how a figure is counted.

Make it yours

Each of these is one request. Try them on the same report.

Ask What you get
“Add a bar chart of this period’s amount by product category.” A bar chart, and a new question to your data grouped by category
“Add a table of the categories with orders, amount and average order.” A table under the chart
“Explain in the (i) how the amount is counted: before or after refunds.” A rule in the report’s dialog
“Add a toggle that shows the table by month instead of by week.” A switch above the table

Every chart, table and switch is a component, one building block of a report page. They are all listed in All components.

Save it

When it looks right, ask:

“Save this version: the Orders report with the category table.”

A saved version is a snapshot of all your app’s files at one moment. Claude keeps them with git, the free program you installed in the Quickstart, which records every change; you never use it yourself. You can ask “What changed since yesterday?” or “Put the Orders report back as it was this morning”, and nothing is lost. Your passwords in app/.env are never part of a saved version.

What Claude wrote
app/src/reports/orders/weekly.sql
-- Orders and amount per week
select strftime('%Y-W%W', ordered_on) as week,
       count(*) as orders, sum(amount) as amount
from orders
where ordered_on between date($from) and date($to)
group by 1
order by 1
app/src/reports/orders/report.tsx
import { defineReport, query } from "~/components/report-kit/define"

import weekly from "./weekly.sql?raw"

type Week = { week: string; orders: number; amount: number }

export default defineReport({
  meta: { title: "Orders", description: "Orders and amount per week.", connector: "csv" },
  queries: { weekly: query<Week>(weekly, { grain: "week" }) },
  components: (k) => [
    <k.Line key="orders" series="weekly" x="week" xFormat="week" y={{ orders: "Orders" }} title="Orders per week" />,
  ],
})

A report is a folder, app/src/reports/orders/, with two kinds of file:

  • weekly.sql, a question to your data in SQL. Its first line is its title. $from and $to are the dates in the date filter.
  • report.tsx, the page: its title and description, which connector reads the data, the questions it asks, and the components that draw the answers. The real file also has the row of tiles and the “(i)” dialog.

The query reads the week as 2026-W30, and grain: "week" lets the date filter cut the rows by week.

SQL dialects. Each database writes some SQL its own way, its dialect. CSV, Excel and JSON files are read with SQLite’s, as above: strftime('%Y-W%W', ordered_on) makes the week, and SQLite’s weeks start on Monday. On Postgres the same line is to_char(ordered_on, 'IYYY-"W"IW'). Claude writes the dialect of your connector; the table is in Report files.

The checks. After writing, Claude runs the app’s checks (npm run lint): a report folder holds only report.tsx and .sql files, each query has its title line, and every column a component reads is one the query returns. A failure names the file and line, and Claude fixes it before you look.

The whole format is on Report files.

Next

Connect your own data: give Claude your files, keep a weekly export fresh, or connect your company’s database.

Then, when you want to know more: Modules (the app’s sidebar entries), Report files (what a report holds), All components (every chart, table and input) and FAQ.