Visualize Erlang/Elixir Nodes On The Command Line
1,531
stars
236
commits
Erlang
primary language
Jul 14, 2026
updated
Production-ready BEAM diagnostics for operators, automation, and AI agents.
observer_cli inspects live Erlang and Elixir systems through two explicit
interfaces. The command CLI is the recommended starting point for bounded,
repeatable diagnostics with stable text, Erlang-term, or JSON output. The TUI
provides a live terminal workspace for interactive exploration.
Both interfaces use Erlang distribution. Connect only to trusted nodes over a trusted network: a distribution cookie is not a read-only credential.

Install observer_cli in the target release so command diagnostics can run
there. Version 2.0 controllers require the matching 2.0.0 target bundle.
Observer CLI 2.0 supports Erlang/OTP 26–29. JSON output requires OTP 27 or
newer on the controller; text and Erlang-term output work across the supported
range.
Add the dependency to rebar.config:
{deps, [
{observer_cli, "2.0.0"}
]}.
Fetch and compile it:
rebar3 compile
Add the dependency to mix.exs:
defp deps do
[
{:observer_cli, "2.0.0"}
]
end
Fetch and compile it:
mix deps.get
mix compile
Release downloads are prebuilt escripts, not standalone native binaries. They
require Erlang/OTP and escript on the controller. The command CLI still
requires the matching observer_cli version in the target release; TUI
auto-load also requires the controller and target to use the same OTP major.
On macOS or Linux, the versioned installer selects the escript for the local OTP major, verifies its release checksum, and installs it for the current user:
curl -fsSL https://raw.githubusercontent.com/zhongwencool/observer_cli/v2.0.0/install.sh | sh
Add $HOME/.local/bin to PATH if the installer asks you to.
Build the same version from its release tag instead:
VERSION=2.0.0
git clone --branch "v${VERSION}" --depth 1 \
https://github.com/zhongwencool/observer_cli.git
cd observer_cli
rebar3 escriptize
BIN=./_build/default/bin/observer_cli
The CI-tested toolchain is Erlang/OTP 29 with Elixir 1.20:
mix deps.get
mix escript.build
BIN=./observer_cli
mkdir -p "$HOME/.local/bin"
install -m 0755 "$BIN" "$HOME/.local/bin/observer_cli"
export PATH="$HOME/.local/bin:$PATH"
observer_cli --version
Save a target without storing its cookie value:
export OBSERVER_CLI_COOKIE='replace-me'
observer_cli connect \
--node app@host \
--cookie-env OBSERVER_CLI_COOKIE
observer_cli status
observer_cli diagnose
observer_cli disconnect
connect stores a target selector, not a persistent connection. Every remote
command starts a temporary hidden controller, performs bounded work, validates
the response, and stops the controller before returning.
logger_std_h configured file
without flushing Logger or accepting an arbitrary path.observer_cli.cli/v1 envelope with
stable exit statuses.The normative machine-readable response contract is published as
priv/schema/observer_cli.cli.v1.schema.json.
| Interface | Choose it for | Start it with |
|---|---|---|
| CLI — recommended | Production runbooks, automation, incident capture, and AI-agent workflows | observer_cli diagnose |
| TUI | Live exploration, ranking changes, and detail drill-down | observer_cli tui app@host |
The CLI requires observer_cli 2.0.0 in the target release and does not inject
missing diagnostic code. The TUI can load its matching interactive bundle on a
trusted target before starting. The old bare
observer_cli NODE [COOKIE REFRESH_MS] form is not supported; use the explicit
tui command.
TUI auto-load sends controller-compiled BEAM bytecode to the target without recompiling it. Build the controller on the same OTP major as the target when auto-load is needed; cross-major bytecode loading is outside the supported compatibility contract.
observer_cli logs returns sensitive, untrusted retained text. It reads only a
selected handler's configured path, not the handler's private file descriptor
or rotation archives, and deliberately rejects redaction flags.
Version 2.0 changes the TUI plugin callbacks and replaces positional plugin sorting. Follow the 1.x plugin migration table.
The generated ExDoc site provides llms.txt, a Markdown version of every page,
and ExDoc's built-in Copy Markdown action. Build it locally with
rebar3 docs.
Erlang
99.1%
Visualize Erlang/Elixir Nodes On The Command Line
1,531
stars
236
commits
Erlang
primary language
Jul 14, 2026
updated
Production-ready BEAM diagnostics for operators, automation, and AI agents.
observer_cli inspects live Erlang and Elixir systems through two explicit
interfaces. The command CLI is the recommended starting point for bounded,
repeatable diagnostics with stable text, Erlang-term, or JSON output. The TUI
provides a live terminal workspace for interactive exploration.
Both interfaces use Erlang distribution. Connect only to trusted nodes over a trusted network: a distribution cookie is not a read-only credential.

Install observer_cli in the target release so command diagnostics can run
there. Version 2.0 controllers require the matching 2.0.0 target bundle.
Observer CLI 2.0 supports Erlang/OTP 26–29. JSON output requires OTP 27 or
newer on the controller; text and Erlang-term output work across the supported
range.
Add the dependency to rebar.config:
{deps, [
{observer_cli, "2.0.0"}
]}.
Fetch and compile it:
rebar3 compile
Add the dependency to mix.exs:
defp deps do
[
{:observer_cli, "2.0.0"}
]
end
Fetch and compile it:
mix deps.get
mix compile
Release downloads are prebuilt escripts, not standalone native binaries. They
require Erlang/OTP and escript on the controller. The command CLI still
requires the matching observer_cli version in the target release; TUI
auto-load also requires the controller and target to use the same OTP major.
On macOS or Linux, the versioned installer selects the escript for the local OTP major, verifies its release checksum, and installs it for the current user:
curl -fsSL https://raw.githubusercontent.com/zhongwencool/observer_cli/v2.0.0/install.sh | sh
Add $HOME/.local/bin to PATH if the installer asks you to.
Build the same version from its release tag instead:
VERSION=2.0.0
git clone --branch "v${VERSION}" --depth 1 \
https://github.com/zhongwencool/observer_cli.git
cd observer_cli
rebar3 escriptize
BIN=./_build/default/bin/observer_cli
The CI-tested toolchain is Erlang/OTP 29 with Elixir 1.20:
mix deps.get
mix escript.build
BIN=./observer_cli
mkdir -p "$HOME/.local/bin"
install -m 0755 "$BIN" "$HOME/.local/bin/observer_cli"
export PATH="$HOME/.local/bin:$PATH"
observer_cli --version
Save a target without storing its cookie value:
export OBSERVER_CLI_COOKIE='replace-me'
observer_cli connect \
--node app@host \
--cookie-env OBSERVER_CLI_COOKIE
observer_cli status
observer_cli diagnose
observer_cli disconnect
connect stores a target selector, not a persistent connection. Every remote
command starts a temporary hidden controller, performs bounded work, validates
the response, and stops the controller before returning.
logger_std_h configured file
without flushing Logger or accepting an arbitrary path.observer_cli.cli/v1 envelope with
stable exit statuses.The normative machine-readable response contract is published as
priv/schema/observer_cli.cli.v1.schema.json.
| Interface | Choose it for | Start it with |
|---|---|---|
| CLI — recommended | Production runbooks, automation, incident capture, and AI-agent workflows | observer_cli diagnose |
| TUI | Live exploration, ranking changes, and detail drill-down | observer_cli tui app@host |
The CLI requires observer_cli 2.0.0 in the target release and does not inject
missing diagnostic code. The TUI can load its matching interactive bundle on a
trusted target before starting. The old bare
observer_cli NODE [COOKIE REFRESH_MS] form is not supported; use the explicit
tui command.
TUI auto-load sends controller-compiled BEAM bytecode to the target without recompiling it. Build the controller on the same OTP major as the target when auto-load is needed; cross-major bytecode loading is outside the supported compatibility contract.
observer_cli logs returns sensitive, untrusted retained text. It reads only a
selected handler's configured path, not the handler's private file descriptor
or rotation archives, and deliberately rejects redaction flags.
Version 2.0 changes the TUI plugin callbacks and replaces positional plugin sorting. Follow the 1.x plugin migration table.
The generated ExDoc site provides llms.txt, a Markdown version of every page,
and ExDoc's built-in Copy Markdown action. Build it locally with
rebar3 docs.
Erlang
99.1%