jawb read [--format md|text|json] [--element <id>] [--full] [--js]

Read the page, or one element, as Markdown, text or JSON.

Returns the page's (or one element's) content, rendered for reading rather than as a list of interactive elements — the counterpart to observe.

$ jawb read --tab t_5a87rr
# Example Domain

This domain is for use in documentation examples without needing permission. Avoid use in operations.

[Learn more](https://iana.org/domains/example)
-- 168 bytes of md from 559 bytes of HTML (body, rev 1, native, 0ms)

--format

  • md (default) — Markdown: headings, links and lists.
  • text — plain text, no Markdown syntax.
  • json — a structured {headings, links, text} object (hidden links are left out of links, like hidden text):
$ jawb read --tab t_5a87rr --format json
{
  "headings": [ { "id": 1, "level": 1, "text": "Example Domain" } ],
  "links": [ { "href": "https://iana.org/domains/example", "id": 3, "text": "Learn more" } ],
  "text": "Example Domain\n\nThis domain is for use in documentation examples without needing permission. Avoid use in operations.\n\nLearn more\n"
}

--json (the global flag) wraps any of these formats in the standard envelope; --format text --json for example:

$ jawb --json read --tab t_5a87rr --format text
{"command":"read","executor":"native","ok":true,"result":{"bytes":130,"content":"Example Domain\n\n...","format":"text","scope":"body","source_bytes":559,"title":"Example Domain","url":"https://example.com/","visibility":{"basis":"inline_only","omitted":{"hidden":{},"unknown":{"aria_hidden":0}}}},"revision":1,"tab":"t_5a87rr","v":1,"warnings":[]}

Hidden content

read leaves out text a person would not see, with the same rules as observe: the hidden attribute and inline display:none, visibility:hidden, opacity:0 or a zero font size on the text or anything around it, plus aria-hidden="true" content. A page that hides an instruction in <div style="display:none"> does not get it into read. result.visibility in --json output says how many regions were left out and why, and its basis (inline_only without --js) says how far to trust that: text hidden by a stylesheet class still comes through.

--element <id>

Scopes the read to one element (by observation ID) instead of the whole page:

$ jawb read --tab t_5a87rr --element 3
Learn more
-- 20 bytes of md from ... (element, rev 1, native, 0ms)

If the element was retargeted since you last observed, read follows the retarget and the human view appends (retargeted 3 → 4).

--full

Reads the whole document instead of the main-content heuristic scope (main/body) read uses by default.

--js

Like observe --js, promotes the tab to the compatibility bridge so read sees JavaScript-rendered content:

$ jawb read --format md
# Search

Searching for multiple words only shows matches that contain all words.

## Search Results

Search finished, found 11 pages matching the search query.

- [asyncio.TaskGroup](https://docs.python.org/3/library/asyncio-task.html#asyncio.TaskGroup) (Python class, in Coroutines and tasks)
...
-- 1646 bytes of md from 25370 bytes of HTML (main, rev 5, bridge, 0ms)

That transcript is from filling a search box, pressing Enter, waiting for results, then reading — see Act for fill/press, and wait via jawb wait --for text:... --timeout 30s.

tools

Lists page-declared WebMCP tools and adapter tools:

$ jawb tools --tab t_5a87rr
no page-declared tools (WebMCP); no adapter tools yet