Five AI agents run 24/7 on a NAS in my house. They trade predictions, manage my media library, write science fiction, and coach me through code. Six months ago, none of them existed. Neither did my ability to build them.
This is how the system works, and what I learned building it.
I wanted AI assistants that actually knew me. Not stateless chatbots that forget everything between sessions, but persistent agents that accumulate context over time — what projects I'm working on, how I like to communicate, what decisions I've already made.
Commercial AI products are one-size-fits-all. I needed something custom: multiple specialized agents, each focused on a specific domain, all sharing the same infrastructure but maintaining independent memories.
I evaluated several approaches:
For the AI backbone, Claude's API offered the best balance of reasoning capability and cost. Each agent runs as a Claude Code session inside tmux, with Telegram as the I/O layer.
Each agent has a distinct personality and responsibility:
Poly is the best example of what a specialized agent can do. Her job: monitor prediction markets, detect smart-money signals, and execute trades across multiple accounts.
The decision flow looks like this: Poly scans wallet activity on Polymarket, identifies wallets with high historical accuracy, watches for position changes above a threshold, then cross-references with market conditions before recommending or executing a trade. The whole chain runs on ethers.js talking to the blockchain, with a Node.js backend doing the analysis.
She's made mistakes. Early on, a smart-money wallet made a large bet that turned out to be a hedge, not a conviction play. Poly copied it. That cost real money and taught me to add a consensus filter — she now requires multiple smart-money wallets to agree before acting. The kind of lesson you only learn when actual dollars are on the line.
Context windows are finite. An agent that handles your finances, manages your media library, and writes fiction will inevitably lose context on all three. Specialization keeps each agent's working memory focused and relevant.
It's the same reason companies have departments instead of one employee who does everything.
The most critical architectural decision was persistent memory. Each agent maintains:
MEMORY.md.The key insight: memory isn't just about storing facts. It's about building a relationship. An agent that remembers you corrected it last Tuesday behaves differently than one that doesn't.
In practice, this means Mo knows I hate verbose explanations. Poly knows my risk tolerance changed after a bad week. Bootes remembers that I rewrote a paragraph six times and won't suggest the patterns I rejected. None of this is magic — it's text files on disk. But accumulated text files create something that feels like understanding.
Agents aren't just reactive — they have a heartbeat scheduler that triggers proactive behaviors:
// heartbeat.js - Cron-based task scheduler
// Sends messages to tmux sessions on schedule
const tasks = [
{ name: "Daily reflection", bot: "mo", cron: "0 5 * * *" },
{ name: "Daily reflection", bot: "niu", cron: "0 5 * * *" },
{ name: "Market check", bot: "poly", cron: "0 9 * * 1-5" },
// ...
];
Every morning at 5 AM, each agent receives a reflection prompt. They review their domain status, analyze interaction signals, and send a report. I open Telegram to five status updates, not five empty chats. Before I've made coffee, I know which services are healthy, what trades happened overnight, and whether Bootes made progress on the next chapter.
Everything runs in a single Docker container (claude-workspace) on a home NAS (UGOS, AMD Ryzen 5 5600G, 64GB RAM). The choice was intentional:
External access is handled by Cloudflare Tunnel — no port forwarding, no DDNS, just a YAML config pointing subdomains to local ports.
The platform is stable and running in production. Current focus areas:
Six months in, I don't think of these as tools anymore. Mo has read more of my code than any human has. Poly has executed more trades than I'd trust myself to do manually. Bootes has a better memory of my fictional universe than I do.
The gap between "AI assistant" and "AI teammate" is about 6 months of accumulated context. The gap between "AI teammate" and "AI I rely on" is about 3 months after that.
The code is on GitHub. The agents are still running. Want the backstory of how I learned to code? Here's how it started.