Something went wrong. Try again.
A lexicon-driven AppView for ATProto.
Something went wrong. Try again.
26 kB · 74 lines
HTML
at gh-pages
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374<!doctype html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-getting-started/dashboard" data-has-hydrated="false"><head><meta charset="UTF-8"><meta name="generator" content="Docusaurus v3.10.0"><title data-rh="true">Dashboard | HappyView</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:image" content="https://happyview.dev/img/og.png"><meta data-rh="true" name="twitter:image" content="https://happyview.dev/img/og.png"><meta data-rh="true" property="og:url" content="https://happyview.dev/getting-started/dashboard"><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="Dashboard | HappyView"><meta data-rh="true" name="description" content="HappyView ships with a web dashboard that provides a visual interface for everything the admin API offers. It runs as a separate Next.js application alongside the Rust backend and authenticates via atproto OAuth."><meta data-rh="true" property="og:description" content="HappyView ships with a web dashboard that provides a visual interface for everything the admin API offers. It runs as a separate Next.js application alongside the Rust backend and authenticates via atproto OAuth."><link data-rh="true" rel="icon" href="/img/favicon.png"><link data-rh="true" rel="canonical" href="https://happyview.dev/getting-started/dashboard"><link data-rh="true" rel="alternate" href="https://happyview.dev/getting-started/dashboard" hreflang="en"><link data-rh="true" rel="alternate" href="https://happyview.dev/getting-started/dashboard" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Dashboard","item":"https://happyview.dev/getting-started/dashboard"}]}</script><link rel="stylesheet" href="/assets/css/styles.18b9c377.css"><script src="/assets/js/runtime~main.413aac68.js" defer="defer"></script><script src="/assets/js/main.c991874c.js" defer="defer"></script></head><body><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||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),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"><link rel="preload" as="image" href="/img/logo.light.png"><link rel="preload" as="image" href="/img/logo.dark.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_hn_G" 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="/"><div class="navbar__logo"><img src="/img/logo.light.png" alt="HappyView" class="themedComponent_EfZ_ themedComponent--light_EnZ3"><img src="/img/logo.dark.png" alt="HappyView" class="themedComponent_EfZ_ themedComponent--dark_UTRq"></div><b class="navbar__title text--truncate"></b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/">Docs</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/gamesgamesgamesgamesgames/happyview" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_yqny"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_pDN8 colorModeToggle_WR5U"><button class="clean-btn toggleButton__Co1 toggleButtonDisabled_pTNf" 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_IF_c lightToggleIcon_z1QC"><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_IF_c darkToggleIcon_O_bk"><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_IF_c systemToggleIcon_SKeC"><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_qQFS"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_NcQk"><div class="docsWrapper_tjyD"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_J6bC" type="button"></button><div class="docRoot_mCS9"><aside class="theme-doc-sidebar-container docSidebarContainer_AIvH"><div class="sidebarViewport_v5_F"><div class="sidebar_TbVu"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_hz51"><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" href="/"><span title="Introduction" class="linkLabel_GBZK">Introduction</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_RHuM menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/getting-started/quickstart"><span title="Getting Started" class="categoryLinkLabel_ppUb">Getting Started</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/getting-started/quickstart"><span title="Quickstart" class="linkLabel_GBZK">Quickstart</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_RHuM menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0" href="/getting-started/deployment/railway"><span title="Deployment" class="categoryLinkLabel_ppUb">Deployment</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/getting-started/configuration"><span title="Configuration" class="linkLabel_GBZK">Configuration</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/getting-started/authentication"><span title="Authentication" class="linkLabel_GBZK">Authentication</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/getting-started/dashboard"><span title="Dashboard" class="linkLabel_GBZK">Dashboard</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_RHuM menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/tutorials/statusphere"><span title="Tutorials" class="categoryLinkLabel_ppUb">Tutorials</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_RHuM menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/guides/lexicons"><span title="Guides" class="categoryLinkLabel_ppUb">Guides</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_RHuM menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/sdk/overview"><span title="JavaScript SDK" class="categoryLinkLabel_ppUb">JavaScript SDK</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_RHuM menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/reference/xrpc-api"><span title="Reference" class="categoryLinkLabel_ppUb">Reference</span></a></div></li></ul></nav></div></div></aside><main class="docMainContainer_Gcuv"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_SLVn"><div class="docItemContainer_gUK8"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer__5rh" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_ilNI"><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"><span class="breadcrumbs__link">Getting Started</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Dashboard</span></li></ul></nav><div class="tocCollapsible_vaUl theme-doc-toc-mobile tocMobile_CcuZ"><button type="button" class="clean-btn tocCollapsibleButton__AHn">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Dashboard</h1></header><p>HappyView ships with a web dashboard that provides a visual interface for everything the <a class="" href="/reference/admin-api">admin API</a> offers. It runs as a separate Next.js application alongside the Rust backend and authenticates via atproto OAuth.</p><p>On a fresh deployment with no users in the database, the first person to log in to the dashboard is automatically bootstrapped as the super user with all permissions — so log in with the handle you want to own the instance first.</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="lexicons">Lexicons<a href="#lexicons" class="hash-link" aria-label="Direct link to Lexicons" title="Direct link to Lexicons" translate="no"></a></h2><p>Navigate to <strong>Lexicons</strong> to see all uploaded lexicons. Each entry shows the NSID, type (record, query, procedure), and whether a Lua script is attached.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="adding-a-lexicon">Adding a lexicon<a href="#adding-a-lexicon" class="hash-link" aria-label="Direct link to Adding a lexicon" title="Direct link to Adding a lexicon" translate="no"></a></h3><p>Click <strong>Add Lexicon</strong> and choose <strong>Local</strong> or <strong>Network</strong>.</p><p><strong>Local</strong> lexicons are defined by you. The editor shows two side-by-side panels (stacked on mobile):</p><ul><li class=""><strong>Lexicon JSON</strong> (left): define your lexicon schema</li><li class=""><strong>Lua Script</strong> (right): write the handler for query/procedure types</li></ul><p>The Lua panel only appears when the lexicon's <code>defs.main.type</code> is <code>query</code> or <code>procedure</code>. For record-type lexicons, only the JSON panel is shown.</p><p>HappyView generates a default Lua script when you first set the type to query or procedure. The template updates when the type changes, but once you edit the script your changes are preserved.</p><p>Toggle <strong>Enable backfill</strong> to index historical records when uploading a record-type lexicon.</p><p><strong>Network</strong> lexicons are fetched from the atproto network. Enter an NSID (e.g. <code>xyz.statusphere.status</code>) and HappyView resolves the schema automatically. If found, the lexicon JSON is displayed in a read-only editor. Click <strong>Add</strong> to track it. Network lexicons are kept up to date via the Jetstream subscription. See <a class="" href="/guides/lexicons#network-lexicons">Lexicons - Network lexicons</a> for how resolution works.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="json-editor">JSON editor<a href="#json-editor" class="hash-link" aria-label="Direct link to JSON editor" title="Direct link to JSON editor" translate="no"></a></h3><p>The JSON editor provides real-time validation against the atproto Lexicon v1 schema:</p><ul><li class="">Validation for Lexicon format</li><li class="">Auto-complete for definition types (<code>record</code>, <code>query</code>, <code>procedure</code>, <code>subscription</code>), property types (<code>string</code>, <code>integer</code>, <code>boolean</code>, <code>ref</code>, <code>union</code>, <code>blob</code>, <code>cid-link</code>, etc.), and schema structure (<code>defs</code>, <code>main</code>, <code>properties</code>, <code>required</code>)</li><li class="">Enforces the required top-level shape: <code>lexicon</code>, <code>id</code>, and <code>defs.main</code></li></ul><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="lua-editor">Lua editor<a href="#lua-editor" class="hash-link" aria-label="Direct link to Lua editor" title="Direct link to Lua editor" translate="no"></a></h3><p>The Lua editor provides context-aware code completions, including suggestions for the <code>Record</code>, <code>db</code>, <code>input</code>, and <code>params</code> APIs as well as Lua keywords, builtins, and standard library functions. It also has snippets for <code>if</code>, <code>for</code>, <code>function</code>, etc.</p><p>See <a class="" href="/guides/scripting">Lua Scripting</a> for the full runtime reference and examples.</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="records">Records<a href="#records" class="hash-link" aria-label="Direct link to Records" title="Direct link to Records" translate="no"></a></h2><p>Navigate to <strong>Records</strong> to browse all indexed atproto records. Records are grouped by collection and searchable. Each record shows its AT URI, author DID, and the raw record JSON.</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="backfill">Backfill<a href="#backfill" class="hash-link" aria-label="Direct link to Backfill" title="Direct link to Backfill" translate="no"></a></h2><p>Navigate to <strong>Backfill</strong> to view and manage backfill jobs. You can start a new backfill for any record-type lexicon to import historical records from the network. The page shows job status, progress (repos processed / total), and record counts. See <a class="" href="/guides/backfill">Backfill</a> for how the process works.</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="users">Users<a href="#users" class="hash-link" aria-label="Direct link to Users" title="Direct link to Users" translate="no"></a></h2><p>Navigate to <strong>Users</strong> to manage who can access the admin API and dashboard. You can add users by DID, assign permissions individually or via a template (<code>viewer</code>, <code>operator</code>, <code>manager</code>, <code>full_access</code>), and remove users. The super user is highlighted and has all permissions by default. See <a class="" href="/guides/permissions">Permissions</a> for what each permission grants.</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="events">Events<a href="#events" class="hash-link" aria-label="Direct link to Events" title="Direct link to Events" translate="no"></a></h2><p>Navigate to <strong>Events</strong> to view the audit log of admin actions. Events include user creation, lexicon uploads, permission changes, backfill starts, and more. Each entry shows the event type, severity, actor, subject, and timestamp. Events are retained for the number of days configured by <code>EVENT_LOG_RETENTION_DAYS</code> (default 30).</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="settings">Settings<a href="#settings" class="hash-link" aria-label="Direct link to Settings" title="Direct link to Settings" translate="no"></a></h2><p>The <strong>Settings</strong> section contains several sub-pages:</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="general">General<a href="#general" class="hash-link" aria-label="Direct link to General" title="Direct link to General" translate="no"></a></h3><p>Configure instance-level settings: application name, logo, terms of service URL, and privacy policy URL. These values appear on OAuth authorization screens and can also be set via environment variables — dashboard values take precedence.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="api-clients">API Clients<a href="#api-clients" class="hash-link" aria-label="Direct link to API Clients" title="Direct link to API Clients" translate="no"></a></h3><p>Register and manage third-party API clients. Each client gets an <code>hvc_…</code> client key and <code>hvs_…</code> client secret. You can configure the client type (confidential or public), allowed origins, scopes, and per-client rate limits. See <a class="" href="/getting-started/authentication#xrpc-api-client-identification">Authentication — API client identification</a> for how clients are used.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="api-keys">API Keys<a href="#api-keys" class="hash-link" aria-label="Direct link to API Keys" title="Direct link to API Keys" translate="no"></a></h3><p>Create and revoke admin API keys for automation. Each key is scoped to specific permissions and tied to the creating user. See <a class="" href="/guides/api-keys">API Keys</a> for details.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="users-1">Users<a href="#users-1" class="hash-link" aria-label="Direct link to Users" title="Direct link to Users" translate="no"></a></h3><p>An alternative path to the top-level Users page for managing user accounts and permissions.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="plugins">Plugins<a href="#plugins" class="hash-link" aria-label="Direct link to Plugins" title="Direct link to Plugins" translate="no"></a></h3><p>Manage installed plugins and configure plugin secrets. Plugins extend HappyView with additional functionality. Plugin secrets are encrypted at rest when <code>TOKEN_ENCRYPTION_KEY</code> is configured. See <a class="" href="/guides/plugins">Plugins</a> for details.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="labelers">Labelers<a href="#labelers" class="hash-link" aria-label="Direct link to Labelers" title="Direct link to Labelers" translate="no"></a></h3><p>Configure labeler subscriptions for content labeling. See <a class="" href="/guides/labelers">Labelers</a> for details.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="environment-variables">Environment Variables<a href="#environment-variables" class="hash-link" aria-label="Direct link to Environment Variables" title="Direct link to Environment Variables" translate="no"></a></h3><p>View the current values of all environment variables that affect HappyView's behavior. This is a read-only view — values are set via your deployment environment, not the dashboard.</p><h3 class="anchor anchorTargetStickyNavbar_zGuS" id="accounts">Accounts<a href="#accounts" class="hash-link" aria-label="Direct link to Accounts" title="Direct link to Accounts" translate="no"></a></h3><p>Manage connected atproto accounts used by the instance.</p><h2 class="anchor anchorTargetStickyNavbar_zGuS" id="next-steps">Next steps<a href="#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no"></a></h2><ul><li class=""><a class="" href="/guides/lexicons">Lexicons</a> — how lexicons drive HappyView's indexing and routing</li><li class=""><a class="" href="/guides/scripting">Lua Scripting</a> — write custom query and procedure logic</li><li class=""><a class="" href="/guides/permissions">Permissions</a> — manage user access to admin features</li><li class=""><a class="" href="/getting-started/configuration">Configuration</a> — full list of environment variables</li></ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/getting-started/authentication"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Authentication</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/tutorials/statusphere"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Statusphere</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_X45M thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#lexicons" class="table-of-contents__link toc-highlight">Lexicons</a><ul><li><a href="#adding-a-lexicon" class="table-of-contents__link toc-highlight">Adding a lexicon</a></li><li><a href="#json-editor" class="table-of-contents__link toc-highlight">JSON editor</a></li><li><a href="#lua-editor" class="table-of-contents__link toc-highlight">Lua editor</a></li></ul></li><li><a href="#records" class="table-of-contents__link toc-highlight">Records</a></li><li><a href="#backfill" class="table-of-contents__link toc-highlight">Backfill</a></li><li><a href="#users" class="table-of-contents__link toc-highlight">Users</a></li><li><a href="#events" class="table-of-contents__link toc-highlight">Events</a></li><li><a href="#settings" class="table-of-contents__link toc-highlight">Settings</a><ul><li><a href="#general" class="table-of-contents__link toc-highlight">General</a></li><li><a href="#api-clients" class="table-of-contents__link toc-highlight">API Clients</a></li><li><a href="#api-keys" class="table-of-contents__link toc-highlight">API Keys</a></li><li><a href="#users-1" class="table-of-contents__link toc-highlight">Users</a></li><li><a href="#plugins" class="table-of-contents__link toc-highlight">Plugins</a></li><li><a href="#labelers" class="table-of-contents__link toc-highlight">Labelers</a></li><li><a href="#environment-variables" class="table-of-contents__link toc-highlight">Environment Variables</a></li><li><a href="#accounts" class="table-of-contents__link toc-highlight">Accounts</a></li></ul></li><li><a href="#next-steps" class="table-of-contents__link toc-highlight">Next steps</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer"><div class="container container-fluid"><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2026 <a href="https://birb.house">Birbhouse Games</a>.</div></div></div></footer></div></body></html>