Companion film
The model is the app
Declare data, logic, and interface together, then open the same model as a working pipeline board.
16 secGrid 0.61.0
Open film page →Canonical Grid model
Track accounts as rows, then show them as a table and workflow board.
What this model gives you
20 min to study · Source reviewed 2026-08-24
Continue with guided practiceExpected checkpoint
After loading the canonical source with its authored account rows.
The total is a formula over Accounts, not a total calculated by either surface.
The Table binds directly to Accounts and names the fields people need to browse.
Kanban maps stage, name, and owner while leaving the underlying model unchanged.
MODEL "Pipeline CRM"
DESCRIPTION "Track accounts as rows, then show them as a table and workflow board."
VERSION "1.0.0"
AUTHOR "AI Agent"
TAGS "surface-template", "crm", "table", "kanban", "surfaces"
Accounts = [
{ name: "Acme", owner: "Mina", stage: "lead", value: 42000 },
{ name: "Northstar", owner: "Owen", stage: "qualified", value: 88000 },
{ name: "River Co", owner: "June", stage: "proposal", value: 56000 }
]
TotalPipeline IS currency = SUM(MAP(Accounts, row => row.value))
Accounts_Table!type = "table"
Accounts_Table!config = """
version = 1
kind = "table"
title = "Accounts"
[columns]
bind = "Accounts"
title = "Accounts"
[[columns.fields]]
key = "name"
label = "Account"
[[columns.fields]]
key = "owner"
label = "Owner"
[[columns.fields]]
key = "stage"
label = "Stage"
[[columns.fields]]
key = "value"
label = "Value"
"""
Accounts_Table!data = ""
Pipeline_Board!type = "kanban"
Pipeline_Board!config = """
version = 1
kind = "kanban"
title = "Pipeline"
[layout]
wip_limit = 8
[[columns]]
id = "lead"
title = "Lead"
[[columns]]
id = "qualified"
title = "Qualified"
[[columns]]
id = "proposal"
title = "Proposal"
[items]
bind = "Accounts"
column = "stage"
title = "name"
assignee = "owner"
"""
Pipeline_Board!data = ""
END MODEL