Portfolio vs plan, health trend, people you owe a reply, the week's reading — written to your phone overnight by an AI working from plain text files you own. This page shows the whole system behind it: a strict filing vault, a set of AI playbooks, and the self-updating dashboard. Copy any piece.
Built and used daily by Kelvin Chen · LinkedIn · GitHub
All names, numbers, pets, and tickers below are fictional sample data.
Receipts
Everything else on this page is fictional sample data — these three are real, lightly redacted entries from the system's own log. This is what "did the work" means, concretely.
[2026-06-05 · evening] analysis · condo listing evaluation
pulled the building's full deed history from NYC Open Data
→ the listing's key "comp" turned out to be a withdrawn sale — no deed ever recorded
→ fair-value model said overpriced · decision: keep renting
evaluation framework updated, so the next listing gets the same treatment automatically
[every Saturday · 10:00] cron · weekly digest
read the week's inbox notes + newsletter emails
→ distilled to 7 insights, filed into the wiki with citations
→ vault architecture lint: 2 drift violations found → 2 task cards opened
owner status during all of this: at breakfast
[every morning · 07:00] cron · morning brief
rewrote the dashboard while the owner slept
→ portfolio vs plan · sleep + recovery trend · two people owed a reply
read on a phone with coffee · typing required: zero
The one principle
Every design choice in this system is a consequence of one rule: decide what a thing is before deciding where it goes. Two splits do all the work.
A lab PDF is raw data. Your one-paragraph read of the trend is knowledge. "Book a follow-up by March" is an action. Three folders, one test, no exceptions — that's what stops a vault from rotting into a junk drawer.
The assistant writes data (JSON); a template renders presentation (HTML). And sensitive data is deployed to a physically separate, gated hostname — "private" never means "hidden in the page," it means "never shipped to the public origin at all."
The shape of it
Adopt them in any order. The vault alone is useful with zero automation; the dashboard is the most involved piece.
System 1 — Knowledge base
Before saving any file, answer one question: is this raw data, knowledge, or an action? The answer is the folder.
raw_data/ — original materialPrimary source files, one subfolder per domain. As close to the original as possible — no interpretation.
raw_data/health/2026-01-15_bloodwork_SAMPLE.md — a raw lab table
(Vitamin D 22 = low, LDL 118 = high). Test: could you have received this exact file from
someone else? → raw data.knowledge/ — distilled understandingOne note per topic, written to be re-read. Links back to its Layer 1 sources. Optionally a rendered HTML view for phone reading.
knowledge/wiki/notes/Bloodwork Trends.md — "most markers stable;
Vitamin D low and LDL mildly high, both diet-addressable, recheck next draw." Test: is this
my understanding, written to re-read? → knowledge.operational/ — the doing systemWhat to DO and the machinery that drives it: goals, the Triage board, configs the scheduled tasks read, and the outputs they write.
operational/goals/interim/Triage.md — the live Kanban (see
below). Test: does it tell me what to do, or capture work in progress? → operational.memory/ holds
durable facts the assistant reloads every session ("has a cat named Mochi," "goal: get Vitamin D
in range") — one fact per file, with MEMORY.md as the index. It's a small hot cache,
not Layer 2 knowledge.System 2 — Skills + router
When you ask for help, the assistant reads a keyword table, loads shared rules, then loads exactly the one playbook that fits — instead of winging it as a generalist.
skill.md, add one
router row. The router is a lookup; the skill holds the brain.System 3 — Daily reports dashboard
A scheduled task writes a tiny JSON each morning. A build step bakes it into a static page. Cloudflare Pages serves it behind a login. A plain-text digest hits your iMessage with a link in.
data/<report>/YYYY-MM-DD.jsonprivate/ to Cloudflare Pagesmorning-brief.html forever; each day adds a small JSON. That archive
is your trend history. Add a biometric key → it renders automatically.A private project (your real dashboards) gated by Cloudflare Access — free email/GitHub login, up to 50 users — and a separate public project that only ever receives sanitized content. Two hostnames = a hard wall, not a path rule that can slip.
iMessage is a poor surface for tables and charts, so the scheduled task sends a short plain-text digest that links into the dashboard. The rich view lives on the phone page; the message is just the nudge.
What I actually built
Each is the same data→presentation split with a different producer behind it. Two are written by an assistant scheduled task; one (people) is a plain Python script that parses markdown. All numbers and names below are fictional.
This is the exact hub the kit ships — all four reports work, including the People board: relationship cadence, who's overdue, last-touch history. Open it on your phone for the real feel. Every name and number is fictional.
Open the demo hub → Straight to People →Shows: day change, a thesis board (which holdings strengthened / got challenged), allocation donut, position-cap gauges, and a holdings table where each row expands to its bet + sell-trigger + per-pillar status.
Built by: a pre-market assistant task that reads your holdings + written theses from the vault, pulls quotes/news, grades each pillar, writes the JSON. Honesty rule: valuation move ≠ thesis break; never invents a reason.
Config: caps, pillars, trigger text — in the
prompt / portfolio.md, not the page.
Shows: body-composition grid (weight, body fat, muscle, bone, water, sleep, HRV, RHR), goal bar + lean-muscle chips, today's actions, what's due, and an "also logged by other tasks" feed.
Built by: a 7am task that reads biometrics, pulls due items off the Triage board, and folds in one-liners other overnight tasks wrote. Writes a markdown brief and this JSON.
Config: the fitness block, which biometrics
you feed, which jobs report into logs[].
Shows: a TL;DR, one "top read," a ranked shortlist (each scored + tagged to a goal, with a link in), and keep / monitor / unsubscribe decisions per source.
Built by: an early-am task that reads one newsletters inbox/label, distills + scores each, writes the JSON, and drops a line into the brief.
Scoring: R5/D4/N3/A3/C4 =
Relevance / Depth / Novelty / Actionability / Credibility (1–5 each).
Shows: relationships as four Dunbar circles (Anchors 21d ⊂ Confidants 35d ⊂ Companions 100d ⊂ Community 365d), a reach-out queue with conversation hooks, and a recent-gatherings feed.
Built by: a plain Python script (gen_people.py),
no LLM — it parses curated.md + gatherings.md from the vault.
Honesty rule: no signal → "unknown," never flagged overdue.
Config: the LAYERS list (cadence
+ target per circle) at the top of the script.
People: a hand-kept curated.md + an in-person log, with optional
automatic signals from iMessage history, your calendar, and Contacts. Brief: a phone
health export + smart scale. Newsletter: one email label. Portfolio: a
hand-maintained holdings file + a brokerage CSV.
The kit's DATA-SOURCES.md has step-by-step exports: iMessage
(chat.db on a Mac), Contacts (vCard), Instagram ("Download your information"),
Calendar (.ics), Health (auto-export), and the honest truth about WeChat (manual — no API).
Rule of thumb: only ever export your own data, and keep it local.
Configuration & cadence
An example schedule — your assistant's scheduled tasks plus one host-side deploy job. Several tasks log into the morning brief. Times are illustrative; tune to your own morning.
| Job | When (example) | What it does | Writes to | Channel |
|---|---|---|---|---|
| Portfolio report | 6:08am · Mon–Fri (pre-open) |
Pulls quotes + theses, flags cap breaches | data/portfolio/…json + a markdown report in the vault |
dashboard |
| Morning brief | 7:00am · daily |
Body composition, today's actions, what's due, what it noticed | data/morning-brief/…json + operational/goals/daily/…md |
dashboard iMessage |
| Task capture | 6:00am · daily |
Sweeps notes/inbox for new to-dos, files them as Triage cards | operational/goals/interim/Triage.md |
vault |
| Spending log | nightly | Tallies the day's transactions vs. a cap; the count feeds the brief | operational/goals/spending_log/…md |
vault → brief |
| Reflection | evening | Turns a short audio note into a dated reflection note | operational/goals/reflection/…md |
vault → brief |
| Newsletter digest | early am | Distills subscribed newsletters into a ranked TL;DR | knowledge/wiki/insights/…md |
dashboard → brief |
| Weekly digest | 10:00am · Saturdays |
Distills the week's captures; drift-checks the vault | knowledge/wiki/insights/…md |
vault |
| Deploy (host-side) | 7:25am + 5:30pm + every 3h |
build.js bakes newest JSON, wrangler publishes |
Cloudflare Pages (private target) | deploy |
wrangler is already logged in —
no long-lived Cloudflare token has to live inside an automation sandbox. The assistant only ever
writes a JSON file; a dumb host-side job (macOS launchd / Linux cron / Windows
Task Scheduler) builds and publishes. Clean separation of trust.The to-do engine
Two files, one job each. The goals file holds the vision (no checkboxes). The Triage board holds the moving to-dos and is the single source of truth — and scheduled tasks keep it current so you don't have to.
Objectives and deadlines only: "Every holding has a written sell-trigger (Q2)." It
describes where you're going. Cards link back to it with (goal:: 2).
The only place active to-dos live. Lanes: Now / Next / Waiting / Done. Mixing the vision and the board into one file is the #1 way this layer rots — so they're kept apart.
| Trigger | Action on the board |
|---|---|
| Morning task-capture (6am) | Scans your notes & inbox for new commitments and files them as cards in Now/Next, linked to a goal. |
| Morning brief (7am) | Pulls the board's due-soon cards into the daily brief + iMessage so nothing is silently forgotten. |
| Evening pass | De-dupes cards against what already exists, moves finished items to Done, keeps blocked ones in Waiting. |
| Weekly vault-doctor (Sat) | Files any architecture-drift it finds as a (source:: vault-doctor) card — the board even tracks fixing the system itself. |
Getting started
Open knowledge-base/ in Obsidian, read ARCHITECTURE.md, start
dropping files in by the placement test. Useful with zero automation.
Point your assistant at skills/CLAUDE.md, edit ROUTER.md to your
domains, and copy a skill.md for each area of your life.
Two Cloudflare Pages projects, gate the private one with Access, wire your scheduled tasks
to write JSON, then schedule deploy.sh. Full steps in dashboard/README.md.
.gitignore is
included) or keep the whole vault out of any public git remote. The public/ deploy
target must never receive private data.