Jellyfin authenticates against Authentik over LDAP, so telling the household that it "will not take the family password" sent people to the wrong door. The tile's provider id (alex -> LdapAuthenticationProviderPlugin) and a live bind + memberOf search against the running outpost are the proof; six places repeated the claim, and all six now say to sign in with the franksdank.cloud username and password. Added the failure mode that actually happens: a password that works on the homepage but is refused here means the name is not in jellyfin_users yet. Plex and the e-book door stay the two genuinely separate accounts. Marreta's tile loses its VPN/headless-browser mechanics and keeps one honest clause: "does not work on all sites". The models page gains the TTS pair the household keeps meeting: frank-tts (Qwen3 talker + 12 Hz codec on the iGPU, five cloned voices, live list at /v1/audio/voices) and Kokoro (82M, stock presets, runs in the user's own browser) - which is why the AI chat's speaker list never matches the server's. Verified in a browser against an isolated copy of the tree: both tiles render the new copy, #models carries both tables, zero broken images, and every retired phrase is absent from the rendered text. ./tests/run.sh: 841 pass.
493 lines
26 KiB
HTML
493 lines
26 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=Rajdhani:wght@500;600;700&family=Share+Tech+Mono&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">
|
|
|
|
<h1>The household guide</h1>
|
|
<p class="sub">Everything running on the computers in this house, what it is for,
|
|
and which door to knock on. Written for people who did not build it.</p>
|
|
|
|
<section id="start">
|
|
<h2>Start here</h2>
|
|
<p class="kicker">Three steps and you are in</p>
|
|
<p><strong>1. Open the front door:</strong>
|
|
<a href="https://www.franksdank.cloud">https://www.franksdank.cloud</a><br>
|
|
It works from anywhere — phone data, a hotel, a friend's house. The first page you
|
|
see is a robot check: your browser does a few seconds of arithmetic so the internet's
|
|
scanners can't wander in. Then type the family username and password Frank gave you.
|
|
There is no signup button on purpose.</p>
|
|
<p><strong>2. Pick what you want to do:</strong></p>
|
|
<table>
|
|
<tr><th>I want to…</th><th>Open</th><th>Needs its own login?</th></tr>
|
|
<tr><td>watch a film or a show</td><td><a href="https://jelly.franksdank.cloud">Jellyfin</a></td><td>no — your franksdank.cloud login</td></tr>
|
|
<tr><td>watch it on a TV that already has Plex</td><td><a href="https://plex.franksdank.cloud/web">Plex</a></td><td>yes — a Plex account, Frank invites it</td></tr>
|
|
<tr><td>listen to an audiobook</td><td><a href="https://audiobooks.franksdank.cloud/audiobookshelf">Audiobookshelf</a></td><td>no — the family password</td></tr>
|
|
<tr><td>ask a computer a question, privately</td><td><a href="https://ai.franksdank.cloud">AI chat</a></td><td>no</td></tr>
|
|
<tr><td>search the web without being followed</td><td><a href="https://search.franksdank.cloud">Search</a></td><td>no</td></tr>
|
|
<tr><td>read a news article without the junk</td><td><a href="https://marreta.franksdank.cloud">Marreta</a></td><td>no</td></tr>
|
|
<tr><td>grab a file off the big disk</td><td><a href="https://files.franksdank.cloud">Files</a></td><td>no (read-only)</td></tr>
|
|
<tr><td>ebooks, retro games, request a film</td><td>not open to the household yet — <a href="#notopen">see below</a></td><td>—</td></tr>
|
|
</table>
|
|
<p><strong>3. On your phone,</strong> open the front door in Safari or Chrome and choose
|
|
<em>Add to Home Screen</em>. You get an icon that behaves like an app. Details in
|
|
<a href="#phone">On your phone</a>.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/homepage.webp" alt="The homepage: one tile per service, each with a short description">
|
|
<figcaption>The front door itself: one tile per thing the house runs, and a line about what
|
|
each is for. The badges say whether it's awake.</figcaption>
|
|
</figure>
|
|
<div class="toc">
|
|
<a href="#doors">The two doors</a>
|
|
<a href="#phone">On your phone</a>
|
|
<a href="#jellyfin">Jellyfin</a>
|
|
<a href="#plex">Plex</a>
|
|
<a href="#audiobookshelf">Audiobookshelf</a>
|
|
<a href="#notopen">Not open yet</a>
|
|
<a href="#files">Files</a>
|
|
<a href="#search">Search</a>
|
|
<a href="#marreta">Read an article</a>
|
|
<a href="#ai">AI chat</a>
|
|
<a href="#gitea">Gitea</a>
|
|
<a href="#models">The models</a>
|
|
<a href="#trouble">When something misbehaves</a>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="doors">
|
|
<h2>The two doors</h2>
|
|
<p>Almost everything here is behind two checks, one after the other.</p>
|
|
<ul>
|
|
<li><strong>Anubis</strong> is the bouncer. It makes a browser prove it is a browser
|
|
(that robot-check page) and stops the automatic scanners that comb the internet for
|
|
open servers. It never asks for a password.</li>
|
|
<li><strong>Authentik</strong> is the front desk. It asks who you are, once per device
|
|
per few days, and after that you drift from app to app without being stopped again.</li>
|
|
</ul>
|
|
<p>One account opens: the homepage, search, Marreta, the AI chat, Files, Gitea, and Jellyfin
|
|
(there it is typed as username + password, not the automatic sign-in).</p>
|
|
<figure>
|
|
<img src="/img/onboarding/door-authentik.webp" alt="The sign-in screen: an identification field, then a password field">
|
|
<figcaption>The front desk. Your username first, then your password. Nothing here signs
|
|
you up for anything; if you don't have an account yet, ask Frank.</figcaption>
|
|
</figure>
|
|
<p class="key-warn">Two doors keep their own accounts and will not take the family
|
|
password: <strong>Plex</strong> (a Plex account, its own e-mail
|
|
login) and the e-book door. Frank creates those by hand. <strong>Jellyfin does take the
|
|
family login</strong> — your franksdank.cloud username and password.</p>
|
|
<p class="foot-note">Want your own password? It lives at
|
|
<a href="https://auth.franksdank.cloud/if/flow/default-user-settings-flow/">account settings</a>
|
|
— the same button you get at the bottom of the homepage.</p>
|
|
</section>
|
|
|
|
<section id="phone">
|
|
<h2>On your phone</h2>
|
|
<p><strong>Get the icon.</strong> In the browser: <em>Share</em> (iPhone) or the
|
|
<em>⋮</em> menu (Android) → <em>Add to Home Screen</em>. Same trick on a tablet.
|
|
There is no app store anything to install for the household doors; they are web pages
|
|
wearing a good coat.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/phone-homepage.webp" alt="The homepage on a phone, one row per service">
|
|
<figcaption>The front door on a 5-inch screen. Same tiles, same links, no app.</figcaption>
|
|
</figure>
|
|
<p><strong>Apps that do have a real client</strong> (better than the web page on a phone):</p>
|
|
<table>
|
|
<tr><th>What</th><th>Where</th><th>Server address to type</th></tr>
|
|
<tr><td>Jellyfin</td><td>Google Play & the App Store (also Fire TV, Roku, most smart TVs)</td><td><code>https://jelly.franksdank.cloud</code></td></tr>
|
|
<tr><td>Plex</td><td>on nearly every TV ever sold</td><td>nothing — sign in to your Plex account</td></tr>
|
|
<tr><td>Audiobookshelf</td><td>Google Play (Android, solid). The iPhone build is a beta with a limited number of seats — use the browser, or SoundLeaf / ShelfPlayer</td><td><code>https://audiobooks.franksdank.cloud/audiobookshelf</code></td></tr>
|
|
</table>
|
|
<p><strong>The one address that only works at home.</strong> The raw file shelf also speaks
|
|
WebDAV on <code>http://192.168.0.235:3923/</code> — that's what a real file-manager app
|
|
mounts. Two catches, both measured: it is <em>http</em>, not https (the phone will warn you;
|
|
it is fine on the house Wi-Fi), and it answers only on the house network. From elsewhere the
|
|
public door hands a file app the robot-check page instead of files, because a file app can't
|
|
solve it. Off-site, use the browser.</p>
|
|
<ul>
|
|
<li>iPhone: the built-in Files app does <em>not</em> do WebDAV. <em>FileBrowser</em> or
|
|
<em>Owlfiles</em> do.</li>
|
|
<li>Android: <em>Cx File Explorer</em>, <em>Material Files</em>, <em>Solid Explorer</em> all do.</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section id="jellyfin">
|
|
<h2>Jellyfin — films and TV</h2>
|
|
<p><a href="https://jelly.franksdank.cloud">jelly.franksdank.cloud</a> — free, no
|
|
account of any company's, and the posters and episode guides are all filled in.</p>
|
|
<h3>Getting in</h3>
|
|
<ul>
|
|
<li>Pick your name. There is no list of names on the login screen — type yours.</li>
|
|
<li>Type your <strong>franksdank.cloud password</strong> — the same one that opens the
|
|
homepage, search and the AI chat. There is no separate Jellyfin password.</li>
|
|
<li>Refused, but the same password opens the homepage? Your name hasn't been given library
|
|
access yet — ask Frank, it's a one-line change on his side.</li>
|
|
<li>No name yet? Ask Frank to make one. There is no self-service signup, on purpose.</li>
|
|
</ul>
|
|
<figure>
|
|
<img src="/img/onboarding/jellyfin-login.webp" alt="The Jellyfin login screen: a username field and a password field">
|
|
<figcaption>The empty login. Username, password, <em>Sign in</em>. Nothing to register.</figcaption>
|
|
</figure>
|
|
<h3>The first ten minutes</h3>
|
|
<ul>
|
|
<li>Home shows <em>Continue watching</em> and what's new. Press a poster; it starts.</li>
|
|
<li>The <strong>⋮</strong> menu on a poster is where the useful things live: mark
|
|
watched, add to a playlist, download it to the device.</li>
|
|
<li>On a TV the app asks for a <em>Server address</em>: <code>https://jelly.franksdank.cloud</code>.</li>
|
|
<li>Settings → theme: the big-screen look is installed for the living-room box.
|
|
Themes are per device, so change it only on the one you're sitting in front of.</li>
|
|
</ul>
|
|
<h3>If it misbehaves</h3>
|
|
<ul>
|
|
<li>It rejects a password that works everywhere else? Your name isn't on the library-access
|
|
list yet — ask Frank.</li>
|
|
<li>A film with a blank poster is missing artwork, not missing files — Frank can refresh it.</li>
|
|
<li>Buffering away from home usually means the pipe out of the house, not the server.</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section id="plex">
|
|
<h2>Plex — the same shelf, different shop window</h2>
|
|
<p><a href="https://plex.franksdank.cloud/web">plex.franksdank.cloud/web</a> bounces you to
|
|
Plex's own sign-in, and that is correct: Plex is closed-source and insists on a Plex account.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/plex-login.webp" alt="Plex's own sign-in page on plex.tv">
|
|
<figcaption>Plex keeps its own front desk. You need a Plex account (an e-mail address is
|
|
enough); Frank invites it into the library.</figcaption>
|
|
</figure>
|
|
<ul>
|
|
<li>Jellyfin and Plex read <strong>the same shelf of files</strong>. The same films are in
|
|
both; the artwork, watch-state and profiles are separate.</li>
|
|
<li>Choose Plex when your TV already has the Plex app on it, or you want Plex's trailers
|
|
and music. Otherwise Jellyfin is the one the household uses.</li>
|
|
<li>Need a Plex account of your own? Ask Frank to invite it; he can also tell you which of
|
|
the two has the thing you're looking for.</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section id="audiobookshelf">
|
|
<h2>Audiobookshelf — audiobooks and podcasts</h2>
|
|
<p><a href="https://audiobooks.franksdank.cloud/audiobookshelf">audiobooks.franksdank.cloud/audiobookshelf</a>
|
|
— the family password works here.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/audiobookshelf-login.webp" alt="The Audiobookshelf login page with username and password fields">
|
|
<figcaption>Two ways in: the password Frank gave you, or <em>Sign in with Authentik</em>,
|
|
which is the same family account.</figcaption>
|
|
</figure>
|
|
<ul>
|
|
<li>Your place in every book follows you between phone, laptop and the kitchen tablet.</li>
|
|
<li>On the phone the Android app is the best version: it will do <em>downloads for offline
|
|
listening</em>. A web page can't play offline; if you need it for a flight, use an app.</li>
|
|
<li>iPhone: the official build is a TestFlight beta with a small number of seats, so either
|
|
use the browser + <em>Add to Home Screen</em>, or a third-party client
|
|
(<em>SoundLeaf</em>, <em>ShelfPlayer</em>).</li>
|
|
<li>Adding the server in any app: <code>https://audiobooks.franksdank.cloud/audiobookshelf</code>.</li>
|
|
</ul>
|
|
<figure>
|
|
<img src="/img/onboarding/audiobookshelf-library.webp" alt="An empty audiobook library with a scan button">
|
|
<figcaption>An empty library. Books appear when Frank scans, and then they're yours to keep playing.</figcaption>
|
|
</figure>
|
|
</section>
|
|
|
|
<section id="notopen">
|
|
<h2>Three doors that are not open to the household yet</h2>
|
|
<ul>
|
|
<li><strong>Calibre-Web</strong> (e-books) —
|
|
<a href="https://books.franksdank.cloud">books.franksdank.cloud</a>. Its own login, and
|
|
Frank hasn't decided who gets in. Ask.</li>
|
|
<li><strong>RomM</strong> (retro games, plays them in the browser) —
|
|
<a href="https://romm.franksdank.cloud">romm.franksdank.cloud</a>. Needs its own account,
|
|
and it is not open to family users yet. Ask.</li>
|
|
<li><strong>Seerr</strong> (the "would you watch this?" request box) —
|
|
<a href="https://seerr.franksdank.cloud">seerr.franksdank.cloud</a>. Not open yet: tell
|
|
Frank what you want to watch and he'll add it.</li>
|
|
</ul>
|
|
<figure>
|
|
<img src="/img/onboarding/calibre-login.webp" alt="The Calibre-Web login page">
|
|
<figcaption>What a closed door looks like: a login that wants credentials of its own.</figcaption>
|
|
</figure>
|
|
</section>
|
|
|
|
<section id="files">
|
|
<h2>Files — the raw shelf</h2>
|
|
<p><a href="https://files.franksdank.cloud">files.franksdank.cloud</a> is the honest view of
|
|
the big disk: folders, dates, sizes, no cleverness. <strong>Read-only</strong> for the
|
|
household — you can take things out, nothing you do here deletes anything.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/copyparty.webp" alt="A folder listing with sizes, dates and a download link on each row">
|
|
<figcaption>Each row has a download link; the <em>zip</em> link at the bottom takes the
|
|
whole folder as one archive. <em>control-panel</em> and the <em>up</em> link navigate.</figcaption>
|
|
</figure>
|
|
<ul>
|
|
<li>Good for: a photo you want the original of, a document, a game ROM, a song to put on another device.</li>
|
|
<li>Bad for: watching video (the player is the wrong tool — use Jellyfin) and for
|
|
saving your own work (it can't write).</li>
|
|
<li>Works in any browser, on any machine, from anywhere.</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section id="search">
|
|
<h2>Search — SearXNG</h2>
|
|
<p><a href="https://search.franksdank.cloud">search.franksdank.cloud</a> asks a lot of search
|
|
engines at once and merges the answers, then leaves no trail behind. Outbound requests ride
|
|
the house VPN.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/search-results.webp" alt="Search results merged from many engines, with engine checkboxes on the left">
|
|
<figcaption>One question, many engines. The boxes on the left choose which engines answer.</figcaption>
|
|
</figure>
|
|
<ul>
|
|
<li>Make it your browser's search engine: browser settings → search → add a custom
|
|
engine with <code>https://search.franksdank.cloud/search?q=%s</code>.</li>
|
|
<li>On a phone there is no app; bookmark it or put the homepage on your home screen.</li>
|
|
</ul>
|
|
<figure>
|
|
<img src="/img/onboarding/phone-search.webp" alt="A search result page on a phone">
|
|
<figcaption>Same results, thumb-sized.</figcaption>
|
|
</figure>
|
|
<details class="key-warn">
|
|
<summary>The privacy catch worth knowing</summary>
|
|
<div class="warn-body">
|
|
<p>This hides your question from Google, Bing and the rest — it does not hide it from
|
|
<em>this house</em>. Queries are logged on this server so Frank can tell a broken search
|
|
from a slow one. And because results are fetched from here, the search engines see one
|
|
house address, not your phone: your habits don't get stitched to your face. If you need a
|
|
genuinely anonymous search, that's Tor or a paid service, not this.</p>
|
|
</div>
|
|
</details>
|
|
</section>
|
|
|
|
<section id="marreta">
|
|
<h2>Read an article without the junk — Marreta</h2>
|
|
<p><a href="https://marreta.franksdank.cloud">marreta.franksdank.cloud</a>. Paste a link, get
|
|
the article: no cookie banner, no video autoplay, no sixteen sidebars. It also runs an RSS
|
|
reader once Frank feeds it news.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/marreta.webp" alt="Marreta's empty home page with a URL box and an Add as app hint">
|
|
<figcaption>Paste the link. The app itself offers <em>Add as app</em> in its menu, which is
|
|
the cleanest way to keep it on a phone.</figcaption>
|
|
</figure>
|
|
<ul>
|
|
<li>Some pages with hard paywalls still come back thin. Nothing in the house can fix that.</li>
|
|
<li>A white screen after pasting? Pause your ad blocker for this site — the app warns
|
|
about exactly that.</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section id="ai">
|
|
<h2>AI chat — Open WebUI</h2>
|
|
<p><a href="https://ai.franksdank.cloud">ai.franksdank.cloud</a>. The family password, or
|
|
<em>Continue with authentik</em> on the login card, which is the same thing.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/openwebui-login.webp" alt="The Open WebUI welcome card with a Continue with authentik button">
|
|
<figcaption>Press <em>Continue with authentik</em> and the family login does the rest.</figcaption>
|
|
</figure>
|
|
<ul>
|
|
<li>Nothing you type here goes to a company's server. It goes to the computers in this house.</li>
|
|
<li>Install it as an app: in Chrome or Edge, the menu → <em>Install site as an app</em>;
|
|
in Safari, share → <em>Add to Home Screen</em>.</li>
|
|
<li>Conversations are kept per account, so your history is yours and Frank's is Frank's.</li>
|
|
</ul>
|
|
<h3>Which model do I pick?</h3>
|
|
<p>You are offered all three, and the app opens on <code>frank-dragoon</code>. Leave it there
|
|
unless you have a reason. Short version (longer version in <a href="#models">The models</a>):</p>
|
|
<ul>
|
|
<li><code>frank-dragoon</code> — fast, sees pictures, doesn't lecture. Good default.</li>
|
|
<li><code>frank-archon</code> — the big careful one on the two-card server. Slower per
|
|
answer, best at long and difficult work. Polite by construction.</li>
|
|
<li><code>frank-zealot</code> — small, quick, holds a very long conversation. Also
|
|
doesn't lecture.</li>
|
|
</ul>
|
|
<p class="key-warn">Two of the three will answer almost anything, including adult and dangerous
|
|
material, without a warning. That is deliberate for Frank's work, not a toy for a child:
|
|
conversations stay on the house machines and are not visible to Frank's phone. If that isn't
|
|
the setup you want for a kid, keep them off this door and ask Frank about a filtered one.</p>
|
|
|
|
</section>
|
|
|
|
<section id="gitea">
|
|
<h2>Gitea — Frank's workshop</h2>
|
|
<p><a href="https://gitea.franksdank.cloud">gitea.franksdank.cloud</a> holds the code that runs
|
|
this house: the configs, the deploy scripts, the tests. It has its own accounts (the top right
|
|
offers <em>Register</em>, or <em>Sign in with OpenID</em> to ride the family login), but it is a
|
|
workshop, not a household door. You very likely don't need it.</p>
|
|
<figure>
|
|
<img src="/img/onboarding/gitea-signin.webp" alt="The Gitea sign-in form with a password box and a Sign in with OpenID button">
|
|
<figcaption>If you ever do need it: <em>Register</em> for its own account, or
|
|
<em>Sign in with OpenID</em> for the family one.</figcaption>
|
|
</figure>
|
|
</section>
|
|
|
|
<section id="models">
|
|
<h2>The models</h2>
|
|
<p class="kicker">What's actually answering you</p>
|
|
<p>Three machines in this house do the thinking. None of them phone a company. Each is a
|
|
different trade-off of speed, memory and how much it can hold in its head at once; the chat
|
|
app above is just a window onto them.</p>
|
|
<table>
|
|
<tr><th>Name</th><th>Runs on</th><th>Good at</th><th>Notes</th></tr>
|
|
<tr>
|
|
<td><code>frank-dragoon</code></td>
|
|
<td>the Strix Halo machine's built-in graphics</td>
|
|
<td>fast answers, long chats, reading pictures, tools</td>
|
|
<td>two conversations at a time; abliterated, so no refusals</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>frank-archon</code></td>
|
|
<td>the media server, two big graphics cards</td>
|
|
<td>the hardest work: long code, careful reasoning, big documents</td>
|
|
<td>four conversations at a time; keeps its guardrails</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>frank-zealot</code></td>
|
|
<td>the RTX 3090 in the corner</td>
|
|
<td>very long conversations, cheap and quick; it is what Frank's own coding agent runs on</td>
|
|
<td>three conversations at 200,000 tokens each; no refusals</td>
|
|
</tr>
|
|
</table>
|
|
<p class="foot-note">The exact weights: <code>frank-dragoon</code> is a halogen conversion of
|
|
Qwen3.8-Flash-Next v2, abliterated
|
|
(<a href="https://huggingface.co/Quat3rnion/halogen-qwen3.8-flash-next-v2-abliterated">Quat3rnion/halogen-qwen3.8-flash-next-v2-abliterated</a>);
|
|
<code>frank-archon</code> is the official Qwen3.8-Flash-Next re-packed for that engine
|
|
(<a href="https://huggingface.co/StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe">StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe</a>);
|
|
<code>frank-zealot</code> is Ternary-Bonsai-2-9B in a 2-bit packing
|
|
(<a href="https://huggingface.co/prism-ml/Ternary-Bonsai-2-9B-gguf">prism-ml/Ternary-Bonsai-2-9B-gguf</a>)
|
|
with a small adapter fitted that removes its refusal reflex. All three accept pictures. Ask
|
|
Frank before pointing a script at one of them directly; the address is on the homepage.</p>
|
|
|
|
<h3>And the voices</h3>
|
|
<p>Two speech models live in this house, and they are different animals. One of them
|
|
speaks as a <em>specific person</em>; the other is a pack of stock voices that ships inside
|
|
the tools you already use.</p>
|
|
<table>
|
|
<tr><th>Name</th><th>Runs on</th><th>Good at</th><th>Notes</th></tr>
|
|
<tr>
|
|
<td><code>frank-tts</code></td>
|
|
<td>the Strix Halo machine's built-in graphics, sharing the card with <code>frank-dragoon</code></td>
|
|
<td>cloning: it speaks as one particular voice, chosen by name</td>
|
|
<td>five voices today — <code>dr.kern</code>, <code>garrickhagon</code>,
|
|
<code>jeffhays</code>, <code>vaati</code>, <code>wilwheaton</code>; ask for one by name and
|
|
you get it. No key, but it is a house-hardware door: it answers on the house network only</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>Kokoro</strong></td>
|
|
<td>your own browser, or Frank's own terminal — no server in the loop</td>
|
|
<td>instant plain narration, quick and cheap</td>
|
|
<td>about two dozen preset voices with coded names (<code>af_heart</code>,
|
|
<code>bm_george</code>…). It cannot clone, and it will never answer to the five names
|
|
above</td>
|
|
</tr>
|
|
</table>
|
|
<ul>
|
|
<li><strong>The AI chat's speaker button is Kokoro.</strong> That is why it offers a
|
|
different list of names, and why it starts talking a moment before anything on the server
|
|
could. It speaks in your browser, on your machine.</li>
|
|
<li><strong>The podcast maker uses the clones.</strong> An episode's two hosts are
|
|
<code>wilwheaton</code> and <code>vaati</code>, rendered by <code>frank-tts</code>. That door
|
|
is Frank's for now.</li>
|
|
<li><strong>Frank's coding agent narrates through the clones too</strong> — the default
|
|
voice is <code>wilwheaton</code>.</li>
|
|
<li><strong>Want your own voice in the list?</strong> Ask Frank. It needs about twenty
|
|
seconds of you talking plainly, once; the voice then carries your name.</li>
|
|
</ul>
|
|
<p class="foot-note">The exact weights: <code>frank-tts</code> is a Qwen3 talker
|
|
(1.7 billion parameters, 4-bit) plus its 12 Hz audio codec, driven by
|
|
<code>qwentts.cpp</code>; Kokoro is a much smaller 82-million-parameter model whose voices are
|
|
baked in. A cloned voice is not a setting — it is a directory of reference audio on the
|
|
server, which is why adding one is a fifteen-minute job and not a checkbox. Programmers on the
|
|
house network: <code>POST http://192.168.0.143:7772/v1/audio/speech</code> with
|
|
<code>{"input": "…", "voice": "vaati"}</code> gets you WAV or MP3, and
|
|
<a href="http://192.168.0.143:7772/v1/audio/voices"><code>/v1/audio/voices</code></a> answers
|
|
the live list, so this page can never lie to you for long.</p>
|
|
</section>
|
|
|
|
<section id="api-access">
|
|
<h2>Let your own tools use it</h2>
|
|
<p class="kicker">For the household's programmers</p>
|
|
<p>Frank can hand you an API key. It works on one door
|
|
— <code>https://ai.franksdank.cloud/api/v1</code> — and speaks the plain OpenAI
|
|
dialect, so anything that can talk to a hosted model can talk to the house.</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-dragoon",
|
|
"messages": [{"role": "user", "content": "What is on the shelf?"}]
|
|
}'</code></pre>
|
|
<p>For <a href="https://github.com/badlogic/pi-mono">Pi</a>, drop this in
|
|
<code>models.json</code>:</p>
|
|
<pre><code>{
|
|
"providers": {
|
|
"frank": {
|
|
"baseUrl": "https://ai.franksdank.cloud/api/v1",
|
|
"api": "openai-completions",
|
|
"apiKey": "PASTE-YOUR-KEY",
|
|
"models": [
|
|
{ "id": "frank-dragoon" }
|
|
]
|
|
}
|
|
}
|
|
}</code></pre>
|
|
<p>Then start Pi with <code>pi --model frank/frank-dragoon</code>.</p>
|
|
<p class="foot-note">The key is for the house AI only — it is not your Authentik password,
|
|
and losing it costs nothing beyond asking Frank to rotate it. Want a different model than the
|
|
one you were given? Ask Frank to widen the key.</p>
|
|
</section>
|
|
|
|
<section id="trouble">
|
|
<h2>When something misbehaves</h2>
|
|
<ul>
|
|
<li><strong>The robot check page keeps coming back.</strong> Your browser is blocking the
|
|
scripts it needs (or an extension is). Allow scripts for that site, or try another browser.
|
|
Still looping? Ask Frank — the guard can be told you're a person.</li>
|
|
<li><strong>"Invalid password" on the front desk.</strong> Right password, wrong door: the
|
|
family login does not open Plex or the e-book door. Jellyfin does take it, but only for the
|
|
names Frank has given library access.</li>
|
|
<li><strong>The AI is slow.</strong> Each model only holds a couple of conversations at once
|
|
(two, three or four, depending which). It is a queue, not a crash — or Frank is
|
|
mid-conversation; the big one is on the same machine as the films.</li>
|
|
<li><strong>The AI invents something confidently.</strong> All three are small models living
|
|
on house hardware; they will make things up rather than say "I don't know". Check anything
|
|
that matters.</li>
|
|
<li><strong>A film is missing.</strong> It is probably not on the shelf yet, or it landed
|
|
yesterday and the library hasn't been told. Say so and Frank will scan.</li>
|
|
<li><strong>A file app can't reach the shelf from outside the house.</strong> Expected: the
|
|
public door is browser-shaped. Use the browser, or mount the home address on the house Wi-Fi.</li>
|
|
<li><strong>Something is genuinely down.</strong> The homepage badge says
|
|
<span style="color: var(--down)">DOWN</span> — tell Frank which one. Screenshots help.</li>
|
|
</ul>
|
|
<p class="foot-note">Anything missing, wrong, or written like a manual instead of a person:
|
|
that's a bug in this page. Tell Frank, or tell the machine that wrote it.</p>
|
|
</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>
|