# dusk:screenshot
Capture a screenshot of the running Flutter app to a file. The VM Service handler walks the render tree to find the `RepaintBoundary` that `DuskPlugin.install()` wrapped around the app root, calls `toImage`, and returns a base64-encoded PNG or JPEG. The CLI decodes the base64 and writes the bytes to the path supplied by `--output`.
JPEG is the default for size: a typical Flutter web screen renders in ~30 KB at quality 70. Switch to PNG when the agent needs lossless pixels for a diff comparison.
---
## Table of contents
- [Synopsis](#synopsis)
- [Arguments](#arguments)
- [Returns](#returns)
- [Format and quality](#format-and-quality)
- [Examples](#examples)
- [See also](#see-also)
---
## Synopsis
```
dart run fluttersdk_dusk dusk:screenshot --output=
[--format=jpeg|png]
[--quality=<1-100>]
```
`dusk:screenshot` requires a running Flutter session (`CommandBoot.connected`). It dials the VM Service URI, calls `ext.dusk.screenshot`, decodes the base64 payload, and writes the resulting bytes to the supplied output path.
---
## Arguments
| Option | Abbr | Type | Default | Required | Description |
|--------|------|------|---------|----------|-------------|
| `--output` | `-o` | string (path) | (none) | yes (`mandatory: true`) | Output file path. Resolved relative to the CWD. The directory must already exist. |
| `--format` | none | enum | `jpeg` | no | One of `jpeg`, `png`. Constrained by `allowed: ['jpeg', 'png']` so any other value errors out at parse time. |
| `--quality` | none | int (string-parsed) | `70` | no | JPEG quality, range 1-100. Ignored for PNG. Falls back to `70` when the value fails `int.tryParse`. |
The `--output` guard fires before the VM Service call; an empty or missing path returns exit code `1` with `Missing --output=.`.
---
## Returns
`dusk:screenshot` returns an integer exit code via `Future`:
| Exit code | Meaning |
|-----------|---------|
| `0` | Screenshot captured and written. The handler emits `Wrote base64 chars to ` where `` is the length of the base64 string before decoding (useful for spotting empty buffers without inspecting the file). |
| `1` | `--output` was missing or empty (CLI-side guard); OR the VM Service handler returned a response without a `base64` field. |
**Success envelope (CLI side):**
```
[ok] Wrote 41268 base64 chars to /tmp/dashboard.jpeg
```
**VM Service envelope (handler side):**
```json
{ "base64": "" }
```
The CLI calls `base64Decode(base64Str)` and writes the resulting bytes to `output`. No additional metadata (width, height, mime) is returned today; the agent infers shape from the file on disk if needed.
---
## Format and quality
- **jpeg** (default): the VM Service handler encodes via the `image` package's JPEG encoder at the supplied quality. Quality 70 is a Playwright-aligned default; bump to 90 for visual-regression diffs, drop to 40 for quick sanity checks.
- **png**: lossless, larger files (typically 5x JPEG at quality 70). The `--quality` value is ignored.
The handler never resizes the screenshot; the captured image matches the running viewport's pixel dimensions (logical size times DPR). To capture at a controlled viewport, run `dusk:resize` or `dusk:device` first.
---
## Examples
### 1. Capture the current screen as JPEG
```bash
dart run fluttersdk_dusk dusk:screenshot --output=/tmp/screen.jpeg
```
Expected output (illustrative):
```
[ok] Wrote 41268 base64 chars to /tmp/screen.jpeg
```
### 2. Capture losslessly for a visual diff
```bash
dart run fluttersdk_dusk dusk:screenshot --output=/tmp/screen.png --format=png
```
Useful when the agent compares against a baseline PNG via `image_diff` or `pixelmatch`.
### 3. Capture at high quality JPEG
```bash
dart run fluttersdk_dusk dusk:screenshot --output=/tmp/hifi.jpeg --quality=92
```
### 4. Capture after a controlled resize
```bash
dart run fluttersdk_dusk dusk:resize --width=1440 --height=900
dart run fluttersdk_dusk dusk:screenshot --output=/tmp/desktop.jpeg
```
---
## See also
- [dusk:snap](dusk-snap.md): the structured-text counterpart; agents typically pair `dusk:snap` and `dusk:screenshot` to read both the Semantics tree and the pixels in a single round.
- [dusk:hot_reload_and_snap](index.md#hot-reload-and-snap): captures snapshot + screenshot + recent exceptions in one round trip.
- [dusk:resize](index.md#cdp) and [dusk:device](index.md#cdp): control the viewport that `dusk:screenshot` captures from on web targets.