agenda.json — Syntax Reference v0.1
The calendar view in the WebUI is driven by agenda.json, a structured
projection of all scheduled items. It lives at:
~/.outheis/human/webui/pages/agenda.json
Top-level structure
Top-level structure
{
"meta": { ... },
"facets": [ ... ],
"view": { ... },
"items": [ ... ]
}
meta
meta
"meta": {
"version": "0.1",
"generated": "2026-04-23T10:00:00Z",
"base_date": "2026-04-23"
}
base_date is the reference day for all relative day offsets.
Regenerated daily — always today.
facets
facets
"facets": [
{ "id": "cato", "label": "Arbeit", "hex": "#FF2E00" },
{ "id": "hiro", "label": "senswork", "hex": "#FFB400" },
{ "id": "rumi", "label": "Self", "hex": "#460A46" },
{ "id": "zeno", "label": "OFC", "hex": "#97EAD2" },
{ "id": "ou", "label": "Privat", "hex": "#218380" },
{ "id": "misc", "label": "Misc", "hex": "#7A7676" }
]
hex = CI color as a hex code. Hue and saturation are derived automatically
by the renderer via HSL conversion — no manual entry required.
The legend is built solely from this array.
view
view
"view": {
"range": 7,
"params": {
"peak_amp": 0.9,
"decay": 10.0,
"ghost_pull": 0.04,
"overlay_alpha": 0.09
}
}
range = visible days (7 / 14 / 30).
params control the gravitational field rendering and are applied to the UI
sliders on load.
items
items
Every item carries a Snowflake ID and a type.
fixed — time-boxed event
{
"id": "7430000000000001",
"type": "fixed",
"facet": "cato",
"title": "outheis Architecture",
"day": 0,
"start": "09:00",
"end": "11:00",
"density": "high",
"layer": 0,
"source": "projects/alpha.md",
"note": "optional"
}
fixed — multi-day (ISO datetime)
{
"id": "7430000000000041",
"type": "fixed",
"facet": "zeno",
"title": "Family gathering",
"start": "2026-04-28T12:00",
"end": "2026-04-30T18:00",
"source": "projects/travel.md"
}
No day field — computed automatically from the date.
Rendered as a connected bar spanning all affected rows.
volatile — undated floating item
{
"id": "7430000000000006",
"type": "volatile",
"facet": "cato",
"title": "Substack draft",
"day": 0,
"size": "m",
"source": "cato"
}
Field reference
Field reference
| Field | Type | fixed | volatile | Description |
|---|---|---|---|---|
id |
string (Snowflake) | ✓ | ✓ | Unique, chronologically sortable |
type |
"fixed" | "volatile" |
✓ | ✓ | |
facet |
string → facets[].id |
✓ | ✓ | Determines color and field behavior |
title |
string | ✓ | ✓ | |
day |
int (offset from base_date) |
✓* | ✓ | *omitted for multi-day ISO events |
start |
"HH:MM" or "YYYY-MM-DDTHH:MM" |
✓ | – | ISO format = multi-day |
end |
"HH:MM" or "YYYY-MM-DDTHH:MM" |
✓ | – | |
density |
"high" | "low" |
– | – | Field weight; absent = default |
layer |
0 | 1 |
– | – | 1 = overlay on top of another event |
size |
"s" | "m" | "l" |
– | ✓ | Effort estimate; determines visual width |
note |
string | – | – | Shown in tooltip only |
pos |
{"x": 0.42, "y": 0.38} |
– | – | Last drag position, written by the view |
source |
string | ✓ | ✓ | Origin: vault file path, "cato", "webui", "signal", "cli" |
done |
"YYYY-MM-DD" |
– | – | Set when item is completed; triggers retention countdown |
source values
source values
| Value | Set by | Meaning |
|---|---|---|
"path/to/file.md" |
zeno | Extracted from this vault file |
"cato" |
cato | Created or managed by the agenda agent |
"webui" |
WebUI | Added or modified via the calendar view |
"signal" |
signal.py | Received via Signal message |
"cli" |
relay/ou | Added via CLI / TUI |
Mapping from Shadow tag format
Mapping from Shadow tag format
Items map directly from the two-line tag format used in Shadow.md:
| Shadow tag line | agenda.json | Calendar |
|---|---|---|
#date-D #time-S-E #facet-X |
type: fixed, day: N, start: S, end: E |
Time-boxed block |
#date-D #facet-X |
type: volatile, day: N |
Floating label |
#action-required #facet-X |
type: volatile, day: null |
Floating, undated |
#date-D1 #date-D2 #time-S-E #facet-X |
type: fixed, start: D1TS, end: D2TE |
Multi-day block |
#date-D #time-HH:MM #facet-X |
type: volatile, day: N, duration: "HH:MM" |
Bounded floating box |
#action-required #time-HH:MM #facet-X |
type: volatile, day: 0, duration: "HH:MM" |
Bounded floating box |
#time-forms:#time-HH:MM-HH:MM= start/end →fixed;#time-HH:MM(single time) = duration →volatilewithdurationfield.