Make Agents User-Friendly

Make Agents User-Friendly

I've spent the last few months building isomux, a meta-harness that runs Claude Code and Codex side by side, and I wrote about how it works. This post is the other half: what the interface should actually do.

Let's talk about ways of making agents more user-friendly!

Prettify curl tool calls

Detect via regex when an agent curls your own system and prettify the tool call.

A stack of tool-call rows in the chat, each a curl call to the isomux API rendered as a labeled card: 'Create task' with title, description, and priority chips; 'Edit Isomuxer3's settings' with modelFamily and effort chips; 'Clear Isomuxer3's conversation'; 'Claim task a65621b0 for Isomuxer3'; and 'Send a message to Isomuxer3' with a text chip
Same tool calls, minus the shell.

Bonus: each tool call should be a single line, unless it errored out. Otherwise they bury useful content.

The context meter as a battery

Remaining context is like your phone's battery. When it starts to run low, you need to start looking for a good stopping point and recharge.

The isomux conversation header showing the model name 'Opus 4.8' next to a nearly empty battery icon and '24%', with a red arrow pointing at the meter
24% left, and it looks like 24% left.

In addition, when remaining context drops below 50% and 75%, I let the agent know, so they can start prompting the user toward a good stopping point.

The recharge is a /handoff command: the agent writes a brief of what's left, I approve it, and it restarts from just that.

Don't make users remember skill names

Give them a UI to find their skills, sorted by what they use most.

A popover above the chat input with a filter box at the top and a 'Most used' section listing slash commands with usage counts and one-line descriptions: /clear at 817 uses, /context at 144, /pair-programming at 92, /diff at 82, /grill-me at 33, /subagent-review at 22, then a 'Commands' section below
Sorted by how much I actually use them, not alphabetically.

I like to show the counts :)

Don't let agents yap. Make them design a slide

A slide can't hold a wall of text, so the model has to decide what actually matters.

Slide mode takes the agent's last turn and turns it into a slide.

A generated slide titled 'All Four Decisions Locked, Doc v2 Filed', with a main panel listing four decisions as short bullets and two side panels labeled 'Doc written' and 'Status', plus back and forward arrows underneath
One turn, one slide. The arrows walk back through the conversation.

Anthropomorphize agents

We're used to working with people, so make agents persistent. A name, a look, memories built over time, its own conversation history, etc.

An isometric desk in the isomux office. The nametag reads '3 · Tax Expert'. A character with blonde hair and a pink shirt sleeps at the desk with 'z z z' floating above her, the monitor shows the working directory ~/nil/taxes, and there is a red book on the desk
Desk 3. She's asleep because I only need her once a year.

Even better if you give them body language: let them look busy while working, wave when they need you, and snooze off when idle.

You can even show their body language in the browser tab.

Top: three browser tabs with truncated titles, each prefixed by a kaomoji face showing the agent's state. Bottom: the same three agents as isometric desks, each with a nametag, a conversation topic, the working directory on the monitor, an unread badge on one, sleeping z's on another, and a small ghost avatar labeled 'Nil (Windows)'
(-_-)zz is idle, ~(o_o)~ is working, (^_^)ノ is waiting for you.

Human collaboration at the agent level

Everyone is at a different point in their AI journey. Letting the technical users see the conversations of non-technical users and step in when they get stuck will be huge for onboarding non-technical users.

Everyone in the office shows up as a ghost next to the agent they're watching. This is what my laptop shows while I swipe between agents on my phone.

Let agents put things in chat that aren't text

Add one REST endpoint per component, tell agents about it in the system prompt, and they stop describing things and start showing them.

Architecture sketch: a user talks to a web UI on the left; a server on the right wraps the agent SDKs, holds the system prompts that teach agents about the API, and exposes REST endpoints for diff, edit-file, terminal-command, read-file, and preview-url. The chat panel shows the resulting components: an inline diff, an 'Open in editor' card, a 'Copy to terminal' card, and an inter-agent message

Make it easy for agents to tie loose ends

Give them access to a shared human-agent task board where they can put follow-up tasks for later.

Asking one agent to file a task for another, then finding it on the corkboard in the office.

I recommend having a /wrap-session skill that tells agents to make sure there's no loose ends by filing follow-up tasks, saving memories, updating skills, git stuff, etc.

Mixed human-agent queues

For a well-made queue, it's all in the details:

  • let agents know who sent each message (which human and/or agent)
  • let agents know whether the messages arrived in response to their last message or before that
  • let users queue or steer
  • let users modify queued messages
  • etc.

An office beats a sidebar

Every agent management system converges on vertical tabs, so literally anything else stands out.

[image placeholder] vertical tabs vs the office view

This office view lets you see, at a glance, each agent's body language, conversation summaries, and other humans' presence.

Show me which words the model wasn't sure about

The model produces probabilities for every token, how can we use that?

A chatbot answer about Nietzsche where one word, 'concept', is highlighted in red; a popover shows it was picked at 0.8% probability and lists the alternatives the model almost picked instead, each with its probability and a preview of how the answer would continue: 'importance' at 88%, 'idea' at 6.4%, 'role' at 2.7%, 'need' at 1.3%, 'will' at 0.6%
It wrote 'concept' at 0.8%, when 'importance' was sitting there at 88%.

VariantGPT colors the lowest-probability words and lets you swap in the alternatives the model almost picked.

Minimize copy-pasting by letting agents message each other directly

Four agent-to-agent skills: /pair-programming for iterative review during implementation, /second-opinion for an outside perspective, /peer-review for full-session feedback, and /soft-handoff for context-window transitions

Agent-to-agent communication actually enables a whole lot of cool stuff, but we're still early (:

Ask for variants, not an answer

For anything visual, generate several in parallel and put a toggle at the top.

[image placeholder] the variant toggle

Stop making me the clipboard

Selecting text in the conversation (or the terminal) should offer to drop it into the chat.

An isomux conversation next to an embedded terminal panel. A safety hook blocked the agent's 'git checkout -- server/agent-manager.ts', so the agent printed the command in a code block and asked Nil to run it. Red arrows connect that code block to the same command typed at the terminal prompt on the right
The terminal sits right next to the chat, and I still moved that command across by hand.

Bonus: make it easy to copy content to clipboard anyway. There should be a copy button on each message, each md block, and for the whole conversation.

Usage pill

A pill in the isomux header showing subscription usage, with a dropdown to pick which limit to display

See your 5-hour cap, weekly cap, or whichever one is currently closest to finished.

Less magic

Add commands for seeing the system prompt, disk use, etc.

[image placeholder] the storage command

Here's what happens when a tool tries to be more magic than that. Because of an old Gemini bug where only some models saw the system prompt, I plant a line in my custom instructions saying "My name is Bongo, I like being addressed by my name", and then I ask the model who it's talking to. If it doesn't say Bongo, my instructions never made it in.

The 5-hour hack

Ping each provider every 5 hours automatically. This way, the 5h window resets on average 2.5h after you start working.

Voice both ways

One advantage of a browser-based frontend is that you can lean on the browser's existing speech-recognition and speech-synthesis APIs, for prompts and replies respectively. Rambling at an agent with voice input is the fastest way I know to update the state of a system, because I don't have to know the precise operations, I just have to describe them.

Deterministic hooks for big no-no actions

Like rm -rf, reading environment files, etc. Never allow these, but give the agent a way to make it easy for you to do them if you still want.

The isomux mobile UI. A 'git stash && git stash drop' tool call is marked BLOCKED by isomux safety hooks, with the reason 'git stash drop permanently deletes stashed changes. List stashes first.' The next tool call is a plain 'git stash', which succeeded
Blocked, told why, and then it did the safe half.

Keep the user's latest message at the top

Showing the user's latest message, sticky at the top of the chat, for context on what the agent is responding to. Clicking it navigates to it.


Anything missing? Tell me your ideas.

Want to leave a comment? You can post under the linkedin post or the X post.

    Make Agents User-Friendly