Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ Zaati OS is an open-source, private-by-default personal operating system. Schedu

You choose the LLM. You own the data. You control the deployment. Zaati OS has no hosted account, required telemetry, central database, or platform fee.

Explore the [three populated dashboard examples](examples/README.md), with local screenshots, forkable JSON compositions, and a documented [design system](docs/design-system.md). Run `npm run examples` after installing dependencies.
Explore the [seven populated dashboard examples](examples/README.md), with local screenshots, forkable JSON compositions, and a documented [design system](docs/design-system.md). Run `npm run examples` after installing dependencies.

<p align="center">
<img width="720" height="405" alt="Animated preview of the Zaati OS synthetic dashboard" src="https://github.com/user-attachments/assets/efa34769-a201-433e-851e-c407b33580f4" />
<img width="1200" alt="Zaati OS Money dashboard with synthetic balance trends, budget, and allocation" src="examples/screenshots/money-preview.png" />
</p>

> The LLM is the ingestion and reasoning layer. Your private snapshot store is the durable memory. The dashboard is the interface.
Expand Down
4 changes: 2 additions & 2 deletions config/instance.example.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "../schemas/instance.schema.json",
"brand_name": "Zaati OS",
"brand_mark": "ذ",
"brand_mark": "\u0630",
"tagline": "Your day, with context.",
"timezone": "UTC",
"locale": "en-US",
Expand All @@ -10,7 +10,7 @@
"enabled_sources": ["overview:daily", "agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing", "review:weekly"],
"experience": {
"mode": "demo",
"show_tour": true
"show_tour": false
},
"theme": {
"preset": "sage",
Expand Down
36 changes: 25 additions & 11 deletions config/sources.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
"cadence": "daily",
"freshness_sla_hours": 30,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["metric-group", "calendar", "list", "timeline", "notice"] },
"presentation": {
"preferred_blocks": ["metric-group", "calendar", "list", "timeline", "notice"]
},
"depends_on": [],
"target_path": "data/snapshots/agenda/primary/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand All @@ -28,15 +30,17 @@
"id": "inbox:attention",
"domain": "inbox",
"source": "attention",
"label": "Inbox attention",
"label": "Inbox",
"description": "Only messages that need a response, decision, deadline, or follow-up.",
"worker_id": "inbox-attention-daily",
"prompt": "prompts/inbox-attention.md",
"schema_ref": "schemas/domains/inbox.schema.json",
"cadence": "daily",
"freshness_sla_hours": 30,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["metric-group", "list", "timeline", "table", "notice"] },
"presentation": {
"preferred_blocks": ["metric-group", "list", "timeline", "table", "notice"]
},
"depends_on": [],
"target_path": "data/snapshots/inbox/attention/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand All @@ -50,15 +54,17 @@
"id": "work:focus",
"domain": "work",
"source": "focus",
"label": "Work focus",
"label": "Work",
"description": "Owned work, blockers, decisions, and the smallest useful next actions.",
"worker_id": "work-focus-daily",
"prompt": "prompts/work-focus.md",
"schema_ref": "schemas/domains/work.schema.json",
"cadence": "weekdays",
"freshness_sla_hours": 36,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["metric-group", "table", "list", "progress", "timeline", "notice"] },
"presentation": {
"preferred_blocks": ["metric-group", "table", "list", "progress", "timeline", "notice"]
},
"depends_on": [],
"target_path": "data/snapshots/work/focus/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand All @@ -72,15 +78,17 @@
"id": "money:pulse",
"domain": "money",
"source": "pulse",
"label": "Money pulse",
"label": "Money",
"description": "User-approved totals, changes, goals, and evidence without raw statements.",
"worker_id": "money-pulse-daily",
"prompt": "prompts/money-pulse.md",
"schema_ref": "schemas/domains/money.schema.json",
"cadence": "daily",
"freshness_sla_hours": 36,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "bar-chart", "donut-chart", "table", "progress", "notice"] },
"presentation": {
"preferred_blocks": ["metric-group", "line-chart", "bar-chart", "donut-chart", "table", "progress", "notice"]
},
"depends_on": [],
"target_path": "data/snapshots/money/pulse/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand All @@ -94,15 +102,17 @@
"id": "news:briefing",
"domain": "news",
"source": "briefing",
"label": "News briefing",
"label": "Briefing",
"description": "A small evidence-linked briefing based on configured interests.",
"worker_id": "news-briefing-daily",
"prompt": "prompts/news-briefing.md",
"schema_ref": "schemas/domains/news.schema.json",
"cadence": "daily",
"freshness_sla_hours": 24,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["list", "timeline", "bar-chart", "table", "text", "notice"] },
"presentation": {
"preferred_blocks": ["list", "timeline", "bar-chart", "table", "text", "notice"]
},
"depends_on": [],
"target_path": "data/snapshots/news/briefing/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand All @@ -124,7 +134,9 @@
"cadence": "daily",
"freshness_sla_hours": 30,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "calendar", "list", "progress", "timeline", "table", "notice"] },
"presentation": {
"preferred_blocks": ["metric-group", "line-chart", "calendar", "list", "progress", "timeline", "table", "notice"]
},
"depends_on": ["agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing"],
"target_path": "data/snapshots/overview/daily/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand All @@ -146,7 +158,9 @@
"cadence": "weekly",
"freshness_sla_hours": 192,
"dashboard_role": "primary",
"presentation": { "preferred_blocks": ["metric-group", "line-chart", "list", "progress", "timeline", "table", "notice"] },
"presentation": {
"preferred_blocks": ["metric-group", "line-chart", "list", "progress", "timeline", "table", "notice"]
},
"depends_on": ["overview:daily", "agenda:primary", "inbox:attention", "work:focus", "money:pulse", "news:briefing"],
"target_path": "data/snapshots/review/weekly/{YYYY}/{MM}/{YYYY-MM-DD}.json",
"privacy": {
Expand Down
9 changes: 9 additions & 0 deletions data/component-examples.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[
{
"id": "reading-note",
"kind": "text",
"title": "Reading a snapshot",
"body": "A snapshot records what was known at a point in time. Check the source dates before using it to make a decision.",
"span": "full"
}
]
169 changes: 113 additions & 56 deletions data/examples/agenda/primary/2026-08-24.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,60 @@
"domain": "agenda",
"source": "primary",
"generated_at": "2026-08-24T07:20:00Z",
"effective_period": { "start": "2026-08-24T00:00:00Z", "end": "2026-08-24T23:59:59Z", "timezone": "UTC" },
"effective_period": {
"start": "2026-08-24T00:00:00Z",
"end": "2026-08-24T23:59:59Z",
"timezone": "UTC"
},
"status": "success",
"producer": { "worker_id": "agenda-daily", "workflow": "example", "version": "0.1.1" },
"sources": [{ "label": "Synthetic calendar", "status": "ok", "as_of": "2026-08-24T07:20:00Z", "reference": "synthetic://calendar" }],
"freshness": { "expires_at": "2026-08-25T13:20:00Z" },
"quality": { "confidence": "high", "warnings": [] },
"privacy": { "classification": "public", "contains_personal_data": false, "synthetic": true },
"producer": {
"worker_id": "agenda-daily",
"workflow": "example",
"version": "0.1.1"
},
"sources": [
{
"label": "Synthetic calendar",
"status": "ok",
"as_of": "2026-08-24T07:20:00Z",
"reference": "synthetic://calendar"
}
],
"freshness": {
"expires_at": "2026-08-25T13:20:00Z"
},
"quality": {
"confidence": "high",
"warnings": []
},
"privacy": {
"classification": "public",
"contains_personal_data": false,
"synthetic": true
},
"data": {
"title": "A focused Monday",
"summary": "Two deep-work windows, one short sync, and enough recovery space remain.",
"title": "Agenda",
"summary": "See today\u2019s commitments and prepare for the next one. Two focus windows total 3.5 hours; the only meeting takes 30 minutes.",
"attention": "low",
"facts": {
"events": [
{
"id": "a1",
"title": "Build the first usable slice",
"title": "Finish the homepage",
"start": "2026-08-24T08:30:00Z",
"end": "2026-08-24T10:30:00Z",
"status": "scheduled"
},
{
"id": "a2",
"title": "Project sync",
"title": "Project check-in",
"start": "2026-08-24T11:00:00Z",
"end": "2026-08-24T11:30:00Z",
"status": "scheduled"
},
{
"id": "a3",
"title": "Review and ship",
"title": "Review the homepage",
"start": "2026-08-24T13:00:00Z",
"end": "2026-08-24T14:30:00Z",
"status": "scheduled"
Expand All @@ -49,78 +73,111 @@
}
],
"actions": [
{ "id": "p1", "title": "Open the acceptance criteria", "due_at": "2026-08-24T08:30:00Z", "status": "open" },
{ "id": "p2", "title": "Write the sync decision", "due_at": "2026-08-24T11:00:00Z", "status": "open" },
{ "id": "p3", "title": "Prepare the release note", "due_at": "2026-08-24T13:00:00Z", "status": "open" }
{
"id": "p1",
"title": "Open the homepage feedback",
"due_at": "2026-08-24T08:30:00Z",
"status": "open"
},
{
"id": "p2",
"title": "List the decision needed at check-in",
"due_at": "2026-08-24T11:00:00Z",
"status": "open"
},
{
"id": "p3",
"title": "Prepare the review link",
"due_at": "2026-08-24T13:00:00Z",
"status": "open"
}
]
},
"presentation": {
"layout": "focus",
"layout": "dashboard",
"blocks": [
{
"id": "day-capacity",
"kind": "metric-group",
"title": "Today\u2019s commitments",
"span": "full",
"metrics": [
{
"label": "Focus time",
"value": 3.5,
"unit": "hours"
},
{
"label": "Meeting time",
"value": 30,
"unit": "minutes"
},
{
"label": "Scheduled events",
"value": 4
}
]
},
{
"id": "schedule",
"kind": "calendar",
"title": "Schedule",
"title": "Monday\u2019s schedule",
"date": "2026-08-24",
"span": "two",
"events": [
{
"id": "a1",
"title": "Build the first usable slice",
"title": "Finish the homepage",
"start": "2026-08-24T08:30:00Z",
"end": "2026-08-24T10:30:00Z",
"tone": "positive"
},
{ "id": "a2", "title": "Project sync", "start": "2026-08-24T11:00:00Z", "end": "2026-08-24T11:30:00Z", "tone": "info" },
{ "id": "a3", "title": "Review and ship", "start": "2026-08-24T13:00:00Z", "end": "2026-08-24T14:30:00Z", "tone": "positive" },
{ "id": "a4", "title": "Walk and reset", "start": "2026-08-24T15:00:00Z", "end": "2026-08-24T15:30:00Z", "tone": "neutral" }
]
{
"id": "a2",
"title": "Project check-in",
"start": "2026-08-24T11:00:00Z",
"end": "2026-08-24T11:30:00Z",
"tone": "info"
},
{
"id": "a3",
"title": "Review the homepage",
"start": "2026-08-24T13:00:00Z",
"end": "2026-08-24T14:30:00Z",
"tone": "positive"
},
{
"id": "a4",
"title": "Walk and reset",
"start": "2026-08-24T15:00:00Z",
"end": "2026-08-24T15:30:00Z",
"tone": "neutral"
}
],
"description": "August 24 \u00b7 all times in UTC"
},
{
"id": "prep",
"kind": "list",
"title": "Tiny preparation",
"span": "one",
"items": [
{ "id": "p1", "title": "Open the acceptance criteria", "meta": "Before 08:30", "tone": "neutral" },
{ "id": "p2", "title": "Write the sync decision in one sentence", "meta": "Before 11:00", "tone": "info" },
{ "id": "p3", "title": "Prepare the release note", "meta": "Before 13:00", "tone": "neutral" }
]
},
{
"id": "day-capacity",
"kind": "metric-group",
"title": "Day capacity",
"span": "full",
"metrics": [
{ "label": "Protected focus", "value": 3.5, "unit": "hours", "tone": "positive" },
{ "label": "Meetings", "value": 0.5, "unit": "hours", "tone": "neutral" },
{ "label": "Open buffer", "value": 2, "unit": "hours", "tone": "info" },
{ "label": "Prep actions", "value": 3, "tone": "warning" }
]
},
{
"id": "day-sequence",
"kind": "timeline",
"title": "Energy-aware sequence",
"title": "Before each commitment",
"span": "one",
"items": [
{
"label": "08:30",
"title": "Build before coordinating",
"description": "Use the highest-energy window for the complete slice.",
"tone": "positive"
"id": "p1",
"title": "Open the homepage feedback",
"meta": "Before 08:30",
"tone": "neutral"
},
{
"label": "11:00",
"title": "Make one decision visible",
"description": "End the sync with an owner and next checkpoint.",
"id": "p2",
"title": "List the decision needed at check-in",
"meta": "Before 11:00",
"tone": "info"
},
{
"label": "15:00",
"title": "Stop before the final push",
"description": "The reset protects the remaining buffer.",
"id": "p3",
"title": "Prepare the review link",
"meta": "Before 13:00",
"tone": "neutral"
}
]
Expand All @@ -131,7 +188,7 @@
"title": "Keep 15:30 onward unclaimed",
"body": "That window absorbs a late review, travel, or an unfinished release note without displacing recovery time.",
"tone": "info",
"span": "one"
"span": "full"
}
]
}
Expand Down
Loading