Two-repo pattern: public framework + private content.
LifeOS SOURCES (private, read-only)
TELOS/ (missions, goals, books, movies, wisdom)
KNOWLEDGE/Ideas/ (title + thesis only)
PROJECTS.md (public projects only)
MEMORY/WORK/ (abstracted to topic themes)
PRINCIPAL_IDENTITY.md (public bio data)
│
├──[DaemonAggregator.ts]──→ Reads sources, merges with existing data
│
├──[SecurityFilter.ts]──→ Deterministic code-level allowlist filter
│ Strips names, paths, credentials, internal refs
│ NOT an LLM filter — enforced by pattern matching
│
└──→ daemon-data.json → ~/Projects/daemon-dm/ (PRIVATE repo)
│
├──[Tools/DeployGate.ts]──→ Deterministic pre-deploy gate (blocks on
│ expired/ungated ephemera, street-address/ZIP/
│ coordinate/home-area strings, unapproved
│ real-time phrasing, credentials, private feed URLs)
│
└──[deploy.sh]──→ Copies JSON into framework → VitePress build → Cloudflare WORKER
│
~/Projects/daemon/ (PUBLIC repo — forkable framework)
│
src/worker.ts (generic):
• /daemon-data.json — served through the edge with expired
ephemera STRIPPED at request time (status/now/offerings/
requesting items with past `expires`; non-default location
falls back to location_default)
• /feed.json — live-activity items aggregated every 30 min
(cron + lazy refresh) from PUBLIC sources only, configured
in daemon-data.json `feeds` (rss | beehiiv | github | x);
cached in KV FEED_KV
• secrets (CF worker secrets, never in code): X_BEARER_TOKEN,
BEEHIIV_API_KEY
STRUCTURALLY EXCLUDED (never read):
CONTACTS.md, FINANCES/, HEALTH/, TRAUMAS.md,
KNOWLEDGE/People/, KNOWLEDGE/Companies/,