Logs and screenshots
Healthy deploy, wrong behaviour at the URL → read logs first. The stderr line that names the fault is usually there from the first bad request, which is cheaper than reasoning about it from the outside. A deploy that reported crashed or timeout is the other way round: its errors and log_tail came back inline, so there is nothing here it does not already have.
stdout and stderr stream off the container as the app writes them, with stderr classified as error so it can be read on its own. Logs are kept for 30 days.
logs(app: "hn-digest", level: "error", limit: 200)
logs(app: "hn-digest", since: "2026-08-13T12:00:00Z")
since takes an RFC3339 timestamp and is how an agent avoids re-reading what it has already seen.
screenshot(app: "hn-digest", viewport: "390x844")
Returns the PNG inline plus the browser's console errors and failed network requests: the two things a picture alone would not tell you. It always captures the root path. There is no way to screenshot a subpath, so a result page or a route behind a form has to be checked by requesting it over HTTP and reading the response. Screenshots are serialized across the whole box, one at a time, and take 2-3 s.