# 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]