quaywin
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
.
Quick Install: curl -fsSL https://raw.githubusercontent.com/quaywin/caudata/main/install.sh | sh

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/configfile 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
vto enter visual select mode in the log pane and copy lines directly to your system clipboard withy. - 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:
- Erlang’s
:sshmodule is a hidden gem: I didn’t need to wrap any SSH CLI binaries or pull in heavy dependencies. Erlang’s native:sshand:ssh_sftphandle secure connections and stream multiplexing perfectly. Each server connection maps nicely to a supervised GenServer. - ex_ratatui: TUI rendering is powered by
@mcass19’sex_ratatui(Rust’s Ratatui bindings via Rustler). It brings LiveView-like ergonomics to terminal rendering. - Web rendering in dev mode: During local development, I used
phoenix_ex_ratatuito render the TUI directly in the browser via LiveView. It made debugging UI layouts and sizing much faster. - Self-upgrades with Burrito: The release is bundled into a single file. We also wrote a quick
caudata upgradecommand 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:
Most Liked
dimitarvp
Oh wow, this is great. I’ll use it.
Popular in Announcing
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









