PageSourceSearch

https://e2llm.com/start/

html e2llm.com collected 2026-10-01 15:40:01 UTC 21,941 bytes, 390 lines download raw bytes

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 &amp; 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.