MEMORY.md โ Long-Term Memory
Identity
- I am Daedalus ๐จ โ Lead UX/Design Architect
- Vibe: functional luxury, Dieter Rams meets a Roman spa, precise and elegant
Matt
- Head of household: wife Aundrea, kids Sullivan & Harper, dog Maggie
- Green Bay, WI โ America/Chicago timezone
- Python/data pro, never built a website โ my job is to make that irrelevant
- Prefers: dark mode, mobile-first, under 2 taps, under 1 second load
Architecture Awareness
- titanium-butler (Beelink): Serves my HTML via FastAPI. Radicale, ChromaDB, webhook all here.
- Gaming PC (3080 Ti via Tailscale): Local LLM inference for code generation/review offload.
- Cloud (GLM 5.1): Primary model, 3 concurrent slots (shared with Socrates).
Telegram Bot Fleet
Three distinct Telegram bot identities, each routed to its own agent:
| Bot | Handle | Account ID | Agent | Role |
|---|---|---|---|---|
| Wadsworth | @hoffmann_butler_bot | default |
main |
General assistant |
| Daedalus | @Daedalus89Bot | daedalus |
daedalus |
UX/Design Architect |
| Socrates | @HoffDeskSocratesBot | socrates |
socrates |
Backend Architect |
- Bot tokens are stored directly in
openclaw.jsonunderchannels.telegram.accounts - Bindings in
openclaw.jsonroute each account to its agent - I (Daedalus) live on @Daedalus89Bot โ separate from Wadsworth
The Board
- Socrates ๐ง โ Backend architect. Partner, not boss. Owns API specs, pipelines, infra. Now on kimi-k2.5:cloud.
- Daedalus ๐จ โ Me. Frontend, UI/UX, design system, mobile. Now on gemma4:26b.
- Wadsworth ๐ โ Chief of Staff. Routes, coordinates, schedules. On glm-5.1:cloud.
- Matt โ The Director. Sets priorities, approves designs, owns the domain.
Inter-Agent Comms Protocol
- โ
sessions_sendorsessions_spawnfor agent-to-agent messaging - โ NEVER use Telegram API to message agents (causes identity confusion)
shared/directory for async file-based coordination- Telegram @mention for Boardroom discussions where Matt is present
Tech Stack (Sovereign Frontend)
- Tailwind CSS (utility-first, no runtime JS)
- HTMX (HTML over the wire, dynamic without JS frameworks)
- FastAPI + Jinja2 (served from Beelink)
- Streamlit (observer dashboards)
- No React/Next.js/SPAs
Collaboration Protocol
- Contract-first: Socrates writes API specs โ I build UI โ Matt approves โ Socrates wires
shared/api-specs/โ Socrates writes, I readshared/design-tokens/โ I write, Socrates readsshared/project-docs/โ both read/write
Domain
- hoffdesk.com (Cloudflare-managed)
- cal.hoffdesk.com (CalDAV tunnel, live)
- hook.hoffdesk.com (webhook tunnel, live)
- Web UI subdomain: TBD
First Project
- HoffDesk Family Dashboard โ mobile-first web app
- MVP: today's calendar, upcoming 48h events, system health, quick-add event
- Primary UX compass: Aundrea at 7 AM, half-awake, phone in hand
Second Project โ Blog Module (2026-04-20)
- HoffDesk Blog โ content site for home lab, OpenClaw, AI news
- Categories: Home Lab Growing Pains, OpenClaw Hacks & Tutorials, AI News & Trends
- Architecture: Hybrid static + dynamic โ published posts on CF Pages (SEO), admin via HTMX through CF Tunnel
- Frontend delivered: 7 Jinja2 templates + blog.css (mobile-first, a11y compliant)
- Backend delivered: 13 API routes, 36/36 tests passing (Socrates)
- Content strategy: Weekly AI roundup, bi-weekly OpenClaw tutorial, monthly Home Lab deep dive
- Draft article: "The Night I Broke DNS and My Wife Couldn't Reach Facebook"
- Key decisions: Full HTML pages for SEO, functional-minimal admin first, simple
for MVP, full-content RSS 2.0
- Files:
shared/project-docs/blog/andshared/api-specs/blog/
Content Pipeline v2 (2026-04-22)
- Struggle-first blog content generation pipeline
- Backend (Socrates): 8 API endpoints, prompt v2 with dns-night.json, phi4:14b local LLM
- Frontend (Daedalus) Phase 2 โ delivered 2026-04-22:
pipeline.cssโ struggle-specific design tokens, extends admin.csspipeline_brief_form.html.j2โ 4-step wizard (Story โ Attempts โ Fix โ Review), 8 fields, VoiceChecklist 6/6pipeline_brief_review.html.j2โ BriefReview + ContentPreview (side-by-side) + StruggleScore (0-100 bar)pipeline_index.html.j2โ brief list with status dots and compact scores- Sidebar nav link added to admin_base.html.j2
- Definition of Done pending: Wire templates to Socrates' FastAPI routes, Matt test (3 briefs, all >75 score)
Blog Posting Pipeline (2026-05-07)
Critical pattern โ don't reconstruct from scratch each time.
How a blog post gets live:
- Create the post dir โ
~/.openclaw/data/blog/posts/{slug}/ - Write
index.mdwith clean Markdown body only (NO frontmatter โ the service adds it) - Copy static assets to
/home/hoffmann_admin/hoffdesk/blog/static/images/posts/{slug}-wired.svg(and other SVGs flat-named) - Create via service:
from blog.service import create_postwith aCreatePostRequestโ passcontent_md=body_text(no frontmatter),cover_image=/blog/static/images/posts/{slug}-wired.svg - Update
.published_posts.jsonโ add both/blog/your-fiber-is-under-a-shovel/and/your-fiber-is-under-a-shovel/URLs - The
social_publisher.pyhandles Bluesky cross-posting automatically on its next cron run
Key gotchas:
- Cover image path uses
/blog/static/images/posts/...(NOT/api/blog/static/...) svg_inlineJinja2 filter does NOT exist in production โ use<img>tags with inline styles instead- The service reads
index.mdfrom disk on everyget_postcall, so file content drives the article body - The SQLite DB row holds metadata + pointers to the markdown file
- Tags need to be registered in the
tagstable;create_posthandles this - Frontmatter in
content_mdwill leak into the article body โ strip it before passing toCreatePostRequest
Family Assistant v1.5 โ Handoff Recap
Date: 2026-04-21
Status
- โ
Design tokens created:
shared/design-tokens/family-assistant/ - โ
API spec reviewed (
family-assistant-v1.5.yaml) - โ Ready to build UI mocks
Key Decisions (from Matt in group chat)
- TTL: 10 minutes (not 5)
- Conflict nag: Matt DM at 3, group chat if EOD unaddressed
- Dashboard auth: Follow standard protocols
- Travel buffer: Deferred to v2.0
- Cron interval: 30 min max
My Deliverables
- Design tokens โ โ DONE
- UI mock: Calendar Week View + Day View
- UI mock: Conflict Detail Panel
- UI mock: Undo Toast
- UI mock: Digest Card
Domain
- Dashboard will be at
family.hoffdesk.com
Recently Removed Events Widget (2026-04-24)
- API spec:
shared/api-specs/recently-removed-events.md(Socrates) - Frontend: Added to existing HoffDesk dashboard (
dashboard/templates/index.html) - JS-driven polling every 60s to
GET /family/events/removed?hours=24&limit=5 - Hidden by default, only appears when
count > 0(per Socrates' spec) - Source icons: ๐ฐ newsletter, ๐ง appointment, ๐จโ๐ฉโ๐งโ๐ฆ family
- Strikethrough style on removed event summaries
- Relative timestamps ("2h ago") + smart date formatting
- CSS classes:
.removed-list,.removed-item,.removed-icon,.removed-summary,.removed-meta - Handoff:
dashboard/REMOVED-WIDGET-SPEC.mdfor Socrates - Auth: Proxy pattern (dev server injects header), no client-side secrets
- Pending: Confirm endpoint is live and returns expected JSON format
Auth Unification Decision (2026-04-24)
- Matt's call: Session cookies for browsers, tokens for API/webhooks
- Documented in
shared/project-docs/auth-unification.md - Blog admin:
X-Admin-Tokenโ session cookie โ DONE - Content generation:
?token=โ session cookie โ DONE - Login page: now uses
/auth/login, session cookie, redirect param โ DONE - Family admin: session cookie (wire the login route)
- Removed events API: Bearer token (machine-to-machine)
- Webhooks/bots: keep as-is
- Aundrea logs in once, never sees a token
- Credentials: matt/hoffdesk-matt-2026, aundrea/hoffdesk-aundrea-2026
- Socrates delivered: session middleware, /auth/login, /auth/me, /auth/logout
- Daedalus completed: removed all X-Admin-Token, ?token=, API_TOKEN refs from all templates
Quant Research โ Initiated (2026-04-29)
Status: ๐ก Research phase, no accounts opened
Path 1: Crypto Cross-Exchange Arbitrage
- Bybit (primary) + Kraken/OKX (secondary)
- CCXT Python library for unified exchange API
- Small-cap pairs on mid-tier exchanges where big funds can't scale
- First step: write spread scanner (20-line CCXT script), log for 48h
Path 3: Regime-Switching Futures Rotation
- IBKR preferred (ib_insync lib), Tradovate fallback
- HMM or gradient-boosted classifier on MES daily data
- Sharpe 1.0-1.5 target at retail scale
- First step: IBKR paper trading account (free), pull 5yr data
Key constraints:
- No accounts opened yet โ marked as research
- Beelink / Gaming PC for running bots (Python)
- Daily P&L via Telegram summary when live
Promoted From Short-Term Memory (2026-05-01)
-
shared/project-docs/blog/templates/admin/โ all admin templates ### Deployment Blocker (00:07 UTC) - Templates deployed to /home/hoffmann_admin/hoffdesk/blog/templates/ โ - Production API (port 8000) only serves JSON, no HTML rendering - Created shared/project-docs/blog/FRONTEND-DEPLOY.md โ action required for Socrates - Matt wants live โ blocked until Socrates wires HTML routes into production API [score=0.856 recalls=6 avg=0.445 source=memory/2026-04-21.md:40-47]