Caudata - A multi-server TUI log streamer using ex_ratatui, Burrito, and native :ssh

Hey everyone,

I wanted to share a tool I’ve been working on called Caudata :lizard:.

Quick Install: curl -fsSL https://raw.githubusercontent.com/quaywin/caudata/main/install.sh | sh

Caudata TUI Demo

Why I built this

My main frustration was tailing Docker and system logs across multiple remote servers. I always ended up opening a bunch of terminal tabs, SSH-ing into each box, and running docker logs -f manually.

Web-based dashboards like Portainer or Dozzle are great, but they require installing agents, setting up web servers, or exposing Docker sockets on the remote hosts, which I wanted to avoid for security and maintenance reasons.

Caudata is a local TUI tool that reads your existing ~/.ssh/config profiles, logs into your servers, auto-discovers running Docker containers/systemd services, and streams their logs into a single terminal window. Zero configuration or agents required on the target servers.

What it does

  • Flexible Authentication: It parses your ~/.ssh/config file to connect automatically using your private keys. If you need to connect to a new host manually, it also supports adding connections with custom hostname, username, and password credentials securely via an in-app modal.
  • Auto-discovery & reconnects: Automatically detects running Docker containers (and systemd services) and reconnects the log streams if a container restarts or rebuilds.
  • TUI visual copy: You can press v to enter visual select mode in the log pane and copy lines directly to your system clipboard with y.
  • Server metrics: Displays basic CPU, RAM, and Disk usage for each server on the sidebar.
  • Single-binary distribution: Packaged with Burrito, so users can download and run it without needing Elixir or Erlang installed on their machine.

Some technical notes on the Elixir/OTP stack

Using Elixir for a CLI/TUI utility was a great experience, and a few things really stood out:

  1. Erlang’s :ssh module is a hidden gem: I didn’t need to wrap any SSH CLI binaries or pull in heavy dependencies. Erlang’s native :ssh and :ssh_sftp handle secure connections and stream multiplexing perfectly. Each server connection maps nicely to a supervised GenServer.
  2. ex_ratatui: TUI rendering is powered by @mcass19’s ex_ratatui (Rust’s Ratatui bindings via Rustler). It brings LiveView-like ergonomics to terminal rendering.
  3. Web rendering in dev mode: During local development, I used phoenix_ex_ratatui to render the TUI directly in the browser via LiveView. It made debugging UI layouts and sizing much faster.
  4. Self-upgrades with Burrito: The release is bundled into a single file. We also wrote a quick caudata upgrade command that checks GitHub releases, downloads the target-specific binary, and swaps it in-place.

The project is still in its early stages. I’d love to hear your feedback on the OTP architecture, codebase structure, or the TUI UX.

Check out the repo here:

14 Likes