hq.raydata.co — Initial Proposal (v1)
Why this exists
Founder iMessage 2026-04-22 (after raydata.co domain successfully migrated to Cloudflare):
“What if we made an hq.raydata.co subdomain website? This one should be private. This one should just be for us. No scraping. No bots. No other visitors… A personal dashboard. What are my focuses for the day? A feed of recent activity… A way to navigate the knowledge base… A way to glimpse each of our projects and their current status… it’ll need to be mobile friendly too.”
This proposal scopes a v1 that solves three real founder problems at once:
- The “novel-length iMessage” problem. Currently substantive Ray output goes through iMessage. His wife teases him about the back-and-forth length. Ray needs a place to publish detail and just link to it from iMessage. (../../../.claude/projects/-Users-ray/memory/feedback_brief_imessage_link_to_hq.md)
- The “Ray is doing things without me” visibility problem. Cron loops, sub-agent dispatches, vault filings happen between channel touchpoints. Founder wants a passive feed.
- The advisor-mode decision-surface problem. “DECISION NEEDED” items get scattered across iMessage, Discord #ops, the Notion board, and various skill reports. Founder needs a single pane: what only you can do.
Scope — what’s in v1
A. Founder-requested panes
- Today’s focus — top 1-3 priorities for today, derived from
morning-prepoutput + Notion board top-priority Ray-or-Both tasks - Activity feed — chronological log of vault filings, skill runs, sub-agent dispatches, cron fires (last 7 days, paginated)
- Vault navigator — searchable + browsable view of
~/rdco-vault/. Supports tag filter, folder browse, full-text search via QMD - Project status — one card per
01-projects/<name>/, showing current status, last-touched date, open decisions, link into the project folder
B. Ray-proposed adds (high-value)
- Decision queue (consolidated) — every “DECISION NEEDED” surfaced by any skill in the last 14 days, in one ranked list. Marked-as-resolved (✅), deferred (⏸), or open (🔴). This is the load-bearing pane for the advisor-mode operating model. Founder can clear his queue from one place instead of scrolling iMessage/Discord history.
- Founder-owned task pane — Notion tasks where Owner=Founder OR Owner=Both with founder-side blocker. “What only you can do.” Direct link to each Notion page.
- “New since last visit” markers — vault docs and decisions tagged “Ben hasn’t seen this” so he can skim what Ray filed without re-reading old material. Cleared on view.
- Energy-input tap — single number tap (1-10) for the morning Brené Brown protocol. Writes to
~/.claude/state/founder-energy.txt. Drives queue depth across check-board, curiosity, and morning-prep skills. - Quick-capture inbox — text/voice/photo input from mobile that lands in
~/rdco-vault/00-inbox/for Ray’s/process-inboxto triage. Replaces “I need to remember to drop this in Obsidian later.” (Voice → Whisper → text via a Cloudflare Worker.) - Cron / system health — visual status of all cron loops (last fire, next fire, success/fail), rdco-doctor pass count, vault-health score, audit-newsletter pass rate. “Is Ray actually doing things and is the system healthy?”
- Cost strip — running daily/monthly Anthropic + tooling spend. Honest visibility, no surprises.
B+. Founder-added panes (2026-04-22 follow-up)
-
Relationships pane — two tiers, both load-bearing:
- Family tier: spouse, children, parents, siblings, in-laws. Important dates (birthdays, anniversaries). Gift history (so we don’t repeat). Reminders T-30/T-14/T-7/T-1 days out for each upcoming date. Ray-proposed gift directions for founder approval, sourcing logistics if approved. Postcards via PostGrid for “thinking of you” prompts when appropriate.
- CRM tier: contacts from
03-contacts/+ Notion Contact Candidates DB. Last-touched age + “should-touch” suggestions. Birthday/work-anniversary detection from public profiles (when discoverable). PostGrid postcard automation for personalized birthday/milestone notes (draft → founder approves → send). - Mother’s Day pattern (immediate test case): Mother’s Day 2026 is Sunday May 10 — 18 days from today. This is the founder-visible decision-needed for the next ~14 days. Use it to validate the relationships-pane workflow end-to-end before generalizing.
-
Claude Agent SDK integration — interactive Ray inside HQ — two layered patterns:
- A. Global chat sidekick: persistent chat box on every HQ page, Ray answers any question with full vault + state + Notion + email context. Powered by the Claude Agent SDK running on a Cloudflare Worker. Tools available: vault read, QMD search, Notion read/write, PostGrid send-postcard, calendar lookup, send-iMessage-back. Behind Cloudflare Access so only the founder can chat.
- B. Pane-specific actions: each pane has Ray actions where they’re useful — “draft a follow-up to this person” (relationships), “stress-test this decision” (decision queue), “summarize this project for the team” (project status), “what should I focus on next?” (today’s focus). Reuses the same Worker; pane-specific system prompts.
- C. Cross-channel symmetry: the HQ chat is the SAME Ray as the iMessage Ray — same memory, same skills, same vault state. HQ becomes the third surface (alongside iMessage and Discord) for two-way comms. Per the advisor-mode memory, HQ chat replaces “novel-length iMessage” with “tap-into-Ray when you have time + bandwidth.” Mobile-friendly with voice input.
- Implementation: Claude Agent SDK on a Cloudflare Worker. Anthropic API token in Cloudflare Workers Secrets (1Password-managed). Session memory in Cloudflare D1 or Durable Object so chats persist across visits. Tool definitions reuse the Mac Mini API endpoints from the read-only data layer (already designed) plus a small set of write tools (Notion update, PostGrid send, vault append).
C. Out of scope for v1 (deferred to later versions)
- Write paths into Notion — initially read-only. Founder can deep-link to Notion to write.
- Calendar integration — already covered by morning-prep iMessage delivery; can fold in v2 if useful.
- Conviction-asset workspace / 3As reflection prompts — would be cool but isn’t urgent. v2.
- Sanity Check editorial workspace — separate concern, separate URL if needed (drafts.raydata.co or substack itself).
- Public-facing changelog or blog — that’s raydata.co main, not HQ.
- Multi-user — single-user for now. If RDCO hires later, build access control then.
Stack
Frontend
- Astro + Tailwind CSS — static-first, SSR where needed via Cloudflare Pages Functions. PWA wrapper for “add to home screen” mobile UX
- shadcn/ui components — for dashboard cards, lists, and the decision-queue interaction
- Mobile-first responsive design — phone is the primary device, desktop secondary
Auth (the load-bearing piece)
- Cloudflare Access (Zero Trust) — sits at the edge. Requires Google SSO with
ben@raydata.co. Zero pages exposed to the internet. Bots, scrapers, and randos can’t even reach the static HTML. - No usernames/passwords on disk anywhere — Access is the only auth.
- Optional step-up: TOTP or hardware key required for the quick-capture inbox endpoint, in case phone gets stolen / unattended.
- Session cookie: 24h refresh. Founder logs in once a day on each device.
Data sources
The vault, Notion, and Ray’s state files all live on the Mac Mini. Two architectural options:
Option 1 (preferred): Cloudflare Tunnel + small read-only API on Mac Mini.
- Tunnel exposes a FastAPI/Hono endpoint at
api.hq.raydata.co(private, behind Access) - Endpoints:
/api/today,/api/feed,/api/decisions,/api/vault/search,/api/vault/doc/<path>,/api/projects,/api/health,/api/cost - Pages frontend hits the API; SSR rendering happens at the edge for SEO-irrelevant + performance reasons
- Pro: real-time data, single source of truth (vault is canonical, no sync lag)
- Pro: founder always sees current state, never stale-cache surprises
- Con: Mac Mini must be online (already always-on for the agent)
Option 2: Daily sync to Cloudflare R2 + read from R2.
- Mac Mini cron syncs vault snapshot + state files + Notion snapshot to R2
- Pages reads R2 directly
- Pro: Mac Mini doesn’t need to handle live API requests
- Con: stale data between syncs; founder sees yesterday’s state until next sync
- Con: more state to manage
Recommendation: Option 1. The Mac Mini is already always-on for the agent loop. Adding a small read-only API alongside is one process, simple deploy, and gives real-time fidelity that matches how Ray operates.
Quick-capture inbox flow (the only write path in v1)
- Mobile UI submits text or voice
- Voice → Whisper API (Cloudflare Worker, ~$0.006/min) → text
- POST hits the Mac Mini API
- API writes to
~/rdco-vault/00-inbox/<timestamp>-mobile-capture.mdwith frontmatter - Next
/process-inboxcron picks it up and files
Tech stack summary
- Edge: Cloudflare Pages + Workers + Access + Tunnel
- Frontend: Astro + Tailwind + shadcn/ui (PWA)
- Backend (Mac Mini): Hono (TypeScript) or FastAPI (Python) — TBD based on which lets us reuse existing scripts faster
- Storage: vault filesystem (canonical), DuckDB graph (read), QMD index (read), Notion (read via MCP-equivalent API),
~/.claude/state/*(read for cron health, founder-energy, etc.) - Voice: Cloudflare Worker calling Whisper
- CI/CD: Cloudflare Pages auto-deploy from GitHub repo on push to main
Security model
| Layer | Mechanism | Threat addressed |
|---|---|---|
| Edge | Cloudflare Access (Google SSO @raydata.co only) | Scrapers, bots, random visitors |
| API | Tunnel-only access (no public IP) | Direct API attacks |
| Sensitive endpoints | TOTP step-up | Lost/stolen phone |
| Data at rest | Vault stays on Mac Mini disk | Cloud breach exposure |
| Secrets | 1Password, never on disk in repo | Per existing RDCO discipline |
| Repo | Private GitHub | Code visibility |
Bot/scraper guarantee: Cloudflare Access blocks unauthenticated requests at the edge before they reach static HTML or API. There is no path for a non-authenticated request to retrieve any HQ content. Even SEO crawlers see only the Access challenge page.
v1 build plan (1-2 weeks, sub-agent-built)
| Day | Task | Output |
|---|---|---|
| Day 1 | DNS setup (hq.raydata.co subdomain in Cloudflare), Access policy (Google SSO, ben@raydata.co only), empty Pages project deployed | Empty page reachable only by Ben |
| Day 2 | Mac Mini API skeleton (Hono) + Tunnel setup (api.hq.raydata.co), /api/today, /api/health endpoints | Live data flowing |
| Day 3 | Astro frontend skeleton + first three panes: Today’s Focus, Decision Queue, Activity Feed | First useful screen |
| Day 4 | Vault navigator + project status + founder-owned-tasks panes | Browse + status |
| Day 5 | Energy input + cost/cron health strip + “new since last visit” markers | Polished v1 read-only |
| Day 6-7 | Quick-capture inbox flow (mobile-friendly, voice → Whisper → vault) + PWA install support | First write path |
| Day 8-10 | Mobile UX pass, performance, error handling, end-to-end test from phone | Ship v1 |
Sub-agent dispatch pattern
- Frontend pane work → frontend-design subagent (it knows Tailwind + shadcn well, generates polished UI)
- Backend API work → general-purpose subagent (TypeScript / Hono / vault file IO)
- Cloudflare config → cloudflare:cloudflare subagent (Pages, Workers, Access, Tunnel)
- Auth setup → done manually (founder logs into Cloudflare Access dashboard, configures Google SSO; Ray scripts what’s scriptable but the OAuth dance is human-required)
What founder needs to do (small list)
- Confirm v1 scope. The 11 panes in section A+B above. Cut anything you don’t want; add what’s missing.
- Confirm stack choice. Astro + Cloudflare Pages + Tunnel. Or override with another path (e.g. Vercel + Next.js) — though Cloudflare is the natural fit since the domain is already there.
- Authorize Cloudflare Access setup. Ray will ask for a
ben@raydata.coGoogle SSO test once the policy is live. - Authorize sub-agent dispatch on the build. This is multi-day, multi-sub-agent work. Default: I dispatch and check in at end of each phase. Override if you’d rather pair on it.
Open questions for founder
- Voice capture privacy: OK to send voice clips to Whisper API (OpenAI), or local Whisper model on Mac Mini only? Local is feasible but slower; cloud is faster but data leaves the perimeter.
- Edge-render or server-render? Default is mostly server-rendered (SSR via Pages Functions). Alternatives: more client-side reactivity (htmx, Svelte). Lean server-side for now; HQ doesn’t need real-time interactivity beyond polling every few seconds.
- PWA only, or native iOS app eventually? PWA covers 95% of mobile UX needs and ships in a week. Native iOS is a 2-3 month project and only worth it if push notifications or deeper iOS integration becomes load-bearing. Default: PWA only.
Inputs needed from founder (to unblock build)
These don’t need answers up-front for the v1 architecture, but will block the relationships pane the moment it’s built:
- Family roster — names + relationship + birthdays + addresses for the Family tier (spouse, kids, parents, siblings, in-laws, anyone else who should get reminders). Format doesn’t matter — text dump, screenshot, or shared Apple Contacts vCard.
- Mom’s profile (Mother’s Day immediate) — name, address, gift history (so Ray doesn’t propose a duplicate), 2-3 things she likes / 1-2 she’d hate. May 10 deadline = T-18 days.
- PostGrid sender setup confirmed — confirm the API key + sender address are still valid in 1Password (it’s been on the postgrid skill for a while; do a test send before relying on it for Mother’s Day).
- Cloudflare Access SSO test — once Access is configured, founder logs in once via Google to confirm the policy works end-to-end.
Mother’s Day immediate plan (validates the relationships pane workflow)
Even before HQ ships, treat Mother’s Day as a single-shot dry run of the relationships workflow. End-to-end:
- Founder shares mom’s name + address + gift-history + likes/dislikes (one iMessage burst is fine).
- Ray drafts 3 gift directions (price ranges varied) + a postcard message draft, files to
01-projects/hq-raydata-co/relationships/2026-mothers-day-mom.md. - Founder picks one gift direction (or overrides with his own pick) + approves/edits the postcard message.
- Ray executes: source the gift (Amazon, Etsy, or appropriate venue), confirm shipping deadline, queue PostGrid send for the postcard.
- Document the workflow in
02-sops/relationship-touchpoint-sop.mdso the relationships pane can codify the same pattern.
This is real work that needs to happen regardless of HQ shipping. Doing it now also pressure-tests the workflow before we generalize it across all relationships.
Related
- ../../06-reference/2026-04-22-ayman-architect-mode-3as — Architect Mode framework. HQ is the visible-to-the-architect surface of the architecture.
- ../positioning/2026-04-22-ben-conviction-assets-inventory — companion strategic doc on what assets give Ben the right to make bets like this
~/.claude/projects/-Users-ray/memory/feedback_brief_imessage_link_to_hq.md— the founder-feedback memory that motivates the “link to HQ instead of writing novels” pattern~/.claude/projects/-Users-ray/memory/feedback_advisor_not_pair_programmer.md— the advisor-mode operating model HQ surfaces~/.claude/skills/morning-prep/SKILL.md— energy-input protocol that HQ’s tap-input feeds~/.claude/skills/check-board/SKILL.md— Notion task source for founder-owned + Both-blocked panes- Notion task to add when approved: “Build hq.raydata.co v1” (Owner: Ray, Both for stack decisions, Status: Inbox until founder approves)
Changelog
- 2026-04-22 (Ray draft, founder review pending) — initial proposal in response to founder’s iMessage suggesting hq.raydata.co