← Commit history

Rewrite the RENDERED readme.html to the developer/Google outline (+ permission table); trim README.md duplication

John Lauer ·afcd52b63d · ·parent b326397
2 files changed +117−190
README.md+3−41
@@ -8,47 +8,9 @@ you**, in the browser you already work in. Cloud containers, Hydrogen Desktop, and the AD CLI reach it through the exact same `relay → adom-desktop → bridge` path they already use for pup. -## Who we are, and why this extension needs broad browser capabilities--**Adom Industries is an AI electronics-prototyping company.** We build a full, AI-native development-environment for the entire electronics industry — and we let developers everywhere build *on top of us*.-Our ecosystem and our users are continuously writing and running code: **web-based oscilloscopes,-web-based electronic design automation (EDA) and CAD software, and applications that drive and control-real circuit boards** — all in the browser, all day, every day.--Because Adom is a complete **"vibe coding"** development environment — where an AI assistant and the-developer build software together in real time — the Extension is designed to **operate the browser the-same way a human developer does**: open and navigate pages, read and screenshot what's on screen, fill-forms, click controls, inspect the DOM, run and debug JavaScript, and manage tabs, windows, downloads,-and the developer's own signed-in sessions. It is the **same category of capability that AI coding-assistants such as the Claude browser extension use to drive a browser for the user** — the AI agent's-hands inside the developer's own browser. The powerful permissions exist to deliver that on your command.--## What it does for you--Three real apps from the Adom ecosystem — and how the Extension helps you get the work done.--### Driving a web-based oscilloscope-![A web-based oscilloscope — live waveform with channel, timebase, and trigger controls](/blob/app/adom-browser-extension/screenshots/usecase-oscilloscope.png)-You're bringing up a browser-based scope and need to confirm the trigger and timebase behave against real-signals. Instead of clicking through every iteration by hand, your AI assistant drives the live app in-your own browser — sets the timebase, drags the trigger to CH1-rising, reads the measurements back, and-screenshots the result. You stay in flow while it verifies the instrument and flags a regression the-moment one appears.--### Building in a web-based EDA / CAD tool-![A browser EDA tool showing a CAN-bus schematic alongside 3D / PCB / Schematic tabs](/blob/app/adom-browser-extension/screenshots/usecase-eda.png)-Mid-design, you want to try a change and see it routed. Your AI opens the EDA tool in the browser you're-already signed into, fills the schematic, re-runs the autorouter, and inspects the nets — turning "try-this and tell me what breaks" into something it just does, in the same session where your part libraries-and logins already live.--### Controlling real circuit boards-![A 3D PCB rendered in a browser CAD viewer](/blob/app/adom-browser-extension/screenshots/usecase-board.png)-When a board-control app talks to real hardware, the AI needs your *actual* browser — your device session,-your USB permissions, your dashboard login. The Extension gives it exactly that: it drives the live page,-flashes and operates the board, and reports back — so hardware-in-the-loop testing runs hands-free instead-of you babysitting every flash.+> The showcase above (oscilloscope · EDA/CAD · board control, each shown running in a Chrome window the+> extension drives) covers the use cases and the per-permission justification. The rest of this README is+> the technical reference: what's new, the architecture, the verb surface, the sub-skills, and install.  ## What's new 
readme.html+114−149
@@ -27,184 +27,152 @@   .wrap{max-width:1020px;margin:0 auto;padding:30px 22px 14px}   h1,h2,h3{font-family:'Familjen Grotesk',system-ui,Arial,sans-serif;letter-spacing:-.02em;line-height:1.08}   a{color:var(--teal-bright);text-decoration:none}-  .lede{font-size:clamp(22px,3.4vw,34px);font-weight:700;margin:0 0 10px;+  .lede{font-size:clamp(26px,4vw,42px);font-weight:700;margin:0 0 12px;     background:linear-gradient(100deg,#00e6dc,#39b8ff 58%,#8c6bf7);     -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}-  .sub{color:var(--muted);font-size:16px;max-width:680px;margin:0 0 26px}+  .sub{color:var(--muted);font-size:16px;max-width:740px;margin:0 0 26px}   .sub b{color:var(--text);font-weight:700} -  /* video */-  .video-card{position:relative;border:1px solid var(--border);border-radius:14px;overflow:hidden;-    background:#000;box-shadow:0 24px 70px rgba(0,0,0,.55),0 0 120px rgba(0,184,177,.06)}-  .video-card video{display:block;width:100%;height:auto}-  .cap{color:var(--muted);font-size:13.5px;margin:10px 2px 0}-  .cap b{color:var(--text)}--  .rail{display:flex;align-items:center;gap:10px;margin:40px 0 18px}-  .rail h2{font-size:24px;margin:0}+  .rail{display:flex;align-items:center;gap:10px;margin:44px 0 16px}+  .rail h2{font-size:25px;margin:0}   .rail .ln{flex:1;height:1px;background:linear-gradient(90deg,var(--border),transparent)}   .pill{display:inline-block;font-family:'Familjen Grotesk',sans-serif;font-size:11px;font-weight:600;     letter-spacing:.06em;text-transform:uppercase;color:var(--teal-bright);     border:1px solid rgba(0,184,177,.35);background:rgba(0,184,177,.07);border-radius:999px;padding:3px 11px} -  .grid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}-  @media(max-width:720px){.grid{grid-template-columns:1fr}}-  .card{border:1px solid var(--border);border-radius:13px;overflow:hidden;background:var(--panel);-    display:flex;flex-direction:column}-  .card.full{grid-column:1/-1}-  .shot{display:block;width:100%;height:auto;border-bottom:1px solid var(--border);background:#0d1117}-  .body{padding:15px 16px 17px}-  .tag{font-family:'Familjen Grotesk',sans-serif;font-size:11px;font-weight:600;letter-spacing:.05em;-    text-transform:uppercase;color:var(--muted);margin:0 0 6px}-  .tag.ok{color:var(--green)} .tag.feat{color:var(--blue)}-  .card h3{font-size:18px;margin:0 0 7px}-  .card p{margin:0;color:var(--muted);font-size:14px}-  .card p b,.body b{color:var(--text);font-weight:700}-  .vault{display:inline-block;font-size:11.5px;color:var(--teal);border:1px dashed rgba(0,184,177,.4);-    border-radius:7px;padding:2px 8px;margin-top:10px;font-family:'Satoshi',monospace}--  /* captcha highlight */-  .captcha{border:1px solid rgba(0,184,177,.28);border-radius:14px;overflow:hidden;-    background:linear-gradient(180deg,rgba(0,184,177,.06),transparent 60%)}-  .captcha .inner{display:grid;grid-template-columns:1.05fr .95fr;gap:0}-  @media(max-width:720px){.captcha .inner{grid-template-columns:1fr}}-  .captcha img{display:block;width:100%;height:auto;border-right:1px solid var(--border)}-  .captcha .copy{padding:22px 22px}-  .captcha h3{font-size:21px;margin:0 0 9px}-  .captcha p{color:var(--muted);font-size:14px;margin:0 0 12px}-  .chk{display:flex;gap:9px;align-items:flex-start;font-size:13.5px;margin:8px 0;color:var(--text)}+  /* use-case cards — full-width Chrome-framed shot + value paragraph */+  .ucs{display:flex;flex-direction:column;gap:22px}+  .uc{border:1px solid var(--border);border-radius:14px;overflow:hidden;background:var(--panel);+    box-shadow:0 18px 50px rgba(0,0,0,.45)}+  .uc .shot{display:block;width:100%;height:auto;background:#eceef1;border-bottom:1px solid var(--border)}+  .uc .body{padding:18px 22px 20px}+  .uc .tag{font-family:'Familjen Grotesk',sans-serif;font-size:11px;font-weight:600;letter-spacing:.06em;+    text-transform:uppercase;color:var(--blue);margin:0 0 7px}+  .uc h3{font-size:20px;margin:0 0 8px}+  .uc p{margin:0;color:var(--muted);font-size:15px}+  .uc p b{color:var(--text);font-weight:700}++  /* permission table */+  .perm{width:100%;border-collapse:collapse;border:1px solid var(--border);border-radius:12px;overflow:hidden;font-size:14px}+  .perm th{background:var(--panel2);color:var(--text);text-align:left;font-family:'Familjen Grotesk',sans-serif;+    font-weight:600;font-size:13px;padding:11px 14px;border-bottom:1px solid var(--border)}+  .perm td{padding:11px 14px;border-bottom:1px solid var(--border);color:var(--muted);vertical-align:top}+  .perm tr:last-child td{border-bottom:none}+  .perm code{color:var(--teal-bright);font-family:'Satoshi',ui-monospace,monospace;font-size:13px;white-space:nowrap}+  .perm td b{color:var(--text)}+  .note{color:var(--muted);font-size:13.5px;margin:14px 2px 0}+  .note b{color:var(--text)}++  .chk{display:flex;gap:10px;align-items:flex-start;font-size:14.5px;margin:11px 0;color:var(--text);max-width:820px}   .chk .b{color:var(--green);font-weight:800;flex:0 0 auto}-  .foot{color:var(--muted);font-size:12.5px;margin:30px 2px 4px;text-align:center}-  .foot b{color:var(--text)}+  .chk span b{color:var(--text)}+  .chk .m{color:var(--muted)}+  .foot{color:var(--muted);font-size:13px;margin:34px 2px 4px;text-align:center}+  .foot b{color:var(--text)} .foot code{color:var(--teal)} </style> </head> <body> <div class="wrap"> -  <div class="lede">Five real vendor sites. One logged-in session. No bot walls.</div>-  <p class="sub">The native-browser extension drives your <b>actual signed-in Chrome/Edge</b> — so every-  vendor's cookies, SSO, saved logins and "I'm not a robot" human-trust come for free. Here it is on-  <b>Mouser, SnapMagic, ComponentSearchEngine, DigiKey and TI</b>, signing in and fetching chip CAD-  past the login walls that stop a headless bot cold.</p>--  <!-- VIDEO -->-  <div class="video-card">-    <video controls preload="metadata" playsinline-      poster="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/demo-login.png">-      <source src="https://wiki.adom.inc/blob/app/adom-browser-extension/demo/adom-native-browser-demo.mp4" type="video/mp4">-      Your browser can't play embedded video —-      <a href="https://wiki.adom.inc/blob/app/adom-browser-extension/demo/adom-native-browser-demo.mp4">download the clip</a>.-    </video>-  </div>-  <p class="cap"><b>▶ 36-second demo.</b> The Adom cursor signs in to Mouser — <b>Chrome autofills the-  saved password, Adom never sees it</b> — then fetches the ST <b>VL53L5CX</b> 8×8 ToF sensor's CAD-  (KiCad symbol + footprint, STEP 3D model, datasheet) from ComponentSearchEngine. No captcha, because-  it's a <b>real</b> session.</p>--  <!-- VENDORS -->-  <div class="rail"><h2>Five vendors, one real session</h2><span class="ln"></span><span class="pill">live</span></div>--  <div class="grid">--    <div class="card">-      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/demo-login.png" alt="Adom drives the Mouser sign-in — the cursor on the Username field, johnAdom + password autofilled">-      <div class="body">-        <p class="tag ok">✓ login automated</p>-        <h3>Mouser — autofill sign-in</h3>-        <p>The Adom cursor focuses the <b>Username</b> field; Chrome autofills <b>johnAdom</b> + the-        saved password (<b>Adom never sees it</b>) and submits. Real session → no captcha, no anti-bot slider.</p>-      </div>-    </div>+  <span class="pill">Chrome &amp; Edge Extension</span>+  <div class="lede" style="margin-top:14px">Your AI's hands in your real browser.</div>+  <p class="sub">Adom is an <b>AI electronics-prototyping development environment</b>. This extension lets your+  AI assistant <b>build, drive, and test web software</b> — web oscilloscopes, EDA &amp; CAD tools, and apps+  that drive real circuit boards — right inside the <b>Chrome or Edge you're already signed into</b>. It is the+  <b>same category of capability as the Claude browser extension</b>: the AI agent's hands inside your own+  browser, acting only on the commands you give it.</p> -    <div class="card">-      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-snapmagic-login.png" alt="SnapMagic login with [email protected] + password autofilled and the Adom debug bar visible">-      <div class="body">-        <p class="tag ok">✓ login automated · invisible reCAPTCHA</p>-        <h3>SnapMagic (SnapEDA) — credential-aware login</h3>-        <p><code>nbrowser_credentials</code> knew <b>snapeda.com</b>, so Chrome pre-filled-        <b>[email protected]</b> + password. SnapMagic's login is gated by an <b>invisible reCAPTCHA</b> bound-        to the button — the real, trusted session <b>clears it silently</b> on submit.</p>-      </div>-    </div>+  <!-- USE CASES -->+  <div class="rail"><h2>What it does for you</h2><span class="ln"></span><span class="pill">in real Chrome</span></div>+  <p class="sub" style="margin-bottom:20px">Three real apps from the Adom ecosystem — each shown running+  <b>in a Chrome window the extension drives</b> (note the <b>"Adom driving"</b> badge in the toolbar), and+  how it helps you get the work done.</p> -    <div class="card">-      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-snapmagic-in.png" alt="SnapMagic signed in — VL53L5CX search returns 9 parts with one-click KiCad/STEP download icons">-      <div class="body">-        <p class="tag feat">▸ past the guest wall</p>-        <h3>SnapMagic — signed in, downloads unlocked</h3>-        <p>Signed in, the <b>VL53L5CX</b> search returns <b>9 parts</b> with one-click KiCad symbol +-        footprint and STEP downloads — the guest "log in to download" wall is gone.</p>-      </div>-    </div>+  <div class="ucs"> -    <div class="card">-      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/demo-fetch.png" alt="ComponentSearchEngine VL53L5CX page, the Adom cursor on Download Model, signed in as John Lauer">+    <div class="uc">+      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/usecase-oscilloscope.png" alt="A web-based oscilloscope running in a Chrome window driven by the Adom extension">       <div class="body">-        <p class="tag feat">▸ chip CAD fetch</p>-        <h3>ComponentSearchEngine — fetch past the wall</h3>-        <p>Signed in, the cursor clicks <b>Download Model</b> on the ST VL53L5CX (8×8 ToF) — pulling the-        <b>KiCad</b> symbol + footprint, <b>STEP</b> 3D model, and the datasheet in one go.</p>+        <p class="tag">Web-based oscilloscope</p>+        <h3>Verify an instrument UI without clicking through every iteration</h3>+        <p>You're bringing up a browser-based scope and need to confirm the trigger and timebase behave against+        real signals. Instead of clicking through it by hand each pass, your AI assistant drives the live app in+        your own Chrome — sets the timebase, drags the trigger to <b>CH1-rising</b>, reads the measurements back,+        and screenshots the result. You stay in flow while it verifies the instrument and flags a regression the+        moment one appears.</p>       </div>     </div> -    <div class="card">-      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-digikey.png" alt="DigiKey homepage driven live in the native browser">+    <div class="uc">+      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/usecase-eda.png" alt="A browser EDA/CAD tool — CAN-bus schematic with 3D / PCB / Schematic tabs — running in a Chrome window driven by the Adom extension">       <div class="body">-        <p class="tag feat">▸ driven live</p>-        <h3>DigiKey — driven in your real profile</h3>-        <p>The native browser renders and drives DigiKey inside your actual Chrome — full page, real-        cookies, your cart. DigiKey is already in your saved-login vault.</p>-        <span class="vault">nbrowser_credentials → auth.digikey.com ✓</span>+        <p class="tag">Web-based EDA &amp; CAD</p>+        <h3>Try a design change and see it routed — hands-free</h3>+        <p>Mid-design, you want to try a change and see it routed. Your AI opens the EDA tool in the browser+        you're already signed into, <b>fills the schematic, re-runs the autorouter, and inspects the nets</b> —+        turning "try this and tell me what breaks" into something it just does, in the same session where your+        part libraries and logins already live.</p>       </div>     </div> -    <div class="card">-      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-ti.png" alt="TI.com homepage driven live in the native browser">+    <div class="uc">+      <img class="shot" src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/usecase-board.png" alt="A 3D PCB rendered in a browser CAD viewer running in a Chrome window driven by the Adom extension">       <div class="body">-        <p class="tag feat">▸ driven live</p>-        <h3>TI.com — driven, SSO-ready</h3>-        <p>TI.com driven live in your real session. Your <b>TI SSO</b> login is in the vault, so signing in-        for a reference-design or sample download is one autofill away.</p>-        <span class="vault">nbrowser_credentials → login.ti.com ✓</span>-      </div>-    </div>--  </div>--  <!-- CAPTCHA -->-  <div class="rail"><h2>"I'm not a robot?" — handled</h2><span class="ln"></span><span class="pill">human-trust</span></div>--  <div class="captcha">-    <div class="inner">-      <img src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-captcha.png" alt="The reCAPTCHA 'I'm not a robot' checkbox in the real browser">-      <div class="copy">-        <h3>The gate that stops headless bots</h3>-        <p>UltraLibrarian, ComponentSearchEngine and SnapEDA/SnapMagic throw <b>reCAPTCHA</b> at-        anonymous, headless automation. The native browser runs in your <b>real, trusted session</b>, so-        the human-trust signals are already there:</p>-        <div class="chk"><span class="b">✓</span><span><b>Invisible reCAPTCHA</b> (like SnapMagic's login) passes <b>silently</b> on submit — verified above, the sign-in just went through.</span></div>-        <div class="chk"><span class="b">✓</span><span>When the visible <b>"I'm not a robot"</b> checkbox appears, the Adom cursor clicks it — and because the session is trusted, it clears with <b>no "select all the traffic lights"</b> image grid.</span></div>-        <div class="chk"><span class="b">✓</span><span>During a real human-gate (2FA / a hard challenge), the taskbar turns <b>yellow</b> and flashes <b>"come look"</b> — it hands control back instead of guessing.</span></div>+        <p class="tag">Apps that drive real circuit boards</p>+        <h3>Hardware-in-the-loop, in your actual browser session</h3>+        <p>When a board-control app talks to real hardware, the AI needs your <b>actual</b> browser — your device+        session, your USB permissions, your dashboard login. The extension gives it exactly that: it drives the+        live page, flashes and operates the board, and reports back — so hardware-in-the-loop testing runs+        hands-free instead of you babysitting every flash.</p>       </div>     </div>-  </div> -  <!-- PARALLEL MULTI-BROWSER -->-  <div class="rail"><h2>One AI, two browsers — at the same time</h2><span class="ln"></span><span class="pill">parallel</span></div>-  <p class="sub" style="margin-bottom:18px">Every <b>browser × profile</b> is its own independently-addressable connection, keyed <code>browser:profile</code>. Here the <b>same</b> AI session drives <b>Microsoft Edge</b> and <b>Google Chrome</b> at once — each on its own page, each its own key. Separate Claude/Codex threads can each take a different browser/profile; nothing collides.</p>-  <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px">-    <figure style="margin:0">-      <img src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-edge.png" alt="Edge driving the wiki extension page" style="display:block;width:100%;border:1px solid var(--border);border-radius:11px">-      <figcaption style="color:var(--muted);font-size:13px;margin-top:8px"><b style="color:#34d17e">EDGE</b> · <code>edge:[email protected]</code> — driving the extension's own wiki page (note Edge's <b>Chat</b>/Copilot button)</figcaption>-    </figure>-    <figure style="margin:0">-      <img src="https://wiki.adom.inc/blob/app/adom-browser-extension/screenshots/show-chrome.png" alt="Chrome driving the Adom apps grid" style="display:block;width:100%;border:1px solid var(--border);border-radius:11px">-      <figcaption style="color:var(--muted);font-size:13px;margin-top:8px"><b style="color:#64ABFF">CHROME</b> · <code>chrome:[email protected]</code> — driving the Adom apps grid (note Chrome's <b>Ask Gemini</b> button)</figcaption>-    </figure>   </div>-  <p class="sub" style="margin-top:16px;font-size:14px">Address either with <code>profile:"edge:[email protected]"</code> on any verb. The host even <b>self-detects its browser from its own process tree</b>, so a browser registers correctly with <b>no extension reload</b>.</p> -  <p class="foot">Drive it yourself: <b>"load my native browser and log into Mouser"</b> &nbsp;·&nbsp;+  <!-- PERMISSIONS -->+  <div class="rail"><h2>Every permission, justified</h2><span class="ln"></span><span class="pill">why we ask</span></div>+  <p class="sub">A development environment has to operate the browser the way a developer does. Each permission+  maps to a concrete action the user asks for — to deliver the features above, never to collect data.</p>+  <table class="perm">+    <tr><th>Permission</th><th>What the user-requested feature needs it for</th></tr>+    <tr><td><code>debugger</code></td><td>Drive, inspect, screenshot, and <b>debug the live page</b> via the DevTools protocol — exactly what building and testing a web app requires. Attached only while a command runs, detached when idle.</td></tr>+    <tr><td><code>host: &lt;all_urls&gt;</code></td><td>A dev environment must work on <b>whatever app you're building or testing</b> — there is no fixed allow-list for "the whole web." Exercised only per command, never to crawl.</td></tr>+    <tr><td><code>cookies</code></td><td>Use your <b>existing signed-in dev tools and services</b> without forcing a re-login. Used to perform your task, never collected.</td></tr>+    <tr><td><code>nativeMessaging</code></td><td>The core transport — connects the extension to <b>your local Adom Desktop</b> so your AI session can send commands and receive results.</td></tr>+    <tr><td><code>tabs</code> · <code>scripting</code> · <code>webNavigation</code></td><td>Open/switch/reload the tabs you operate, read the DOM and fill fields, and run each command at the right moment (e.g. "navigate, then screenshot").</td></tr>+    <tr><td><code>downloads</code></td><td>Save files you ask to download — exports, CAD/3D assets, datasheets — into your own profile.</td></tr>+    <tr><td><code>tabCapture</code> · <code>desktopCapture</code></td><td>Record a walkthrough of <b>your own page</b> when you explicitly ask for one.</td></tr>+    <tr><td><code>storage</code> · <code>alarms</code></td><td>Remember your session-to-window map and keep the connection alive — minimal local state only.</td></tr>+  </table>+  <p class="note"><b>No remotely-hosted code.</b> All logic ships in the package; it evaluates JavaScript only on+  the page you point it at, via the debugger/scripting APIs — never by loading external scripts.</p>++  <!-- CONTROL / TRANSPARENCY -->+  <div class="rail"><h2>You're always in control</h2><span class="ln"></span><span class="pill">transparent</span></div>+  <div class="chk"><span class="b">✓</span><span><b>It acts only on your command.</b> Every action is initiated by you, or by your Adom AI session working on your behalf — nothing happens on its own.</span></div>+  <div class="chk"><span class="b">✓</span><span><b>It's visible when it's driving.</b> Chrome's <span class="m">"started debugging this browser"</span> bar appears whenever a debugger-using command runs; the extension lazy-attaches and idle-detaches after a few seconds, so the bar is only up while it's actually working.</span></div>+  <div class="chk"><span class="b">✓</span><span><b>Idle by default.</b> It does nothing unless your Adom Desktop and an Adom session are connected — and you can remove it at any time to end all access.</span></div>++  <!-- PRIVACY -->+  <div class="rail"><h2>Privacy</h2><span class="ln"></span><span class="pill">your data, your tasks</span></div>+  <p class="sub">The extension runs inside your own browser and acts on the commands you give it. The pages and+  screenshots it reads go to <b>your own Adom session</b> to carry out the task you asked for, and it works+  through your existing signed-in sessions so your tools just work. <b>Adom's business is selling+  electronics-prototyping and development tools — not data</b>; your browsing and the contents of your work stay+  yours, and aren't used for advertising. Full policy:+  <a href="https://wiki.adom.inc/john/adom-browser-extension/files/PRIVACY.md">Privacy Policy (Markdown)</a> ·+  <a href="https://wiki.adom.inc/john/adom-browser-extension/files/privacy.html">HTML version</a>.</p>++  <!-- HOW IT WORKS -->+  <div class="rail"><h2>How it works</h2><span class="ln"></span><span class="pill">architecture</span></div>+  <p class="sub">The extension connects through a Chrome <b>native-messaging host on your own computer</b> to your+  local <b>Adom Desktop</b> app; commands flow to the extension and results flow back to your active Adom session.+  The host↔bridge link is a <b>loopback (127.0.0.1) connection pinned to this extension's exact identity</b>, so+  no random page or other extension can drive it. Cloud containers, Hydrogen Desktop, and the Adom CLI reach it+  through the same <code>relay → adom-desktop → bridge</code> path they already use. Full technical docs, the+  verb surface, and the sub-skills are in the README below.</p>++  <p class="foot">Try it: <b>"open my web scope and set a 1&micro;s trigger on CH1"</b> &nbsp;·&nbsp;   <code>adompkg install adom-browser-extension</code> &nbsp;·&nbsp; full docs in the README below.</p>  </div>@@ -222,11 +190,8 @@     }     window.addEventListener("load",post);     window.addEventListener("resize",post);-    // images/video change height as they load     document.querySelectorAll("img").forEach(function(im){ im.addEventListener("load",post); im.addEventListener("error",post); });-    var v=document.querySelector("video"); if(v){ v.addEventListener("loadedmetadata",post); }     if(window.ResizeObserver){ new ResizeObserver(post).observe(document.body); }-    // a few early ticks while fonts/layout settle     var n=0,iv=setInterval(function(){ post(); if(++n>12) clearInterval(iv); },250);     post();   })();