PhoenixGenApiTui supports three transport modes. Each transport provides full session isolation: every connected client gets its own independent explorer state.

Local (default)

Run directly in your IEx session. This is the default when no transport option is given.

iex> PhoenixGenApiTui.ui()
# or explicitly
iex> PhoenixGenApiTui.explore()

Programmatic usage with options:

PhoenixGenApiTui.explore(transport: :local)

SSH

Serves the explorer over SSH. Multiple clients can connect simultaneously, each with an isolated session. Useful for inspecting PhoenixGenApi resources on a remote server.

iex> PhoenixGenApiTui.explore(transport: :ssh)

Then connect from another terminal:

ssh phoenix@localhost -p 4546
# password: tui

Custom port:

PhoenixGenApiTui.explore(transport: :ssh, port: 4000)

Custom credentials:

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

Erlang Distribution

Starts a listener on the current node. Remote BEAM nodes attach over Erlang distribution — useful for headless servers or cross-architecture inspection.

# 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)

Embedding in a Supervision Tree

For deployed applications, you can embed the SSH daemon or distribution listener directly in your supervision tree:

# In your application.ex
def start(_type, _args) do
  state = PhoenixGenApiTui.Introspection.load()
  tui_state = PhoenixGenApiTui.State.new(state)

  children = [
    # ... your existing children ...
    {PhoenixGenApiTui.App,
     transport: :ssh,
     port: 2222,
     auto_host_key: true,
     auth_methods: ~c"password",
     user_passwords: [{~c"admin", ~c"secret"}],
     app_opts: [state: tui_state]}
  ]

  Supervisor.start_link(children, strategy: :one_for_one)
end