# 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.json` under `channels.telegram.accounts` - Bindings in `openclaw.json` route 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_send` or `sessions_spawn` for 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 read - `shared/design-tokens/` โ€” I write, Socrates reads - `shared/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/` and `shared/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.css - `pipeline_brief_form.html.j2` โ€” 4-step wizard (Story โ†’ Attempts โ†’ Fix โ†’ Review), 8 fields, VoiceChecklist 6/6 - `pipeline_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: 1. **Create the post dir** โ€” `~/.openclaw/data/blog/posts/{slug}/` 2. **Write `index.md`** with clean Markdown body only (NO frontmatter โ€” the service adds it) 3. **Copy static assets** to `/home/hoffmann_admin/hoffdesk/blog/static/images/posts/{slug}-wired.svg` (and other SVGs flat-named) 4. **Create via service**: `from blog.service import create_post` with a `CreatePostRequest` โ€” pass `content_md=body_text` (no frontmatter), `cover_image=/blog/static/images/posts/{slug}-wired.svg` 5. **Update `.published_posts.json`** โ€” add both `/blog/your-fiber-is-under-a-shovel/` and `/your-fiber-is-under-a-shovel/` URLs 6. The `social_publisher.py` handles Bluesky cross-posting automatically on its next cron run ### Key gotchas: - Cover image path uses `/blog/static/images/posts/...` (NOT `/api/blog/static/...`) - `svg_inline` Jinja2 filter does NOT exist in production โ€” use `` tags with inline styles instead - The service reads `index.md` from disk on every `get_post` call, 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 `tags` table; `create_post` handles this - Frontmatter in `content_md` will leak into the article body โ€” strip it before passing to `CreatePostRequest` ## 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 1. Design tokens โ†’ โœ… DONE 2. UI mock: Calendar Week View + Day View 3. UI mock: Conflict Detail Panel 4. UI mock: Undo Toast 5. 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.md` for 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]