29 lines
29 KiB
HTML
29 lines
29 KiB
HTML
<!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>│ & 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'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> |