This commit is contained in:
vincent
2026-11-08 21:22:53 +00:00
commit b7457c5123
3199 changed files with 1005130 additions and 0 deletions

475
api/config.ts/index.html Normal file
View File

@@ -0,0 +1,475 @@
<!DOCTYPE html>
<html>
<head>
<title>api&#x2F;config.ts - gerbeur documentation</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="doc-current-file" content="">
<link rel="stylesheet" href="..&#x2F;..&#x2F;styles.css">
<link rel="stylesheet" href="..&#x2F;..&#x2F;page.css">
<link id="ddocResetStylesheet" rel="stylesheet" href="..&#x2F;..&#x2F;reset.css"><link href="../../comrak.css" rel="stylesheet" /><link href="../../prism.css" rel="stylesheet" /><script src="../../prism.js"></script><script src="..&#x2F;..&#x2F;script.js" defer></script>
<script src="..&#x2F;..&#x2F;darkmode_toggle.js"></script><script src="..&#x2F;..&#x2F;search_index.js" defer></script>
<script src="..&#x2F;..&#x2F;fuse.js" defer></script>
<script src="..&#x2F;..&#x2F;search.js" defer></script></head>
<body>
<div class="ddoc">
<div><nav id="topnav">
<div class="h-full">
<div class="flex items-center"><ul class="breadcrumbs">
<li>
<a href="..&#x2F;..&#x2F;" class="contextLink">gerbeur</a>
</li><span class="text-black dark:text-white"><svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M5.76748 11.8159C5.5378 11.577 5.54525 11.1972 5.78411 10.9675L8.93431 8L5.78411 5.0325C5.54525 4.80282 5.5378 4.423 5.76748 4.18413C5.99715 3.94527 6.37698 3.93782 6.61584 4.1675L10.2158 7.5675C10.3335 7.68062 10.4 7.83679 10.4 8C10.4 8.16321 10.3335 8.31938 10.2158 8.4325L6.61584 11.8325C6.37698 12.0622 5.99715 12.0547 5.76748 11.8159Z"
fill="currentColor"
/>
</svg>
</span>api&#x2F;config.ts</ul>
</div>
<div class="flex items-center gap-2">
<button id="theme-toggle" type="button" aria-label="Toggle dark mode" style="display: none;"><svg
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="currentColor"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z"
/>
</svg>
<svg
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="currentColor"
class="hidden"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z"
/>
<path
d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z"
/>
<path
d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z"
/>
<path
d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z"
/>
<path
d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z"
/>
<path
d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z"
/>
<path
d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z"
/>
<path
d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z"
/>
<path
d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z"
/>
</svg>
</button>
<input
type="text"
id="searchbar"
style="display: none;"
class="py-2 px-2.5 mx-1 rounded text-sm border border-gray-300 bg-transparent dark:bg-gray-800 dark:border-gray-700"
/>
</div>
</div>
</nav>
<div id="searchResults"></div><div id="content">
<main><section>
<div class="space-y-2 flex-1"><div class="space-y-7" id="module_doc"><div class="markdown"><p>Lets a deployment configure the server through the <code>GERBEUR_*</code> environment
variables, which it reads once at import, and holds the fixed limits the
backend applies. The deno tasks load <code>.env</code> with <code>--env-file</code>, so changing a
setting needs a restart.</p>
</div><section class="section" id="api&#x2F;config_ts_type-aliases"><div>
<h2 class="anchorable mb-1"><a href="#api&#x2F;config_ts_type-aliases" class="anchor" aria-label="Anchor" tabIndex="-1"><svg
width="16"
height="16"
viewBox="0 0 14 14"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1081_1237)">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M6.80328 2.8656C6.68736 2.99 6.62425 3.15454 6.62725 3.32456C6.63025 3.49457 6.69913 3.65678 6.81936 3.77702C6.9396 3.89725 7.10181 3.96613 7.27182 3.96913C7.44184 3.97213 7.60638 3.90902 7.73078 3.7931L8.82453 2.69935C8.98712 2.53676 9.18015 2.40778 9.39259 2.31978C9.60503 2.23179 9.83272 2.1865 10.0627 2.1865C10.2926 2.1865 10.5203 2.23179 10.7327 2.31978C10.9452 2.40778 11.1382 2.53676 11.3008 2.69935C11.4634 2.86194 11.5923 3.05497 11.6803 3.2674C11.7683 3.47984 11.8136 3.70753 11.8136 3.93747C11.8136 4.16741 11.7683 4.3951 11.6803 4.60754C11.5923 4.81998 11.4634 5.013 11.3008 5.1756L9.11328 7.3631C8.95075 7.52581 8.75775 7.65488 8.5453 7.74295C8.33285 7.83102 8.10513 7.87635 7.87516 7.87635C7.64518 7.87635 7.41746 7.83102 7.20501 7.74295C6.99256 7.65488 6.79956 7.52581 6.63703 7.3631C6.51263 7.24718 6.34809 7.18407 6.17807 7.18707C6.00806 7.19007 5.84585 7.25894 5.72561 7.37918C5.60538 7.49942 5.5365 7.66163 5.5335 7.83164C5.5305 8.00165 5.59361 8.1662 5.70953 8.2906C5.99391 8.57501 6.33154 8.80062 6.70312 8.95455C7.0747 9.10847 7.47296 9.18769 7.87516 9.18769C8.27736 9.18769 8.67562 9.10847 9.0472 8.95455C9.41878 8.80062 9.7564 8.57501 10.0408 8.2906L12.2283 6.1031C12.8026 5.52874 13.1253 4.74974 13.1253 3.93747C13.1253 3.12521 12.8026 2.34621 12.2283 1.77185C11.6539 1.19749 10.8749 0.874817 10.0627 0.874817C9.25039 0.874817 8.47139 1.19749 7.89703 1.77185L6.80328 2.8656ZM2.69953 11.3006C2.53682 11.1381 2.40774 10.9451 2.31968 10.7326C2.23161 10.5202 2.18628 10.2924 2.18628 10.0625C2.18628 9.8325 2.23161 9.60477 2.31968 9.39233C2.40774 9.17988 2.53682 8.98688 2.69953 8.82435L4.88703 6.63685C5.04956 6.47414 5.24256 6.34506 5.45501 6.25699C5.66746 6.16893 5.89518 6.1236 6.12516 6.1236C6.35513 6.1236 6.58285 6.16893 6.7953 6.25699C7.00775 6.34506 7.20075 6.47414 7.36328 6.63685C7.48768 6.75277 7.65223 6.81588 7.82224 6.81288C7.99225 6.80988 8.15446 6.741 8.2747 6.62077C8.39494 6.50053 8.46381 6.33832 8.46681 6.1683C8.46981 5.99829 8.4067 5.83375 8.29078 5.70935C8.0064 5.42494 7.66878 5.19933 7.2972 5.0454C6.92562 4.89148 6.52736 4.81225 6.12516 4.81225C5.72296 4.81225 5.3247 4.89148 4.95312 5.0454C4.58154 5.19933 4.24391 5.42494 3.95953 5.70935L1.77203 7.89685C1.19767 8.47121 0.875 9.25021 0.875 10.0625C0.875 10.8747 1.19767 11.6537 1.77203 12.2281C2.34639 12.8025 3.12539 13.1251 3.93766 13.1251C4.74992 13.1251 5.52892 12.8025 6.10328 12.2281L7.19703 11.1343C7.31295 11.0099 7.37606 10.8454 7.37306 10.6754C7.37006 10.5054 7.30119 10.3432 7.18095 10.2229C7.06071 10.1027 6.8985 10.0338 6.72849 10.0308C6.55848 10.0278 6.39393 10.0909 6.26953 10.2068L5.17578 11.3006C5.01325 11.4633 4.82025 11.5924 4.6078 11.6805C4.39535 11.7685 4.16763 11.8138 3.93766 11.8138C3.70768 11.8138 3.47996 11.7685 3.26751 11.6805C3.05506 11.5924 2.86206 11.4633 2.69953 11.3006Z"
fill="currentColor"
/>
</g>
<defs>
<clipPath id="clip0_1081_1237">
<rect width="14" height="14" fill="white" />
</clipPath>
</defs>
</svg>
</a>
Type Aliases</h2></div><div class="namespaceSection"><div id="namespace_bandcampplayer" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-TypeAlias bg-TypeAlias/15 dark:text-TypeAliasDark dark:bg-TypeAliasDark/15" title="Type Alias">T</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;BandcampPlayer.html" title="BandcampPlayer">
<span>BandcampPlayer</span><span> = <span><span class="td-str">"embed"</span><span class="td-op"> | </span><span class="td-str">"native"</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>How the frontend plays Bandcamp. <code>&quot;embed&quot;</code> uses Bandcamp's iframe, which
can't autoplay. <code>&quot;native&quot;</code> resolves the page's streams through
<code>GET /api/bandcamp/tracks</code> and plays them in the app's player, which
autoplays and queues an album's tracks.</p>
</div></div></div>
</div></div>
</section>
<section class="section" id="api&#x2F;config_ts_variables"><div>
<h2 class="anchorable mb-1"><a href="#api&#x2F;config_ts_variables" class="anchor" aria-label="Anchor" tabIndex="-1"><svg
width="16"
height="16"
viewBox="0 0 14 14"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1081_1237)">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M6.80328 2.8656C6.68736 2.99 6.62425 3.15454 6.62725 3.32456C6.63025 3.49457 6.69913 3.65678 6.81936 3.77702C6.9396 3.89725 7.10181 3.96613 7.27182 3.96913C7.44184 3.97213 7.60638 3.90902 7.73078 3.7931L8.82453 2.69935C8.98712 2.53676 9.18015 2.40778 9.39259 2.31978C9.60503 2.23179 9.83272 2.1865 10.0627 2.1865C10.2926 2.1865 10.5203 2.23179 10.7327 2.31978C10.9452 2.40778 11.1382 2.53676 11.3008 2.69935C11.4634 2.86194 11.5923 3.05497 11.6803 3.2674C11.7683 3.47984 11.8136 3.70753 11.8136 3.93747C11.8136 4.16741 11.7683 4.3951 11.6803 4.60754C11.5923 4.81998 11.4634 5.013 11.3008 5.1756L9.11328 7.3631C8.95075 7.52581 8.75775 7.65488 8.5453 7.74295C8.33285 7.83102 8.10513 7.87635 7.87516 7.87635C7.64518 7.87635 7.41746 7.83102 7.20501 7.74295C6.99256 7.65488 6.79956 7.52581 6.63703 7.3631C6.51263 7.24718 6.34809 7.18407 6.17807 7.18707C6.00806 7.19007 5.84585 7.25894 5.72561 7.37918C5.60538 7.49942 5.5365 7.66163 5.5335 7.83164C5.5305 8.00165 5.59361 8.1662 5.70953 8.2906C5.99391 8.57501 6.33154 8.80062 6.70312 8.95455C7.0747 9.10847 7.47296 9.18769 7.87516 9.18769C8.27736 9.18769 8.67562 9.10847 9.0472 8.95455C9.41878 8.80062 9.7564 8.57501 10.0408 8.2906L12.2283 6.1031C12.8026 5.52874 13.1253 4.74974 13.1253 3.93747C13.1253 3.12521 12.8026 2.34621 12.2283 1.77185C11.6539 1.19749 10.8749 0.874817 10.0627 0.874817C9.25039 0.874817 8.47139 1.19749 7.89703 1.77185L6.80328 2.8656ZM2.69953 11.3006C2.53682 11.1381 2.40774 10.9451 2.31968 10.7326C2.23161 10.5202 2.18628 10.2924 2.18628 10.0625C2.18628 9.8325 2.23161 9.60477 2.31968 9.39233C2.40774 9.17988 2.53682 8.98688 2.69953 8.82435L4.88703 6.63685C5.04956 6.47414 5.24256 6.34506 5.45501 6.25699C5.66746 6.16893 5.89518 6.1236 6.12516 6.1236C6.35513 6.1236 6.58285 6.16893 6.7953 6.25699C7.00775 6.34506 7.20075 6.47414 7.36328 6.63685C7.48768 6.75277 7.65223 6.81588 7.82224 6.81288C7.99225 6.80988 8.15446 6.741 8.2747 6.62077C8.39494 6.50053 8.46381 6.33832 8.46681 6.1683C8.46981 5.99829 8.4067 5.83375 8.29078 5.70935C8.0064 5.42494 7.66878 5.19933 7.2972 5.0454C6.92562 4.89148 6.52736 4.81225 6.12516 4.81225C5.72296 4.81225 5.3247 4.89148 4.95312 5.0454C4.58154 5.19933 4.24391 5.42494 3.95953 5.70935L1.77203 7.89685C1.19767 8.47121 0.875 9.25021 0.875 10.0625C0.875 10.8747 1.19767 11.6537 1.77203 12.2281C2.34639 12.8025 3.12539 13.1251 3.93766 13.1251C4.74992 13.1251 5.52892 12.8025 6.10328 12.2281L7.19703 11.1343C7.31295 11.0099 7.37606 10.8454 7.37306 10.6754C7.37006 10.5054 7.30119 10.3432 7.18095 10.2229C7.06071 10.1027 6.8985 10.0338 6.72849 10.0308C6.55848 10.0278 6.39393 10.0909 6.26953 10.2068L5.17578 11.3006C5.01325 11.4633 4.82025 11.5924 4.6078 11.6805C4.39535 11.7685 4.16763 11.8138 3.93766 11.8138C3.70768 11.8138 3.47996 11.7685 3.26751 11.6805C3.05506 11.5924 2.86206 11.4633 2.69953 11.3006Z"
fill="currentColor"
/>
</g>
<defs>
<clipPath id="clip0_1081_1237">
<rect width="14" height="14" fill="white" />
</clipPath>
</defs>
</svg>
</a>
Variables</h2></div><div class="namespaceSection"><div id="namespace_allowed_origins" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;ALLOWED_ORIGINS.html" title="ALLOWED_ORIGINS">
<span>ALLOWED_ORIGINS</span><span>: <span class="td-kw">string</span>[]</span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The origins that CORS in main.ts and the WebSocket route accept. They are
<a href="../.././api/config.ts/~/PUBLIC_URL.html">PUBLIC_URL</a>, <a href="../.././api/config.ts/~/FRONTEND_URL.html">FRONTEND_URL</a> and the comma-separated
<code>GERBEUR_ALLOWED_ORIGINS</code>.</p>
</div></div></div>
</div><div id="namespace_attachments_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;ATTACHMENTS_DIR.html" title="ATTACHMENTS_DIR">
<span>ATTACHMENTS_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Holds the images pasted into chat messages, comments, dump notes and
descriptions. The startup tasks purge those nothing links to.</p>
</div></div></div>
</div><div id="namespace_avatars_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;AVATARS_DIR.html" title="AVATARS_DIR">
<span>AVATARS_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Holds each user's avatar.</p>
</div></div></div>
</div><div id="namespace_bandcamp_player" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;BANDCAMP_PLAYER.html" title="BANDCAMP_PLAYER">
<span>BANDCAMP_PLAYER</span><span>: <span class="td-ref">BandcampPlayer</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>How the frontend plays Bandcamp (<code>GERBEUR_BANDCAMP_PLAYER</code>), passed to it in
index.html. Any value but <code>&quot;native&quot;</code> means <code>&quot;embed&quot;</code>, so a typo falls back to
the player that always works.</p>
</div></div></div>
</div><div id="namespace_community_refresh_minutes" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;COMMUNITY_REFRESH_MINUTES.html" title="COMMUNITY_REFRESH_MINUTES">
<span>COMMUNITY_REFRESH_MINUTES</span><span>: <span class="td-kw">number</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>How often, in minutes, the <code>/community</code> page's figures are recomputed
(<code>GERBEUR_COMMUNITY_REFRESH_MINUTES</code>), 15 by default.</p>
</div></div></div>
</div><div id="namespace_db_path" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;DB_PATH.html" title="DB_PATH">
<span>DB_PATH</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The SQLite database file (<code>GERBEUR_DB_PATH</code>). api/test/setup.ts points it at
a throwaway file before anything opens the database.</p>
</div></div></div>
</div><div id="namespace_default_style" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;DEFAULT_STYLE.html" title="DEFAULT_STYLE">
<span>DEFAULT_STYLE</span><span>: <span class="td-ref">StyleName</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The instance's style (<code>GERBEUR_DEFAULT_STYLE</code>). The site shows it until a
visitor or their account picks one, through index.html, and the emails that
aren't a user's own (the welcome and the password reset) are drawn in it. A
value that isn't a style means <a href="../.././shared/theme.ts/~/BASE_STYLE.html">BASE_STYLE</a>.</p>
</div></div></div>
</div><div id="namespace_dump_allowed_mime_prefixes" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;DUMP_ALLOWED_MIME_PREFIXES.html" title="DUMP_ALLOWED_MIME_PREFIXES">
<span>DUMP_ALLOWED_MIME_PREFIXES</span><span>: <span class="td-kw">string</span>[]</span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The MIME type prefixes a file dump may have. dump-service also accepts the
exact types of <a href="../.././api/config.ts/~/DUMP_ALLOWED_MIME_TYPES.html">DUMP_ALLOWED_MIME_TYPES</a>.</p>
</div></div></div>
</div><div id="namespace_dump_allowed_mime_types" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;DUMP_ALLOWED_MIME_TYPES.html" title="DUMP_ALLOWED_MIME_TYPES">
<span>DUMP_ALLOWED_MIME_TYPES</span><span>: <span class="td-ref">Set</span>&lt;<span class="td-kw">string</span>&gt;</span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The documents and archives a file dump may be, beyond the prefixes.</p>
</div></div></div>
</div><div id="namespace_dumps_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;DUMPS_DIR.html" title="DUMPS_DIR">
<span>DUMPS_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Holds the file of each file dump.</p>
</div></div></div>
</div><div id="namespace_email_enabled" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;EMAIL_ENABLED.html" title="EMAIL_ENABLED">
<span>EMAIL_ENABLED</span><span>: <span class="td-kw">boolean</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Whether the instance sends email, which is whether <a href="../.././api/config.ts/~/SMTPS_URL.html">SMTPS_URL</a> is
set. <code>email-service.ts</code> opens its transport by it, and index.html tells the
client, whose settings show the digest switches disabled without it.</p>
</div></div></div>
</div><div id="namespace_email_locale" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;EMAIL_LOCALE.html" title="EMAIL_LOCALE">
<span>EMAIL_LOCALE</span><span>: <span class="td-ref">Locale</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The language of every email (<code>GERBEUR_EMAIL_LOCALE</code>). The interface picks
each visitor's language in their browser, which the server never learns, so
the emails take the instance's. A value that isn't a locale means the
source one, English.</p>
</div></div></div>
</div><div id="namespace_federation" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;FEDERATION.html" title="FEDERATION">
<span>FEDERATION</span><span>: { incoming<span>: <span class="td-kw">boolean</span></span>; outgoing<span>: <span class="td-kw">boolean</span></span>; }</span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Which ways federated sign-in goes, each on unless set to <code>0</code>.</p>
</div></div><ul class="namespaceItemContentSubItems"><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;FEDERATION.html#property_incoming">
<span>incoming</span><span>: <span class="td-kw">boolean</span></span></a></li><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;FEDERATION.html#property_outgoing">
<span>outgoing</span><span>: <span class="td-kw">boolean</span></span></a></li></ul></div>
</div><div id="namespace_federation_allow_private" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;FEDERATION_ALLOW_PRIVATE.html" title="FEDERATION_ALLOW_PRIVATE">
<span>FEDERATION_ALLOW_PRIVATE</span><span>: <span class="td-kw">boolean</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Lets federated sign-in reach instances on private addresses, <code>localhost</code>
among them, and over plain http (<code>GERBEUR_FEDERATION_ALLOW_PRIVATE=1</code>), so
that two instances on one machine can trust each other in development.
Off, <code>remote/gerbeur-instance.ts</code> reaches only public https instances, since
an identity is only as safe as the connection it came over.</p>
</div></div></div>
</div><div id="namespace_from_email" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;FROM_EMAIL.html" title="FROM_EMAIL">
<span>FROM_EMAIL</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The <code>From</code> address of every email (<code>GERBEUR_FROM_EMAIL</code>), as an address or
as <code>Name &lt;address&gt;</code>. <code>email-service.ts</code> refuses to load without it when
<a href="../.././api/config.ts/~/SMTPS_URL.html">SMTPS_URL</a> is set.</p>
</div></div></div>
</div><div id="namespace_frontend_url" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;FRONTEND_URL.html" title="FRONTEND_URL">
<span>FRONTEND_URL</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Points password reset links and the Open Graph tags' page URLs at the
frontend when it isn't served from <a href="../.././api/config.ts/~/PUBLIC_URL.html">PUBLIC_URL</a>, as with a separate
Vite server, and allows it as an origin. It is <code>GERBEUR_FRONTEND_URL</code>,
without a trailing slash.</p>
</div></div></div>
</div><div id="namespace_jwt_secret" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;JWT_SECRET.html" title="JWT_SECRET">
<span>JWT_SECRET</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The key lib/jwt.ts signs and verifies tokens with (<code>GERBEUR_JWT_SECRET</code>).
The server refuses to start without it.</p>
</div></div></div>
</div><div id="namespace_listen_host" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;LISTEN_HOST.html" title="LISTEN_HOST">
<span>LISTEN_HOST</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The interface the server binds to (<code>GERBEUR_LISTEN_HOST</code>). The default,
0.0.0.0, lets Docker forward the port; 127.0.0.1 keeps it to loopback.</p>
</div></div></div>
</div><div id="namespace_max_image_size_bytes" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;MAX_IMAGE_SIZE_BYTES.html" title="MAX_IMAGE_SIZE_BYTES">
<span>MAX_IMAGE_SIZE_BYTES</span><span>: <span class="td-kw">number</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Caps the size of an image upload, in bytes, for avatars, covers, thumbnails
and attachments. lib/upload.ts states it in megabytes in its error.</p>
</div></div></div>
</div><div id="namespace_og_site_name" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;OG_SITE_NAME.html" title="OG_SITE_NAME">
<span>OG_SITE_NAME</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The site's name (<code>GERBEUR_SITE_NAME</code>). It is filled into index.html, the OG
tags, the icons' manifest and the emails.</p>
</div></div></div>
</div><div id="namespace_orphaned_attachments_retention_hours" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;ORPHANED_ATTACHMENTS_RETENTION_HOURS.html" title="ORPHANED_ATTACHMENTS_RETENTION_HOURS">
<span>ORPHANED_ATTACHMENTS_RETENTION_HOURS</span><span>: <span class="td-lit">1</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>How long an attachment nothing links to is kept before startup purges it.</p>
</div></div></div>
</div><div id="namespace_pagination_default_limit" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;PAGINATION_DEFAULT_LIMIT.html" title="PAGINATION_DEFAULT_LIMIT">
<span>PAGINATION_DEFAULT_LIMIT</span><span>: <span class="td-lit">20</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The page size when a request names none.</p>
</div></div></div>
</div><div id="namespace_pagination_max_limit" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;PAGINATION_MAX_LIMIT.html" title="PAGINATION_MAX_LIMIT">
<span>PAGINATION_MAX_LIMIT</span><span>: <span class="td-lit">100</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The largest page size a request may ask for.</p>
</div></div></div>
</div><div id="namespace_playlist_images_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;PLAYLIST_IMAGES_DIR.html" title="PLAYLIST_IMAGES_DIR">
<span>PLAYLIST_IMAGES_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Holds each playlist's cover.</p>
</div></div></div>
</div><div id="namespace_port" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;PORT.html" title="PORT">
<span>PORT</span><span>: <span class="td-kw">number</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The port the server listens on (<code>GERBEUR_PORT</code>, default 8000).</p>
</div></div></div>
</div><div id="namespace_public_url" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;PUBLIC_URL.html" title="PUBLIC_URL">
<span>PUBLIC_URL</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The URL visitors reach the server at (<code>GERBEUR_PUBLIC_URL</code>), without a
trailing slash. Behind a reverse proxy it must be the outside URL: it is an
allowed origin, it tells links to this site's own pages from other links,
and it prefixes the image URLs in their previews.</p>
</div></div></div>
</div><div id="namespace_scaled_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;SCALED_DIR.html" title="SCALED_DIR">
<span>SCALED_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Holds the scaled-down copies of the images above, which lib/ffmpeg.ts makes
as they are first asked for, each at its upload's path with its width. It
can be emptied at any time: the copies are made again.</p>
</div></div></div>
</div><div id="namespace_site_emoji" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;SITE_EMOJI.html" title="SITE_EMOJI">
<span>SITE_EMOJI</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The emoji that serves as the site's logo (<code>GERBEUR_SITE_EMOJI</code>). The icons
script draws the favicons from it, and index.html carries it to the app's
header, so changing it needs a restart but no rebuild.</p>
</div></div></div>
</div><div id="namespace_smtps_url" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;SMTPS_URL.html" title="SMTPS_URL">
<span>SMTPS_URL</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The <code>smtps://</code> URL of the server <code>email-service.ts</code> sends mail through
(<code>GERBEUR_SMTPS_URL</code>). When it is empty, no email is sent: sign-up sends no
welcome, a password reset request does nothing, and there are no digests.</p>
</div></div></div>
</div><div id="namespace_theme_color" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;THEME_COLOR.html" title="THEME_COLOR">
<span>THEME_COLOR</span><span>: <span class="td-str">"#111827"</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The background of the generated Apple touch icon, the manifest's colors, and
the accent of previews of this site's own pages. index.html's <code>theme-color</code>
tags don't follow it.</p>
</div></div></div>
</div><div id="namespace_thumbnails_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;THUMBNAILS_DIR.html" title="THUMBNAILS_DIR">
<span>THUMBNAILS_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Holds the thumbnails a poster uploads (<code>&lt;id&gt;-custom</code>) and those the
thumbnails route generates from file dumps.</p>
</div></div></div>
</div><div id="namespace_unused_invites_retention_days" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;UNUSED_INVITES_RETENTION_DAYS.html" title="UNUSED_INVITES_RETENTION_DAYS">
<span>UNUSED_INVITES_RETENTION_DAYS</span><span>: <span class="td-lit">7</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>How long an invite stays usable. invite-service refuses an older one, and
the startup tasks purge it.</p>
</div></div></div>
</div><div id="namespace_uploads_dir" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;UPLOADS_DIR.html" title="UPLOADS_DIR">
<span>UPLOADS_DIR</span><span>: <span class="td-kw">string</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The directory uploads are stored under (<code>GERBEUR_UPLOADS_DIR</code>). Each kind has
its subdirectory below, created by the first upload, and each file is named
after the id of what it belongs to.</p>
</div></div></div>
</div><div id="namespace_welcome_email_body" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Variable bg-Variable/15 dark:text-VariableDark dark:bg-VariableDark/15" title="Variable">v</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;config.ts&#x2F;~&#x2F;WELCOME_EMAIL_BODY.html" title="WELCOME_EMAIL_BODY">
<span>WELCOME_EMAIL_BODY</span><span>: <span><span class="td-kw">string</span><span class="td-op"> | </span><span class="td-kw">null</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>The Markdown of the welcome email sent on registration
(<code>GERBEUR_WELCOME_EMAIL_BODY</code>), or null for the built-in one in the
<a href="../.././api/config.ts/~/EMAIL_LOCALE.html">EMAIL_LOCALE</a>. <code>api/mail/welcome.ts</code> replaces <code>{{site_name}}</code> and
<code>{{username}}</code> in it.</p>
</div></div></div>
</div></div>
</section>
</div>
</div>
</section>
</main><div class="toc">
<div><div class="usageContent">
<h3>Usage</h3><div class="markdown"><pre class="highlight"><code class="language-typescript">import * as mod from &quot;api/config.ts&quot;;
</code><button class="copyButton" data-copy="import * as mod from &quot;api/config.ts&quot;;
"><svg
class="copy"
width="15"
height="15"
viewBox="0 0 15 15"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect x="2" y="2" width="7" height="7" fill="none" />
<rect x="6" y="6" width="7" height="7" fill="none" />
<path
d="M1.55566 2.7C1.55566 2.03726 2.09292 1.5 2.75566 1.5H8.75566C9.41841 1.5 9.95566 2.03726 9.95566 2.7V5.1H12.3557C13.0184 5.1 13.5557 5.63726 13.5557 6.3V12.3C13.5557 12.9627 13.0184 13.5 12.3557 13.5H6.35566C5.69292 13.5 5.15566 12.9627 5.15566 12.3V9.9H2.75566C2.09292 9.9 1.55566 9.36274 1.55566 8.7V2.7ZM6.35566 9.9V12.3H12.3557V6.3H9.95566V8.7C9.95566 9.36274 9.41841 9.9 8.75566 9.9H6.35566ZM8.75566 8.7V2.7H2.75566V8.7H8.75566Z"
fill="currentColor"
/>
</svg>
<svg
class="check"
width="15"
height="15"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
xmlns="http://www.w3.org/2000/svg"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M5 12l5 5l10 -10" />
</svg>
</button><code></code></pre>
</div></div><nav class="topSymbols">
<h3>Symbols</h3>
<ul><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;AuthState.html" title="AuthState"><div class="docNodeKindIcon"><div class="text-Interface bg-Interface/15 dark:text-InterfaceDark dark:bg-InterfaceDark/15" title="Interface">I</div></div>
<span class="hover:bg-Interface/15 hover:bg-InterfaceDark/15">
AuthState
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;AuthContext.html" title="AuthContext"><div class="docNodeKindIcon"><div class="text-TypeAlias bg-TypeAlias/15 dark:text-TypeAliasDark dark:bg-TypeAliasDark/15" title="Type Alias">T</div></div>
<span class="hover:bg-TypeAlias/15 hover:bg-TypeAliasDark/15">
AuthContext
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;authMiddleware.html" title="authMiddleware"><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<span class="hover:bg-Function/15 hover:bg-FunctionDark/15">
authMiddleware
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;requirePermission.html" title="requirePermission"><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<span class="hover:bg-Function/15 hover:bg-FunctionDark/15">
requirePermission
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;error.ts&#x2F;~&#x2F;errorMiddleware.html" title="errorMiddleware"><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<span class="hover:bg-Function/15 hover:bg-FunctionDark/15">
errorMiddleware
</span>
</a>
</li></ul><a class="flex items-center gap-0.5" href="..&#x2F;..&#x2F;.&#x2F;all_symbols.html">
<span class="leading-none">view all 1307 symbols</span><svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M5.76748 11.8159C5.5378 11.577 5.54525 11.1972 5.78411 10.9675L8.93431 8L5.78411 5.0325C5.54525 4.80282 5.5378 4.423 5.76748 4.18413C5.99715 3.94527 6.37698 3.93782 6.61584 4.1675L10.2158 7.5675C10.3335 7.68062 10.4 7.83679 10.4 8C10.4 8.16321 10.3335 8.31938 10.2158 8.4325L6.61584 11.8325C6.37698 12.0622 5.99715 12.0547 5.76748 11.8159Z"
fill="currentColor"
/>
</svg>
</a></nav><nav class="documentNavigation">
<h3>Document Navigation</h3><ul><li><a href="#api/config_ts_type-aliases" title="Type Aliases">Type Aliases</a></li><li><ul><li><a href="#namespace_bandcampplayer" title="BandcampPlayer">BandcampPlayer</a></li></ul></li><li><a href="#api/config_ts_variables" title="Variables">Variables</a></li><li><ul><li><a href="#namespace_allowed_origins" title="ALLOWED_ORIGINS">ALLOWED_ORIGINS</a></li><li><a href="#namespace_attachments_dir" title="ATTACHMENTS_DIR">ATTACHMENTS_DIR</a></li><li><a href="#namespace_avatars_dir" title="AVATARS_DIR">AVATARS_DIR</a></li><li><a href="#namespace_bandcamp_player" title="BANDCAMP_PLAYER">BANDCAMP_PLAYER</a></li><li><a href="#namespace_community_refresh_minutes" title="COMMUNITY_REFRESH_MINUTES">COMMUNITY_REFRESH_MINUTES</a></li><li><a href="#namespace_db_path" title="DB_PATH">DB_PATH</a></li><li><a href="#namespace_default_style" title="DEFAULT_STYLE">DEFAULT_STYLE</a></li><li><a href="#namespace_dump_allowed_mime_prefixes" title="DUMP_ALLOWED_MIME_PREFIXES">DUMP_ALLOWED_MIME_PREFIXES</a></li><li><a href="#namespace_dump_allowed_mime_types" title="DUMP_ALLOWED_MIME_TYPES">DUMP_ALLOWED_MIME_TYPES</a></li><li><a href="#namespace_dumps_dir" title="DUMPS_DIR">DUMPS_DIR</a></li><li><a href="#namespace_email_enabled" title="EMAIL_ENABLED">EMAIL_ENABLED</a></li><li><a href="#namespace_email_locale" title="EMAIL_LOCALE">EMAIL_LOCALE</a></li><li><a href="#namespace_federation" title="FEDERATION">FEDERATION</a></li><li><a href="#namespace_federation_allow_private" title="FEDERATION_ALLOW_PRIVATE">FEDERATION_ALLOW_PRIVATE</a></li><li><a href="#namespace_from_email" title="FROM_EMAIL">FROM_EMAIL</a></li><li><a href="#namespace_frontend_url" title="FRONTEND_URL">FRONTEND_URL</a></li><li><a href="#namespace_jwt_secret" title="JWT_SECRET">JWT_SECRET</a></li><li><a href="#namespace_listen_host" title="LISTEN_HOST">LISTEN_HOST</a></li><li><a href="#namespace_max_image_size_bytes" title="MAX_IMAGE_SIZE_BYTES">MAX_IMAGE_SIZE_BYTES</a></li><li><a href="#namespace_og_site_name" title="OG_SITE_NAME">OG_SITE_NAME</a></li><li><a href="#namespace_orphaned_attachments_retention_hours" title="ORPHANED_ATTACHMENTS_RETENTION_HOURS">ORPHANED_ATTACHMENTS_RETENTION_HOURS</a></li><li><a href="#namespace_pagination_default_limit" title="PAGINATION_DEFAULT_LIMIT">PAGINATION_DEFAULT_LIMIT</a></li><li><a href="#namespace_pagination_max_limit" title="PAGINATION_MAX_LIMIT">PAGINATION_MAX_LIMIT</a></li><li><a href="#namespace_playlist_images_dir" title="PLAYLIST_IMAGES_DIR">PLAYLIST_IMAGES_DIR</a></li><li><a href="#namespace_port" title="PORT">PORT</a></li><li><a href="#namespace_public_url" title="PUBLIC_URL">PUBLIC_URL</a></li><li><a href="#namespace_scaled_dir" title="SCALED_DIR">SCALED_DIR</a></li><li><a href="#namespace_site_emoji" title="SITE_EMOJI">SITE_EMOJI</a></li><li><a href="#namespace_smtps_url" title="SMTPS_URL">SMTPS_URL</a></li><li><a href="#namespace_theme_color" title="THEME_COLOR">THEME_COLOR</a></li><li><a href="#namespace_thumbnails_dir" title="THUMBNAILS_DIR">THUMBNAILS_DIR</a></li><li><a href="#namespace_unused_invites_retention_days" title="UNUSED_INVITES_RETENTION_DAYS">UNUSED_INVITES_RETENTION_DAYS</a></li><li><a href="#namespace_uploads_dir" title="UPLOADS_DIR">UPLOADS_DIR</a></li><li><a href="#namespace_welcome_email_body" title="WELCOME_EMAIL_BODY">WELCOME_EMAIL_BODY</a></li></ul></li></ul></nav></div>
</div></div>
</div>
</div>
</body>
</html>