[{"data":1,"prerenderedAt":622},["ShallowReactive",2],{"navigation_docs":3,"-guide-reveal":108,"-guide-reveal-surround":617},[4,48],{"title":5,"path":6,"stem":7,"children":8,"icon":47},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,15,19,23,27,31,35,39,43],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Searching","\u002Fguide\u002Fsearch","1.guide\u002F2.search",{"title":16,"path":17,"stem":18},"Fan-out","\u002Fguide\u002Ffanout","1.guide\u002F3.fanout",{"title":20,"path":21,"stem":22},"Reading","\u002Fguide\u002Fread","1.guide\u002F4.read",{"title":24,"path":25,"stem":26},"Reverse Image Search","\u002Fguide\u002Fimage","1.guide\u002F5.image",{"title":28,"path":29,"stem":30},"Reveal","\u002Fguide\u002Freveal","1.guide\u002F5.reveal",{"title":32,"path":33,"stem":34},"CLI","\u002Fguide\u002Fcli","1.guide\u002F6.cli",{"title":36,"path":37,"stem":38},"Agents","\u002Fguide\u002Fagents","1.guide\u002F7.agents",{"title":40,"path":41,"stem":42},"Custom Providers","\u002Fguide\u002Fcustom","1.guide\u002F8.custom",{"title":44,"path":45,"stem":46},"Explorer","\u002Fguide\u002Fexplorer","1.guide\u002F9.explorer","i-lucide-book-open",{"title":49,"path":50,"stem":51,"children":52,"icon":107},"Providers","\u002Fproviders","2.providers\u002F0.index",[53,55,59,63,67,71,75,79,83,87,91,95,99,103],{"title":54,"path":50,"stem":51},"Overview",{"title":56,"path":57,"stem":58},"Brave","\u002Fproviders\u002Fbrave","2.providers\u002F01.brave",{"title":60,"path":61,"stem":62},"Context.dev","\u002Fproviders\u002Fcontext","2.providers\u002F02.context",{"title":64,"path":65,"stem":66},"Exa","\u002Fproviders\u002Fexa","2.providers\u002F03.exa",{"title":68,"path":69,"stem":70},"Firecrawl","\u002Fproviders\u002Ffirecrawl","2.providers\u002F04.firecrawl",{"title":72,"path":73,"stem":74},"Jina","\u002Fproviders\u002Fjina","2.providers\u002F05.jina",{"title":76,"path":77,"stem":78},"Mojeek","\u002Fproviders\u002Fmojeek","2.providers\u002F06.mojeek",{"title":80,"path":81,"stem":82},"SearXNG","\u002Fproviders\u002Fsearxng","2.providers\u002F07.searxng",{"title":84,"path":85,"stem":86},"SerpAPI","\u002Fproviders\u002Fserpapi","2.providers\u002F08.serpapi",{"title":88,"path":89,"stem":90},"SerpBase","\u002Fproviders\u002Fserpbase","2.providers\u002F09.serpbase",{"title":92,"path":93,"stem":94},"Tavily","\u002Fproviders\u002Ftavily","2.providers\u002F10.tavily",{"title":96,"path":97,"stem":98},"TinyFish","\u002Fproviders\u002Ftinyfish","2.providers\u002F11.tinyfish",{"title":100,"path":101,"stem":102},"OpenAI Codex","\u002Fproviders\u002Fopenai-codex","2.providers\u002F12.openai-codex",{"title":104,"path":105,"stem":106},"Marginalia","\u002Fproviders\u002Fmarginalia","2.providers\u002F13.marginalia","i-lucide-library",{"id":109,"title":28,"body":110,"description":609,"extension":610,"links":611,"meta":612,"navigation":174,"path":29,"seo":614,"stem":30,"__hash__":616},"docs\u002F1.guide\u002F5.reveal.md",{"type":111,"value":112,"toc":600},"minimark",[113,118,131,137,253,256,274,282,289,293,430,433,437,448,451,455,471,475,490,515,544,555,559,576,580,597],[114,115,117],"h2",{"id":116},"what-isnt-the-page-showing-you","What isn't the page showing you?",[119,120,121,122,126,127,130],"p",{},"A read gives you the text. That's its job. It's also exactly how the clue gets lost. Read ",[123,124,125],"code",{},"https:\u002F\u002Fgsmg.io\u002Ftheseedisplanted"," and you get one line, ",[123,128,129],{},"# GSMG Puzzle",". That's it.",[119,132,133,136],{},[123,134,135],{},"revealUrl"," fetches the page's own HTML and lists what a browser keeps out of sight.",[138,139,144],"pre",{"className":140,"code":141,"language":142,"meta":143,"style":143},"language-ts shiki shiki-themes web web web","import { revealUrl } from \"@agntn\u002Fweb\";\n\nconst { findings } = await revealUrl(\"https:\u002F\u002Fgsmg.io\u002Ftheseedisplanted\");\n\nfor (const finding of findings) {\n  console.log(finding.kind, finding.line, finding.value ?? finding.reason);\n}\n","ts","",[123,145,146,169,176,204,209,229,247],{"__ignoreMap":143},[147,148,151,155,159,162,166],"span",{"class":149,"line":150},"line",1,[147,152,154],{"class":153},"skH_V","import",[147,156,158],{"class":157},"s38Sx"," { revealUrl } ",[147,160,161],{"class":153},"from",[147,163,165],{"class":164},"shU9J"," \"@agntn\u002Fweb\"",[147,167,168],{"class":157},";\n",[147,170,172],{"class":149,"line":171},2,[147,173,175],{"emptyLinePlaceholder":174},true,"\n",[147,177,179,182,185,188,191,195,198,201],{"class":149,"line":178},3,[147,180,181],{"class":153},"const",[147,183,184],{"class":157}," { findings } ",[147,186,187],{"class":153},"=",[147,189,190],{"class":153}," await",[147,192,194],{"class":193},"sK71F"," revealUrl",[147,196,197],{"class":157},"(",[147,199,200],{"class":164},"\"https:\u002F\u002Fgsmg.io\u002Ftheseedisplanted\"",[147,202,203],{"class":157},");\n",[147,205,207],{"class":149,"line":206},4,[147,208,175],{"emptyLinePlaceholder":174},[147,210,212,215,218,220,223,226],{"class":149,"line":211},5,[147,213,214],{"class":153},"for",[147,216,217],{"class":157}," (",[147,219,181],{"class":153},[147,221,222],{"class":157}," finding ",[147,224,225],{"class":153},"of",[147,227,228],{"class":157}," findings) {\n",[147,230,232,235,238,241,244],{"class":149,"line":231},6,[147,233,234],{"class":157},"  console.",[147,236,237],{"class":193},"log",[147,239,240],{"class":157},"(finding.kind, finding.line, finding.value ",[147,242,243],{"class":153},"??",[147,245,246],{"class":157}," finding.reason);\n",[147,248,250],{"class":149,"line":249},7,[147,251,252],{"class":157},"}\n",[119,254,255],{},"Same page from the terminal:",[138,257,261],{"className":258,"code":259,"language":260,"meta":143,"style":143},"language-bash shiki shiki-themes web web web","web reveal https:\u002F\u002Fgsmg.io\u002Ftheseedisplanted\n","bash",[123,262,263],{"__ignoreMap":143},[147,264,265,268,271],{"class":149,"line":150},[147,266,267],{"class":193},"web",[147,269,270],{"class":164}," reveal",[147,272,273],{"class":164}," https:\u002F\u002Fgsmg.io\u002Ftheseedisplanted\n",[138,275,280],{"className":276,"code":278,"language":279,"meta":143},[277],"language-text","[reveal] https:\u002F\u002Fgsmg.io\u002Ftheseedisplanted\ntext\u002Fhtml; charset=utf-8 · 832 bytes\nFound 1 comment, 1 hidden element, 2 form fields, 4 meta tags, 1 link\n\nComments\n  line 12 in html.no-js: Nice to see you around! Good luck little bunny hunter ;)\n\nHidden elements\n  line 23 div (display: none): (no text)\n\nForm fields\n  line 23 input password (type=password, inside hidden div at line 23)\n  line 23 input (no name) (type=submit, inside hidden div at line 23)\n\nMeta tags\n  line 5 charset: utf-8\n  line 7 robots: noindex, nofollow\n  line 8 description: GSMG Puzzle\n  line 9 viewport: width=device-width, initial-scale=1\n\nLinks\n  line 6 icon https:\u002F\u002Fgsmg.io\u002Fimg\u002Ffavicon.png\n","text",[123,281,278],{"__ignoreMap":143},[119,283,284,285,288],{},"There it is. The first step of the GSMG puzzle, a comment and a password form behind ",[123,286,287],{},"display: none",". Good luck, little bunny hunter.",[114,290,292],{"id":291},"what-counts-as-hidden","What counts as hidden",[294,295,296,309],"table",{},[297,298,299],"thead",{},[300,301,302,306],"tr",{},[303,304,305],"th",{},"Kind",[303,307,308],{},"What it lists",[310,311,312,331,357,371,381,391,404,417],"tbody",{},[300,313,314,320],{},[315,316,317],"td",{},[123,318,319],{},"comment",[315,321,322,323,326,327,330],{},"HTML comments, plus ",[123,324,325],{},"\u003C?...?>"," and ",[123,328,329],{},"\u003C![CDATA[...]]>",", which browsers keep as comments too",[300,332,333,338],{},[315,334,335],{},[123,336,337],{},"hidden",[315,339,340,342,343,346,347,349,350,342,353,356],{},[123,341,287],{},", ",[123,344,345],{},"visibility: hidden",", zero opacity or font size, the ",[123,348,337],{}," attribute, a closed ",[123,351,352],{},"\u003Cdialog>",[123,354,355],{},"\u003Ctemplate>",", text pushed off screen or clipped to nothing",[300,358,359,364],{},[315,360,361],{},[123,362,363],{},"field",[315,365,366,367,370],{},"fields of ",[123,368,369],{},"type=\"hidden\"",", and every field inside a hidden element",[300,372,373,378],{},[315,374,375],{},[123,376,377],{},"camouflage",[315,379,380],{},"text in its background's color",[300,382,383,388],{},[315,384,385],{},[123,386,387],{},"invisible",[315,389,390],{},"zero width and other invisible characters, by code point",[300,392,393,398],{},[315,394,395],{},[123,396,397],{},"attribute",[315,399,400,403],{},[123,401,402],{},"data-*"," and attributes HTML doesn't define",[300,405,406,414],{},[315,407,408,342,411],{},[123,409,410],{},"meta",[123,412,413],{},"link",[315,415,416],{},"meta and link tags",[300,418,419,427],{},[315,420,421,342,424],{},[123,422,423],{},"script",[123,425,426],{},"style",[315,428,429],{},"inline code as an excerpt, linked files as URLs",[119,431,432],{},"Every finding carries its line in the source and the element around it. The table order is the answer's order, so the things nobody sees come first. Hidden text spelled in tag characters or variation selectors gets decoded. Sneaky. Not anymore.",[114,434,436],{"id":435},"wayback-captures-come-raw","Wayback captures come raw",[119,438,439,440,443,444,447],{},"Pass a ",[123,441,442],{},"web.archive.org\u002Fweb\u002F\u003Ctimestamp>\u002F\u003Curl>"," address and it reads the ",[123,445,446],{},"id_"," form instead. That's the capture as archived. No toolbar, no Wayback scripts posing as the page's own. Relative links resolve against the archived page, not the archive.",[119,449,450],{},"The Wayback Machine is slow, and sometimes it answers 503 for a minute. A 503 gets two more tries. A timeout doesn't, it already took its minute.",[114,452,454],{"id":453},"public-pages-only","Public pages only",[119,456,457,342,460,342,463,466,467,470],{},[123,458,459],{},"localhost",[123,461,462],{},"10.0.0.8",[123,464,465],{},"169.254.169.254"," and the rest of the private ranges get refused before a single request. Every redirect is checked too. So a model holding this tool can't aim it at your router or your cloud metadata. Your own code can, with ",[123,468,469],{},"allowPrivateNetwork: true",".",[114,472,474],{"id":473},"stylesheets-count-too","Stylesheets count too",[119,476,477,478,481,482,485,486,489],{},"A ",[123,479,480],{},".secret { display: none }"," rarely sits in the page. It lives in ",[123,483,484],{},"site.css",". So the reveal reads the linked sheets too. Plus whatever they ",[123,487,488],{},"@import",", cascaded the way a browser does it. Ten at most. Each one passes the same address check and byte limit as the page, and all of them get 30 seconds together. A sheet that 404s or comes back as HTML doesn't count, same as in a browser. A Wayback capture gets its sheets from the same capture, not from today's site.",[119,491,492,493,342,496,326,499,502,503,506,507,510,511,514],{},"Cascade layers count as well. Tailwind v4 tucks nearly all its CSS into ",[123,494,495],{},"@layer",[123,497,498],{},".hidden",[123,500,501],{},".sr-only"," included. Skip those blocks and the reveal goes as blind as the reader. So layer blocks, ",[123,504,505],{},"@layer a, b;"," statements and ",[123,508,509],{},"layer()"," imports rank the way a browser ranks them. Nested layers too, and ",[123,512,513],{},"!important"," still turns the order around.",[119,516,517,518,521,522,342,525,342,528,531,532,535,536,539,540,543],{},"And ",[123,519,520],{},"@media","? A block every screen matches counts like the rules around it: ",[123,523,524],{},"screen",[123,526,527],{},"all",[123,529,530],{},"not print",", or no query at all. ",[123,533,534],{},"print"," stays out, and so does anything about width. So Bootstrap's ",[123,537,538],{},".d-md-none"," stays a mystery. It lives in ",[123,541,542],{},"(min-width: 768px)",", and the reveal has no window to measure.",[119,545,546,547,550,551,554],{},"Which ones made it? ",[123,548,549],{},"stylesheets"," in the result lists them, and ",[123,552,553],{},"web_reveal"," says how many it applied.",[114,556,558],{"id":557},"what-it-cant-see","What it can't see",[119,560,561,562,565,566,568,569,470],{},"Nothing runs. No JavaScript. Selectors stay simple: a tag, an id, some classes. ",[123,563,564],{},"nav a:hover"," gets skipped, and so does any ",[123,567,520],{}," waiting for a window size, a printer or a reader's setting. Colors count only when the page or its sheets declare them. A page that builds itself in the browser needs a browser, and that's ",[570,571,575],"a",{"href":572,"rel":573},"https:\u002F\u002Fbrowsers.agntn.dev",[574],"nofollow","@agntn\u002Fbrowsers",[114,577,579],{"id":578},"for-agents","For agents",[119,581,582,584,585,588,589,592,593,596],{},[123,583,553],{}," takes a ",[123,586,587],{},"url",", plus ",[123,590,591],{},"maxChars"," (20 000 by default) and ",[123,594,595],{},"timeoutSeconds",". When the findings don't fit, the answer says what it left out by kind. Then the model knows to ask for more, right?",[426,598,599],{},"html pre.shiki code .skH_V, html code.shiki .skH_V{--shiki-light:var(--shiki-token-keyword);--shiki-default:var(--shiki-token-keyword);--shiki-dark:var(--shiki-token-keyword)}html pre.shiki code .s38Sx, html code.shiki .s38Sx{--shiki-light:var(--ui-text-highlighted);--shiki-default:var(--ui-text-highlighted);--shiki-dark:var(--ui-text-highlighted)}html pre.shiki code .shU9J, html code.shiki .shU9J{--shiki-light:var(--shiki-token-string);--shiki-default:var(--shiki-token-string);--shiki-dark:var(--shiki-token-string)}html pre.shiki code .sK71F, html code.shiki .sK71F{--shiki-light:var(--shiki-token-function);--shiki-default:var(--shiki-token-function);--shiki-dark:var(--shiki-token-function)}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":143,"searchDepth":171,"depth":171,"links":601},[602,603,604,605,606,607,608],{"id":116,"depth":171,"text":117},{"id":291,"depth":171,"text":292},{"id":435,"depth":171,"text":436},{"id":453,"depth":171,"text":454},{"id":473,"depth":171,"text":474},{"id":557,"depth":171,"text":558},{"id":578,"depth":171,"text":579},"The parts of a page its reader never sees. Comments, hidden form fields, invisible characters and white text on white, each with its line.","md",null,{"icon":613},"i-lucide-eye",{"title":615,"description":609},"Reveal hidden content on a web page","BQBSt1UZSE-Flir2Sx3IUj8RKhsG3K5GkIfMaiDxKjI",[618,620],{"title":24,"path":25,"stem":26,"description":619,"children":-1},"A public image URL in, the pages that contain or resemble it out, through SerpAPI Google Lens.",{"title":32,"path":33,"stem":34,"description":621,"children":-1},"The web command, its subcommands, the flags, and the JSON envelopes that match the library.",1792091261655]