diff --git a/serverAppConfigs-docs/log.md b/serverAppConfigs-docs/log.md index c29d062..c593036 100644 --- a/serverAppConfigs-docs/log.md +++ b/serverAppConfigs-docs/log.md @@ -3,6 +3,7 @@ ## 2026-09-25 - `/serverAppConfigs-docs/Dankserver/Jellyfin.md` — Jellyfin LDAP 401 resolved: the auth works via the modern `/Users/AuthenticateByName` endpoint (HTTP 200, alex authenticated, full plugin flow logged: service bind → search → ldapUid → user bind → token). The 401 was a test artifact — I had been probing the legacy `/Users/Auth/Password` route, which Jellyfin 12.1 removed (the `LegacyEmbyRouteRewriteMiddleware` is gone). The web UI uses the modern endpoint, so user logins are fine. No config change needed; the LDAP-Auth 23.0.0.0 plugin + authentik 2026.8.3 outpost are healthy. - `/shared/homepage/services.json`, `/shared/homepage/docs.html` — Suggested uses added to the three LLM model descriptions (status cards + the `/docs` model guide + the "which one to pick" foot-note): frank-large → cybersecurity + debugging (use requires Frank's permission); frank-medium → the primary intelligent model (surpasses Claude Sonnet 5 per Artificial Analysis) for software engineering, sysadmin, instruction tasks; frank-small → the fast/cheap utility model (agentic search, RAG, research subagents, translation, roleplay, summarization). Deployed to `/srv/homepage`; bats 19/19 + non-Mac-mini e2e green (d3c8197). +- `/shared/homepage/{services.json,app.js,style.css,docs.html}` — Model cards reworked to a structured three-line shape: each LLM card now carries a `details` object (role / spec / use) rendered as a bold pale-green role, a bright-green spec line, and a dim "Use:" line (`app.js` `descHTML()` falls back to the plain `description` for non-LLM cards; new `.desc-role`/`.desc-spec`/`.desc-use` CSS + bare-mode reset). Roles made neutral (no nicknames): frank-large = deep reasoning, frank-medium = primary model, frank-small = fast utility model. The `/docs` model guide was also fixed — it had drifted to retired model info (frank-large listed as Qwen3.8-Flash-Next 87.3 GiB / 200k, frank-medium as FP8 ~31 GiB) — now Qwen3.8-27B UD-Q8_K_XL 31.5 GiB / 262k and MXFP4/W4A8 19.4 GiB, reordered large→medium→small. bats 30/30 + live browser render verified. - Fleet-wide container update (dankclaw + dankserver) — every pullable image brought current. Pinned bumps: authentik `2026.8.0`→`2026.8.3` (server/worker/outpost), tautulli `v2.18.1-ls242`→`ls245`, calibre-web `0.6.27-ls397`→`ls402`, plex `1.43.3.10896`→`1.43.4.10903`; seerr already at `v3.4.1`. Local-build rebuilds (forced `--no-cache`, the base images had moved): caddy (xcaddy porkbun), alloy, loki, comfyui-rocm (ComfyUI re-cloned), hermes ×3 (fresh `:latest`, `23986f31`→`e1e87aec`). anubis already at latest stable `v1.27.0` (only pre-releases exist beyond). Verified: all 16 floating-tag services CURRENT (zero stale), every real container active, caddy edge serving (auth 302 / ai 200), 340 bats green. Excluded: frank-medium/radiance-vllm (custom LLM build). - `/dankserver/{tautulli,calibre-web,plex}/quadlet/*.container`, `/dankclaw/authentik/quadlet/*.container` — version pins bumped; docs (Tautulli.md, Calibre-Web.md, Plex.md, Authentik.md + server/worker, index.md) and the dead `dankserver/compose.yaml` plex entry synced (0b1ea2e). diff --git a/shared/homepage/app.js b/shared/homepage/app.js index 8ea1246..30c39f8 100644 --- a/shared/homepage/app.js +++ b/shared/homepage/app.js @@ -31,6 +31,20 @@ function esc(s) { }); } +// The description: structured role/spec/use lines when the service defines +// them (the LLM cards), else the plain description string. +function descHTML(svc) { + const d = svc.details; + if (d && (d.role || d.spec || d.use)) { + const lines = []; + if (d.role) lines.push('
' + esc(d.role) + '
'); + if (d.spec) lines.push('
' + esc(d.spec) + '
'); + if (d.use) lines.push('
Use: ' + esc(d.use) + '
'); + return lines.join(''); + } + return esc(svc.description || ''); +} + // Shared panel component: one TUI panel for a service in a given state. function renderPanel(svc, state) { const panel = document.createElement('div'); @@ -43,7 +57,7 @@ function renderPanel(svc, state) { ' ' + BADGE_LABEL[state] + '' + ' ' + esc(svc.name) + '' + '' + - '
' + esc(svc.description || '') + '
' + + '
' + descHTML(svc) + '
' + ''; return panel; } diff --git a/shared/homepage/docs.html b/shared/homepage/docs.html index c36c245..66c5842 100644 --- a/shared/homepage/docs.html +++ b/shared/homepage/docs.html @@ -45,26 +45,26 @@

Three models serve the family. The homepage status cards show whether each one is up right now.

-

frank-large — the big brain

+

frank-large — deep reasoning

-

frank-small — the eyes

+

frank-medium — the primary model

-

frank-medium — the 27B generalist

+

frank-small — the fast utility model

Which one to pick? Small utility work, RAG, search, and diff --git a/shared/homepage/services.json b/shared/homepage/services.json index 75d8c77..c1de2ed 100644 --- a/shared/homepage/services.json +++ b/shared/homepage/services.json @@ -267,7 +267,11 @@ "name": "frank-large", "category": "user", "section": "AI", - "description": "Qwen3.8-27B (UD-Q8_K_XL, 31.5 GiB) — 262k-token context, one conversation at a time. The big brain: long, thoughtful text conversations, DFlash2 spec decode. Text only; it cannot see images. Suggested use: cybersecurity and debugging tasks — use requires Frank's permission.", + "details": { + "role": "Deep reasoning model", + "spec": "Qwen3.8-27B (UD-Q8_K_XL, 31.5 GiB) — 262k-token context, one conversation at a time, text only.", + "use": "Cybersecurity and debugging. Requires Frank's permission." + }, "url": "", "docs": "/docs#models", "probe": "127.0.0.1:7770", @@ -279,7 +283,11 @@ "name": "frank-medium", "category": "user", "section": "AI", - "description": "Qwen3.8-27B-Uncensored (MXFP4/W4A8, 19.4 GiB) — 262k-token context shared by up to eight conversations. The primary intelligent model: surpasses Claude Sonnet 5 per Artificial Analysis. Suggested use: software engineering, system administration, and instruction tasks. It sees images.", + "details": { + "role": "Primary model", + "spec": "Qwen3.8-27B-Uncensored (MXFP4/W4A8, 19.4 GiB) — 262k-token context across up to eight conversations; sees images. Beats Claude Sonnet 5 per Artificial Analysis.", + "use": "Software engineering, system administration, and instruction tasks." + }, "url": "", "docs": "/docs#models", "probe": "192.168.0.235:7770", @@ -291,7 +299,11 @@ "name": "frank-small", "category": "user", "section": "AI", - "description": "Gemma4-12B QAT (Q4_K_M, 7.4 GiB) — 1M-token pool across four 262k-token conversations. The fast, cheap utility model and the eyes (screenshots, photos, diagrams). Suggested use: agentic search, text/audio/image RAG, research subagents, language translation, roleplaying games, summarization — any small utility task that doesn't require much intelligence.", + "details": { + "role": "Fast utility model", + "spec": "Gemma4-12B QAT (Q4_K_M, 7.4 GiB) — 1M-token pool across four conversations; fastest at images.", + "use": "Agentic search, RAG, research subagents, translation, roleplay, and summarization — any small task that doesn't need much intelligence." + }, "url": "", "docs": "/docs#models", "probe": "127.0.0.1:7771", diff --git a/shared/homepage/style.css b/shared/homepage/style.css index 9131b35..4209755 100644 --- a/shared/homepage/style.css +++ b/shared/homepage/style.css @@ -78,6 +78,9 @@ body::before { .badge.wip-open { color: var(--wip); } .badge.wip-closed { color: var(--dim); } .desc { color: var(--fg); margin: 8px 0; } +.desc-role { color: var(--head); font-weight: bold; } +.desc-spec { color: var(--fg); } +.desc-use { color: var(--dim); margin-top: 4px; } .links a { color: var(--link); text-decoration: underline; margin-right: 12px; } .foot { @@ -105,5 +108,6 @@ html[data-bare="1"] body { background: #fff; color: #000; font-family: serif; te html[data-bare="1"] body::before { display: none; } html[data-bare="1"] .panel, html[data-bare="1"] .top, html[data-bare="1"] .foot { border-color: #000; background: none; } html[data-bare="1"] .badge, html[data-bare="1"] .name, html[data-bare="1"] .desc, html[data-bare="1"] .summary, html[data-bare="1"] .section-title { color: #000; } +html[data-bare="1"] .desc-role, html[data-bare="1"] .desc-spec, html[data-bare="1"] .desc-use { color: #000; font-weight: normal; } html[data-bare="1"] .section-title { border-color: #000; } html[data-bare="1"] .links a, html[data-bare="1"] .toggle, html[data-bare="1"] .foot a { color: #000; }