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 & used daily by Kelvin Chen · no account, no plans to commercialize
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.
The daily engine
Each is the same data→presentation split, produced by a scheduled assistant task on its own cron — portfolio before the market opens, the brief at 7am, the digest with your newsletters. All numbers and names below are fictional.
This is the exact hub the kit ships — the daily reports, the People board, and the knowledge views all work. Open it on your phone for the real feel. Every name and number is fictional.
Open the demo hub →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).
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.
A product of its own
Friendships don't end — they drift. This board is the anti-drift instrument: four Dunbar circles, a contact cadence per circle, and a reach-out queue with a conversation hook for each name. It's the report people ask about most, so it gets its own section.
Shows: Anchors 21d ⊂ Confidants 35d ⊂ Companions 100d ⊂ Community 365d, who's overdue, last-touch history, and a recent-gatherings feed. Built by: a plain Python script — no LLM, no guessing: no signal → "unknown," never falsely flagged overdue.
Open the People demo →Beyond reports
Cron reports are the heartbeat — but half my real hub is something else: knowledge views. Any distilled note in the vault can be rendered as a phone page and published behind the same login. Write once, consult forever. Three shapes these tend to take:
Training program, rehab protocol, onboarding checklist — anything with phases renders well as a phone checklist. When the phase changes, update the note and the view follows; the vault note stays the single source of truth.
Recipes you actually cook, interview prep, conversation prompts, a packing list — whatever you skim in the moment, right before you need it. A reference earns its keep when it's one tap away instead of buried in a notes app.
Rent vs buy, lease vs own, job offer A vs B: assumptions, the math, and the current verdict in one note. When an input changes, update the note — the dashboard version is always your latest thinking, not a stale spreadsheet.
knowledge/…/note.md
→ a "render this note" skill turns it into a static HTML view → the deploy job publishes it to
the gated dashboard. No new infrastructure — same vault, same hub, same login.The hardware & plumbing
The most-asked question: where do the numbers come from? One rule explains everything: the assistant never talks to a device API. Sensors and apps write to files; scheduled tasks read files. Files are the API.
A Withings smart scale (weight + body composition), a Withings sleep mat (sleep stages, heart rate — zero effort, it's under the mattress), and an Apple Watch (workouts, active energy). All three sync into Apple Health automatically; the Health Auto Export app turns that into a daily JSON file in iCloud.
Rule: every metric on the dashboard is labeled with its source sensor — a scale weight and a watch estimate are not the same number.
Google Timeline: a manual JSON export once a month — the weekly digest task parses it into a travel log, office-day counts, and workout backfill. Workouts: class-booking confirmation emails, parsed straight from Gmail. Food: a photo-calorie app's weekly PDF export, parsed on Saturdays.
Pattern: exports and emails, not integrations — nothing here can break when an API changes.
Portfolio: a hand-maintained holdings file + a brokerage CSV export.
Newsletters: one Gmail label the digest task reads. People: two markdown files
you keep by hand (curated.md, gatherings.md) with optional
one-time exports from iMessage, Contacts, and Calendar.
Cost of entry: mostly $0 — the files are the work, and you own all of them.
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.Take it with you
The vault, the skills, the dashboard — I run my life on them daily, and I have no plans to commercialize any of it. Public domain, fictional sample data, no account. Email only, used once to know who's building.
About the builder
Principal PM at US Mobile (multi-network, eSIM activation, Starlink One). Built this system for himself and runs his life on it daily, and shares it free with no plans to commercialize. The rest: badminton, pickleball, EDM, and a miniature poodle named Yumi(暖暖).