v2.4.0 · zero-config log streaming
Pipe any process into stdout and get structured, searchable logs in under a minute. No agent, no sidecar, no YAML.
$npm i -g stdout
$stdout run -- node server.js
→ streaming to https://app.stdout.dev/s/9f2a1c
12:04:31infoserver listening on :3000
12:04:33warnslow query 812ms db.users.find
12:04:35errorECONNREFUSED redis:6379
12:04:36inforetry 1/5 in 250ms
$stdout search "ECONNREFUSED" --since 1h
01 / why stdout
The process exits and its output goes with it. stdout ships every line off the box as it is written, so a crash loop leaves a trail instead of a gap.
$docker logs api
Error: No such container: api
$stdout tail api --since 10m
12:04:35errorECONNREFUSED redis:6379
Every line is parsed into fields the moment it lands — level, timestamp, message, and anything you emit as JSON. Query it like a table, not a haystack.
$stdout search 'level:error AND service:api' \
--since 24h --json
→ 14 matches in 2,148,903 lines (38ms)
→ grouped by trace_id, newest first
Sample debug lines, drop health checks, keep every error. Retention rules live in one file you can read in ten seconds.
[retention]
error = "90d"
info = "7d"
debug = "off"
02 / the surface
stdout run
Wrap any process and stream its output as it happens.
stdout tail
Follow a live stream, filtered by service, level, or trace id.
stdout search
Query historical logs with field filters and time ranges.
stdout export
Dump a result set to NDJSON, CSV, or straight into a bucket.
stdout keys
Create, rotate, and revoke ingest keys per environment.
03 / compatibility
There is no SDK to install and no language binding to wait for. stdout reads the two streams every runtime already writes to.
04 / getting started
One binary, no runtime dependencies. Works on macOS, Linux, and inside CI.
$npm i -g stdout
Swap your start command. Everything on stdout and stderr is captured as it is written.
$stdout run -- npm start
A shareable URL with live tail, search, and filters. Nothing to configure, nothing to host.
$stdout tail --web
05 / in production
We replaced a 400-line log shipper config with one command. I have not thought about log delivery since.
@dmitri_k
staff engineer · northwind
The search syntax is the one that was already in my head. That is the entire review.
@sam.builds
founder · octopad
Log spend dropped 60% in a week, because dropping health checks took exactly one line.
@priya_r
platform lead · heliostat
added per line
resident memory
config files required
supported runtimes
06 / questions
Yes. The collector is MIT licensed and ships as a single binary. Point it at your own instance and nothing leaves your network.
Seven days on the free plan, ninety on Pro, and configurable per level. Retention rules live in one config file.
All of them. It reads stdout and stderr, so anything that prints works — Node, Python, Go, Rust, a shell script, a compiled binary.
It writes to a local buffer and ships asynchronously. Under a millisecond added per line, with backpressure if the network stalls.
No. The CLI makes exactly one outbound connection: the one that carries your logs.
$ ready when you are
Install it, wrap your process, watch the stream. Free for solo projects, forever.
$npm i -g stdout