Skip to content

Capturing

A capture is a snapshot of everything a developer would normally collect by hand from the page and DevTools. The extension does it in one click.

What is in a capture

FieldSourceNotes
Screenshotchrome.tabs.captureVisibleTabPNG, the visible viewport at the moment of capture. Compressed if larger than ~4000px on the longest side.
URLchrome.tabs.queryThe active tab’s URL. Always present.
ConsoleIn-page hook on console.*Includes log, info, warn, error, debug. Each entry has level, args (serialized), timestamp, and stack trace (when available).
NetworkIn-page hook on fetch and XMLHttpRequestMethod, URL, status, request and response headers, timing, response size. Bodies where size and CSP allow.
Errorswindow.onerror, window.onunhandledrejectionUncaught errors and rejected promises with stack traces.
Performanceperformance.getEntriesByType('navigation'), long task observer, Web VitalsPage load timing, longest tasks, LCP, CLS, FID where measured.
Capture metadataExtension-internalPage load state at capture time, timestamps, capture id, extension version.

How console and network are captured

The extension injects content scripts into every frame at document_start. The MAIN-world script hooks console.*, fetch, and XMLHttpRequest before the page’s own scripts run, so messages and requests from the very start of page load are captured.

Each captured entry is buffered in memory (per-tab). When you click capture, the ISOLATED-world bridge collects the buffer and ships it to the service worker.

This is why console history starts from extension load: messages logged before the extension activated are not in the buffer. The capture metadata flags this so the user (and any AI reading the ticket) knows.

How the screenshot is taken

chrome.tabs.captureVisibleTab returns a PNG of the visible viewport. Toado captures only the visible area (no full-page scroll-and-stitch in v1). For ultrawide monitors, the image is compressed to a max dimension of 4000 px on the longest side before upload.

Project assignment

Each capture is bound to one project. Selection rules:

  1. If a URL pattern in any project matches the current URL, that project is preselected.
  2. Otherwise, the most recent project chosen for the current origin is preselected.
  3. Otherwise, the popup prompts you to pick.

You can always override the preselection before submitting.

Pre-submit review (opt-in)

Off by default for speed. When on (Options › Capture › Review before submit), the popup shows the capture preview with redactions applied, giving you one chance to scrub or cancel before it leaves your machine.

Useful for:

  • Pages with sensitive data you might want to redact.
  • Verifying nothing accidentally leaked from the network log.
  • Adding a quick title before the ticket is created.

Edge cases

CSP-locked sites

Some sites use a strict Content Security Policy that blocks injected scripts. On those, the screenshot and URL still capture, but console and network may be partial or empty. The capture metadata flags csp_blocked: true and the ticket gets a banner explaining what is missing.

Cross-origin iframes

The MAIN-world content script runs in every frame thanks to all_frames: true, but cross-origin frames are sandboxed by the browser. The top frame’s console and network are captured; cross-origin frame contents are out of scope for v1.

Restricted URLs

Chrome blocks extension access on chrome://, chrome-extension://, the Chrome Web Store, and view-source: pages. The extension icon is disabled there, with a tooltip explaining why.

Incognito mode

Works only if you have enabled the extension for incognito (chrome://extensions/ › Toado › Allow in incognito). When not enabled, clicking the extension on an incognito tab opens a one-time prompt with the enable instructions.

SSO / login walls

No special behavior. Capture runs in the user’s authenticated session, same as any other page. Use redaction for sensitive content. See Annotation toolbar › redaction.

Heavy network traffic

Hundreds of requests are fine; bodies are capped at a default 10 MB total per capture. Oversize responses include headers and a body_truncated: true flag, so the data is still useful for debugging.

Streaming responses (SSE / WebSocket)

Captured as connection metadata. Toado does not buffer payloads indefinitely. The capture marks the connection as streaming.

The service worker aborts and retries once on the new URL. If two consecutive captures straddle navigation, the user sees a notification.

Tab closed mid-submit

The service worker retries for up to 30 seconds. If still failing, it falls back to the offline queue.

Capture health banner

If any field came back partial or empty, the ticket detail page shows a non-blocking banner explaining what is missing and why. This serves both the human reviewer and the AI agent: both know up front the capture is incomplete before debugging begins.

Example banner text:

Heads up: console history starts from extension load (the page loaded before Toado was active). Network and screenshot captured normally.

Where to next