Skip to content
use-cases / tail-prod-logs-to-a-url / hero
PIPE · LIVE LOG STREAMING

Tail production logs to a URL anyone can curl

A fire happens. Three engineers want the same logs at the same time. One sender pipes tail -F into a Hoody Pipe URL. Anyone with the link runs curl and sees the bytes stream past in real time. No bastion, no agent install, no dashboard seat.

Read the pipe docs
use-cases / tail-prod-logs-to-a-url / mechanism

One sender. Many curls. No agent.

On the prod container, one line pipes tail straight into a Hoody Pipe URL. Receivers GET the same path. The pipe holds nothing — bytes stream through. The first receiver to connect unblocks the sender; up to 256 readers can join the same path.

prod-app-7 · /var/log/app
PUT · sender
# On the production container — one line.
# tail -F follows new lines forever; curl -T - PUTs stdin
# straight into a pipe path. ?n=4 says "wait for 4 readers".

tail -F /var/log/app/*.log \
  | curl -T - \
      "https://prod-pipe.containers.hoody.com/api/v1/pipe/live?n=4"

# [INFO] Waiting for 4 receiver(s) to connect...
# [INFO] Streaming to 4 receiver(s)...
the pipe holds nothing · bytes stream through
any laptop · ssh-free
GET · readers
# Any engineer with the URL — same command, same path.
# The response body IS the live stdout of the sender.
# Up to 256 readers can join. SSE progress is available too.

curl "https://prod-pipe.containers.hoody.com/api/v1/pipe/live?n=4"

# 200 GET /v1/orders/8421 · 18ms
# POST /v1/checkout user=u_28f payload=ok
# 500 POST /v1/checkout · stripe timeout
# retrying charge attempt=2/3

Two pieces of the documented Pipe API: PUT /api/v1/pipe/[path] on the sender, GET /api/v1/pipe/[path] on every reader, both keyed by the same n. The server forwards the sender's Content-Type, holds the connection up to a 5-minute TTL while it waits for readers, and applies backpressure if any single reader is slow.

use-cases / tail-prod-logs-to-a-url / powers

What the pipe gives you that a dashboard doesn't

A logs URL behaves differently from a Datadog seat. It's read by URL, not by login. It vanishes when the sender stops. And it scales to a whole incident channel.

MULTIPLAYER BY DEFAULT

Up to 256 curls on one stream

n=N is documented in the Pipe API: every reader joining the same path with the same n receives an identical fan-out copy. SREs, on-call, the founder watching from a phone — all tail the same stream at once.

HTTP-NATIVE

No agent. No forwarder. Just curl.

There is nothing to install on the readers' side. Anything that speaks HTTP — curl, fetch, a browser tab, a Slack incident channel previewing the URL — is a valid log tail. The bytes are the response body.

EPHEMERAL

ctrl-C and the pipe is gone

When the sender disconnects, the pipe vanishes. No retention to configure, no log volume to clean up, no leftover endpoint exposed to the internet. The URL was a path, not a place — and the path closes when the fire ends.

use-cases / tail-prod-logs-to-a-url / capacity

The numbers behind the URL

From the Pipe API spec. Limits and behaviors that make a URL feel like infrastructure instead of a toy.

  1. READERS PER PATH256

    The documented cap on n. Your incident channel will not run out of seats.

  2. BYTES STORED0

    The pipe is direct-streamed end-to-end. No intermediate disk, no retention to manage.

  3. WAITING TTL5 min

    Receivers can connect before the sender; the server holds the slot for up to 5 minutes.

Source: Hoody Pipe API — limits documented for /api/v1/pipe/[path], n parameter, and unestablished pipe TTL.

use-cases / tail-prod-logs-to-a-url / punchline

Logs aren't a place anymore. They're a path.

no bastion · no seat · no forwarderone URL · up to 256 curls
yesterdayssh bastion → tail -f /var/log/app.log
todayhttps://prod-pipe.../api/v1/pipe/live
Read the pipe API
use-cases / tail-prod-logs-to-a-url / replaces

What this replaces

The set of tools and rituals you currently invoke to get three engineers staring at the same prod log. Each one charges per seat, per agent, or per dashboard. The pipe is one URL.

  • Datadog Logs seatsPer-user license to see the same bytes
  • SSH bastion + tail -fHop, ssh, find the log file, repeat per engineer
  • Loggly / Logtail forwardersAgent install, config, retention bill
  • ELK / Splunk dashboardsHeavy stack to host one tail
  • Slack screenshare of tail -fOne person tails, the rest squint
  • Cloud provider log groupsConsole seat plus IAM per reader
use-cases / tail-prod-logs-to-a-url / cta

The fire ends. You ctrl-C the sender. The pipe vanishes. There is nothing to clean up.

Read the pipe API
use-cases / tail-prod-logs-to-a-url / related

Read the others