Skip to content
use-cases / a-progress-bar-your-boss-can-spectate / hero
PIPE · ?PROGRESS · SSE

A progress bar your boss can spectate without joining

You're running an eight-hour migration. Five people want a status without consuming a receiver slot or interrupting the stream. Append ?progress to the pipe URL. Anyone who opens it gets a live HTML dashboard — bytes transferred, current speed, ETA, state transitions. The migration runs at full speed regardless of how many eyes are watching.

use-cases / a-progress-bar-your-boss-can-spectate / mechanism

How the boss watches without touching the stream

?progress is a side-channel read. It never claims a receiver slot, never creates backpressure, never touches the bytes. The migration runs at full bandwidth regardless of how many people are watching.

SPECTATOR TIMELINEZERO RECEIVER SLOTS
T+0 min
BOSS OPENS URL

She pastes the pipe URL with ?progress into her phone browser. The HTML dashboard appears instantly — state: waiting, 0% — no install, no login, no receiver slot consumed.

T+22 min
STREAM IS LIVE

SSE pushes a state: streaming event. The progress bar snaps to 22%, bytes tick up, MB/s settles at 118. The dashboard updates itself every 250 ms without a single page reload.

T+4 h
BOSS GOES TO BED

She closes the tab. Her spectator connection drops. The migration doesn't notice — it was never in the data path. The sender and its one real receiver carry on.

T+8 h
WAKES TO 100%

She reopens the URL at sunrise. The dashboard shows a done event: 7.6 GB transferred, 8h 2m, no errors. Server-side state survives the refresh — latecomers always see the final line.

T+8h 4m
SENDS THE ACK

She forwards the URL to the team Slack. Three engineers open it and see the same done state. No status thread to close, no Grafana panel to un-star. One URL, five witnesses, zero interruptions.

spectate.sh
# 1. Sender — eight-hour migration. Same as always.
tar czf - /var/lib/postgres | curl -T - "$PIPE/api/v1/pipe/migration"

# 2. Receiver — the only client that matters for backpressure.
curl "$PIPE/api/v1/pipe/migration" | tar xzf - -C /restore

# 3. Boss opens the URL on her phone. HTML dashboard. No setup.
# => https://pipe.hoody.com/api/v1/pipe/migration?progress

# 4. You want SSE for a Slack bot? Same URL, different Accept.
curl -N -H "Accept: text/event-stream" \
  "$PIPE/api/v1/pipe/migration?progress" \
  | grep -E '^event: (progress|state|done)'
# event: state    \n data: '{'"state":"streaming","receivers":1'}'
# event: progress \n data: '{'"bytes":5046464512,"mbps":118,"etaSec":840'}'
# event: done     \n data: '{'"bytes":8160000000,"durationSec":28800'}'

Three SSE event types. state for transitions (idle → waiting → streaming → complete), progress every 250 ms while bytes flow (bytesTransferred, speed, ETA), done once at the end with final stats. Up to fifty spectators per path, each with a five-minute connect window.

use-cases / a-progress-bar-your-boss-can-spectate / audience

Every stakeholder, one read-only URL

?progress is a side-channel. Boss, coworker, external client, on-call — they all open the same URL. None of them affect the transfer. All of them see the same live state.

use-cases / a-progress-bar-your-boss-can-spectate / punchline

Watching the migration is its own URL. The migration doesn't notice.

0 RECEIVER SLOTS USEDUP TO 50 SPECTATORS PER PATH
MIGRATION1 sender, 1 receiver, full bandwidth
SPECTATORS12 boss-eyes on the dashboard, 0 backpressure
  • no Slack channel to babysit
  • no Grafana dashboard to wire
  • no progress endpoint to write
use-cases / a-progress-bar-your-boss-can-spectate / replaces

What this replaces

Every team has a way to answer 'how far along is it?' Most of those ways cost a service to run, a dashboard to wire, or a chat channel to babysit. A query parameter on the pipe URL costs none of that.

  • Slack #migrations channel updatesA human typing percentages every five minutes
  • Grafana dashboardsAn exporter, a Prometheus scrape, a panel to maintain
  • Custom progress endpointsBespoke route, bespoke schema, bespoke retention bug
  • Tmux-share over SSHBastion access just to watch a number tick up
  • Datadog metric panelsPer-host agent and per-metric pricing for one transfer
  • 'are we there yet' pingsFive teammates asking the same question on different threads
use-cases / a-progress-bar-your-boss-can-spectate / cta

Send the URL. Stop sending updates.

use-cases / a-progress-bar-your-boss-can-spectate / related

Read the others