---
title: Streaming & dry-run
description: Stream bodies through stdin/stdout with no temp files, and use --dry-run to preview an operation before it runs.
---

`upload --stdin` reads the body from `stdin`; `download --stdout` writes it to `stdout`. No intermediate file, no extra copy. Metadata for stdout downloads is suppressed by default and only emitted to `stderr` when `--verbose` is set, so the byte stream stays clean.

`--dry-run` resolves the provider and prints the operation it _would_ run, without making a network call. Handy as a sanity check inside an agent loop before letting it execute writes.

```bash lineNumbers
# Stream binary in/out without temp files
ffmpeg -i talk.mov -c copy -f mp4 - \
  | files --provider r2 --bucket talks upload 2026/q1/keynote.mp4 --stdin --content-type video/mp4

files --provider r2 --bucket talks download 2026/q1/keynote.mp4 --stdout \
  | ffprobe -i - 2>&1

# Plan before doing — useful as a sanity check inside an agent loop
files --provider s3 --bucket uploads --dry-run delete reports/q1.pdf
# → {"action":"delete","dryRun":true,"provider":"s3","keys":["reports/q1.pdf"]}

# Verbose adds stack traces to error output
files --provider s3 --bucket uploads --verbose head missing.txt
```
