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, with what it is doing and how long it has been at it. Pick one and Enter immediately puts you in front of it.
full command line interface
~ ❯ amon status
pi blocked 6m 3 atlas-api ~/work/atlas
codex idle 2m 1 fix/detect-flake ~/Projects/amon.sh
claude working 4m 1 main ~/Projects/amon.sh
opencode idle 41m 4 website ~/.cache/worktrees/site
~ ❯ amon focus 3
Everything the desktop shows is one command away — add --json and it's scriptable. Reference.
Installed and ready in 30 seconds
~ ❯ yay -S amon-bin
(1/1) installing amon-bin [######################] 100%
~ ❯ amon setup
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]
Set up integrations. Without arguments, an interactive screen; with a target, one agent (amon setup claude); --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.
amon status [--json]
What every connected agent is doing, most urgent first. --json prints the entries machine-readable instead of as a table.
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.
amon doctor
Integration, daemon, widget, 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.