// how it works
A link that exists before the output does
Spawn a stream
Piping into spwn creates a secret upload key and a
shareable watch link before a single byte is written.
# url is printed instantly, to stderr
$ long-job | spwn
▶ https://spwn.stream/Kd7fQw2mRt
Pipe into it
Output streams up as it happens. The page is live from the first millisecond — no "wait until it finishes", no size limits on what flows through.
$ tail -f /var/log/app.log | spwn $ spwn run -- make release
Watch from anywhere
Laptop, phone, teammate's screen. Live push over SSE, autoscroll, ANSI colors, full-text search. When the command ends, the page says so — then the link expires on its own.
// examples
Things you'll actually use it for
$ journalctl -u myapp -f | spwn \
--title "prod · myapp"
You're away from the desk and prod is acting up. Open the link on your phone and watch the log stream in real time.
$ spwn run -- make release
A colleague wants to see why the build is red. Send the link instead of a 40 MB log attachment. Exit code included.
$ spwn run -- rsync -a /data backup:/mnt
Two-hour transfer, one shared link. Check progress from bed instead of babysitting a terminal.
# crontab — every run leaves a readable trail
0 3 * * * backup.sh 2>&1 | spwn \
--title "nightly backup"
Each run gets its own link. Skim them over coffee instead of digging through mail logs.
// why spwn
Small tool, obsessive details
Live, not polled
Server-sent events push bytes the moment they arrive. Milliseconds, not refresh intervals.
ANSI rendered
Colors, bold, underline — 256-color too. Your colored test output stays colored.
Search & filter
Full-text search across everything the stream produced, with match highlighting.
Self-expiring
Links die after 24h by default. Nothing to clean up, nothing lingering forever.
Watch-only links
Sharing the link lets people read. Writing requires the creator's secret key.
One static binary
Go, zero dependencies, the whole site embedded. Drop it on any box and go.
// faq
Questions, answered
How long do streams live?
--ttl 2h (or up to the server maximum) to change it per stream. After expiry the link is simply gone — no tombstones, no archive.Who can write to a stream?
Is it private?
Can I use it with plain curl, nothing installed?
read id key <<< "$(curl -s https://spwn.stream/new)" long-job | curl -sNT - -H "X-Spwn-Key: $key" https://spwn.stream/s/$idOr one-shot (the link arrives when the command finishes):
long-job | curl -s --data-binary @- https://spwn.stream/