1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="utf-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1"> 6<title>Connect your AI - E2LLM setup</title> 7<meta name="robots" content="index,follow"> 8<link rel="canonical" href="https://e2llm.com/start/"> 9<meta property="og:type" content="website"> 10<meta property="og:title" content="Connect your AI - E2LLM setup"> 11<meta property="og:url" content="https://e2llm.com/start/"> 12<meta property="og:image" content="https://e2llm.com/brand/e2llm-og-1200x630.png"> 13<meta property="og:description" content="Pick your browser and your AI. We show only the steps you need and verify it on a real page."> 14<meta name="twitter:card" content="summary"> 15<meta name="twitter:title" content="Connect your AI - E2LLM setup"> 16<meta name="twitter:image" content="https://e2llm.com/brand/e2llm-256-solid.png"> 17<meta name="twitter:description" content="Pick your browser and your AI. We show only the steps you need and verify it on a real page."> 18<meta name="description" content="Pick your browser and your AI. We show only the steps you need and verify it on a real page."> 19<link rel="icon" type="image/png" sizes="48x48" href="/brand/e2llm-48-solid.png"> 20<style> 21 :root{ 22 color-scheme:dark; 23 --bg:#020617;--panel:#0e1730;--panel2:#0a1124;--ink:#eef2f8;--mut:#96a5bb; 24 --dim:#68758c;--line:#1c2942;--acc:#a78bfa;--acc-dim:#1c1938;--warn:#f5b544;--bad:#ef6a6a; 25 --mono:"SFMono-Regular",ui-monospace,"JetBrains Mono",Menlo,Consolas,monospace; 26 --sans:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif; 27 } 28 *{box-sizing:border-box} 29 body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans); 30 line-height:1.6;font-size:16px;letter-spacing:-0.01em; 31 background-image:radial-gradient(70rem 44rem at 50% -8%, #12203a 0%, transparent 58%);} 32 .wrap{max-width:760px;margin:0 auto;padding:0 22px} 33 a{color:var(--acc);text-decoration:none} 34 .mono{font-family:var(--mono);letter-spacing:0} 35 36 header{border-bottom:1px solid var(--line);position:sticky;top:0;background:#020617cc; 37 backdrop-filter:blur(10px);z-index:10} 38 nav{display:flex;align-items:center;height:58px;gap:16px} 39 .logo{display:flex;align-items:center;font-weight:800;font-size:19px;letter-spacing:-0.04em;color:var(--ink)} 40 .logo b{color:var(--acc);font-weight:800} 41 nav .sp{flex:1} 42 .prog{font-family:var(--mono);font-size:12.5px;color:var(--dim)} 43 44 h1{font-size:clamp(26px,4.4vw,38px);line-height:1.08;margin:34px 0 10px;font-weight:700;letter-spacing:-0.02em;text-wrap:balance} 45 .lead{color:var(--mut);font-size:17px;margin:0 0 8px;max-width:56ch} 46 .boundary-note{font-family:var(--mono);font-size:12.5px;color:var(--dim); 47 border:1px solid var(--line);border-radius:8px;padding:10px 13px;margin:20px 0 4px;background:var(--panel2)} 48 49 .screen{padding:8px 0 60px} 50 .hide{display:none} 51 52 .kick{font-family:var(--mono);font-size:12.5px;color:var(--dim);letter-spacing:.03em;margin:30px 0 14px;text-transform:uppercase} 53 .cards{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px} 54 @media(max-width:640px){.cards{grid-template-columns:1fr}} 55 .card{text-align:left;background:var(--panel);border:1px solid var(--line);border-radius:12px; 56 padding:18px;cursor:pointer;color:var(--ink);font:inherit;transition:.14s} 57 .card:hover{border-color:#3a3170;background:#171436;transform:translateY(-1px)} 58 .card .nm{font-family:var(--mono);font-weight:600;font-size:15px;margin-bottom:5px} 59 .card .ex{color:var(--mut);font-size:13px;line-height:1.5} 60 .card .tag{display:inline-block;font-family:var(--mono);font-size:10.5px;margin-top:10px; 61 padding:2px 7px;border-radius:5px;border:1px solid var(--line);color:var(--dim)} 62 .card .tag.ok{color:var(--acc);border-color:#3b3170;background:var(--acc-dim)} 63 .card .tag.warn{color:var(--warn);border-color:#43391c;background:#171204} 64 65 .backrow{display:flex;align-items:center;gap:14px;margin:26px 0 4px} 66 .back{font-family:var(--mono);font-size:13px;color:var(--mut);cursor:pointer;background:none;border:0} 67 .back:hover{color:var(--ink)} 68 .chosen{font-family:var(--mono);font-size:12.5px;color:var(--dim)} 69 .chosen b{color:var(--acc)} 70 71 ol.steps{list-style:none;counter-reset:st;margin:22px 0 0;padding:0} 72 ol.steps>li{counter-increment:st;position:relative;
72padding:0 0 26px 46px;margin:0} 73 ol.steps>li::before{content:counter(st);position:absolute;left:0;top:-2px;width:30px;height:30px; 74 border:1px solid #362d63;border-radius:50%;color:var(--acc);font-family:var(--mono);font-size:14px; 75 display:flex;align-items:center;justify-content:center;background:var(--acc-dim)} 76 ol.steps>li::after{content:"";position:absolute;left:15px;top:32px;bottom:6px;width:1px;background:var(--line)} 77 ol.steps>li:last-child::after{display:none} 78 li h3{margin:2px 0 6px;font-size:16.5px;font-weight:650;letter-spacing:-0.01em} 79 li p{margin:0 0 8px;color:var(--mut);font-size:14.5px} 80 li .why{color:var(--dim);font-size:13px;font-family:var(--mono);line-height:1.55} 81 li a.go{font-family:var(--mono);font-size:13px} 82 83 .field{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line); 84 border-radius:8px;padding:8px 10px;margin:7px 0;font-family:var(--mono);font-size:13px} 85 .field .lbl{color:var(--dim);min-width:74px} 86 .field .val{color:var(--ink);flex:1;overflow-x:auto;white-space:nowrap} 87 .copy{border:1px solid var(--line);background:none;color:var(--mut);font-family:var(--mono); 88 font-size:11px;padding:4px 9px;border-radius:6px;cursor:pointer} 89 .copy:hover{border-color:var(--acc);color:var(--acc)} 90 .copy.done{color:var(--acc);border-color:#3b3170} 91 92 .warnbox{border:1px solid #43391c;background:#171204;border-radius:8px;padding:10px 13px; 93 margin:8px 0;font-size:13px;color:#e7cf95} 94 .warnbox b{color:var(--warn)} 95 .okbox{border:1px solid #3b3170;background:var(--acc-dim);border-radius:8px;padding:12px 14px; 96 margin:10px 0;font-size:14px;color:#d6cdf3} 97 .okbox b{color:var(--acc)} 98 99 .test{background:var(--panel);border:1px solid #362d63;border-radius:10px;padding:16px 18px;margin-top:6px} 100 .test .q{font-family:var(--mono);font-size:14px;color:var(--ink);background:var(--panel2); 101 border:1px solid var(--line);border-radius:7px;padding:9px 11px;margin:8px 0} 102 103 details.tr{border-top:1px solid var(--line);margin-top:8px;padding-top:10px} 104 details.tr summary{cursor:pointer;font-family:var(--mono);font-size:13px;color:var(--mut);list-style:none} 105 details.tr summary::-webkit-details-marker{display:none} 106 details.tr summary::before{content:"⥠";color:var(--dim)} 107 details.tr[open] summary{color:var(--ink)} 108 details.tr ul{margin:10px 0 4px;padding-left:18px;color:var(--mut);font-size:13.5px} 109 details.tr li{margin:4px 0} 110 111 footer{border-top:1px solid var(--line);padding:30px 0;color:var(--dim);font-family:var(--mono);font-size:12.5px} 112</style> 113</head> 114<body> 115 116<header><div class="wrap"><nav> 117 <a class="logo" href="/">e<b>2</b>llm</a> 118 <span class="sp"></span> 119 <span class="prog" id="prog">Step 1 of 3 - your browser</span> 120</nav></div></header> 121 122<div class="wrap"> 123 124 <div class="screen" id="s-intro"> 125 <h1>Connect your AI to the browser you already use.</h1> 126 <p class="lead">Pick your browser, then your AI. We show only the steps you need - and we don't call it done until your AI has actually read a page for you.</p> 127 <p class="boundary-note">E2LLM is the browser connection layer, not another agent. Your AI decides what to do; E2LLM gives it structured page context and explicit browser actions.</p> 128 129 <div class="kick">1 - which browser holds the pages you work in?</div> 130 <div class="cards" id="browserCards"></div> 131 <p class="boundary-note">Any Chromium browser (Brave, Vivaldi, others) works through the Chrome-store extension too. <b>Safari isn't supported.</b> Pick the browser where you're <b>already signed in</b> to the sites you want your AI to work in - that signed-in session is the whole point. E2LLM works inside it and never asks for your passwords.</p> 132 </div> 133 134 <div class="screen hide" id="s-client"> 135 <div class="backrow"> 136 <button class="back" onclick="toIntro()">â browser</button> 137 <span class="chosen">browser: <b id="c-br">-</b></span> 138 </div> 139 <h1>Which AI do you use?</h1> 140 <p class="lead">This is the only part that differs per AI. Everything else is the same three steps.</p> 141 <div class="kick">2 - pick your AI client</div> 142 <div class="cards" id="clientCards"></div> 143 </div> 144 145 <div class="screen hide" id="s-steps"> 146 <div class="backrow"> 147 <button class="back" onclick="toClient()">â AI</button>
148 <span class="chosen"><b id="c-br2">-</b> + <b id="c-cl">-</b></span> 149 </div> 150 <h1 id="stepsTitle">Set it up.</h1> 151 <p class="lead" id="stepsLead"></p> 152 <ol class="steps" id="stepList"></ol> 153 </div> 154 155</div> 156 157<footer><div class="wrap"> 158 E2LLM · <a href="/">home</a> · <a href="https://github.com/e2llm/e2llm-sifr">SiFR spec</a> · read-only first test, always. 159</div></footer> 160
161<script> 162const MCP_URL = "https://mcp.e2llm.com/mcp"; 163 164const CHROME_STORE="https://chromewebstore.google.com/detail/element-to-llm-mcp/ddjlkdonfmjfblighhpppkcnkiaplhfd"; 165const EDGE_STORE="https://microsoftedge.microsoft.com/addons/detail/element-to-llm-mcp/mdfckibopioeogdbmnnalocaoabojjko"; 166const BROWSERS = { 167 chrome:{label:"Chrome", ex:"The one you're signed into your sites with.", store:CHROME_STORE, storeLabel:"Add to Chrome", 168 pin:'Click the puzzle piece ð§© in the toolbar, then the pin ð next to E2LLM.', 169 caveat:null}, 170 edge:{label:"Edge", ex:"Available from Microsoft Edge Add-ons.", store:EDGE_STORE, storeLabel:"Add to Edge", 171 pin:'Click the puzzle piece in the toolbar, then the eye/pin next to E2LLM.', 172 caveat:'If a background tab goes unresponsive later, exclude that site from Sleeping Tabs or keep it active.'}, 173 firefox:{label:"Firefox", ex:"Own add-on. Full read + act support.", store:"https://addons.mozilla.org/en-US/firefox/addon/element-to-llm-mcp/", storeLabel:"Add to Firefox", 174 pin:'Right-click the E2LLM icon â Pin to Toolbar so it stays awake.', 175 caveat:null}, 176 arc:{label:"Arc", ex:"Chromium. Uses the Chrome-store extension.", store:CHROME_STORE, storeLabel:"Add to Arc (from Chrome store)", 177 pin:'Open the extensions menu in the toolbar and pin E2LLM so Arc keeps it awake.', 178 caveat:'Arc tucks extensions away - reach E2LLM from the extensions button in the toolbar.'}, 179 comet:{label:"Comet", ex:"Chromium. Uses the Chrome-store extension.", store:CHROME_STORE, storeLabel:"Add to Comet (from Chrome store)", 180 pin:'Click the puzzle piece in the toolbar, then pin E2LLM.', 181 caveat:null} 182}; 183 184// kind: 'connector' (UI OAuth) or 'cli' (terminal). verified: exact steps confirmed. 185const CLIENTS = { 186 chatgpt:{label:"ChatGPT", sub:"web connector", kind:"connector", verified:true, 187 prereq:"Custom connectors need a paid plan (Plus / Pro / Business).", 188 devmode:true, 189 connectorUrl:"https://chatgpt.com/plugins#settings/Connectors?create-connector=true", 190 enableInChat:"In a new conversation open the + / tools menu and switch E2LLM on for that chat. Connecting it once is not the same as turning it on in the chat.", 191 risk:true}, 192 claude:{label:"Claude", sub:"connector directory", kind:"connector", verified:"tested", 193 directory:"https://claude.ai/directory", 194 prereq:"On Team / Enterprise, only a workspace owner can add a connector.", 195 devmode:false, 196 connectorUrl:"https://claude.ai/settings/connectors", 197 enableInChat:"Open a new chat and make sure e2llm shows in the tools/connectors list for that conversation.", 198 risk:false}, 199 grok:{label:"Grok", sub:"connector", kind:"connector", verified:"tested", 200 prereq:"Needs a paid Grok account (any tier).", devmode:false, 201 connectorUrl:"https://grok.com/connectors", 202 enableInChat:"On the connectors page: New Connector â Custom. Then enable E2LLM in your conversation.", 203 risk:false}, 204 perplexity:{label:"Perplexity", sub:"connector", kind:"connector", verified:"tested", 205 prereq:"The add panel may show no tools before you connect - that's expected. Connect first, verify at runtime.", 206 devmode:false, 207 connectorUrl:"https://www.perplexity.ai/settings/connectors", 208 enableInChat:"Start a new thread with E2LLM enabled, then run the test below.", 209 risk:false}, 210 mistral:{label:"Mistral", sub:"Le Chat connector", kind:"connector", verified:"tested", 211 prereq:null, devmode:false, 212 connectorUrl:"https://chat.mistral.ai/", 213 enableInChat:"Enable E2LLM for the conversation, then run the test below.", 214 risk:false}, 215 claudecode:{label:"Claude Code", sub:"command line", kind:"cli", verified:"tested", 216 cmd:`claude mcp add --transport http e2llm ${MCP_URL}`, 217 verifyCmd:"claude mcp list", 218 note:"On first use it opens the E2LLM OAuth page in your browser - approve with the same account as the extension."}, 219 codex:{label:"Codex", sub:"command line", kind:"cli", verified:"tested", 220 cmd:`codex mcp add e2llm --url ${MCP_URL}`, 221 verifyCmd:"codex mcp list", 222 note:"Completes OAuth in the browser on first call. Don't confuse this with ChatGPT web - different setup."}, 223 kimi:{label:"Kimi", sub:"harness", kind:"cli", verified:"tested", 224 endpoint:true, 225 note:"Add E2LLM as an HTTP MCP server (OAuth) in Kimi's MCP config, then start a session. Kimi's own docs show the exact config location for your version."}, 226 copilot:{label:"Copilot", sub:"harness", kind:"cli", verified:"tested", 227 endpoint:true, 228 note:"Add E2LLM as an HTTP MCP server (OAuth) in Copilot's MCP settings."}, 229 other:{label:"Other MCP client", sub:"manual", kind:"other", verified:false, 230 note:"Any MCP-compatible client works: point it at the endpoint below over HTTP with OAuth. This exact client hasn't been individually tested."} 231}; 232 233let state={browser:null, client:null}; 234 235function pickBrowser(b){ 236 state.browser=b; 237 document.getElementById('c-br').textContent=BROWSERS[b].label; 238 renderClientCards(); 239 show('s-client'); prog('Step 2 of 3 - your AI'); 240} 241function pickClient(c){ 242 state.client=c; 243 renderSteps(); 244 show('s-steps'); prog('Step 3 of 3 - setup'); 245} 246function toIntro(){show('s-intro');prog('Step 1 of 3 - your browser')} 247function toClient(){show('s-client');prog('Step 2 of 3 - your AI')} 248 249function tagFor(v){ 250 if(v===true||v==='tested') return '<span class="tag ok">Tested</span>'; 251 if(v==='unstable') return '<span class="tag warn">Tested · unstable</span>'; 252 if(v==='confirm') return '<span class="tag">Compatible</span>'; 253 return '<span class="tag">Manual</span>'; 254} 255function renderBrowserCards(){ 256 const wrap=document.getElementById('browserCards'); 257 wrap.innerHTML='';
258 for(const [k,b] of Object.entries(BROWSERS)){ 259 wrap.insertAdjacentHTML('beforeend', 260 `<button class="card" onclick="pickBrowser('${k}')"> 261 <div class="nm">${b.label}</div><div class="ex">${b.ex}</div> 262 <span class="tag ok">Tested</span></button>`); 263 } 264} 265function renderClientCards(){ 266 const wrap=document.getElementById('clientCards'); 267 wrap.innerHTML=''; 268 for(const [k,c] of Object.entries(CLIENTS)){ 269 wrap.insertAdjacentHTML('beforeend', 270 `<button class="card" onclick="pickClient('${k}')"> 271 <div class="nm">${c.label}</div><div class="ex">${c.sub}</div>${tagFor(c.verified)}</button>`); 272 } 273} 274 275function fld(label,val){ 276 return `<div class="field"><span class="lbl">${label}</span><span class="val">${val}</span> 277 <button class="copy" onclick="cp(this,'${val.replace(/'/g,"\\'")}')">copy</button></div>`; 278} 279 280function renderSteps(){ 281 const b=BROWSERS[state.browser], c=CLIENTS[state.client]; 282 document.getElementById('c-br2').textContent=b.label; 283 document.getElementById('c-cl').textContent=c.label; 284 document.getElementById('stepsTitle').textContent=`${b.label} + ${c.label} - you're 4 steps out.`; 285 document.getElementById('stepsLead').textContent="Do these in order. The last one is the only proof that counts."; 286 287 let s=[]; 288 289 // 1 install 290 s.push(`<h3>Install the E2LLM extension</h3> 291 <p>Get the <b>MCP</b> extension - not the plain capture add-on. They look alike; only this one connects your AI.</p> 292 <p><a class="go" href="${b.store}" target="_blank" rel="noopener">${b.storeLabel} â</a></p> 293 <p class="why">Return to this page after it's installed.</p> 294 ${b.caveat?`<div class="warnbox">${b.caveat}</div>`:''}`); 295 296 // 2 pin + sign in 297 s.push(`<h3>Pin it, then sign in</h3> 298 <p>${b.pin}</p> 299 <p>Then click the E2LLM icon and sign in (free account).</p> 300 <div class="warnbox"><b>Don't skip the pin.</b> Unpinned, the browser puts the extension to sleep and it silently stops responding - the #1 reason "it just stopped working".</div>`); 301 302 // 3 client-specific 303 if(c.kind==='connector'){ 304 let inner=`<h3>Connect it to ${c.label}</h3>`; 305 if(c.prereq) inner+=`<div class="warnbox">${c.prereq}</div>`; 306 if(c.devmode){ 307 inner+=`<p><b>First turn on Developer Mode</b> - this is what unlocks custom connectors:</p> 308 <p class="why">${c.label} â Settings â Apps & Connectors â Advanced â <b>Developer mode = ON</b>.<br> 309 (On some accounts: Settings â Connectors â Advanced settings. If you don't see "Developer mode", that's where it lives.)</p>`; 310 } 311 if(c.directory){ 312 inner+=`<div class="okbox"><b>e2llm is listed in the Anthropic Claude connector directory.</b> That's the short path, no custom setup.</div> 313 <p><a class="go" href="${c.directory}" target="_blank" rel="noopener">Open the Claude connector directory â</a></p> 314 <p class="why">Search for <b>e2llm</b>, click Add, and sign in with the same account as the extension.</p> 315 <details class="tr"><summary>No directory access on your plan? Add it manually</summary> 316 <div style="margin-top:10px">${fld('Name','e2llm')}${fld('Server URL',MCP_URL)}${fld('Auth','OAuth')}</div> 317 </details>`; 318 } else { 319 inner+=`<p>Then open the connector screen and add e2llm:</p> 320 <p><a class="go" href="${c.connectorUrl}" target="_blank" rel="noopener">Open ${c.label} connectors â</a></p> 321 ${fld('Name','e2llm')} 322 ${fld('Server URL',MCP_URL)} 323 ${fld('Auth','OAuth')}`; 324 } 325 if(c.risk) inner+=`<div class="warnbox">${c.label} shows an <b>âelevated riskâ</b> notice - that's the standard warning for any connector that can act. Read it, then approve to continue.</div>`; 326 inner+=`<p class="why">On the sign-in screen, use the <b>same account as the extension</b> - the extension and the connector must be one E2LLM account.</p>`; 327 s.push(inner); 328 329 s.push(`<h3>Switch it on <em>in the chat</em></h3> 330 <p>${c.enableInChat}</p> 331 <p class="why">Added â enabled. This is the step people miss right before they say
331it "doesn't work".</p>`); 332 } else if(c.kind==='cli'){ 333 let inner=`<h3>Add E2LLM to ${c.label}</h3>`; 334 if(c.cmd){ 335 inner+=`<p>Run this once:</p>${fld('run',c.cmd)} 336 <p class="why">${c.note}</p> 337 <p>Then check it's registered:</p>${fld('verify',c.verifyCmd)} 338 <div class="warnbox">Command shape is current as of setup; if your version differs, <b>${c.label.toLowerCase()} mcp --help</b> shows the exact flags.</div>`; 339 } else { // endpoint-config harness (Kimi, Copilot) 340 inner+=`<p>${c.note}</p> 341 ${fld('Endpoint',MCP_URL)}${fld('Transport','HTTP')}${fld('Auth','OAuth')} 342 <p class="why">Use the same E2LLM account as the extension when OAuth opens.</p>`; 343 } 344 if(c.unstable) inner+=`<div class="warnbox"><b>Heads up:</b> ${c.unstable}</div>`; 345 s.push(inner); 346 } else { // other 347 s.push(`<h3>Point your MCP client at E2LLM</h3> 348 ${fld('Endpoint',MCP_URL)} 349 ${fld('Transport','HTTP')} 350 ${fld('Auth','OAuth')} 351 <div class="warnbox">MCP-compatible, but this exact client hasn't been individually tested by us. If a tool call fails, check OAuth completed and the client lists the E2LLM tools.</div>`); 352 } 353 354 // final: test (read-only) 355 s.push(`<h3>Prove it on a real page</h3> 356 <div class="test"> 357 <p>Open any harmless page in <b>${b.label}</b>, keep that tab active, then ask ${c.label}:</p> 358 <div class="q">List my open tabs - read only, don't click or navigate.</div> 359 <p>See your <b>real</b> tabs come back? Your AI can now see your browser. Next:</p> 360 <div class="q">What's on this tab?</div> 361 <div class="okbox"><b>That's it.</b> The connection works on any page you're signed into - your accounts, your dashboards, your internal tools.</div> 362 </div> 363 <details class="tr"><summary>Not working?</summary> 364 <ul> 365 <li><b>Extension not pinned</b> - pin it (step 2), the sleep is the usual culprit.</li> 366 <li><b>Not signed in</b>, or signed into a <b>different account</b> than the connector.</li> 367 ${c.kind==='connector'?'<li><b>Connector not enabled in this chat</b> - added â on. Toggle it in the conversation.</li>':''} 368 ${c.devmode?'<li><b>Developer mode off</b> - no custom connector appears without it.</li>':''} 369 <li>AI answered but used its <b>own</b> browser/search - repeat with "use E2LLM to read the current tab".</li> 370 <li>Reads the <b>wrong tab</b> - ask it to list tabs, then make the right one active and retry.</li> 371 </ul> 372 </details>`); 373 374 document.getElementById('stepList').innerHTML = s.map(x=>`<li>${x}</li>`).join(''); 375} 376 377function cp(btn,val){ 378 navigator.clipboard.writeText(val).then(()=>{ 379 btn.textContent='copied'; btn.classList.add('done'); 380 setTimeout(()=>{btn.textContent='copy';btn.classList.remove('done')},1400); 381 }); 382} 383function show(id){for(const s of document.querySelectorAll('.screen'))s.classList.add('hide'); 384 document.getElementById(id).classList.remove('hide');window.scrollTo(0,0);} 385function prog(t){document.getElementById('prog').textContent=t;} 386 387renderBrowserCards(); 388</script>
388 389</body> 390</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.