Eris AI infrastructure, Erik Smith
Eris runs on my Mac Mini. I trust her because I put together each level of her memory and tone of voice. I'm the one who updates her following the latest local AI news online. I'm also the one who debugs her...
Why she exists
An AI-heavy workflow across five to ten services means constant context-switching, expensive tokens for routine tasks, and an assistant that forgets everything the moment you close the tab. I needed a permanent partner that lives locally, knows my projects and my voice, and is always running whether I am at the machine or not.
Zero external tokens for daily operations. Claude Code is reserved for building and coding. Eris handles everything else: research, briefings, memory, autonomous tasks, all without touching a metered API.
What she does
- Morning Brief: Daily at 7:30am, Letta reads calendar, email, active projects, and burnout signals, then delivers a briefing as a macOS notification. Clicking it opens the chat.
- Ambient Awareness: An activity logger captures word-level keystrokes and app switches, and a screenshot daemon fires on every context switch. At 2am a digest prunes the noise, captions each session with a vision model, and archives what's left. 17 LaunchAgents running at all times.
- Long-Term Memory: A Letta agent keeps persistent archival memory across sessions. A conversation index logs every exchange, and a sync bridge routes new files and wiki entries into Letta automatically.
- Session Handoffs: When a session ends, the pipe catches the goodbye phrases and writes a structured handoff file to disk. Claude Code reads it when the next session starts and acknowledges it before moving on.
- Autonomous Task Queue: A task runner fires every 30 minutes. She reads the task file, works through whatever's queued, and emails me the results without me checking in.
- Custom Voice: Kokoro TTS with a blended voice model: bm_fable 52%, bf_lily 13%, bm_lewis 25%, bm_george 4.5%, bm_daniel 5%, at 0.95 speed. Fully local, so there's no round-trip lag and no per-character bill.
How she is built
Daedalus ยท Mac Mini M4 Pro, 64GB unified memory.
- Interface: Open WebUI (localhost:8080), eris_pipe.py (OWUI to Letta bridge), Kokoro TTS (custom voice, :8880)
- Agent and memory: Letta 0.16.7 (persistent agent, :8283), PostgreSQL 17 + pgvector (165 archival entries), Karpathy Archive (6-directory store)
- Model serving: llama.cpp (chat brain, :11500), Qwen3.6 35B-A3B Q4_K_M (tools, ~45 tok/s), Ollama (embeddings + extractor)
- External tools, 10 live: Gmail, Drive, Calendar, Puppeteer (:8285), Gemini 2.5 Flash (routing), InvokeAI (:9090), ComfyUI (:8188)
Generation was never the issue. Prefill is the slow part, the time she spends reading context before she answers: 604 prefill tok/s, 0.2s to first token, measured on the local Qwen3.6 35B-A3B brain, warm cache.
What I kept, and what I cut
- Letta over a raw vector database: A persistent agent with a structured API meant I didn't have to build retrieval logic myself. Letta handles chunking, embedding, archival, and context injection.
- Kokoro TTS over cloud alternatives: Cloud TTS would add latency and per-character cost to every response. Kokoro runs locally on :8880, starts with Open WebUI, and the custom blend means she doesn't sound like a stock assistant.
- Removed MemPalace after measuring 10s of pipe latency: It was triggering on personal-memory signals and adding ten seconds to every matching response, and Letta archival already covered the same ground.
- Removed Whisper STT for the same reason: It wasn't being used in practice and added startup overhead to every session, so it went, however useful it looked in planning.
- Weekly synthesis over daily summarization: Daily summaries create noise. A weekly behavioral synthesis every Sunday at 2:30am surfaces patterns across the week, like how long a build actually took, or where my attention kept drifting off to.
- Karpathy Archive directory structure: Six directories with explicit routing rules (RAW, WIKI, REPORTS, MEMORY, SCREENSHOTS, and more). The sync bridge knows which directory each file type belongs in, so nothing just lands wherever.
Return on investment
- Hardware cost: One-time: Mac Mini M4 Pro, 64GB. Fixed. Depreciation on that is measured in years.
- Marginal cost per token: $0.00: Qwen3.6 35B-A3B at 45 tok/s. Every brief, task, and synthesis run is free.
- Agents running 24/7: 17: LaunchAgents firing on schedule. Same cost whether they run once or ten thousand times.
Erik Smith, Design Engineer & UX Designer