Configuration¶
Cadence is configured via ~/.openclaw/cadence.json. The gateway reads this file at startup.
Full config reference¶
{
"enabled": true,
"vaultPath": "/path/to/obsidian/vault",
"delivery": {
"channel": "telegram",
"telegramChatId": "123456789"
},
"pillars": [
{ "id": "tech", "name": "Technology", "keywords": ["code", "architecture"] },
{ "id": "business", "name": "Business", "keywords": ["strategy", "growth"] },
{ "id": "life", "name": "Life", "keywords": ["health", "habits"] }
],
"llm": {
"provider": "anthropic",
"model": "claude-3-5-haiku-latest"
},
"extraction": {
"publishTag": "::publish"
},
"digest": {
"minToFlush": 5,
"maxHoursBetween": 12,
"cooldownHours": 4,
"quietHoursStart": "22:00",
"quietHoursEnd": "08:00"
},
"schedule": {
"enabled": true,
"nightlyDigest": "21:00",
"morningStandup": "08:00",
"timezone": "America/New_York"
}
}
Top-level options¶
| Key | Type | Default | Description |
|---|---|---|---|
enabled |
boolean |
false |
Whether Cadence starts with the gateway |
vaultPath |
string |
— | Absolute path to the Obsidian vault to watch |
Delivery¶
Controls where digests are sent.
| Key | Type | Default | Description |
|---|---|---|---|
delivery.channel |
"telegram" \| "discord" \| "log" |
"log" |
Delivery channel |
delivery.telegramChatId |
string |
— | Telegram chat ID (required when channel is "telegram") |
Pillars¶
Content categories used by the insight extractor to classify extracted insights. Each pillar has:
| Key | Type | Description |
|---|---|---|
id |
string |
Short identifier (used in output) |
name |
string |
Human-readable name |
keywords |
string[] |
Optional keywords to help classification |
Default pillars: tech, business, life.
LLM¶
Controls the model used for insight extraction.
| Key | Type | Default | Description |
|---|---|---|---|
llm.provider |
"anthropic" \| "openai" |
"anthropic" |
LLM provider |
llm.model |
string |
"claude-3-5-haiku-latest" |
Model identifier |
The LLM adapter uses OpenClaw's configured API keys. No additional key setup is needed if your gateway already has a working model provider.
Extraction¶
Controls how the insight extractor filters and processes content.
| Key | Type | Default | Description |
|---|---|---|---|
extraction.publishTag |
string |
"::publish" |
Marker string that flags content for extraction |
The extractor only processes files containing this marker. Files without it are ignored, even if they change in the watched vault.
Additional internal defaults (not currently exposed in config):
- Minimum content length: 50 characters
- Debounce window: 2 seconds after last edit
- Max batch size: 5 files per LLM call
- Min batch delay: 1 second between batches
Digest¶
Controls how insights are batched and when digests are flushed.
| Key | Type | Default | Description |
|---|---|---|---|
digest.minToFlush |
number |
5 |
Minimum insights before auto-flush |
digest.maxHoursBetween |
number |
12 |
Maximum hours between flushes |
digest.cooldownHours |
number |
4 |
Hours an insight must age before it can be flushed |
digest.quietHoursStart |
string |
"22:00" |
Start of quiet hours (no auto-flush) |
digest.quietHoursEnd |
string |
"08:00" |
End of quiet hours |
Flush triggers¶
A digest flushes when any of these conditions are met:
- Count trigger: Queued insights >=
minToFlush, all past cooldown, not in quiet hours - Time trigger: Hours since last flush >=
maxHoursBetween, at least one insight past cooldown, not in quiet hours - Cron trigger: A scheduled job fires — bypasses quiet hours and cooldown entirely
Quiet hours¶
During quiet hours (default 22:00-08:00), automatic flushes are suppressed. Scheduled cron jobs override this — if you set nightlyDigest: "21:00", that flush happens even though 21:00 is close to quiet hours, because cron triggers bypass all filters.
Cooldown¶
Freshly extracted insights wait cooldownHours before they can be auto-flushed. This prevents showing you insights from content you just wrote. Cron-triggered flushes ignore cooldown.
Schedule¶
Controls time-based triggers via the CronBridge source.
| Key | Type | Default | Description |
|---|---|---|---|
schedule.enabled |
boolean |
false |
Whether scheduled jobs are active |
schedule.nightlyDigest |
string |
— | Time for nightly digest flush (e.g., "21:00") |
schedule.morningStandup |
string |
— | Time for morning signal (e.g., "08:00") |
schedule.timezone |
string |
"America/New_York" |
Timezone for all schedule times |
Times are in 24-hour "HH:MM" format.
Storage¶
The digest queue is stored at ~/.openclaw/cadence/digest-queue.jsonl. This is an append-only JSONL file with line types: insight, dequeue, flush, clear. The file is fault-tolerant — malformed lines are skipped on read.
Environment variables¶
| Variable | Description |
|---|---|
CADENCE_DEBUG=1 |
Enable verbose signal logging on stderr |
Legacy config¶
Older versions used cadence fields directly in the main OpenClaw config (~/.openclaw/openclaw.json) under the cadence key. The P1 pipeline uses the dedicated cadence.json file instead. Both are read at startup; cadence.json takes precedence for P1 options.