# Logs and diagnostics

The `/logs` page (**System health** in the app) merges container and host-side service logs into one stream, with a health bar above them, and lets you package that detail for a bug report.

Already know what is wrong? Go to [Troubleshooting](/docs/guides/troubleshooting/) first. Come here for raw logs or a bundle to attach.

## Check the system-health bar

1. Open `/logs`. The status bar shows an overall status (`healthy` or `degraded`) plus a colored dot and label for `vm`, `containers`, `ide_bridge`, and `mcp_os`.
2. Click the overall status to expand a details row: each container's name and status, plus the IDEs Speedwave detected with their ports.
3. If Speedwave found an IDE you have not selected yet, the `ide_bridge` cell shows a **connect →** link into Integrations. See [IDE Bridge](/docs/features/ide-bridge/) for what the bridge does.
4. Click **refresh** to force an update between the automatic 5-second ticks.

<DesktopFrame screen="logs" />

## Read the log stream

1. Below the bar, the log view live-tails a merged stream, the last 500 lines by default. It re-fetches every 5 seconds and sticks to the bottom while scrolled.
2. Use the **level chips** (`all`, `debug`, `info`, `warn`, `error`) to narrow what you see.
3. Use the **source dropdown** to isolate one source, each listed with its line count.
4. Hover a timestamp to see its raw value; the displayed time is your local timezone.

Speedwave logs at trace level, with no toggle, so a diagnostics export always carries the fullest context and you never need to reproduce a problem at higher verbosity first. A few noisy third-party libraries are capped at warn to keep the stream readable.

On desktop, these logs also live on disk: `~/Library/Logs/pl.speedwave.desktop` on macOS, `%LOCALAPPDATA%/pl.speedwave.desktop/logs` on Windows. Files rotate at 50 MB, keeping the last 10 segments.

### HTTP debug logs get condensed

Set `ANTHROPIC_LOG=debug` to see raw Claude Code SDK traffic, and Speedwave collapses each verbose request or response into a one or two line summary tagged with a `[log_ID]`, instead of dumping the raw multi-line output:

```
-> POST /v1/messages (model=claude-opus-4, max_tokens=4096, stream=true, messages=12) [a1b2c3]
<- 200 /v1/messages (content-type=text/event-stream, from api.anthropic.com, in 842ms) [a1b2c3]
```

The SDK emits each response in three fragments; Speedwave merges them into that one line. Anything it doesn't recognize still passes through untouched.

## Export a diagnostics bundle

The **export diagnostics** button packages app logs, container logs, and system info into a sanitized ZIP, no tokens or secrets included. It is disabled during an export and when no project is open.

1. On `/logs`, click **export diagnostics**. The label changes to "exporting…" while Speedwave builds the archive.
2. On success, a modal titled **Diagnostics archive saved** shows the ZIP's path.
3. Click **copy path** to copy it, then **close**.
4. Share the bundle yourself, with support or attached to your bug report. Nothing uploads automatically.

The ZIP lands in your Downloads directory (falling back to your home directory), named `speedwave-diagnostics-<unix-timestamp>.zip`.
**You attach it yourself:** Speedwave saves the file and shows you its path. It does not open a file manager, upload the bundle, or attach it for you.

### What the bundle contains

- speedwave-diagnostics-&lt;timestamp&gt;.zip
  - logs/
    - **\*.log** app log files
  - containers/
    - compose.log container and compose logs
    - compose.yml the project compose file
  - mcp-os/
    - mcp-os.log if present
  - claude/
    - claude-session.log if present
  - lima/
    - serial.log Lima serial log, macOS only
  - system-info.txt OS, arch, app version, `claude_pinned` (pinned Claude Code version)
The single-file sources (mcp-os log, Claude session log, Lima `serial.log` macOS only) appear only when they exist.

Speedwave's log sanitizer rewrites anything sensitive as `***REDACTED***` before writing the ZIP:

| Category | Examples |
|---|---|
| API keys | Anthropic (`sk-ant-...`), Google (`AIza...`), generic `sk-*` |
| Git hosting tokens | GitHub (`ghp_`, `ghs_`, `gho_`, `ghu_`, `github_pat_`), GitLab (`glpat-`), Atlassian Cloud |
| Chat tokens | Slack (`xoxb`, `xoxp`, `xoxa`, `xoxr`, `xoxs`, `xoxe`) |
| Auth data | `Authorization`/`Bearer` headers, `Set-Cookie`/`Cookie`, JWTs, URL userinfo credentials |
| Other | PEM private keys, home-directory usernames, `password`/`secret`/`api_key`/`token` params, `X-Redmine-API-Key`, OTEL exporter headers |

A crash payload the sanitizer can't parse as text collapses to `unknown panic payload` rather than risk leaking it. The tokens directory is never included in the ZIP. The exception is `system-info.txt`, written raw with OS, architecture, app version, and the pinned Claude Code version.

For a version mismatch, check `claude_pinned` in `system-info.txt` first. Speedwave pins this version itself, so a mismatch usually means your `claude` container needs a rebuild; see [Troubleshooting](/docs/guides/troubleshooting/) for the fix.