Skip to content

Commit 9985c5b

Browse files
committed
feat: add complex dashboard demos and component lab
1 parent 41336c4 commit 9985c5b

26 files changed

Lines changed: 1151 additions & 107 deletions

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ You choose the LLM. You own the data. You control the deployment. Zaati OS has n
3636
## What makes it different
3737

3838
- **Any LLM workflow:** ChatGPT, Claude, Gemini, a local model, n8n, cron, or custom code can publish the same contract.
39-
- **LLM-directed presentation:** A safe UI contract lets the producer request metrics, lists, timelines, calendars, line or bar charts, progress views, notices, text, and tables. The renderer only permits audited components, never arbitrary HTML or code.
39+
- **LLM-directed presentation:** A safe UI contract lets the producer request metrics, lists, timelines, calendars, line, bar, or allocation charts, progress views, notices, text, and tables. The renderer only permits audited components, never arbitrary HTML or code.
4040
- **Private by architecture:** Real snapshots are ignored in the public code repository. The recommended public-fork setup keeps data in a separate private repository and protects the deployment with Cloudflare Access.
4141
- **Files before databases:** JSON is portable, diffable, inspectable, and easy for AI tools to create.
4242
- **Useful failure states:** Freshness, provenance, confidence, missing sources, and warnings remain visible.
@@ -75,6 +75,8 @@ make tutorial
7575

7676
Everything else, including custom sources, encrypted storage, full theme tokens, and automatic deployment, is optional and documented separately.
7777

78+
Synthetic demo mode includes a **Component lab** with the JSON contract beside each rendered block. Every demo source also includes a **Recreate this page** drawer containing the current base worker and source-specific Markdown prompt, ready for placeholder review and use in a scheduled LLM workflow.
79+
7880
The canonical daily bundle contains agenda, inbox attention, work focus, money, news, and the dependency-backed daily overview. Prompt Studio can also create smaller independent bundles, and now generates the matching private-repository setup command.
7981

8082
## Create a scheduled task prompt

config/sources.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"cadence": "daily",
1515
"freshness_sla_hours": 30,
1616
"dashboard_role": "primary",
17-
"presentation": { "preferred_blocks": ["calendar", "list", "notice"] },
17+
"presentation": { "preferred_blocks": ["metric-group", "calendar", "list", "timeline", "notice"] },
1818
"depends_on": [],
1919
"target_path": "data/snapshots/agenda/primary/{YYYY}/{MM}/{YYYY-MM-DD}.json",
2020
"privacy": {
@@ -36,7 +36,7 @@
3636
"cadence": "daily",
3737
"freshness_sla_hours": 30,
3838
"dashboard_role": "primary",
39-
"presentation": { "preferred_blocks": ["metric-group", "list", "notice"] },
39+
"presentation": { "preferred_blocks": ["metric-group", "list", "timeline", "table", "notice"] },
4040
"depends_on": [],
4141
"target_path": "data/snapshots/inbox/attention/{YYYY}/{MM}/{YYYY-MM-DD}.json",
4242
"privacy": {
@@ -58,7 +58,7 @@
5858
"cadence": "weekdays",
5959
"freshness_sla_hours": 36,
6060
"dashboard_role": "primary",
61-
"presentation": { "preferred_blocks": ["metric-group", "table", "list", "progress", "notice"] },
61+
"presentation": { "preferred_blocks": ["metric-group", "table", "list", "progress", "timeline", "notice"] },
6262
"depends_on": [],
6363
"target_path": "data/snapshots/work/focus/{YYYY}/{MM}/{YYYY-MM-DD}.json",
6464
"privacy": {
@@ -80,7 +80,7 @@
8080
"cadence": "daily",
8181
"freshness_sla_hours": 36,
8282
"dashboard_role": "primary",
83-
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "bar-chart", "table", "progress", "notice"] },
83+
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "bar-chart", "donut-chart", "table", "progress", "notice"] },
8484
"depends_on": [],
8585
"target_path": "data/snapshots/money/pulse/{YYYY}/{MM}/{YYYY-MM-DD}.json",
8686
"privacy": {
@@ -102,7 +102,7 @@
102102
"cadence": "daily",
103103
"freshness_sla_hours": 24,
104104
"dashboard_role": "primary",
105-
"presentation": { "preferred_blocks": ["list", "timeline", "text", "notice"] },
105+
"presentation": { "preferred_blocks": ["list", "timeline", "bar-chart", "table", "text", "notice"] },
106106
"depends_on": [],
107107
"target_path": "data/snapshots/news/briefing/{YYYY}/{MM}/{YYYY-MM-DD}.json",
108108
"privacy": {
@@ -124,7 +124,7 @@
124124
"cadence": "daily",
125125
"freshness_sla_hours": 30,
126126
"dashboard_role": "primary",
127-
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "calendar", "list", "progress", "notice"] },
127+
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "calendar", "list", "progress", "timeline", "table", "notice"] },
128128
"depends_on": ["agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing"],
129129
"target_path": "data/snapshots/overview/daily/{YYYY}/{MM}/{YYYY-MM-DD}.json",
130130
"privacy": {
@@ -146,7 +146,7 @@
146146
"cadence": "weekly",
147147
"freshness_sla_hours": 192,
148148
"dashboard_role": "primary",
149-
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "list", "progress", "timeline", "notice"] },
149+
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "list", "progress", "timeline", "table", "notice"] },
150150
"depends_on": ["overview:daily", "agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing"],
151151
"target_path": "data/snapshots/review/weekly/{YYYY}/{MM}/{YYYY-MM-DD}.json",
152152
"privacy": {

data/examples/agenda/primary/2026-08-24.json

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,19 @@
3939
"start": "2026-08-24T13:00:00Z",
4040
"end": "2026-08-24T14:30:00Z",
4141
"status": "scheduled"
42+
},
43+
{
44+
"id": "a4",
45+
"title": "Walk and reset",
46+
"start": "2026-08-24T15:00:00Z",
47+
"end": "2026-08-24T15:30:00Z",
48+
"status": "scheduled"
4249
}
4350
],
4451
"actions": [
4552
{ "id": "p1", "title": "Open the acceptance criteria", "due_at": "2026-08-24T08:30:00Z", "status": "open" },
46-
{ "id": "p2", "title": "Write the sync decision", "due_at": "2026-08-24T11:00:00Z", "status": "open" }
53+
{ "id": "p2", "title": "Write the sync decision", "due_at": "2026-08-24T11:00:00Z", "status": "open" },
54+
{ "id": "p3", "title": "Prepare the release note", "due_at": "2026-08-24T13:00:00Z", "status": "open" }
4755
]
4856
},
4957
"presentation": {
@@ -64,7 +72,8 @@
6472
"tone": "positive"
6573
},
6674
{ "id": "a2", "title": "Project sync", "start": "2026-08-24T11:00:00Z", "end": "2026-08-24T11:30:00Z", "tone": "info" },
67-
{ "id": "a3", "title": "Review and ship", "start": "2026-08-24T13:00:00Z", "end": "2026-08-24T14:30:00Z", "tone": "positive" }
75+
{ "id": "a3", "title": "Review and ship", "start": "2026-08-24T13:00:00Z", "end": "2026-08-24T14:30:00Z", "tone": "positive" },
76+
{ "id": "a4", "title": "Walk and reset", "start": "2026-08-24T15:00:00Z", "end": "2026-08-24T15:30:00Z", "tone": "neutral" }
6877
]
6978
},
7079
{
@@ -74,8 +83,55 @@
7483
"span": "one",
7584
"items": [
7685
{ "id": "p1", "title": "Open the acceptance criteria", "meta": "Before 08:30", "tone": "neutral" },
77-
{ "id": "p2", "title": "Write the sync decision in one sentence", "meta": "Before 11:00", "tone": "info" }
86+
{ "id": "p2", "title": "Write the sync decision in one sentence", "meta": "Before 11:00", "tone": "info" },
87+
{ "id": "p3", "title": "Prepare the release note", "meta": "Before 13:00", "tone": "neutral" }
88+
]
89+
},
90+
{
91+
"id": "day-capacity",
92+
"kind": "metric-group",
93+
"title": "Day capacity",
94+
"span": "full",
95+
"metrics": [
96+
{ "label": "Protected focus", "value": 3.5, "unit": "hours", "tone": "positive" },
97+
{ "label": "Meetings", "value": 0.5, "unit": "hours", "tone": "neutral" },
98+
{ "label": "Open buffer", "value": 2, "unit": "hours", "tone": "info" },
99+
{ "label": "Prep actions", "value": 3, "tone": "warning" }
78100
]
101+
},
102+
{
103+
"id": "day-sequence",
104+
"kind": "timeline",
105+
"title": "Energy-aware sequence",
106+
"span": "one",
107+
"items": [
108+
{
109+
"label": "08:30",
110+
"title": "Build before coordinating",
111+
"description": "Use the highest-energy window for the complete slice.",
112+
"tone": "positive"
113+
},
114+
{
115+
"label": "11:00",
116+
"title": "Make one decision visible",
117+
"description": "End the sync with an owner and next checkpoint.",
118+
"tone": "info"
119+
},
120+
{
121+
"label": "15:00",
122+
"title": "Stop before the final push",
123+
"description": "The reset protects the remaining buffer.",
124+
"tone": "neutral"
125+
}
126+
]
127+
},
128+
{
129+
"id": "buffer",
130+
"kind": "notice",
131+
"title": "Keep 15:30 onward unclaimed",
132+
"body": "That window absorbs a late review, travel, or an unfinished release note without displacing recovery time.",
133+
"tone": "info",
134+
"span": "one"
79135
}
80136
]
81137
}

data/examples/inbox/attention/2026-08-24.json

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"quality": { "confidence": "high", "warnings": [] },
1515
"privacy": { "classification": "public", "contains_personal_data": false, "synthetic": true },
1616
"data": {
17-
"title": "Two messages deserve attention",
18-
"summary": "One scheduling decision and one document review need a response. Everything else can wait.",
17+
"title": "Four messages fit into two reply windows",
18+
"summary": "One deadline and one scheduling decision come first. A review and follow-up can share the afternoon window; 18 low-value messages remain excluded.",
1919
"attention": "medium",
2020
"facts": {
2121
"items": [
@@ -33,6 +33,21 @@
3333
"subject_summary": "Approve the revised outline",
3434
"reason": "reply",
3535
"status": "open"
36+
},
37+
{
38+
"id": "m3",
39+
"sender_label": "Operations contact",
40+
"subject_summary": "Confirm the renewal choice",
41+
"reason": "deadline",
42+
"deadline": "2026-08-24T15:00:00Z",
43+
"status": "open"
44+
},
45+
{
46+
"id": "m4",
47+
"sender_label": "Research collaborator",
48+
"subject_summary": "Close the open question",
49+
"reason": "follow-up",
50+
"status": "waiting"
3651
}
3752
]
3853
},
@@ -45,7 +60,8 @@
4560
"title": "Attention filter",
4661
"span": "full",
4762
"metrics": [
48-
{ "label": "Needs reply", "value": 2, "tone": "warning" },
63+
{ "label": "Needs reply", "value": 4, "tone": "warning" },
64+
{ "label": "Due today", "value": 2, "tone": "danger" },
4965
{ "label": "Waiting on others", "value": 1, "tone": "neutral" },
5066
{ "label": "Ignored noise", "value": 18, "tone": "positive" }
5167
]
@@ -71,6 +87,22 @@
7187
"meta": "15 minutes",
7288
"status": "Review",
7389
"tone": "info"
90+
},
91+
{
92+
"id": "m3",
93+
"title": "Confirm the renewal choice",
94+
"description": "A yes-or-no choice is due before the afternoon processing window.",
95+
"meta": "Due 15:00",
96+
"status": "Deadline",
97+
"tone": "danger"
98+
},
99+
{
100+
"id": "m4",
101+
"title": "Close the open research question",
102+
"description": "Send the missing constraint; no full thread review is required.",
103+
"meta": "No explicit deadline",
104+
"status": "Follow-up",
105+
"tone": "neutral"
74106
}
75107
]
76108
},
@@ -81,6 +113,44 @@
81113
"body": "Newsletters, receipts, automated updates, and promotional messages were excluded from the attention queue.",
82114
"tone": "positive",
83115
"span": "one"
116+
},
117+
{
118+
"id": "reply-plan",
119+
"kind": "timeline",
120+
"title": "Reply plan",
121+
"span": "one",
122+
"items": [
123+
{
124+
"label": "09:50",
125+
"title": "Resolve the scheduling choice",
126+
"description": "Reply before the first focus block closes.",
127+
"tone": "warning"
128+
},
129+
{
130+
"label": "12:15",
131+
"title": "Confirm the renewal",
132+
"description": "A one-line answer clears the only hard deadline.",
133+
"tone": "danger"
134+
},
135+
{ "label": "16:00", "title": "Batch review and follow-up", "description": "Cap the window at 25 minutes.", "tone": "info" }
136+
]
137+
},
138+
{
139+
"id": "attention-register",
140+
"kind": "table",
141+
"title": "Attention register",
142+
"span": "one",
143+
"columns": [
144+
{ "key": "item", "label": "Item" },
145+
{ "key": "reason", "label": "Reason" },
146+
{ "key": "window", "label": "Window" }
147+
],
148+
"rows": [
149+
{ "item": "Planning window", "reason": "Decision", "window": "09:50" },
150+
{ "item": "Renewal choice", "reason": "Deadline", "window": "12:15" },
151+
{ "item": "Revised outline", "reason": "Review", "window": "16:00" },
152+
{ "item": "Research question", "reason": "Follow-up", "window": "16:00" }
153+
]
84154
}
85155
]
86156
}

0 commit comments

Comments
 (0)