The quiet console
A build spends two minutes filling the scrollback with progress nobody reads, and the one line that mattered scrolled past forty seconds ago. What a person wants from turnout build is a line saying it is building and a line saying it finished - and, on the rare failure, the whole output right there, without running it again.
So every command turnout starts for an app is captured rather than passed straight through. The output always goes to a log file; only what reaches the terminal changes.
Commands that finish
Section titled “Commands that finish”build, test, lint, and the build step inside deploy show a loader with the elapsed time, and nothing else:
[myapp] pnpm build◇ Building myapp finished in 24sWhen one fails, the output appears immediately - the end of it on the terminal, all of it in the log:
[myapp] pnpm build■ Building myapp failed after 3.2ssrc/app.ts:14:8 - error TS2304: Cannot find name 'wat'.full output: C:\Users\me\AppData\Local\lacodda\turnout\logs\myapp.build.logCommands that keep running
Section titled “Commands that keep running”dev, and any custom command through run, show a loader until the server says it is up, and from then on only the lines that look like a problem:
[myapp] pnpm dev --port 5100[myapp] http://myapp.localhost -> dev server port 5100◇ myapp ready in 1.4s - http://myapp.localhostHot-reload chatter stays out of the way; an error or a warning from the server comes through as it happens. Everything, chatter included, is in the log.
A server that never announces itself keeps its console. turnout recognises the three shapes it can: Vite’s ready in, Next’s compiled, and - for anything else - the first line carrying an http:// address, which is what a server prints when it starts listening. If none of those arrives within ninety seconds, turnout stops waiting, prints what it held back and streams from there on, exactly as it did before.
Seeing everything
Section titled “Seeing everything”-v / --verbose turns the loader off and streams the output in full. So does anything that is not a terminal: a pipe, a file, a CI job. Piped output is byte for byte what it always was, and exit codes pass through either way.
turnout build myapp -v # the whole build, as it happensturnout build myapp | tee out.log # streams, no loader, nothing to stripThe log file
Section titled “The log file”Every job writes both of its streams to logs/ in the data directory, one file per app and command - or to wherever TURNOUT_LOG_DIR points:
logs/myapp.build.loglogs/myapp.dev.loglogs/myapp.test%3Ae2e.logThe next run of the same command replaces the file rather than growing it - the question a log answers is “what did the last one say”. A run that failed leaves a copy in logs/failed/ first, so the output of a failure outlives the retry that followed it - see a failure is kept. A command name that is not a file name (test:e2e) is escaped rather than squashed, so test-e2e keeps a file of its own. turnout logs prints them, -f follows one as it grows.
A job started with --detach has no console at all: its log is all of its output. See background jobs.
The log is written whatever the console does, including under -v. Hiding output is only acceptable when none of it is lost.