Your first cell in 60 seconds.

Five steps. Edit code on the left, see live results on the right. No setup, no install.

1 Value
2 Formula
3 Listen
4 Branch
5 Ship

A value cell

Every sheet starts with data. Edit the value, watch the cell on the right update.

my-sheet.yaml step 1 / 5
cells: - id: budget.total kind: value value: 5000
live output โ— live
budget.total 5000
๐Ÿ’ก Try editing value: 5000 to a different number. The cell on the right updates instantly. That's reactivity.

A formula cell

A formula cell computes from other cells. It recomputes automatically when its inputs change.

my-sheet.yaml step 2 / 5
cells: - id: budget.total kind: value value: 5000 - id: spend kind: value value: 2770 - id: remaining kind: formula expr: "budget.total - spend"
live output โ— live
budget.total5000
spend2770
remaining2230
๐Ÿ’ก Edit value: 2770 on the spend cell. remaining recomputes automatically. That's the reactive engine doing its job.

A listener cell

A listener fires when a cell changes. Use it for alerts, logs, or any side effect.

my-sheet.yaml step 3 / 5
cells: - id: budget.total kind: value value: 5000 - id: spend kind: value value: 2770 - id: remaining kind: formula expr: "budget.total - spend" - id: status kind: formula expr: "remaining < 0 ? 'over' : (remaining < 1000 ? 'low' : 'ok')" - id: alert kind: listener watch: status condition: "status === 'low'" action: "console.log('โš ๏ธ Budget low!')"
live output โ— live
budget.total5000
spend2770
remaining2230
statusok
alert (fired?)โ€” no โ€”
๐Ÿ’ก Set spend: 4500 and watch: remaining drops, status goes to low, the alert listener fires. Open the browser console to see the log.

Branch the future

Try a different scenario without losing the original. Click "Branch" to fork the engine.

branches 2 timelines
budget.total5000
spend2770
remaining2230
statusok
what just happened 3 cells

You branched the engine. Now there are two timelines โ€” main and alternate. Set a value on one branch. Switch to the other. The other still has the old value.

This is what quilt-time gives you: every cell has a history. You can branch, rewind, replay, merge. Like git for your data, but it's a runtime.

You shipped a sheet.

Three cells, one formula, one listener. You wrote 15 lines of YAML. You have a reactive system.

your-sheet.yaml complete
cells: - id: budget.total kind: value value: 5000 - id: spend kind: value value: 2770 - id: remaining kind: formula expr: "budget.total - spend" - id: status kind: formula expr: "remaining < 0 ? 'over' : (remaining < 1000 ? 'low' : 'ok')" - id: alert kind: listener watch: status condition: "status === 'low'" action: "console.log('โš ๏ธ Budget low!')"

๐ŸŽ‰ You did it.

You just learned the four core concepts of Quilt: value, formula, listener, and branch. The whole model fits in your head.

Where to go next

Try it in your browser Open Quilt Studio Read the full docs See all 11 repos