home-hub/index.html

55 lines
23 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" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-overview" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">Home Hub</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://pages.brrd.tech/rob/home-hub/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Home Hub"><meta data-rh="true" name="description" content="Entertainment system with Home Assistant, smart speakers, and voice control"><meta data-rh="true" property="og:description" content="Entertainment system with Home Assistant, smart speakers, and voice control"><link data-rh="true" rel="icon" href="/rob/home-hub/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://pages.brrd.tech/rob/home-hub/"><link data-rh="true" rel="alternate" href="https://pages.brrd.tech/rob/home-hub/" hreflang="en"><link data-rh="true" rel="alternate" href="https://pages.brrd.tech/rob/home-hub/" hreflang="x-default"><script data-rh="true">function insertBanner(){var n=document.createElement("div");n.id="__docusaurus-base-url-issue-banner-container";n.innerHTML='\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">/rob/home-hub/</span> </p>\n <p>We suggest trying baseUrl = <span id="__docusaurus-base-url-issue-banner-suggestion-container" style="font-weight: bold; color: green;"></span></p>\n</div>\n',document.body.prepend(n);var e=document.getElementById("__docusaurus-base-url-issue-banner-suggestion-container"),o=window.location.pathname,s="/"===o.substr(-1)?o:o+"/";e.innerHTML=s}document.addEventListener("DOMContentLoaded",function(){void 0===window.docusaurus&&insertBanner()})</script><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home Hub","item":"https://pages.brrd.tech/rob/home-hub/"}]}</script><link rel="stylesheet" href="/rob/home-hub/assets/css/styles.6095798e.css">
<script src="/rob/home-hub/assets/js/runtime~main.27db9fc9.js" defer="defer"></script>
<script src="/rob/home-hub/assets/js/main.c648c878.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/rob/home-hub/"><b class="navbar__title text--truncate">Home Hub</b></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://gitea.brrd.tech/rob/home-hub" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Source Code<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/rob/home-hub/"><span title="Home Hub" class="linkLabel_WmDU">Home Hub</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/home-hub/todos/"><span title="Home Hub TODOs" class="linkLabel_WmDU">Home Hub TODOs</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/home-hub/goals/"><span title="Goals" class="linkLabel_WmDU">Goals</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/rob/home-hub/milestones/"><span title="Milestones" class="linkLabel_WmDU">Milestones</span></a></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/rob/home-hub/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Home Hub</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Home Hub</h1></header>
<p>Entertainment system with Home Assistant, smart speakers, and voice control</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview" translate="no"></a></h2>
<p>Home Hub is a Dell Inspiron 14 5420 laptop repurposed as a living room entertainment center and smart home controller. It runs Debian 12 with a Cinnamon desktop and combines:</p>
<ul>
<li class=""><strong>Media playback</strong> — YouTube, Netflix, and web browsing via Brave browser</li>
<li class=""><strong>Home Assistant Supervised</strong> — Orchestrating smart home devices and automations</li>
<li class=""><strong>Custom ESP32 WiFi smart speaker</strong> — Voice-controlled audio routing and assistant capabilities</li>
<li class=""><strong>PipeWire audio</strong> — Managing audio output between laptop speakers and networked devices</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hardware">Hardware<a href="#hardware" class="hash-link" aria-label="Direct link to Hardware" title="Direct link to Hardware" translate="no"></a></h2>
<table><thead><tr><th>Component</th><th>Detail</th></tr></thead><tbody><tr><td>Machine</td><td>Dell Inspiron 14 5420</td></tr><tr><td>Audio</td><td>Intel sof-hda-dsp (ALSA card 0) via PipeWire</td></tr><tr><td>OS</td><td>Debian 12 (Bookworm)</td></tr><tr><td>Desktop</td><td>Cinnamon / LightDM</td></tr><tr><td>Docker</td><td>Home Assistant Supervised</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architecture">Architecture<a href="#architecture" class="hash-link" aria-label="Direct link to Architecture" title="Direct link to Architecture" translate="no"></a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">┌──────────────────────────────────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ Home Hub (Laptop) │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ┌──────────┐ ┌───────────────────────┐ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ Brave │ │ Home Assistant │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ Browser │ │ (Docker/Supervised) │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ │ │ │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ YouTube │ │ Assist Pipeline │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ Netflix │ │ (STT/TTS) │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └────┬─────┘ └──────────┬────────────┘ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ ┌────▼───────────────────▼────────────┐ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ PipeWire Audio │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ └────┬────────────────────────────────┘ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">│ │ │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└───────┼──────────────────────────────────┘</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ▼ (WiFi)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ┌─────────────┐</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │ ESP32 │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │ Smart │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │ Speaker │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> │ (ESPHome) │</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> └─────────────┘</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no"></a></h2>
<ul>
<li class=""><strong>Reliable audio</strong> — PipeWire audio stack with hassio_audio conflict permanently resolved via systemd service</li>
<li class=""><strong>Home Assistant Supervised</strong> — Full HA installation with ESPHome addon for ESP32 firmware management</li>
<li class=""><strong>hassio_audio isolation</strong> — Custom systemd service uses nsenter to mask <code>/dev/snd</code> inside the container, keeping the supervisor happy while freeing ALSA for PipeWire</li>
<li class=""><strong>ESP32 smart speaker</strong> (planned) — WiFi-based voice assistant using ESPHome&#x27;s <code>voice_assistant</code> component</li>
<li class=""><strong>Voice-controlled audio routing</strong> (planned) — Route audio between laptop speakers and ESP32 via voice commands</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="quick-start">Quick Start<a href="#quick-start" class="hash-link" aria-label="Direct link to Quick Start" title="Direct link to Quick Start" translate="no"></a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># SSH into Home Hub</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ssh rob@192.168.0.166</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Check audio status</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">wpctl status</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Check Home Assistant containers</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sudo docker ps --format &quot;table {{.Names}}\t{{.Status}}&quot;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Verify hassio_audio is neutered</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sudo systemctl status disable-hassio-audio.service</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Access Home Assistant web UI</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># http://192.168.0.166:8123</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-decisions">Key Decisions<a href="#key-decisions" class="hash-link" aria-label="Direct link to Key Decisions" title="Direct link to Key Decisions" translate="no"></a></h2>
<ul>
<li class=""><strong>PipeWire over PulseAudio</strong> — Better ALSA integration and lower latency</li>
<li class=""><strong>hassio_audio disabled</strong> — Home Assistant&#x27;s audio container locks ALSA devices; ESP32 speaker communicates over WiFi instead</li>
<li class=""><strong>ESPHome for ESP32</strong> — Native Home Assistant integration via <code>voice_assistant</code> component</li>
<li class=""><strong>Browser-based streaming</strong> — No dedicated media server needed for initial setup</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-projects">Related Projects<a href="#related-projects" class="hash-link" aria-label="Direct link to Related Projects" title="Direct link to Related Projects" translate="no"></a></h2>
<p>This project is part of the development ecosystem:</p>
<ul>
<li class=""><a href="https://pages.brrd.tech/rob/CmdForge/" target="_blank" rel="noopener noreferrer" class="">CmdForge</a> - AI-powered CLI tool builder</li>
<li class=""><a href="https://pages.brrd.tech/rob/CascadingDev/" target="_blank" rel="noopener noreferrer" class="">CascadingDev</a> - Cascading Development Framework</li>
<li class=""><a href="https://pages.brrd.tech/rob/orchestrated-discussions/" target="_blank" rel="noopener noreferrer" class="">Orchestrated Discussions</a> - AI Discussion Framework</li>
<li class=""><a href="https://pages.brrd.tech/rob/artifact-editor/" target="_blank" rel="noopener noreferrer" class="">Artifact Editor</a> - Code Artifact Editor</li>
<li class=""><a href="https://pages.brrd.tech/rob/ramble/" target="_blank" rel="noopener noreferrer" class="">Ramble</a> - Voice Note Transcription</li>
</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--next" href="/rob/home-hub/todos/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Home Hub TODOs</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#overview" class="table-of-contents__link toc-highlight">Overview</a></li><li><a href="#hardware" class="table-of-contents__link toc-highlight">Hardware</a></li><li><a href="#architecture" class="table-of-contents__link toc-highlight">Architecture</a></li><li><a href="#features" class="table-of-contents__link toc-highlight">Features</a></li><li><a href="#quick-start" class="table-of-contents__link toc-highlight">Quick Start</a></li><li><a href="#key-decisions" class="table-of-contents__link toc-highlight">Key Decisions</a></li><li><a href="#related-projects" class="table-of-contents__link toc-highlight">Related Projects</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/rob/home-hub/">Overview</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://gitea.brrd.tech/rob/home-hub" target="_blank" rel="noopener noreferrer" class="footer__link-item">Gitea<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Home Hub Documentation</div></div></div></footer></div>
</body>
</html>