Files
serverAppConfigs/shared/homepage/docs.html
T
Frank 7066accc25 homepage: capability equivalence on the AI cards
Every fleet model card (and the #models docs section) now states, in
plain family-facing terms, what the model is equivalent to:
frank-large ~ Claude Sonnet 5 / OpenAI-Luna, frank-primary ~ Claude
Opus 4.8 / OpenAI-Terra (both Summer 2026 frontier), frank-secondary ~
last year (2025) frontier. Rendered as a new details.equiv line
(desc-equiv, styled in the head color, bare-mode clean); pinned in
homepage_config.bats.
2026-10-08 01:30:50 -07:00

214 lines
11 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>frank — docs</title>
<base href="/">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=VT323&display=swap">
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="top">
<span class="title">frank@home:~$ docs</span>
<a id="bare-toggle" class="toggle" href="?bare=1">bare</a>
</header>
<main class="docs">
<section id="getting-in">
<h1>Getting in</h1>
<p>Everything here lives behind two doors. The first is <strong>Anubis</strong>, a
quiet bot-check: the first time you visit any guarded page in a session you see a
short "making sure you're not a bot" screen. It runs once. The second door is
<strong>Authentik</strong>, the family single sign-on: log in once and every
guarded service (this homepage, search, chat, media requests, and friends) opens
for you without a second password.</p>
<ul>
<li>Need an account? Ask Frank. Accounts are issued by hand; there is no signup.</li>
<li>Your clearance lives in a cookie. Clearing cookies means re-clearing both doors.</li>
<li>If a page asks you to log in repeatedly, that is a server-side problem — tell Frank, don't brute-force it.</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>,
the family chat app. Open the address, click <strong>Continue with authentik</strong>,
and use the same single sign-on as everything else — no separate password. Your
conversations are saved to your account, so history follows you between devices.</p>
<img src="img/openwebui-chat.png" alt="Open WebUI chat screen with a question and the AI's answer">
<p>Below the text box, the model box on the right chooses which model answers you.
Family accounts get <code>frank-secondary</code> — the fleet's fast all-rounder,
which also sees images: drag a photo or screenshot straight into the chat box.
Frank's account can additionally reach the bigger models.</p>
<img src="img/openwebui-model-picker.png" alt="The Open WebUI welcome screen with frank-secondary selected in the model box">
<p>Open WebUI keeps your chat history; the raw model endpoints (used by developer
tools, see <a href="#api-access">API access</a>) do not.</p>
</section>
<section id="models">
<h1>The running models</h1>
<p>Three models serve the family. The homepage status cards show whether
each one is up right now.</p>
<h2>frank-large — deep reasoning</h2>
<ul>
<li><strong>Model:</strong> Qwen3.8-Flash-Next v2 Swift1.5 abliterated (halogen flash-server, ~62&nbsp;GiB) — an uncensored 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 conversations at a time; sees images.</li>
<li><strong>Inputs:</strong> text, image.</li>
<li><strong>Best for:</strong> cybersecurity and debugging. <em>Use requires Frank's permission.</em></li>
</ul>
<h2>frank-primary — the primary model</h2>
<ul>
<li><strong>Model:</strong> Qwen3.8-Flash-Next at native FP8 precision (radiance, 173&nbsp;GiB across both R9700s) — the biggest brain on the network.</li>
<li><strong>Equivalent:</strong> Claude Opus 4.8 / OpenAI-Terra (Summer 2026 frontier intelligence).</li>
<li><strong>Capacity:</strong> 200k-token context, two conversations at a time; sees images.</li>
<li><strong>Inputs:</strong> text, image.</li>
<li><strong>Best for:</strong> software engineering, system administration, and instruction tasks.</li>
</ul>
<h2>frank-secondary — the fast utility model</h2>
<ul>
<li><strong>Model:</strong> Qwen3.5-9B-Uncensored (Q6_K, 6.9&nbsp;GiB) 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> two simultaneous conversations, 200k tokens each; sees images.</li>
<li><strong>Inputs:</strong> text, image.</li>
<li><strong>Best for:</strong> agentic search, RAG, research subagents, translation, roleplay, and summarization — any small task that doesn't need much intelligence, and anything with a picture (screenshots, photos, diagrams). This is the model Open&nbsp;WebUI offers to family accounts.</li>
</ul>
<p class="foot-note">Which one to pick? Small utility work, RAG, search, and
screenshots: <code>frank-secondary</code>. Software engineering, sysadmin, and
instruction tasks: <code>frank-primary</code>. Cybersecurity and debugging:
<code>frank-large</code> (with Frank's permission).</p>
</section>
<section id="api-access">
<h1>API access — the AI on your own laptop</h1>
<p>Developer assistants like <strong>Opencode</strong> and <strong>Pi</strong> are
chat programs that run on your own computer and can read your files, run commands,
and edit code while they talk. They are all built to speak the same standard
language as the big commercial products (the "OpenAI-compatible" API), and our
server speaks it too. You give the program three things — an address, a personal
key, and a model name — and your laptop thinks through our hardware.</p>
<h2>Step 1 — get your personal key</h2>
<ol>
<li>Open <a href="https://ai.franksdank.cloud">ai.franksdank.cloud</a> and log in.</li>
<li>Click your circle (bottom-left corner) → <strong>Settings</strong> → <strong>Account</strong>.</li>
<li>Scroll to <strong>API keys</strong> → press <strong>Show</strong> → <strong>Create new secret key</strong>.</li>
<li>Press the copy icon. The key looks like <code>sk-3f2a…</code>.</li>
</ol>
<img src="img/openwebui-api-keys.png" alt="The Open WebUI Account settings page with the API key field at the bottom">
<p class="key-warn">The key is a password. Anyone who has it can use our AI as
you. Paste it only into the program's config file — never into a shared chat,
a screenshot, or a git repository.</p>
<h2>Step 2 — the three details every tool asks for</h2>
<ul>
<li><strong>Base URL:</strong> <code>https://ai.franksdank.cloud/api/v1</code></li>
<li><strong>Model:</strong> <code>frank-secondary</code></li>
<li><strong>API key:</strong> the <code>sk-…</code> from step 1 — sent as the header <code>Authorization: Bearer sk-…</code></li>
</ul>
<p>Proof that it works, from any terminal (replace the key):</p>
<pre><code>curl https://ai.franksdank.cloud/api/v1/chat/completions \
-H "Authorization: Bearer PASTE-YOUR-KEY" \
-H "Content-Type: application/json" \
-d '{"model": "frank-secondary", "messages": [{"role": "user", "content": "Hello!"}]}'</code></pre>
<h2>Step 3a — Opencode</h2>
<p>Install once (<code>npm install -g opencode-ai</code>), then create the file
<code>~/.config/opencode/opencode.json</code> with:</p>
<pre><code>{
"$schema": "https://opencode.ai/config.json",
"provider": {
"frank": {
"npm": "@ai-sdk/openai-compatible",
"name": "Frank fleet",
"options": {
"baseURL": "https://ai.franksdank.cloud/api/v1",
"apiKey": "PASTE-YOUR-KEY"
},
"models": {
"frank-secondary": { "name": "frank-secondary" }
}
}
}
}</code></pre>
<p>Start <code>opencode</code> and pick the model with <code>/model</code> —
it appears as <code>frank/frank-secondary</code>.</p>
<h2>Step 3b — Pi</h2>
<p>Create the file <code>~/.pi/agent/models.json</code> with:</p>
<pre><code>{
"providers": {
"frank": {
"baseUrl": "https://ai.franksdank.cloud/api/v1",
"api": "openai-completions",
"apiKey": "PASTE-YOUR-KEY",
"models": [
{ "id": "frank-secondary" }
]
}
}
}</code></pre>
<p>Then start Pi with <code>pi --model frank/frank-secondary</code>.</p>
<p class="foot-note">The key works only for the family AI — it is not your
Authentik password, and losing it costs nothing beyond asking Frank to rotate it.
Want a bigger model (frank-primary, frank-large)? 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.</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>
<span>docs · written by the chief designer · ask Frank for anything missing</span>
</footer>
<script>
// The same bare-mode toggle the service pages use (?bare=1), for this static page.
(function () {
var bare = new URLSearchParams(window.location.search).get('bare') === '1';
document.documentElement.setAttribute('data-bare', bare ? '1' : '0');
var t = document.getElementById('bare-toggle');
if (t) {
t.textContent = bare ? 'styled' : 'bare';
t.href = bare ? '?bare=0' : '?bare=1';
}
})();
</script>
</body>
</html>