homepage: HF source links per model; docs reorder (AI last), arr stack out of family docs

This commit is contained in:
Frank
2026-10-08 04:00:26 -07:00
parent 8c5bde7034
commit f148ecab4a
5 changed files with 55 additions and 35 deletions
@@ -152,6 +152,18 @@ effect layer is stripped under `data-bare="1"` (the e2e bare page).
Unit: `tests/homepage_config.bats` (referenced art files exist, model
blocks well-formed, deployer ships the `img/` tree).
**Docs reorder + model source links (2026-10-08, fifth wave):** the docs
page section order is now getting-in → troubleshooting → media → chat →
models → api-access (non-AI first, AI last). The *arr stack (Prowlarr,
Sonarr, Radarr, Lidarr, Readarr, qBittorrent) is out of the family docs
entirely — admin tooling; Seerr is presented as the front door for
requests. Each fleet model gained a Hugging Face source link: card field
`model.hf` rendered as the cyan `model on huggingface ↗` line under the
role, and the docs `Model:` bullets link the checkpoint names (zealot →
HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive, dragoon →
Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated, archon →
Qwen/Qwen3.8-Flash-Next-FP8).
## Design decision — 2026-08-22
The live up/down check runs server-side. A checker on Dankclaw probes each backend and writes a same-origin `status.json`. The page fetches only that file and renders the badges. The browser never calls a backend directly. The checker runs as a systemd timer every 3 minutes.
+4 -1
View File
@@ -83,7 +83,10 @@ function miCard(svc, state) {
'<img class="mi-art" src="/img/unit-' + esc(m.unit) + '.jpg" alt="' + esc(m.unit) + '">' +
'<div class="mi-head"><div class="mi-id"><span class="badge ' + state + '">' + BADGE_LABEL[state] + '</span>' +
'<span class="mi-name">' + esc(svc.name) + '</span></div>' +
'<div class="mi-role">' + esc(m.role) + '</div></div></div>',
'<div class="mi-role">' + esc(m.role) + '</div>' +
(m.hf ? '<a class="mi-hf" href="' + esc(m.hf) +
'" target="_blank" rel="noopener">model on huggingface &#8599;</a>' : '') +
'</div></div>',
voiceBtn(m.tagline, m.sfx)
];
if (m.equiv) parts.push('<div class="mi-equiv">' + esc(m.equiv) + '</div>');
+33 -33
View File
@@ -32,6 +32,36 @@
</ul>
</section>
<section id="troubleshooting">
<h1>When something looks broken</h1>
<ul>
<li><strong>A status card says DOWN.</strong> Reload the page once; the checker
re-probes every few minutes. If it stays down, that service really is unhappy — tell Frank.</li>
<li><strong>"status unavailable" on the homepage.</strong> The page couldn't read
its status file. Hard-reload (Ctrl/Cmd-Shift-R).</li>
<li><strong>Connection timeout on a home device.</strong> Nine times out of ten
the device isn't using the house DNS (Pi-hole at 192.168.0.143) and resolved
our names to the public address, which doesn't answer. Point the device's DNS at
192.168.0.143 and retry.</li>
<li><strong>The bot-check spins forever.</strong> Let it finish; heavy JS blocking
(privacy extensions) can starve it. Pause the blocker, reload, resume.</li>
</ul>
</section>
<section id="media">
<h1>Media &amp; files</h1>
<ul>
<li><strong>Movies &amp; TV:</strong> request with <a href="https://seerr.franksdank.cloud">Seerr</a>;
watch with <a href="https://plex.franksdank.cloud/web/index.html">Plex</a> or
<a href="https://jelly.franksdank.cloud">Jellyfin</a>. Seerr is the front door —
requests ride the VPN tunnel from there.</li>
<li><strong>Books:</strong> <a href="https://books.franksdank.cloud">Calibre-Web</a> — the e-book library, with its own login.</li>
<li><strong>Games:</strong> <a href="https://romm.franksdank.cloud">RomM</a> — ROM library and emulator collection.</li>
<li><strong>Raw files:</strong> <a href="https://files.franksdank.cloud">Copyparty</a> — direct downloads and shares.</li>
<li><strong>Search:</strong> <a href="https://search.franksdank.cloud">SearXNG</a> — metasearch, VPN-routed, no AI snoop. <span class="key-warn" title="Searches are obfuscated, not anonymous: SearXNG hides you from the upstream engines and the VPN tunnel hides the traffic from the LAN &mdash; but the upstream search API keys are tied to Frank&rsquo;s identity. Don&rsquo;t treat it as Tor.">&#9888; privacy note &mdash; hover to read</span></li>
</ul>
</section>
<section id="chat">
<h1>Talking to the AI</h1>
<p>The everyday front door is <a href="https://ai.franksdank.cloud">Open&nbsp;WebUI</a>,
@@ -61,7 +91,7 @@
<h2>frank-zealot — the fast utility model <em>(api id: frank-secondary)</em></h2>
<ul>
<li><strong>Model:</strong> Qwen3.5-9B-Uncensored (Q6_K) on the RTX&nbsp;3090 — roughly 95 tokens per second.</li>
<li><strong>Model:</strong> <a href="https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive" target="_blank" rel="noopener">Qwen3.5-9B-Uncensored</a> (Q6_K) on the RTX&nbsp;3090 — roughly 95 tokens per second.</li>
<li><strong>Equivalent:</strong> last year's frontier level (2025).</li>
<li><strong>Capacity:</strong> 200k-token context, two submissions at a time; sees images.</li>
<li><strong>Inputs:</strong> text, image.</li>
@@ -73,7 +103,7 @@
<h2>frank-dragoon — deep reasoning <em>(api id: frank-large)</em></h2>
<ul>
<li><strong>Model:</strong> Qwen3.8-Flash-Next v2 Swift1.5 abliterated (halogen flash-server, ~62&nbsp;GiB) on the Strix Halo iGPU — an abliterated (censorship-removed) edition that thinks before answering.</li>
<li><strong>Model:</strong> <a href="https://huggingface.co/Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated" target="_blank" rel="noopener">Qwen3.8-Flash-Next v2 Swift1.5 abliterated</a> (halogen flash-server, ~62&nbsp;GiB) on the Strix Halo iGPU — an abliterated (censorship-removed) edition that thinks before answering.</li>
<li><strong>Equivalent:</strong> Claude Sonnet 5 / OpenAI-Luna (Summer 2026 frontier intelligence).</li>
<li><strong>Capacity:</strong> 200k-token context, two submissions at a time; sees images.</li>
<li><strong>Inputs:</strong> text, image.</li>
@@ -83,7 +113,7 @@
<h2>frank-archon — the big one <em>(api id: frank-primary)</em></h2>
<ul>
<li><strong>Model:</strong> Qwen3.8-Flash-Next at native FP8 precision (radiance, 173&nbsp;GiB) on twin AMD R9700s with more than 200&nbsp;GB of system RAM — the biggest brain on the network and the fastest runtime.</li>
<li><strong>Model:</strong> <a href="https://huggingface.co/Qwen/Qwen3.8-Flash-Next-FP8" target="_blank" rel="noopener">Qwen3.8-Flash-Next</a> at native FP8 precision (radiance, 173&nbsp;GiB) on twin AMD R9700s with more than 200&nbsp;GB of system RAM — the biggest brain on the network and the fastest runtime.</li>
<li><strong>Equivalent:</strong> Claude Opus 4.8 / OpenAI-Terra (Summer 2026 frontier intelligence).</li>
<li><strong>Capacity:</strong> 200k-token context, two submissions at a time; sees images.</li>
<li><strong>Inputs:</strong> text, image.</li>
@@ -174,36 +204,6 @@
Want a bigger model (<code>frank-archon</code>, <code>frank-dragoon</code>)? Ask Frank to raise your access.</p>
</section>
<section id="media">
<h1>Media &amp; files</h1>
<ul>
<li><strong>Movies &amp; TV:</strong> request with <a href="https://seerr.franksdank.cloud">Seerr</a>;
watch with <a href="https://plex.franksdank.cloud/web/index.html">Plex</a> or
<a href="https://jelly.franksdank.cloud">Jellyfin</a>. Don't ask the *arrs directly —
Seerr is the front door, and requests ride the tunnel from there.</li>
<li><strong>Books:</strong> <a href="https://books.franksdank.cloud">Calibre-Web</a> — the e-book library, with its own login.</li>
<li><strong>Games:</strong> <a href="https://romm.franksdank.cloud">RomM</a> — ROM library and emulator collection.</li>
<li><strong>Raw files:</strong> <a href="https://files.franksdank.cloud">Copyparty</a> — direct downloads and shares.</li>
<li><strong>Search:</strong> <a href="https://search.franksdank.cloud">SearXNG</a> — metasearch, VPN-routed, no AI snoop. <span class="key-warn" title="Searches are obfuscated, not anonymous: SearXNG hides you from the upstream engines and the VPN tunnel hides the traffic from the LAN &mdash; but the upstream search API keys are tied to Frank&rsquo;s identity. Don&rsquo;t treat it as Tor.">&#9888; privacy note &mdash; hover to read</span></li>
</ul>
</section>
<section id="troubleshooting">
<h1>When something looks broken</h1>
<ul>
<li><strong>A status card says DOWN.</strong> Reload the page once; the checker
re-probes every few minutes. If it stays down, that service really is unhappy — tell Frank.</li>
<li><strong>"status unavailable" on the homepage.</strong> The page couldn't read
its status file. Hard-reload (Ctrl/Cmd-Shift-R).</li>
<li><strong>Connection timeout on a home device.</strong> Nine times out of ten
the device isn't using the house DNS (Pi-hole at 192.168.0.143) and resolved
our names to the public address, which doesn't answer. Point the device's DNS at
192.168.0.143 and retry.</li>
<li><strong>The bot-check spins forever.</strong> Let it finish; heavy JS blocking
(privacy extensions) can starve it. Pause the blocker, reload, resume.</li>
</ul>
</section>
</main>
<footer class="foot">
<span><a href="/">← services</a></span>
+3
View File
@@ -295,6 +295,7 @@
"model": {
"unit": "zealot",
"role": "Frank's utility model",
"hf": "https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive",
"tagline": "HONOR GUIDE ME!",
"sfx": [
"zealot-honor.ogg"
@@ -330,6 +331,7 @@
"model": {
"unit": "dragoon",
"role": "Frank's deep reasoning model",
"hf": "https://huggingface.co/Quat3rnion/halogen-swift1.5-qwen3.8-flash-next-v2-abliterated",
"tagline": "I have returned — make use of me.",
"sfx": [
"dragoon-returned.ogg",
@@ -365,6 +367,7 @@
"model": {
"unit": "archon",
"role": "Frank's strongest and fastest model runtime",
"hf": "https://huggingface.co/Qwen/Qwen3.8-Flash-Next-FP8",
"tagline": "...Power Overwhelming...",
"sfx": [
"archon-power.ogg"
+3 -1
View File
@@ -261,6 +261,8 @@ html[data-bare="1"] .top { border-image: none; }
.mi-id { display: flex; align-items: baseline; gap: 8px; }
.mi-name { color: var(--mi); font-size: 19px; text-shadow: 0 0 6px color-mix(in srgb, var(--mi) 55%, transparent); }
.mi-role { color: var(--dim); margin: 6px 0 2px; }
.mi-hf { display: inline-block; margin: 1px 0 2px; font-size: 12px; color: var(--proto-cyan); text-decoration: none; }
.mi-hf:hover { text-decoration: underline; text-shadow: 0 0 6px color-mix(in srgb, var(--proto-cyan) 60%, transparent); }
.mi-voice {
display: block;
appearance: none;
@@ -312,7 +314,7 @@ html[data-bare="1"] .mi-name { color: #000; text-shadow: none; }
html[data-bare="1"] .mi-voice { color: #000; text-decoration: underline; }
html[data-bare="1"] .mi-role, html[data-bare="1"] .mi-spec, html[data-bare="1"] .mi-use, html[data-bare="1"] .mi-comp,
html[data-bare="1"] .mi-inputs, html[data-bare="1"] .mi-equiv, html[data-bare="1"] .mi-super,
html[data-bare="1"] .mi-warn { color: #000; }
html[data-bare="1"] .mi-warn, html[data-bare="1"] .mi-hf { color: #000; }
html[data-bare="1"] .app-art { display: none; }
html[data-bare="1"] .svc-warn, html[data-bare="1"] .mi-perm, html[data-bare="1"] .mi-comp { color: #000; border: none; text-shadow: none; padding: 0; }
html[data-bare="1"] .mi-perm, html[data-bare="1"] .mi-comp { border: 1px solid #000; }