Files
even-g2/docs/architecture.html

29 lines
29 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Architecture | Documentation</title>
<meta name="description" content="How Even Hub apps connect your code to the Even G2 glasses.">
<meta name="generator" content="VitePress v2.0.0-alpha.16">
<link rel="preload stylesheet" href="/docs/assets/style.C9-XXDvi.css" as="style">
<link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
<script type="module" src="/docs/assets/app.CFvRVw9a.js"></script>
<link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/docs/assets/chunks/theme.kl4s8rzo.js">
<link rel="modulepreload" href="/docs/assets/chunks/framework.BlYYuYRL.js">
<link rel="modulepreload" href="/docs/assets/get-started_architecture.md.DoIROHS8.lean.js">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"dark",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-a1287e7a><!--[--><!--]--><!--[--><span tabindex="-1" data-v-3b257a0a></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-3b257a0a>Skip to content</a><!--]--><!----><header class="VPNav" data-v-a1287e7a data-v-a0b2321a><div class="VPNavBar has-sidebar top" data-v-a0b2321a data-v-df8b92a3><div class="wrapper" data-v-df8b92a3><div class="container" data-v-df8b92a3><div class="title" data-v-df8b92a3><div class="VPNavBarTitle has-sidebar" data-v-df8b92a3 data-v-381c7abb><a class="title" href="/docs/get-started/overview" data-v-381c7abb><!--[--><!--]--><!--[--><img class="VPImage logo" src="/docs/imgs/icon.svg" alt data-v-35a7d0b8><!--]--><span data-v-381c7abb>Documentation</span><!--[--><!--]--></a></div></div><div class="content" data-v-df8b92a3><div class="content-body" data-v-df8b92a3><!--[--><!--]--><div class="VPNavBarSearch search" data-v-df8b92a3 data-v-9d963081><!--[--><button type="button" class="VPNavBarSearchButton" aria-label="Search" aria-keyshortcuts="/ control+k meta+k" data-v-9d963081 data-v-6007d037><span class="vpi-search" aria-hidden="true" data-v-6007d037></span><span class="text" data-v-6007d037>Search</span><span class="keys" aria-hidden="true" data-v-6007d037><kbd class="key-cmd" data-v-6007d037>⌘</kbd><kbd class="key-ctrl" data-v-6007d037>Ctrl</kbd><kbd data-v-6007d037>K</kbd></span></button><!----><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-df8b92a3 data-v-860fda33><span id="main-nav-aria-label" class="visually-hidden" data-v-860fda33> Main Navigation </span><!--[--><!--[--><a class="VPLink link vp-external-link-icon no-icon VPNavBarMenuLink" href="https://evenhub.evenrealities.com" target rel="noreferrer" tabindex="0" data-v-860fda33 data-v-3224c352><!--[--><span data-v-3224c352>Portal</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-df8b92a3 data-v-af096f4a><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="true" data-v-af096f4a data-v-e40a8bb6 data-v-4a1c76db><span class="check" data-v-4a1c76db><span class="icon" data-v-4a1c76db><!--[--><span class="vpi-sun sun" data-v-e40a8bb6></span><span class="vpi-moon moon" data-v-e40a8bb6></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-df8b92a3 data-v-164c457f data-v-c26cd89d><!--[--><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-df8b92a3 data-v-020e0d5e data-v-0b52c8fe><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-0b52c8fe><span class="vpi-more-horizontal icon" data-v-0b52c8fe></span></button><div class="menu" data-v-0b52c8fe><div class="VPMenu" data-v-0b52c8fe data-v-ca69ded9><!----><!--[--><!--[--><!----><div class="group" data-v-020e0d5e><div class="item appearance" data-v-020e0d5e><p class="label" data-v-020e0d5e>Theme</p><div class="appearance-action" data-v-020e0d5e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="true" data-v-020e0d5e data-v-e40a8bb6 data-v-4a1c76db><span class="check" data-v-4a1c76db><span class="icon" data-v-4a1c76db><!--[--><span class="vpi-sun sun" data-v-e40a8bb6></span><span class="vpi-moon moon" data-v-e40a8bb6></span><!--]--></span></span></button></div></div></div><div class="group" data-v-020e0d5e><div class="item social-links" data-v-020e0d5e><div class="VPSocialLinks social-links-list" data-v-020e0d5e data-v-c26cd89d><!--[--><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-df8b92a3 data-v-5dea55bf><span class="container" data-v-5dea55bf><span class="top" data-v-5dea55bf></span><span class="middle" data-v-5dea55bf></span><span class="bottom" data-v-5dea55bf></span></span></button></div></div></div></div><div class="divider" data-v-df8b92a3><div class="divider-line" data-v-df8b92a3></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-a1287e7a data-v-a1555d26><div class="container" data-v-a1555d26><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-a1555d26><span class="vpi-align-left menu-icon" data-v-a1555d26></span><span class="menu-text" data-v-a1555d26>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-a1555d26 data-v-8ca43daf><button data-v-8ca43daf>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-a1287e7a data-v-71d76522><div class="curtain" data-v-71d76522></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-71d76522><span class="visually-hidden" id="sidebar-aria-label" data-v-71d76522> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-b60d39e6><section class="VPSidebarItem level-0 is-link has-active" data-v-b60d39e6 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/index" data-v-c467f688><!--[--><h2 class="text" data-v-c467f688>Get Started</h2><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/overview" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Overview</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/index" data-v-c467f688><!--[--><h3 class="text" data-v-c467f688>Quickstart</h3><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-2 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/sign-in" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Sign in</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/hardware" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Hardware</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/install-node" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Install Node.js & npm</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/install-tools" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Install Even Hub tooling</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/first-app" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Your First App</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/quickstart/templates" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Templates</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/get-started/architecture" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Architecture</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b60d39e6><section class="VPSidebarItem level-0 is-link" data-v-b60d39e6 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/index" data-v-c467f688><!--[--><h2 class="text" data-v-c467f688>Build</h2><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/page-lifecycle" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Page Lifecycle</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/display" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Display & UI System</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/design-guidelines" data-v-c467f688><!--[--><p class="text" data-v-c467f688>UI/UX Design Guidelines</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/device-apis" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Device APIs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/contextual-menu" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Contextual Menu</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/networking" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Networking</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/build/background-lifecycle" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Background & Lifecycle</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b60d39e6><section class="VPSidebarItem level-0 is-link" data-v-b60d39e6 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/test/index" data-v-c467f688><!--[--><h2 class="text" data-v-c467f688>Test</h2><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/test/simulator" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Simulator</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/test/local-testing" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Local Testing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/test/private-testing" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Private Testing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/test/beta-testing" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Beta Testing</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b60d39e6><section class="VPSidebarItem level-0 is-link" data-v-b60d39e6 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/ship/index" data-v-c467f688><!--[--><h2 class="text" data-v-c467f688>Ship</h2><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/ship/packaging" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Packaging & Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/ship/app-submission" data-v-c467f688><!--[--><p class="text" data-v-c467f688>App Submission & QA Guidelines</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b60d39e6><section class="VPSidebarItem level-0 is-link" data-v-b60d39e6 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/reference/index" data-v-c467f688><!--[--><h2 class="text" data-v-c467f688>Reference</h2><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/reference/glossary" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Glossary</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/reference/cli" data-v-c467f688><!--[--><p class="text" data-v-c467f688>CLI</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/reference/versioning" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Versioning Policy</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/reference/changelog" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Changelog</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/reference/faq" data-v-c467f688><!--[--><p class="text" data-v-c467f688>FAQ</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b60d39e6><section class="VPSidebarItem level-0 is-link" data-v-b60d39e6 data-v-c467f688><div class="item" tabindex="0" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/AI-tooling/index" data-v-c467f688><!--[--><h2 class="text" data-v-c467f688>AI Tooling</h2><!--]--></a><!----></div><div class="items" data-v-c467f688><!--[--><div class="VPSidebarItem level-1 is-link" data-v-c467f688 data-v-c467f688><div class="item" data-v-c467f688><div class="indicator" data-v-c467f688></div><a class="VPLink link link" href="/docs/AI-tooling/claude-code" data-v-c467f688><!--[--><p class="text" data-v-c467f688>Claude Code</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-a1287e7a data-v-8b153e3f><div class="VPDoc has-sidebar has-aside" data-v-8b153e3f data-v-e9c01962><!--[--><!--]--><div class="container" data-v-e9c01962><div class="aside" data-v-e9c01962><div class="aside-curtain" data-v-e9c01962></div><div class="aside-container" data-v-e9c01962><div class="aside-content" data-v-e9c01962><div class="VPDocAside" data-v-e9c01962 data-v-6d7b3c46><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-6d7b3c46 data-v-3dd0d1cf><div class="content" data-v-3dd0d1cf><div class="outline-marker" data-v-3dd0d1cf></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-3dd0d1cf>On this page</div><ul class="VPDocOutlineItem root" data-v-3dd0d1cf data-v-d0276d81><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-6d7b3c46></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e9c01962><div class="content-container" data-v-e9c01962><!--[--><!--]--><main class="main" data-v-e9c01962><div style="position:relative;" class="vp-doc _docs_get-started_architecture" data-v-e9c01962><div><blockquote><p><strong>Last updated:</strong> 2026-06-11</p></blockquote><p>Even Hub apps are <strong>web apps</strong> - HTML, CSS, and JavaScript - glued to the glasses by the Even Hub SDK. You build them on your laptop, package them up, and submit them through the dev portal for users to install.</p><h2 id="connection-model" tabindex="-1">Connection model <a class="header-anchor" href="#connection-model" aria-label="Permalink to “Connection model”">​</a></h2><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes even-light even-dark" style="--shiki-light:#333333;--shiki-dark:#D3D3D3;--shiki-light-bg:#F2F2F2;--shiki-dark-bg:#2E2E2E;" tabindex="0" dir="ltr"><code><span class="line"><span>┌──────────────────┐ HTTPS ┌────────────────────┐ Bluetooth ┌─────────────────────┐</span></span>
<span class="line"><span>│ Even Hub Cloud │ ◄──────────► │ Phone │ ◄────────────► │ Even G2 Glasses │</span></span>
<span class="line"><span>│ (distribution │ │ (Even Realities │ │ (display + input) │</span></span>
<span class="line"><span>│ &amp; hosting) │ │ App + WebView) │ │ │</span></span>
<span class="line"><span>└──────────────────┘ └────────────────────┘ └─────────────────────┘</span></span></code></pre></div><ul><li><strong>The phone</strong> runs the Even Realities App (Flutter), which hosts your plugin in a WebView - Chromium on Android, WKWebView on iOS. Your app logic runs inside that WebView. The Even Realities App relays everything to and from the glasses over Bluetooth.</li><li><strong>The glasses</strong> render UI containers and emit input events - presses, scrolls, swipes. Apart from native scroll handling, no app logic runs on them.</li></ul><div class="warning custom-block"><p class="custom-block-title">Network whitelist is not a CORS bypass</p><p>The <code>app.json</code> <code>network</code> whitelist is an <strong>Even-side permission check</strong> - it controls which domains your plugin is allowed to call from the WebView. It does <strong>not</strong> bypass CORS.</p><p>In production, <code>fetch()</code> requires both:</p><ol><li>The remote domain listed in your <code>app.json</code> <code>network</code> whitelist, <strong>and</strong></li><li>Correct CORS headers (<code>Access-Control-Allow-Origin</code>, etc.) returned by that remote API.</li></ol><p>APIs that work on <code>localhost</code> but fail inside the WebView are almost always CORS misconfigurations on the remote side, not Even bugs. See <a href="/docs/build/networking">Networking</a> for the full request flow and debugging tips.</p></div><h2 id="testing-your-app" tabindex="-1">Testing your app <a class="header-anchor" href="#testing-your-app" aria-label="Permalink to “Testing your app”">​</a></h2><p>Three ways to run your app during development:</p><ol><li><strong>QR sideload</strong> - the CLI prints a QR pointing at your local dev server; scan it from the Even Realities App and your app loads on the glasses with hot reload.</li><li><strong>Private build</strong> - <code>evenhub pack</code> produces an <code>.ehpk</code>; upload it through the dev portal to install on your own devices.</li><li><strong>Simulator</strong> - preview layouts and exercise logic entirely on your laptop, no hardware needed.</li></ol><h2 id="pwa-as-an-alternative" tabindex="-1">PWA as an alternative <a class="header-anchor" href="#pwa-as-an-alternative" aria-label="Permalink to “PWA as an alternative”">​</a></h2><p>If you&#39;d rather stay outside the Even Hub distribution flow, build a <strong>Progressive Web App</strong> and point users at your hosted URL. You keep full control over distribution and hosting; you also skip the dev portal entirely - no packaging, no review.</p><h2 id="the-sdk-bridge" tabindex="-1">The SDK bridge <a class="header-anchor" href="#the-sdk-bridge" aria-label="Permalink to “The SDK bridge”">​</a></h2><p>The SDK injects a JavaScript bridge (<code>EvenAppBridge</code>) into the WebView. Your frontend calls into it to drive the display and receive input.</p><p><strong>Web → Glasses:</strong> your JS calls <code>bridge.callEvenApp(method, params)</code> → WebView bridge → Even Realities App → Bluetooth → glasses.</p><p><strong>Glasses → Web:</strong> input events travel Bluetooth → Even Realities App → <code>window._listenEvenAppMessage(...)</code> → your callback.</p><p>For the project layout and a working scaffold, see <a href="/docs/get-started/quickstart/first-app#_2-project-structure">Your First App § Project structure</a>.</p></div></div></main><footer class="VPDocFooter" data-v-e9c01962 data-v-87364368><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-87364368><span id="doc-footer-aria-label" class="visually-hidden" data-v-87364368>Pager</span><div class="pager" data-v-87364368><a class="VPLink link pager-link prev" href="/docs/get-started/quickstart/templates" rel="prev" data-v-87364368><!--[--><span class="desc" data-v-87364368>Previous page</span><span class="title" data-v-87364368>Templates</span><!--]--></a></div><div class="pager" data-v-87364368><a class="VPLink link pager-link next" href="/docs/build/index" rel="next" data-v-87364368><!--[--><span class="desc" data-v-87364368>Next page</span><span class="title" data-v-87364368>Build</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"ai-tooling_claude-code.md\":\"C7H_8YCq\",\"ai-tooling_index.md\":\"DSaK-jJa\",\"build_background-lifecycle.md\":\"DiM5miPG\",\"build_contextual-menu.md\":\"Cn---x0c\",\"build_design-guidelines.md\":\"BL7UM4zg\",\"build_device-apis.md\":\"BahyAsXj\",\"build_display.md\":\"TH6sBkGh\",\"build_index.md\":\"DaHlxCby\",\"build_networking.md\":\"ETEAbk3D\",\"build_page-lifecycle.md\":\"VGKEFEO0\",\"get-started_architecture.md\":\"DoIROHS8\",\"get-started_index.md\":\"BhleXwmV\",\"get-started_overview.md\":\"9E9fGzk_\",\"get-started_quickstart_first-app.md\":\"D9L-H8NW\",\"get-started_quickstart_hardware.md\":\"Y8h3aa2_\",\"get-started_quickstart_index.md\":\"B-QxTg2R\",\"get-started_quickstart_install-node.md\":\"CnkAbhq8\",\"get-started_quickstart_install-tools.md\":\"1ktlsjFX\",\"get-started_quickstart_sign-in.md\":\"U0gnIH8L\",\"get-started_quickstart_templates.md\":\"dtOMMIqX\",\"index.md\":\"DhAdwW-m\",\"reference_changelog.md\":\"RteF40PX\",\"reference_cli.md\":\"BTh1lq90\",\"reference_faq.md\":\"CeRPWHPe\",\"reference_glossary.md\":\"BzVJOglq\",\"reference_index.md\":\"BjAMWB5B\",\"reference_versioning.md\":\"D2rRfOp7\",\"ship_app-submission.md\":\"frKZPiSb\",\"ship_index.md\":\"BIDwrKo8\",\"ship_packaging.md\":\"jl3GqjXq\",\"test_beta-testing.md\":\"gurXK4Mw\",\"test_index.md\":\"B70CRDWi\",\"test_local-testing.md\":\"j93HHWsF\",\"test_private-testing.md\":\"BPSRLeWg\",\"test_simulator.md\":\"XGYKOdSW\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Documentation\",\"description\":\"EvenRealities Developer Portal Documentation\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":\"dark\",\"themeConfig\":{\"logo\":\"/imgs/icon.svg\",\"logoLink\":\"/docs/get-started/overview\",\"darkModeSwitchLabel\":\"Theme\",\"lightModeSwitchTitle\":\"Switch to light theme\",\"darkModeSwitchTitle\":\"Switch to dark theme\",\"nav\":[{\"text\":\"Portal\",\"link\":\"https://evenhub.evenrealities.com\",\"target\":\"\",\"noIcon\":true}],\"search\":{\"provider\":\"local\"},\"sidebar\":[{\"text\":\"Get Started\",\"link\":\"/get-started/index.md\",\"items\":[{\"text\":\"Overview\",\"link\":\"/get-started/overview\"},{\"text\":\"Quickstart\",\"link\":\"/get-started/quickstart/index.md\",\"items\":[{\"text\":\"Sign in\",\"link\":\"/get-started/quickstart/sign-in\"},{\"text\":\"Hardware\",\"link\":\"/get-started/quickstart/hardware\"},{\"text\":\"Install Node.js & npm\",\"link\":\"/get-started/quickstart/install-node\"},{\"text\":\"Install Even Hub tooling\",\"link\":\"/get-started/quickstart/install-tools\"},{\"text\":\"Your First App\",\"link\":\"/get-started/quickstart/first-app\"},{\"text\":\"Templates\",\"link\":\"/get-started/quickstart/templates\"}]},{\"text\":\"Architecture\",\"link\":\"/get-started/architecture\"}]},{\"text\":\"Build\",\"link\":\"/build/index.md\",\"items\":[{\"text\":\"Page Lifecycle\",\"link\":\"/build/page-lifecycle\"},{\"text\":\"Display & UI System\",\"link\":\"/build/display\"},{\"text\":\"UI/UX Design Guidelines\",\"link\":\"/build/design-guidelines\"},{\"text\":\"Device APIs\",\"link\":\"/build/device-apis\"},{\"text\":\"Contextual Menu\",\"link\":\"/build/contextual-menu\"},{\"text\":\"Networking\",\"link\":\"/build/networking\"},{\"text\":\"Background & Lifecycle\",\"link\":\"/build/background-lifecycle\"}]},{\"text\":\"Test\",\"link\":\"/test/index.md\",\"items\":[{\"text\":\"Simulator\",\"link\":\"/test/simulator\"},{\"text\":\"Local Testing\",\"link\":\"/test/local-testing\"},{\"text\":\"Private Testing\",\"link\":\"/test/private-testing\"},{\"text\":\"Beta Testing\",\"link\":\"/test/beta-testing\"}]},{\"text\":\"Ship\",\"link\":\"/ship/index.md\",\"items\":[{\"text\":\"Packaging & Deployment\",\"link\":\"/ship/packaging\"},{\"text\":\"App Submission & QA Guidelines\",\"link\":\"/ship/app-submission\"}]},{\"text\":\"Reference\",\"link\":\"/reference/index.md\",\"items\":[{\"text\":\"Glossary\",\"link\":\"/reference/glossary\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"Versioning Policy\",\"link\":\"/reference/versioning\"},{\"text\":\"Changelog\",\"link\":\"/reference/changelog\"},{\"text\":\"FAQ\",\"link\":\"/reference/faq\"}]},{\"text\":\"AI Tooling\",\"link\":\"/AI-tooling/index.md\",\"items\":[{\"text\":\"Claude Code\",\"link\":\"/AI-tooling/claude-code\"}]}],\"socialLinks\":[]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true,\"additionalConfig\":{}}");</script>
</body>
</html>