- Every app card carries hex-clipped art: 19 amber-tinted brand marks from the Simple Icons CDN plus 19 improvised monogram SVGs, wired via a per-service "art" field; homepage_config.bats pins art presence for all 32 apps. - Model cards render zealot -> dragoon -> archon (registry order pinned in the seam). - Dragoon and zealot share one common uncensored legal warning (adult content, harmful/hateful/illegal descriptions, sensitive offensive cybersecurity topics, severe legal risk, "don't ruin this server for everybody"), hover label on card and docs. - Archon gets a bordered red permission callout: ask Frank before use. - SearXNG obfuscation-not-anonymity note moved to a card-level hover warning (.svc-warn) and a docs hover note. - Gitea: self-service signup flow; no need to ask Frank. - Footer docs/admin/account-settings become glowing bordered buttons; the admin button is shown only to homepage-admins members via a new Caddy /whoami endpoint echoing the outpost-injected X-Authentik-* headers (spoof-proof; the /admin* 403 stays the real gate). e2e pins both sides. - Docs naming swept: Protoss names primary, bracketed api ids, explicit note that a future switchover renames the ids themselves.
226 lines
13 KiB
HTML
226 lines
13 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 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-zealot</code> — the fleet's fast all-rounder
|
|
(Open WebUI lists models by their API id; this one is <code>frank-secondary</code>),
|
|
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 the family model 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, named for the Protoss units of StarCraft.
|
|
The homepage "Model Information" panel shows whether each one is up right now —
|
|
and plays the unit's voice if you click its quoted line.</p>
|
|
|
|
<p class="foot-note">Naming: the Open WebUI picker and the raw API show the
|
|
endpoint <em>api ids</em> in brackets below. The Protoss names are the family
|
|
names; a future switchover will rename the ids to match.</p>
|
|
|
|
<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 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>
|
|
<li><strong>Best for:</strong> code editor autocomplete, agentic search, RAG, research subagents, translation, roleplay, and summarization — any small task that doesn't need much intelligence, and anything with a picture. This is the model Open WebUI offers to family accounts.</li>
|
|
<li><strong>Compaction:</strong> if your agent harness supports setting a compaction model, set this one. A compaction job severely slows the bigger models for far longer than it slows this one.</li>
|
|
<li><strong>Supervision:</strong> requires tight human supervision.</li>
|
|
<li><strong>Warning:</strong> <span class="key-warn" title="Uncensored model: output can include adult content, content that describes harmful, hateful, or illegal acts, content concerning “sensitive offensive cybersecurity topics”, and other output that may carry severe legal risk. Take this warning seriously — don’t ruin this server for everybody.">⚠ Uncensored model — hover to read</span></li>
|
|
</ul>
|
|
|
|
<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 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>
|
|
<li><strong>Best for:</strong> complex agentic tasks, programming, system administration, and "claw"-style personal agents.</li>
|
|
<li><strong>Supervision:</strong> safe for autonomous, low-supervision use.</li>
|
|
<li><strong>Warning:</strong> <span class="key-warn" title="Uncensored model: output can include adult content, content that describes harmful, hateful, or illegal acts, content concerning “sensitive offensive cybersecurity topics”, and other output that may carry severe legal risk. Take this warning seriously — don’t ruin this server for everybody.">⚠ Uncensored model — hover to read</span></li>
|
|
|
|
<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 GiB) on twin AMD R9700s with more than 200 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>
|
|
<li><strong>Best for:</strong> software engineering, system administration, and instruction tasks. <strong>⚠ Ask Frank for permission before use</strong> — this is his primary model; he uses it more than anything else on the fleet.</li>
|
|
</ul>
|
|
|
|
<p class="foot-note">Which one to pick? Small utility work, autocomplete, RAG,
|
|
programming, and personal agents: <code>frank-dragoon</code>. Software
|
|
engineering, sysadmin, and instruction tasks: <code>frank-archon</code> (ask
|
|
Frank first). The ids in brackets are what the Open WebUI picker and the
|
|
raw API show today; the Protoss names are the family names, and the switchover
|
|
will rename the ids to match.</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> — this is <code>frank-zealot</code>, the family utility model (the API uses the id, not the family name)</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 (<code>frank-archon</code>, <code>frank-dragoon</code>)? Ask Frank to raise your access.</p>
|
|
</section>
|
|
|
|
<section id="media">
|
|
<h1>Media & files</h1>
|
|
<ul>
|
|
<li><strong>Movies & 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 — but the upstream search API keys are tied to Frank’s identity. Don’t treat it as Tor.">⚠ privacy note — 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>
|
|
<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>
|