๐Ÿ“„ MEMORY.md 9,794 bytes Yesterday 23:37 ๐Ÿ“‹ Raw

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 <img> 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
    • 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]