PhoenixGenApiTui

Terminal-based interactive explorer for PhoenixGenApi applications, built on ExRatatui.

Navigate your services, function configs, call flows, cluster topology, rate limits, and runtime health — without leaving the terminal.

Features

UI Layout

╭─ ● 🔥 PhoenixGenApi TUI Explorer │ UserService ─────────────────────╮
╰────────────────────────────────────────────────────────────────────────╯
╭─ Search ─────────────╮ ╭─ user_service ───────────────────────────────╮
│ / search... │ │ Functions │ Call Flows │ Cluster │ Health │.. │
╰──────────────────────╯ ╰──────────────────────────────────────────────╯
╭─ Navigation 2s · 3f ─╮ ╭──────────────────────────────────────────────╮
│ ▶ ◆ user_service (2) │ │ Request Type Version Response Nodes │
│ ├ get_user │ │ get_user 1.0.0 sync [node1] │
│ └ create_user │ │ create_user 1.0.0 sync [node1] │
│ ◆ blog_service (1) │ │ │
╰──────────────────────╯ ╰──────────────────────────────────────────────╯
╭────────────────────────────────────────────────────────────────────────╯
│ j/k navigate ⏎ select h/l panels Tab tabs / search r refresh q │
╰────────────────────────────────────────────────────────────────────────╯

Installation

Add phoenix_gen_api_tui to your dependencies:

def deps do
[
{:phoenix_gen_api_tui, "~> 0.1.0"}
]
end

Tip: For runtime inspection during development, add to :dev only:

{:phoenix_gen_api_tui, "~> 0.1.0", only: :dev}

Usage

Start your application and open IEx:

iex -S mix

Then launch the TUI:

iex> PhoenixGenApiTui.ui()

Inspect a remote node

Query PhoenixGenApi data from a remote node via RPC:

iex> PhoenixGenApiTui.ui(remote_node: :"app@remote-host")

Programmatic usage

# Local (default)
PhoenixGenApiTui.explore()
# SSH transport
PhoenixGenApiTui.explore(transport: :ssh)
# Distributed transport
PhoenixGenApiTui.explore(transport: :distributed)

Transports

Local (default)

Run directly in your IEx session:

iex> PhoenixGenApiTui.ui()

SSH

Serve the explorer over SSH. Multiple clients can connect simultaneously, each with an isolated session:

iex> PhoenixGenApiTui.explore(transport: :ssh)

Then connect from another terminal:

ssh phoenix@localhost -p 4546
# password: tui

Custom port and credentials:

PhoenixGenApiTui.explore(
transport: :ssh,
port: 4000,
user_passwords: [{~c"admin", ~c"secret"}]
)

Erlang Distribution

Start a listener on the current node, then attach from a remote BEAM node:

# Terminal 1 — start the listener
iex --sname app --cookie demo -S mix
iex> PhoenixGenApiTui.explore(transport: :distributed)
# Terminal 2 — attach from another node
iex --sname local --cookie demo -S mix
iex> ExRatatui.Distributed.attach(:"app@hostname", PhoenixGenApiTui.App)

Keybindings

KeyAction
j / Move selection down
k / Move selection up
h / Focus navigation panel
l / Focus detail panel
EnterSelect / drill into item
EscGo back / close overlay
TabCycle through tabs
1-6Select tab directly
/Start search (fuzzy matching)
rRefresh data
?Toggle help
qQuit

Guides

How It Works

PhoenixGenApiTui reads runtime configuration from your running PhoenixGenApi application via ConfigDb and Diagnostics. Data is cached with a 30-second TTL to avoid excessive RPC calls. Press r to force a refresh.

License

Copyright 2026 PhoenixGenApi

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.