Share a Log or Command Output

Show a teammate what your machine sees: a log file as it grows, a command's output refreshed every few seconds, or a one-off snippet, file or pipe. Each gets a link that works while the command runs.


Goal

Three links: one that follows app.log live, one that reruns a command on an interval, and one for a single piece of text, a file or command output.

Prerequisites

1. Follow a log file live

Any file works. For the tutorial, create a small one:

$ echo "12:00:01 service started" > app.log
$ nfltr tail app.log
nfltr tail dev starting
  file:         /home/you/app.log
  lines:        50
Share URL              https://fast-beam-0d80c450ede795600648c0d0aec3e87e.nfltr.xyz/
  Access               Public
Connected — waiting for requests... (press Ctrl+C to stop)

The link opens a live, searchable view of the last 50 lines (--lines 200 for more). New lines appear as they are written:

$ echo "12:00:05 GET /health 200" >> app.log
$ curl -s "${URL}raw"
12:00:01 service started
12:00:05 GET /health 200

Besides the page at /, the link serves /raw (plain text), /stream (Server-Sent Events, for scripts) and /health. Press Ctrl+C to stop sharing; the link answers 503 from then on:

$ curl -s -o /dev/null -w '%{http_code}\n' "${URL}raw"
503

2. Publish a command's output as it changes

nfltr watch reruns a command on an interval and serves the latest output, like watch with a link:

$ nfltr watch --interval 2s uptime
Watching: uptime (every 2s)
Share URL              https://fast-beam-0d80c450ede795600648c0d0aec3e87e.nfltr.xyz/
Connected — waiting for requests... (press Ctrl+C to stop)

The page refreshes itself. Scripts can read /api/output (JSON) or /events (Server-Sent Events):

$ curl -s "${URL}api/output"
{"output":"12:00:48  up 3 days,  2:11, 2 users, load averages: 1.52 1.60 1.71\n","time":"2026-09-29T12:00:48Z","runs":3}

Quote a command with arguments or pipes: nfltr watch "kubectl get pods". --expire 1h stops it on its own.

# Ctrl+C in the nfltr watch terminal

3. Share a snippet, a file or piped output

Text on the command line:

$ nfltr share "error: connection refused on db:5432"
Sharing: text (36 bytes)
Share URL              https://fast-beam-0d80c450ede795600648c0d0aec3e87e.nfltr.xyz/

The link shows the text with a Copy button; /raw is the plain text:

$ curl -s "${URL}raw"
error: connection refused on db:5432
# Ctrl+C in the nfltr share terminal

Anything piped in (a diff, a test run, the last lines of a log):

$ tail -n 20 app.log | nfltr share
Sharing: stdin (49 bytes)
Share URL              https://fast-beam-0d80c450ede795600648c0d0aec3e87e.nfltr.xyz/
$ curl -s "${URL}raw"
12:00:01 service started
12:00:05 GET /health 200
# Ctrl+C in the nfltr share terminal

A file, as a download (a directory gets a listing). --expire 30m stops sharing on its own:

$ nfltr share ./app.log --expire 30m
Sharing: file: /home/you/app.log (49 B)
Auto-expire in 30m0s
Share URL              https://fast-beam-0d80c450ede795600648c0d0aec3e87e.nfltr.xyz/
$ curl -s "$URL"
12:00:01 service started
12:00:05 GET /health 200

For anything sensitive, add a password: nfltr share ./report.html --share-preset review prints generated credentials, --share-auth user:password uses yours (nfltr tail takes --basic-auth user:password).

For scripts, nfltr share --json prints {"share_id", "url", "expires_at", "size_bytes"} once the relay has issued the link. If the relay refuses it, it prints {"error": "…"} with the relay's reason and exits 1, so a script never gets a link that does not work.

4. Clean up

Press Ctrl+C in the terminal running nfltr share. Every link above now answers 503.

$ curl -s -o /dev/null -w '%{http_code}\n' "$URL"
503

If it goes wrong

You seeMeaning and fix
Error: stat nope.log: no such file or directorynfltr tail needs an existing file. Check the path (flags may come before or after it).
Error: nothing to sharenfltr share got no text, no file and no piped input. Pass one of them.
Error: recv error: rpc error: code = AlreadyExists desc = API key is already in use by agent <agent id>Another nfltr command already uses this API key. Stop it, or run this one with a second key (--key-name).
The link answers 503The sharing command is not running any more. Start it again.

Next