fix(homepage): Jellyfin takes the family login; document the voice models

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.
This commit is contained in:
Frank committed 2026-11-04 12:49:42 -08:00
1 parent 9961ed62c0
commit f7c41966b0
2 files changed
+64 -12

No files matched your search

+62 -10
View File
@@ -33,7 +33,7 @@ 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&hellip;</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>yes &mdash; ask Frank</td></tr>
<tr><td>watch a film or a show</td><td><a href="https://jelly.franksdank.cloud">Jellyfin</a></td><td>no &mdash; 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 &mdash; 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 &mdash; 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>
@@ -77,15 +77,17 @@ There is no signup button on purpose.</p>
<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.</p>
<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">Three doors keep their own accounts and will not take the family
password: <strong>Jellyfin</strong>, <strong>Plex</strong> (a Plex account, its own e-mail
login) and the e-book door. Frank creates those by hand.</p>
<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> &mdash; 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>
&mdash; the same button you get at the bottom of the homepage.</p>
@@ -128,8 +130,10 @@ account of any company's, and the posters and episode guides are all filled in.<
<h3>Getting in</h3>
<ul>
<li>Pick your name. There is no list of names on the login screen &mdash; type yours.</li>
<li>Type the password Frank set for you. <strong>It is not the family password</strong>;
this is the most common wrong door.</li>
<li>Type your <strong>franksdank.cloud password</strong> &mdash; 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 &mdash; 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>
@@ -147,7 +151,8 @@ account of any company's, and the posters and episode guides are all filled in.<
</ul>
<h3>If it misbehaves</h3>
<ul>
<li>Wrong password and no error you understand? That's the family password again.</li>
<li>It rejects a password that works everywhere else? Your name isn't on the library-access
list yet &mdash; ask Frank.</li>
<li>A film with a blank poster is missing artwork, not missing files &mdash; Frank can refresh it.</li>
<li>Buffering away from home usually means the pipe out of the house, not the server.</li>
</ul>
@@ -167,7 +172,8 @@ Plex's own sign-in, and that is correct: Plex is closed-source and insists on a
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>Ask Frank for an invitation; he can also tell you which of the two has the thing you're looking for.</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>
@@ -359,6 +365,51 @@ Qwen3.8-Flash-Next v2, abliterated
(<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 &mdash; <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 &mdash; 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>&hellip;). 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> &mdash; 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&nbsp;billion parameters, 4-bit) plus its 12&nbsp;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 &mdash; 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": "&hellip;", "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">
@@ -401,7 +452,8 @@ one you were given? Ask Frank to widen the key.</p>
scripts it needs (or an extension is). Allow scripts for that site, or try another browser.
Still looping? Ask Frank &mdash; 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 Jellyfin, Plex or the e-book door.</li>
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 &mdash; or Frank is
mid-conversation; the big one is on the same machine as the films.</li>