Project

tull-rust

Teleport Your Logs with Love. Pipe any command output into tull - it gets captured with a unique ID, stored locally, and served via a lightweight web interface.

Rust · 100% 2,690 crate downloads Open source
Rust CLI Logging Flask Developer Tools

Debugging a long-running process usually means one of two things: scrolling through a terminal that has already lost the output, or adding ad-hoc logging to a script and cleaning it up later. Neither is great. tull is a small Rust CLI that sits between your command and your terminal, capturing everything transparently.

The name stands for Teleport Your Logs with Love. The idea is simple - pipe anything into tull and it assigns the session a unique UUID, stores the stream locally under ~/.tull, and makes it browsable via a local Flask web server. Your stdout still works exactly as before - tull passes the stream through without interruption.

# install
cargo install tull-rust

# capture output of any command
ps ax | tull

# start the web server to browse logs
tull web

# follow a live log session
tull follow <uuid>

# list all saved sessions
tull list

How it works

1

Pipe interception

Any data piped into tull is read from stdin. A unique UUID is generated for the session.

2

Local storage

The stream is written to a file under ~/.tull/ keyed by the UUID, while simultaneously being forwarded to stdout - so your terminal output is unchanged.

3

Background web server

A Flask server starts as a background process (if not already running), exposing simple REST endpoints to list and retrieve sessions by UUID.

4

Browse & follow

Open the TULL_WEB_URL in your browser to browse all sessions. Use tull follow for live tailing of an active session.

Sharing outside LAN

Since tull exposes a local web server, you can use ngrok or localtunnel to share a session URL with teammates - useful for quickly sharing long build or deployment logs without pasting walls of text.

Why Rust

The original motivation for writing this in Rust was to have a near-zero overhead pipe interceptor. A tool that sits in the middle of every command's output stream should not itself be a bottleneck. Rust's ownership model also makes the concurrent read-write to both stdout and the local file clean to reason about without reaching for locks or async runtimes.

The project is published on crates.io with over 2,600 downloads across two versions. It is a small tool, but one that reflects a recurring frustration turned into something reusable - which is the best reason to build anything.