proto v0.58 - OpenTelemetry and agent-friendly output
In this release, we're focusing on observability, and making proto easier to consume from automated and AI-driven workflows.
OpenTelemetry support
OpenTelemetry (OTEL) has become the industry standard for collecting traces, logs, and metrics from applications. With this release, proto now ships with built-in OTEL support, allowing you to export this data over OTLP to any compatible backend (Grafana, Honeycomb, Datadog, and so on).
To enable it, pass the new --otel global option (or set the PROTO_OTEL environment variable),
and configure the destination using the standard OTEL_EXPORTER_OTLP_* environment variables.
$ export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317"
$ proto --otel install node
This will export traces and metrics. If you'd also like log events exported as OTLP logs, enable the
--otel-logs option (or PROTO_OTEL_LOGS). And to distinguish proto from other services in your
telemetry backend, set a custom service name with --otel-service-name (or
PROTO_OTEL_SERVICE_NAME).
Out of the box, we record metrics for the operations that matter most:
- Tool installs (and individual install steps)
- Tool uninstalls
- Plugin loads
Each metric tracks both attempt counts and durations, tagged with attributes like the tool, strategy, cache hit/miss, and success/error status — enough to start spotting slow installs or flaky plugins across your team or CI.
Agent-friendly output
Since proto's inception, output has been tuned for humans reading a terminal. But more and more, proto is being driven by scripts, CI pipelines, and AI agents — none of which care about colors, spinners, or progress bars.
To better serve these consumers, we've introduced a new console reporting layer, exposed through a
global --reporter option (and PROTO_REPORTER environment variable), for controlling how proto
prints output. It supports three formats:
text(default) - Human-readable output with styling.json- A single JSON document, printed once the command completes.ndjson- Newline-delimited JSON, where each line is a standalone JSON object, streamed as the command runs.
$ proto --reporter json outdated
NDJSON is particularly well-suited to streaming consumers, since each event can be parsed the moment
it's emitted, instead of waiting for the entire command to finish. To make this seamless, proto now
detects when it's being run by an AI agent or bot, and automatically switches the default reporter
to ndjson — no flag required. Errors are also serialized as JSON in this mode, so a failed command
still parses cleanly.
macOS .pkg and .dmg support
proto installs the majority of tools as pre-built archives (.tar.gz, .zip, and friends), but
some tools on macOS are only distributed as .pkg installers or .dmg disk images. In this
release, we've taught proto how to unpack both formats, expanding the range of tools that can be
installed without a bespoke plugin.
For plugin authors, we've also added a new post_script_args field to the DownloadPrebuiltOutput
of the WASM API, which lets you pass a list of
arguments to the post-install script that runs after a prebuilt has been unpacked.
Detecting executable name collisions
proto links a single shim and bin for each executable name, which means two configured tools that resolve to the same name (for example, the same identifier provided by two different backends) will silently shadow one another — whichever is linked last wins.
We've reworked the internal bin/shim registry to better detect these collisions, and
proto diagnose now surfaces them as warnings, so you can resolve
the ambiguity before it bites you.
Other changes
View the official release for a full list of changes.
- Improved the performance of checksum file hashing by streaming files, instead of reading them entirely into memory.
- Reduced log verbosity for
proto exec,run, andshell, so executed command output stays clean. - Fixed an issue where uninstalling a tool by version could leave around a stale/dangling bin file
in
~/.proto/bin. - Updated wasmtime to v43 (from v41).
