I have dashboards. There's one for the agent platform itself, behind single sign-on. There's a read-only dashboard for a trading experiment, one for my home-grown intrusion detection, and a Homepage start page tying the lot together. I open them when I want to look at something.
But I don't talk to my agents through any of them. I talk to them in Discord. A private server, one bot, and a set of channels. That's the primary interface, and this is how it's laid out, what it gives me for nothing, and what actually goes wrong.
How the channels route work
The main channel goes to my chief-of-staff agent, which is called Denzel. Anything I type there lands with it. It does some admin itself, and anything on a specialist's turf becomes a card on a kanban board, assigned to the right profile: infrastructure to the coder, research to the scout, security to the security profile, long-form writing to the writer.
The specialists report into their own channels. There's one for kanban updates, one for network and security alerts, one for sysadmin reports, one for dev.to, one for music, one for family holiday planning. Two of them take conversation directly: the shopping assistant and the toolsmith each have a channel routed straight to their profile, with no @mention needed. Only my account is allowed to talk to the bot at all.
Some channels double as approval queues. The toolsmith posts each tool it thinks I should trial as its own message, and I react ✅ or ❌. The SEO agent does the same with metadata changes for my posts. A reaction is about the smallest approval interface there is, and it works from my phone.
The useful property is that the room is the address. I don't type which agent I mean. Adding a specialist means adding a channel and a route.
What Discord gives a one-user setup for free
If I built this as a web app, I'd be building a list of things that have nothing to do with the agents:
- Identity and auth. Discord already knows who I am. The bot only answers my account.
- Push notifications to my phone and desktop, with no setup on my side.
- History and search, going back as far as the channels do.
- Threads. The bot can open one per conversation, which keeps a long back-and-forth out of the main channel.
- Images. I can send the shopping assistant a photo of a jacket and it finds similar pieces in my size.
- Mobile, off my home network. The agents reach Discord outbound. I don't open anything up to reach them from outside.
None of that is interesting to build, and all of it is necessary. That's the whole argument.
What actually breaks
Sessions cache the system prompt. A Discord session keeps the system prompt it started with. Add a skill, change an agent's instructions, rename it, and an existing session won't see any of it. The setting that should time sessions out doesn't do anything in the build I run. The fix is typing /reset in the channel.
I learned this the annoying way. I'd built a workflow for approving replies to comments on my posts, then asked the main agent to post one. The session predated the skill. Instead of saying it didn't know how, it spent 25 minutes searching the web and reading the article, and then invented a summary. Now, whenever an agent's instructions change, /reset is part of the change.
A session can get poisoned. My first real chat with the shopping assistant went badly. A simple request, a white T-shirt or a polo, took 43 minutes and failed. The session history held file paths that my cloud model provider's PII filter had redacted into placeholders, and the model kept copying those broken paths back into its own commands. Nothing wrong with the agent's code. The conversation itself was contaminated, and the only fix was ending the session and starting clean.
Voice notes are dropped. A recorded voice message in a text channel reaches my agent platform as an empty message. The audio attachment is thrown away before the code that would detect it as voice ever runs. The feature exists in the code and doesn't engage. There's a separate path for live voice channels. I haven't tried it, so I can't tell you whether it works.
2,000 characters per message. That's Discord's cap. Fine for "done" or a short list. Not fine for a daily digest. The shopping assistant's posting helper splits on line boundaries and keeps each piece under 1,900 characters, and product results go out as embeds rather than long text.
Link previews. Drop a bare URL in a message and Discord unfurls it into a preview card. My first test digest was hard to read for exactly that reason. The shopping assistant now sets Discord's per-message SUPPRESS_EMBEDS flag on its text posts, so links stay links.
No tables. A code block is the closest you get. If an agent's output is naturally a table, it has to become a list.
Someone else's server
This is the one to think about properly, and I'd rather be straight about it. My channels aren't carrying package updates and uptime pings. They carry my clothing sizes and order history, family holiday planning, and security alerts from my own network.
Discord isn't end-to-end encrypted. The identity and auth are free, but everything in those channels sits on Discord's servers. For me, a private server that only my account can post in is an acceptable trade for what it saves me. It is a trade, though, and it's worth making on purpose rather than by default. If your agents handle things you wouldn't want stored on a third party's servers, this layout isn't for you, or those agents belong somewhere else.
The general point
For a tool with one user, the chat app is the UI, and the dashboards are for looking. Everything I'd otherwise build — login, notifications, history, a mobile client, somewhere to drop a photo — already exists, so the time goes on the agents.
What I didn't expect is that the failures are about sessions, not the interface. Stale prompts, poisoned history, attachments dropped before they're processed. None of that shows up as an error in Discord. It shows up as an agent confidently doing the wrong thing, which is the thing to watch for.
🤖 Drafted with AI assistance from my own homelab notes, logs and repos, then reviewed and edited before publishing.
Top comments (0)