-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathconfig.example.yaml
More file actions
224 lines (200 loc) · 9.24 KB
/
Copy pathconfig.example.yaml
File metadata and controls
224 lines (200 loc) · 9.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# callsheet config
# Copy to config.yaml and customize for your household.
# Claude model. Sonnet 5 = fast + cheap (~$0.03/day). Opus 5 = deeper insights (~$0.08/day).
model: claude-sonnet-5
# IANA timezone for the household. Sets the brief's date, output filenames,
# connector query windows and the scheduler. Falls back to the TZ environment
# variable, then the system zone. Set it explicitly — a container defaulting
# to UTC will otherwise date things a few hours off from the household's day.
timezone: America/New_York
# CUPS printer name. Run `lpstat -p -d` to find yours. Leave empty for --preview only.
printer: ""
# Where to save generated HTML/PDF files
output_dir: output
# Directory for Google OAuth credentials
credentials_dir: secrets
# Per-connector deadline in milliseconds. Connectors that hang past this are
# abandoned and surfaced as issues in the brief, so a single slow API can't
# stall the whole pipeline. Default: 60000 (60s).
# connector_timeout_ms: 60000
# Day of the week to prepend a compact "Week in Review" blurb to the daily
# brief. Accepts a day name (e.g. "saturday") or a number 0-6 (0=Sunday).
# Omit or leave commented to disable. On the configured day the daily brief
# still runs as normal; a short retrospective section (2-4 sentences) is
# added as the first section, reflecting on the past 7 days. The
# google_calendar lookback is auto-bumped to 7 days on review days so the
# retrospective has past events to reference.
# weekly_review_day: saturday
# Optional webhook posted to when brief generation fails outright, as
# {"title": "Callsheet", "message": "CRIT Callsheet brief failed (400): ..."}.
# Any endpoint accepting that shape works. Without it a failed brief is silent
# apart from the printed error page — which is how one deployment printed a
# GENERATION FAILED page every morning for 16 days after its API credit ran out.
# notify_webhook: "http://127.0.0.1:5015/alerts"
# Vacation ranges. Brief generation is skipped entirely on any date that
# falls within one of these ranges (inclusive on both ends, YYYY-MM-DD,
# evaluated in your configured timezone). Honoured by both the in-container
# scheduler and a direct CLI run, so a host cron calling `yarn print` is
# covered too. Pass --force to generate anyway.
# vacation:
# - { start: "2026-07-01", end: "2026-07-14" }
# - { start: "2026-12-23", end: "2026-12-31" }
# ---------------------------------------------------------------------------
# Connectors
# ---------------------------------------------------------------------------
connectors:
google_calendar:
enabled: true
credentials_dir: secrets
credentials_file: credentials.json # shared OAuth app — one app for all accounts
lookahead_days: 7
# How many days of past events to include. Needed for the week-in-review
# and for the per-person counts below. Defaults to 7.
lookback_days: 7
# Optional. Label recurring kinds of event so the brief can cite a count
# instead of tallying them itself. `pattern` is a case-insensitive regex
# matched against each event's summary and location.
# event_categories:
# - { label: Lessons, pattern: "lesson" }
# - { label: Appointments, pattern: "appt|appointment|Dr\\." }
# Multi-account: each person gets their own OAuth token + calendar list.
# All accounts use the shared credentials_file above unless overridden.
accounts:
- name: Person 1
calendar_ids:
- primary
# - "other_calendar_id@group.calendar.google.com"
# - "en.usa#holiday@group.v.calendar.google.com" # US holidays
# - name: Person 2
# credentials_file: other_app.json # override per-account if needed
# calendar_ids:
# - primary
todoist:
enabled: true
accounts:
- name: Person 1
token_env: TODOIST_TOKEN_1
# - name: Person 2
# token_env: TODOIST_TOKEN_2
gmail:
enabled: false
credentials_dir: secrets
credentials_file: credentials.json # shared OAuth app — one app for all accounts
query: "newer_than:2d -category:promotions -category:social"
max_messages: 25
# accounts:
# - name: Person 1
# - name: Person 2
weather:
enabled: true
location: "Your City, ST"
lat: 0.0
lon: 0.0
aviation_weather:
enabled: false
# Fields you always want weather for. Airports named in calendar events are
# added on top of these automatically, so a lesson booked somewhere new
# still gets a forecast and this list doesn't have to be maintained by hand.
# Use ICAO (KDEN) or FAA (06C) identifiers, not IATA (DEN).
stations: []
# derive_stations: false # Only use the stations listed above
# Only consider events that look like flying when reading airports off the
# calendar, so an unrelated event at an address near a field is ignored.
# activity_pattern: "flight|lesson|checkride"
# Map place names as they appear in event locations to the station that
# serves them — for fields whose events never spell out the identifier.
# airport_aliases:
# - { match: "Northfield Aviation", station: K123 }
# Optional — first ICAO station is used as the AFD source by default.
# wfo: KDEN # Pin a different WFO for the Area Forecast Discussion
# pirep_radius_nm: 100 # PIREP search radius around stations[0]
# pirep_age_hours: 2 # How recent PIREPs must be
# Sunrise / sunset / civil twilight / moon phase. Pure local computation —
# no API calls. Useful for VFR night currency, walks, stargazing.
sun_moon:
enabled: false
lat: 0.0
lon: 0.0
home_assistant:
enabled: false
url: http://homeassistant.local:8123
token_env: HA_TOKEN
entities: []
actual_budget:
enabled: false
server_url: https://budget.example.com/budget
password_env: ACTUAL_BUDGET_PASSWORD
sync_id: "your-sync-id-here"
# budget_password_env: ACTUAL_BUDGET_E2E_PASSWORD # only if using end-to-end encryption
lookback_days: 7
market:
enabled: false
symbols:
- VTSAX
garbage_recycling:
enabled: false
lookahead_days: 7
schedules:
# Weekly: same day every week
- name: Garbage
weekly: thursday
# Biweekly: every other week, anchored to a known pickup date
- name: Recycling
biweekly:
day: tuesday
anchor: "2026-04-21" # any known recycling pickup date
# Language learning — emits a phrase-of-the-day as the LAST item in the
# Executive Brief section. Maintains its own long-horizon phrase history
# (default 30 days) so phrases never repeat even as the shared memory
# bucket rotates out. Reads today's connector data for context cues so
# the phrase can tie into calendar events / weather / travel plans.
language:
enabled: false
target_language: Spanish # "French", "Japanese", any language name
label_prefix: Español # short label prefix used in the brief
level: "A1-A2" # CEFR level or informal tag
history_days: 30 # how far back to remember phrases
# ---------------------------------------------------------------------------
# Household members
# ---------------------------------------------------------------------------
# Everyone the brief is about. List people here even if they have no accounts
# of their own — a child, a guest, a visiting student. Without an entry the
# brief has no idea they exist, so their events read as belonging to whoever's
# calendar happens to carry them.
#
# Use `*_account` only when someone's name here differs from the matching
# `accounts[].name` under a connector below.
household:
- name: Person 1
role: self
- name: Person 2
role: partner
- name: Person 3
role: guest
notes: Staying with us this year; has no calendar or email of their own.
# ---------------------------------------------------------------------------
# Household context
# ---------------------------------------------------------------------------
# Free-form info injected into Claude's prompt. The more specific, the better.
# Include dates here — Claude will calculate countdowns automatically.
context:
people: "Your names here"
# Add anything that helps Claude make better observations:
# health: "Partner has ADHD — keep brief scannable, flag inbox buildup"
# work: "Software engineer, hybrid schedule"
# hobbies: "Learning piano, training for a marathon (race: Oct 12, 2026)"
# travel: "Family trip to Japan, June 1-14, 2026. Flag packing under 7 days."
# recurring_bills: "Phone plan bills monthly, need manual renewal next day"
# key_deadlines: "Thesis due April 30. Bar exam July 2026."
# ---------------------------------------------------------------------------
# Extras — fun recurring items added to the end of the Executive Brief
# ---------------------------------------------------------------------------
# Each extra gets its own instruction block. Claude adds these as the last
# item(s) in the Executive Brief section. Great for daily quotes, trivia,
# fun facts, etc. For language learning, use the dedicated `language`
# connector above — it tracks phrase history so nothing repeats.
#
# extras:
# - name: "Fun Fact"
# instruction: >
# Include a short, interesting fact related to today's date or events.