Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,97 @@
# Changelog

## 0.2.0

#### Features

* Process list page in [#208](https://github.com/software-mansion/voyager/pull/208)
* Process info page in [#233](https://github.com/software-mansion/voyager/pull/233)
* ETS table list page in [#216](https://github.com/software-mansion/voyager/pull/216)
* ETS table contents view in [#236](https://github.com/software-mansion/voyager/pull/236)
* ETS match-spec search in [#225](https://github.com/software-mansion/voyager/pull/225)
* Paged key lookup for bag and duplicate_bag ETS tables in [#239](https://github.com/software-mansion/voyager/pull/239), [#263](https://github.com/software-mansion/voyager/pull/263)
* Look up any non-truncated key from the ETS contents view in [#276](https://github.com/software-mansion/voyager/pull/276)
* Term inspector in [#221](https://github.com/software-mansion/voyager/pull/221)
* MCP tools for processes in [#230](https://github.com/software-mansion/voyager/pull/230)
* MCP tools for ETS tables in [#231](https://github.com/software-mansion/voyager/pull/231)
* In-app updates: the desktop app checks for a new release on startup and can install it, with an Updates card in Settings in [#251](https://github.com/software-mansion/voyager/pull/251)
* IPv6 support when connecting to nodes, directly and over SSH in [#159](https://github.com/software-mansion/voyager/pull/159)
* Setting to show the connected node's PIDs in local `<0.X.Y>` format in [#184](https://github.com/software-mansion/voyager/pull/184)
* Connecting-to-a-node guide in [#245](https://github.com/software-mansion/voyager/pull/245)
Comment thread
hhubert6 marked this conversation as resolved.

#### Enhancements

* Jump to linked processes from the supervision tree details panel, with a Back button through the jump history in [#277](https://github.com/software-mansion/voyager/pull/277)
* Default macOS menu (Hide, Minimize, Fullscreen), View → Zoom In (Cmd+=) / Zoom Out (Cmd+-) / Actual Size, Help → Report an Issue…, and Cmd/Ctrl+B to toggle the sidebar in [#238](https://github.com/software-mansion/voyager/pull/238), [#255](https://github.com/software-mansion/voyager/pull/255)
* Install the `voyager_agent` helper module on node connect (inspected node needs OTP 27+) in [#193](https://github.com/software-mansion/voyager/pull/193), [#223](https://github.com/software-mansion/voyager/pull/223)
* Version the remote agent so different Voyager versions can inspect the same node in [#273](https://github.com/software-mansion/voyager/pull/273)
* Rate limit remote node introspection calls in [#201](https://github.com/software-mansion/voyager/pull/201)
* Rate limit process fetches in the supervision tree details panel in [#260](https://github.com/software-mansion/voyager/pull/260)
* Show a notice instead of rendering supervision trees above 2,000 elements in [#258](https://github.com/software-mansion/voyager/pull/258)
* Start distribution without a listening port or EPMD registration in [#218](https://github.com/software-mansion/voyager/pull/218)
* More specific node connection error messages in [#177](https://github.com/software-mansion/voyager/pull/177)
* Only one app instance can run at a time in [#169](https://github.com/software-mansion/voyager/pull/169)
* Used-percentage column in System limits in [#261](https://github.com/software-mansion/voyager/pull/261)
* Remember the auto-refresh interval across reloads in [#197](https://github.com/software-mansion/voyager/pull/197)
* Keep the selected connection type (Direct / SSH) in the URL in [#183](https://github.com/software-mansion/voyager/pull/183)
* Select dropdowns styled to match the app in [#259](https://github.com/software-mansion/voyager/pull/259)
* Sidebar tooltips in compact mode in [#166](https://github.com/software-mansion/voyager/pull/166)
* Feedback link in the sidebar in [#160](https://github.com/software-mansion/voyager/pull/160)
* Copy buttons confirm with an icon change in [#161](https://github.com/software-mansion/voyager/pull/161)
* Better tooltips on the connect page in [#158](https://github.com/software-mansion/voyager/pull/158)
* Supervision tree icon rotated to match the tree's left-to-right layout in [#271](https://github.com/software-mansion/voyager/pull/271)

#### Bug fixes

* Generate a random distribution cookie per launch in [#205](https://github.com/software-mansion/voyager/pull/205)
* Bind the packaged app's endpoint to loopback instead of all interfaces in [#190](https://github.com/software-mansion/voyager/pull/190)
* Protect the MCP HTTP endpoint against DNS rebinding: reject non-loopback `Origin` and `Host` headers and always bind to `127.0.0.1` in [#247](https://github.com/software-mansion/voyager/pull/247), [#250](https://github.com/software-mansion/voyager/pull/250)
* Pin the host part of Voyager's own node name to `127.0.0.1` (long names) or `localhost` (short names) in [#149](https://github.com/software-mansion/voyager/pull/149)
* Fix SSH agent authentication option in [#222](https://github.com/software-mansion/voyager/pull/222)
* Persist the MCP enabled setting in the database in [#176](https://github.com/software-mansion/voyager/pull/176)
* Fix MCP telemetry in [#152](https://github.com/software-mansion/voyager/pull/152)
* Follow GNOME theme changes in Auto mode on Linux in [#281](https://github.com/software-mansion/voyager/pull/281)
* Fix app icon on older macOS versions in [#165](https://github.com/software-mansion/voyager/pull/165)
* Update the connection-type tooltip after disconnecting from a node in [#148](https://github.com/software-mansion/voyager/pull/148)
* Hide spinner arrows on number inputs in [#287](https://github.com/software-mansion/voyager/pull/287)
* Hide the WebKit caps lock indicator in password fields in [#265](https://github.com/software-mansion/voyager/pull/265)
* Dim the show-password toggle while connecting in [#199](https://github.com/software-mansion/voyager/pull/199)

## 0.2.0-rc.1 (2026-10-07)

#### Features

* In-app updates: the desktop app checks for a new release on startup and can install it, with an Updates card in Settings in [#251](https://github.com/software-mansion/voyager/pull/251)
* Paged key lookup for bag and duplicate_bag ETS tables in [#239](https://github.com/software-mansion/voyager/pull/239), [#263](https://github.com/software-mansion/voyager/pull/263)
* Look up any non-truncated key from the ETS contents view in [#276](https://github.com/software-mansion/voyager/pull/276)
* IPv6 support when connecting to nodes, directly and over SSH in [#159](https://github.com/software-mansion/voyager/pull/159)
* Setting to show the connected node's PIDs in local `<0.X.Y>` format in [#184](https://github.com/software-mansion/voyager/pull/184)
* Help tooltips with Erlang docs links on process and ETS panels, and a connecting-to-a-node guide in [#245](https://github.com/software-mansion/voyager/pull/245)

#### Enhancements

* Default macOS menu (Hide, Minimize, Fullscreen), View → Zoom In / Zoom Out / Actual Size, Help → Report an Issue…, and Cmd/Ctrl+B to toggle the sidebar in [#255](https://github.com/software-mansion/voyager/pull/255)
* More specific node connection error messages in [#177](https://github.com/software-mansion/voyager/pull/177)
* Version the remote agent so different Voyager versions can inspect the same node in [#273](https://github.com/software-mansion/voyager/pull/273)
* Show a notice instead of rendering supervision trees above 2,000 elements in [#258](https://github.com/software-mansion/voyager/pull/258)
* Rate limit process fetches in the supervision tree details panel in [#260](https://github.com/software-mansion/voyager/pull/260)
* Used-percentage column in System limits in [#261](https://github.com/software-mansion/voyager/pull/261)
* Remember the auto-refresh interval across reloads in [#197](https://github.com/software-mansion/voyager/pull/197)
* Keep the selected connection type (Direct / SSH) in the URL in [#183](https://github.com/software-mansion/voyager/pull/183)
* Highlight the key in ETS record rows in [#270](https://github.com/software-mansion/voyager/pull/270)
* Select dropdowns styled to match the app in [#259](https://github.com/software-mansion/voyager/pull/259)
* Supervision tree icon rotated to match the tree's left-to-right layout in [#271](https://github.com/software-mansion/voyager/pull/271)

#### Bug fixes

* Protect the MCP HTTP endpoint against DNS rebinding: reject non-loopback `Origin` and `Host` headers and always bind to `127.0.0.1` in [#247](https://github.com/software-mansion/voyager/pull/247), [#250](https://github.com/software-mansion/voyager/pull/250)
* Follow GNOME theme changes in Auto mode on Linux in [#281](https://github.com/software-mansion/voyager/pull/281)
* Fix the ETS lookup sidebar button overflowing the window in [#272](https://github.com/software-mansion/voyager/pull/272)
* Fix the multiselect dropdown covering the sidebar in [#286](https://github.com/software-mansion/voyager/pull/286)
* Hide spinner arrows on number inputs in [#287](https://github.com/software-mansion/voyager/pull/287)
* Hide the WebKit caps lock indicator in password fields in [#265](https://github.com/software-mansion/voyager/pull/265)
* Dim the show-password toggle while connecting in [#199](https://github.com/software-mansion/voyager/pull/199)

## 0.2.0-rc.0 (2026-09-10)

#### Features
Expand Down
76 changes: 18 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ https://github.com/user-attachments/assets/8aa3f69e-a692-4b9d-9bf5-75d972f6370f

## Overview
Comment thread
hhubert6 marked this conversation as resolved.

Voyager is a desktop app that inspects running BEAM systems — supervision trees, processes, memory and IO usage, running applications, and more — through one interface instead of a patchwork of shell commands copy-pasted into `iex`. It connects to any OTP 27+ node, local or remote, over plain Erlang distribution and surfaces the information the BEAM already exposes, in a form that is actually pleasant to read.
Voyager is a desktop app that inspects running BEAM systems — supervision trees, processes, ETS tables, memory and IO usage, running applications, and more — through one interface instead of a patchwork of shell commands copy-pasted into `iex`. It connects to any OTP 27+ node, local or remote, over plain Erlang distribution and surfaces the information the BEAM already exposes, in a form that is actually pleasant to read.
Comment thread
hhubert6 marked this conversation as resolved.
Outdated

No setup is required on the target node. Voyager gathers everything over RPC, and all rendering and storage happens on your machine.
No setup is required on the target node. On connect, Voyager compiles and loads a small helper module (`voyager_agent`) into the node's memory and gathers everything else over RPC; nothing is written to the node's disk, and all rendering and storage happens on your machine.

### Why Voyager

Expand All @@ -49,39 +49,30 @@ Download the latest build for your platform from the [website](https://voyager.s
- macOS (Intel)
- Linux (x64) — distributed as an AppImage, see [docs/linux_appimage_guide.md](docs/linux_appimage_guide.md) for how to run and install it

## Connecting to a node

Voyager needs to reach the target node over Erlang distribution and needs its cookie.
The app checks for a new release on startup and can install it in place; the current version and update status are under **Settings → Updates**.

- **Local / remote node** — provide the node name (`myapp@host`) and the cookie. Voyager starts distribution on demand and connects.
- **Over SSH** — provide SSH credentials to a host that can reach the node. Voyager tunnels the distribution connection through it, which is the usual path to a production node behind a bastion.
## Connecting to a node

The target node must have distribution enabled — a node started without a name is not distributed and cannot be connected to at all. Give it a name and a cookie at boot, and make sure the name type matches the toggle next to the node name field:
Voyager connects to any distributed node running **OTP 27 or later**, either directly or through an SSH tunnel to a host that can reach it, which is the usual path to a production node behind a bastion. Start the node with a name and a cookie, then enter both in the connect form:

```sh
# long names — use the `--name` toggle in Voyager
# Elixir
iex --name my_app@127.0.0.1 --cookie my-secret-cookie -S mix phx.server
Comment thread
hhubert6 marked this conversation as resolved.
Outdated
# Erlang
erl -name my_app@127.0.0.1 -setcookie my-secret-cookie
```

For a Mix release, set the equivalent environment variables instead:

```sh
RELEASE_DISTRIBUTION=name RELEASE_NODE=my_app@10.0.0.5 RELEASE_COOKIE=my-secret-cookie bin/my_app start
```

Recent connections are saved in a local SQLite database; secrets are encrypted before being written. The encryption key never leaves your machine — it is generated on first boot at `~/.voyager/vault.key` (readable only by you), so losing that file makes previously stored secrets unrecoverable.

Distribution settings (node name, cookie handling) are configurable under **Settings → Distribution**.

### Supported OTP versions

The inspected node must run **OTP 27 or later**, whether you connect directly or over SSH. Nodes on OTP 26 and older are refused.
See [docs/connecting_to_a_node.md](docs/connecting_to_a_node.md) for short names, releases, IPv6, the SSH setup, how saved connections are stored, and troubleshooting.

## MCP server

Voyager can expose the connected node to MCP clients such as Claude Code or Cursor, so an agent can inspect a live system instead of guessing from source code.

Enable it under **Settings → MCP** and pick a port. Point your MCP client at the resulting HTTP endpoint. The tool operates on whichever node Voyager is currently connected to.
Enable it under **Settings → MCP Server** and pick a port (default `4040`). Point your MCP client at `http://127.0.0.1:<port>/mcp`; the endpoint only listens on loopback and rejects requests from non-local origins. The tools operate on whichever node Voyager is currently connected to:
Comment thread
hhubert6 marked this conversation as resolved.
Outdated

- `node_info` — system, memory, runtime, limits and scheduler snapshot
- `process_list` / `process_info` — rank processes by an attribute, then read one process's details
- `ets_list` / `ets_read_table_chunk` / `ets_search_table` — list ETS tables, page through one, or query it with a match spec

## Feedback and contributing

Expand All @@ -93,46 +84,15 @@ Voyager is in active development and feedback shapes what gets built next.

## Development

Required Elixir, Erlang, Node.js, and Rust versions are pinned in [`.tool-versions`](.tool-versions).

Install dependencies and set up the database:
With the tool versions from [`.tool-versions`](.tool-versions) installed:

```sh
mix setup
mix phx.server # web app at localhost:4000
mix tauri.dev # desktop app
```

Run the web app on its own:

```sh
mix phx.server
# or
iex -S mix phx.server
```

Then visit [localhost:4000](http://localhost:4000).

Run the desktop application in development:

```sh
mix tauri.dev
```

To check the production desktop app locally:

```sh
mix assets.deploy
mix tauri.app
```

To tell a locally built desktop app apart from a release, set `VOYAGER_DEV_BUILD=true` in
`rel/app/.env` (see [`.env.sample`](rel/app/.env.sample)). Apps built or run through `mix tauri.*`
then show a `Dev Build` banner.

Before opening a pull request, run:

```sh
mix precommit
```
See [docs/development.md](docs/development.md) for prerequisites, SSH tunnels in development, local production builds, and the checks to run before opening a pull request.

## License

Expand Down
Loading