amon lets you know when your agents are working, idle, or need your attention. It runs them untouched in your own terminal. Any agent, one keystroke away. Built for Omarchy Linux.
omarchy + amon = the agent-native OS
Omarchy is the perfect environment for using agents. A workspace holds everything a project needs: agent terminals, a browser, the logs - tiled or side-scrolling, set up the way you want.
amon adds the missing piece: it shows you what your agents are doing, which one needs your attention - and lets you quickly jump between them.
agents as first-class citizens on your desktop
Start your agents in the terminal as usual. amon shows their live state in the top bar. Super+number now lands you on the right agent when switching workspaces.
Super+A to every agent in one place
The agent panel is the central piece - Super+A from wherever you are, over whatever you are doing. It is where you come back to: every agent, grouped by the workspace it is on, each row leading with the project it is working in and the branch it is on, then what it is doing and how long it has been at it. Pick one and Enter immediately puts you in front of it.
Super+Alt+A opens its sibling, the start agent panel: the agents you started, most recent first, with the project and folder. Pick one and a new terminal opens there running that agent again.
running agents on another machine?
SSH into a Linux box or a Mac with amon installed and the agents you start there show up here; amon setup ssh makes plain ssh do it.
control your agents from a hardware keypad
amon drives a Work Louder Creator Micro 2 over USB or Bluetooth. The six keys that can light stand for the first six agents in the panel's order, and each shows its agent's state: breathing while it works, solid while it waits for you, lit when it finished while you were away. Tap one to focus that agent. Or set them to workspaces: key N lights for the agent on workspace N that most needs you, a tap goes there, and tapping again moves on to the next agent on that workspace. The ring around the board shows the most urgent state anywhere. The dial scrolls, and walks the agent panel while it is open; the stick moves window focus like Super+arrows. The other seven keys are yours to map. By default they open the panel, open the start agent panel, send Up and Escape, dictate through voxtype - hold to talk, release to send - and send Down and Enter. Settings.
full command line interface
~ ❯ amon status
3 atlas atlas-api 6m blocked pi Apply migration to production?
2 docs-portal docs-refresh 12m idle pi Updated 3 pages
1 amon.sh main 4m working claude ❯ add a login rate limiter
1 amon.sh detect-flake 9m working codex Bash(cargo nextest run)
4 amon.sh website 41m idle opencode
~ ❯ amon focus 3
Everything the desktop shows is one command away - add --json and it's scriptable. Reference.
Installed and ready in 30 seconds
~ ❯ curl -fsSL amon.sh/install | sh
downloading amon v0.1.0
installed ~/.local/bin/amon
Set up amon - space toggles, enter applies
▸ [x] pi detected
[x] claude detected
[x] codex detected
[x] opencode detected
✓ amon installed.
amon is made to run seamlessly on your Omarchy setup. There is nothing to configure: amon setup just makes it all work automatically.
screenshots
command line reference
amon setup [target] [--all] [--no-alias] [--upgrade] [--duck | --no-duck]
Set up integrations. Without arguments, an interactive screen; with a target, one agent (amon setup claude), or ssh, which aliases ssh so agents on the machines you reach show up here; --all takes every detected agent plus the desktop integration without a screen. --no-alias skips aliasing the agent's name - on the non-interactive forms only, the screen always aliases. --upgrade refreshes everything already set up after a binary upgrade - installs nothing new, revisits no choices; the installer runs it for you. Ducking - music dips while a notification plays - is included by default where WirePlumber runs, as one drop-in file amon owns; --no-duck opts out, and either flag alone installs or removes just that piece.
amon status [--json]
What every connected agent is doing, most urgent first. --json prints the entries machine-readable instead of as a table.
amon start [--json] | amon start <agent> --dir <folder> [--host <host>]
The agents you started, most recent first - what Super+Alt+A lists. With an agent and a folder, opens a new terminal there running that agent again; with --host, one that ran on another machine, reached over the same SSH arguments.
amon focus <workspace>
Go to a workspace by number, landing on the agent that needs your attention rather than on whatever was focused there last. A plain workspace switch when no agent wants anything. With --cycle, run again while one of that workspace's agents is focused, it goes to the next one there.
amon doctor
Integration, daemon, widget, audio, and alias health in one report.
amon --help | --version
Help for amon or any subcommand (amon setup --help), and the version. Flags before an agent's name are amon's own; unknown ones are an error rather than something an agent might see.
amon <agent> [args…]
Run an agent under amon. Any first word that is not a subcommand below names an agent, and every argument after it is passed to the agent verbatim - flags included, nothing interpreted.
amon remove [target] [--all]
Remove integrations - one target, or everything after one confirmation. --all skips the confirmation, for scripts.
amon daemon
Run the daemon in the foreground. Rarely needed - any amon command starts it on demand.
amon hook report-agent | report-agent-session
Relays an installed hook's report - the agent's state, or which session it is in - to its wrapper. Used by the hook scripts amon setup installs, not by hand.
settings
Everything configurable lives in one file, ~/.config/amon/config.toml - amon setup writes it once, fully commented and fully commented-out, and never touches it again. Every setting is optional; each chip below shows its default. The daemon watches the file, so changes apply live under a running bar - nothing restarts. A file that fails to parse keeps the last good configuration (amon doctor reports it), and a missing file simply means the defaults.
frame_ms = 200
How long one spinner frame is shown, in milliseconds. Four frames at 200ms is one turn every 800ms.
state_beats = 5
The focused workspace takes turns between its agent's state and the marker that says you are here. Beats spent on the state; a beat is half a spinner turn, so the rhythm follows the spinner's speed.
marker_beats = 3
Beats spent on the focus marker in that same turn-taking.
working = ["⠒", "⠰", "⠤", "⠆"]
The animation frames for a working agent, in order, any length - one frame is a static glyph. Plain characters, here and below: a glyph setting chooses which character, never how it is drawn.
blocked = ""
The glyph for an agent that needs input.
done = ""
The glyph for an agent that finished while you were not looking. An agent at rest has no glyph - its workspace keeps the number, underlined.
focused = ""
The marker for the workspace you are on.
enabled = true
A short sound when an agent starts waiting for you, and when one finishes unwatched. Nothing plays for an agent you are looking at. Set to false to silence both.
done = "…/finished.mp3"
Your own sound for the finished-unwatched case, instead of the bundled one. A relative path resolves from the config file's own directory.
blocked = "…/attention.mp3"
Your own sound for the needs-input case, same rules.
Other audio dips while these sounds play - ducking is on by default in setup, and amon setup --no-duck lets you turn it off.
check = true
Whether the daemon may look for newer releases: one request against the GitHub release page's redirect, at most daily, with nothing about your machine in it. When a newer release exists, the agent panel shows a one-line footer with the command that upgrades; nothing downloads or installs itself. Set to false and it never checks.
A Work Louder Creator Micro 2 lights up by itself when connected - six keys, one per agent in the panel's order, each colored by its agent's state, the ring glowing when anything needs you, tap a key to be at that agent. These settings only tune it. Three things have to be in place, and amon doctor checks each: firmware 0.6.0 or newer, access to the device (one udev rule, which amon setup offers), and the agent layer on the board with the board switched to it - amon setup writes the layer onto an empty slot after saving the current keymap; the touch sensor at the bottom left cycles to it.
enabled = true
Set false to leave the device alone entirely.
brightness = 1.0
Keys and ring alike, 0.0-1.0. ring = false darkens the ambient ring; by default it shows the fleet's most urgent state.
agent_keys = "agents"
What the six lit keys stand for. "agents": key N is the panel's Nth agent, and a tap focuses exactly that agent. "workspaces": key N is workspace N, lit by its most urgent agent, and a tap does what Super+N does; tap again to move on to the next agent there.
[devices.micro2.colors]
Per-state key colors: blocked = "#FF6D00", working = "#304FFE", done = "#00FF4C", idle = "#FFFFFF". The ring borrows them.
[devices.micro2.keys]
The seven macro keys, any action. Controls: macro_1..macro_7 in reading order, upper row then lower. Actions: none, panel, start, workspace:N, key:<chord>, exec:<command>. Defaults: the agent panel, the start agent panel, Up, Escape on the upper row; dictation, Down, Enter on the lower. Everything else is fixed: agent key N lights and focuses the panel's Nth agent (or workspace N, with agent_keys), the encoder scrolls and drives the open agent panel, the joystick moves window focus.
[devices.micro2.dictation]
The dictate key reads two ways, and recording starts on the press either way: a tap toggles, a hold is push-to-talk. hold_ms = 250 is how long a press counts as holding; auto_submit = true sends Enter when a hold ends and the text has landed. Taps never do.
All of it together, in ~/.config/amon/config.toml. Saved changes apply within a second:
[devices.micro2]
brightness = 0.7
[devices.micro2.keys]
macro_2 = "exec:obsidian" # second key, upper row: open Obsidian
macro_4 = "key:super+shift+f" # fourth key, upper row: send a chord
macro_7 = "workspace:5" # last key, lower row: jump to workspace 5
[devices.micro2.dictation]
hold_ms = 300
auto_submit = false
[devices.micro2.colors]
working = "#7D74F0"