Files
serverAppConfigs/shared/homepage/services.json
T
Frank 8500600d09 frank-primary: swap Dankserver to llama.cpp Qwen3.8-Flash-Next Q8_0
The 2026-09-26 same-day cutover that ended the Lucebox DS4.1 detour:
Dankserver's :7770 endpoint is now unsloth llama.cpp (the b11030-mix
prebuilt, ROCm gfx120X, bundled runtime) serving
unsloth/Qwen3.8-Flash-Next-GGUF at Q8_0 — 175.30 GiB across six sha256-
verified split parts — on both Radeon AI PRO R9700s, as a ROOT unit (the
frank-large shape: no container, no generated unit).

The deployed contract:

- Placement law: layer split -ts 1,1 with -ngl 999; the routed experts
  and the 51B-param n-gram (PLE) table are COMPUTED in host RAM via
  -ot exps=CPU,ngram_embeddings=CPU (the x4-pair measurement: streaming
  over PCIe loses at 3.7 t/s, computing in RAM does not care).
  per_layer_token_embd.weight=CPU is required by the shared MTP head's
  borrow path (a GPU-resident borrow crashes the draft load).
  mmap stays on; --cache-ram 16384.
- Spec chain draft-mtp,ngram-mod: the shared Q8_0 MTP head
  (mtp-...-shared-Q8_0.gguf, 2,786,568,256 B) at depth 2, with the
  draftless ngram-mod matcher chained behind it — the only legal way to
  layer two spec implementations in one process.
- Vision explicit: --mmproj names the BF16 projector (this build never
  autoloads; a server without it comes up healthy and text-only).
- Reasoning: --reasoning-format deepseek → reasoning_content; the
  Qwen3.8 template's {xhigh, medium, low} reasoning_effort gate folded
  by reasoningEffortMap in models.yml.
- One stream, the model's full 262,144 context; greedy server default
  with Qwen-recommended sampling riding compat.extraBody.

The deployer's deploy_llm_primary is rewritten for the root unit: it
gates every artifact at its declared byte count (stat -c %s, never wc -c
— which read the whole 377 GiB lucebox file for minutes on 2026-09-26),
retires the lucebox user quadlet to dated home trash, waits out port
7770, relinks/enables/restarts the root unit and waits up to 1800 s for
/health. The quadlet-era tree under dankserver/frank-primary/ is
archived (dankserver/.AGENTTRASH/20260926-llamacpp-cutover/ on this
box; git history everywhere else) and its planner mapping replaced by
the scripts/ trio.

Observability flips back to the llamacpp namespace: a frank-primary
Prometheus job at 192.168.0.235:7770 (cross-host LAN — the netavark
published-port quirk that forces host.containers.internal for the two
Dankclaw endpoints is same-host only), the LlmEndpointDown runbook
text, and the dashboard description for three llama.cpp endpoints.

Docs: the new runbook (frank-primary-llamacpp-qwen38-flash-next-q8.md),
RETIRED banners on the lucebox and radiance runbooks and their index
entries, the AGENTS.md fleet section rewritten for the root-unit shape,
and the homepage frank-medium card renamed to frank-primary with the
Q8_0 Flash-Next spec (docs.html #models and the modality note updated:
images on frank-primary and frank-small, audio on frank-small only).

models.yml: the dankserver provider is "llamacpp (dankserver)" serving
frank-primary, contextWindow 262144, maxTokens 65536 (compaction-gap
law: 183,501 + 65,536 <= 262,144), input [text, image].

Suite: 346 green (frank_primary_unit.bats rewritten for the root unit —
16 tests pinning the placement law, the shared-head requirement, the
explicit projector, HIP env hygiene (BIND_HOST, never bare HOST), and
the deployer's byte-count gates; the quadlet-era planner and
changed-tests mappings rewritten for the trio; the observability scrape
test asserts three llamacpp jobs again).

Rollback: the lucebox image (localhost/lucebox-rocm:gfx1201) and the
378 GiB payload stay on the host; the Qwen payload stays fetched, so a
re-swap in either direction is a redeploy, not a refetch.
2026-09-26 19:45:28 -07:00

438 lines
11 KiB
JSON

[
{
"name": "SearXNG",
"category": "user",
"section": "Web Apps",
"description": "AI-free, VPN-routed search engine, fully hosted on Frank's server.",
"url": "http://search.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:8081",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "OpenWebUI",
"category": "user",
"section": "AI",
"description": "AI Chat/Search interface",
"url": "http://ai.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3005",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Gitea",
"category": "user",
"section": "Web Apps",
"description": "Git code hosting and review platform.",
"url": "http://gitea.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3000",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Calibre-Web",
"category": "user",
"section": "Media Library Apps",
"description": "E-book library.",
"url": "http://books.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:8083",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "RomM",
"category": "user",
"section": "Media Library Apps",
"description": "ROM and emulator library.",
"url": "http://romm.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:8085",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Copyparty",
"category": "user",
"section": "Web Apps",
"description": "Direct downloads from Frank's server.",
"url": "http://files.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:3923",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Plex",
"category": "user",
"section": "Media Library Apps",
"description": "Closed source media server with apps for everything.",
"url": "http://plex.franksdank.cloud/web/index.html",
"docs": "",
"probe": "192.168.0.235:32400",
"method": "tcp",
"wip": false,
"showLink": true
},
{
"name": "Jellyfin",
"category": "user",
"section": "Media Library Apps",
"description": "Open source media server.",
"url": "http://jelly.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:8096",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Seerr",
"category": "user",
"section": "Media Library Apps",
"description": "Download Requests",
"url": "http://seerr.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:5055",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Marreta",
"category": "user",
"section": "Web Apps",
"description": "Clean, ad-free article reader. Paste any URL, get just the article.",
"url": "http://marreta.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:8082",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Sonarr",
"category": "admin",
"section": "Media Library Apps",
"description": "TV series library and automation.",
"url": "http://192.168.0.112:8989",
"docs": "",
"probe": "192.168.0.112:8989",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Hermes",
"category": "admin",
"section": "AI",
"description": "The agent gateway.",
"url": "http://hermes.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:8787",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Hermes dashboard",
"category": "admin",
"section": "AI",
"description": "Agent management UI (config, API keys, sessions).",
"url": "http://hermesadmin.franksdank.cloud",
"docs": "",
"probe": "192.168.0.143:9119",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Grafana",
"category": "admin",
"section": "Observability",
"description": "Dashboards.",
"url": "http://grafana.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3002",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Prometheus",
"category": "admin",
"section": "Observability",
"description": "Metrics collection.",
"url": "http://prometheus.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:9090",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Loki",
"category": "admin",
"section": "Observability",
"description": "Log storage.",
"url": "http://loki.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3100",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "node-exporter",
"category": "admin",
"section": "Observability",
"description": "Host metrics.",
"url": "",
"docs": "",
"probe": "127.0.0.1:9100",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "alloy",
"category": "admin",
"section": "Observability",
"description": "Log shipping.",
"url": "",
"docs": "",
"probe": "127.0.0.1:12345",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "alertmanager",
"category": "admin",
"section": "Observability",
"description": "Alert delivery to Signal.",
"url": "",
"docs": "",
"probe": "127.0.0.1:9093",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "Caddy",
"category": "admin",
"section": "Infrastructure",
"description": "The reverse proxy.",
"url": "",
"docs": "",
"probe": "127.0.0.1:80",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "Pi-hole",
"category": "admin",
"section": "Infrastructure",
"description": "LAN DNS + ad blocking.",
"url": "http://pihole.franksdank.cloud",
"docs": "",
"probe": "192.168.0.143:8083",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Gluetun",
"category": "admin",
"section": "Infrastructure",
"description": "The outbound VPN tunnel.",
"url": "",
"docs": "",
"probe": "127.0.0.1:51820",
"method": "tcp",
"wip": "closed",
"showLink": false
},
{
"name": "frank-large",
"category": "user",
"section": "AI",
"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.",
"inputs": ["text"],
"use": "Cybersecurity and debugging. Requires Frank's permission."
},
"url": "",
"docs": "/docs#models",
"probe": "127.0.0.1:7770",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "frank-primary",
"category": "user",
"section": "AI",
"details": {
"role": "Primary model",
"spec": "Qwen3.8-Flash-Next (Q8_0, 175.3 GiB) — full 262k-token context, one conversation; sees images. Spec-drafted (MTP + n-gram) on both R9700s.",
"inputs": ["text", "image"],
"use": "Software engineering, system administration, and instruction tasks."
},
"url": "",
"docs": "/docs#models",
"probe": "192.168.0.235:7770",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "frank-small",
"category": "user",
"section": "AI",
"details": {
"role": "Fast utility model",
"spec": "Gemma4-12B QAT (Q4_K_M, 7.4 GiB) — 1M-token pool across four conversations; fastest at images.",
"inputs": ["text", "image", "audio"],
"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",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "mariadb",
"category": "admin",
"section": "Infrastructure",
"description": "RomM's database (Dankserver). Not probeable from the monitor: 3306 is container-internal, and publishing a database port on the LAN is not a trade this fleet makes. RomM's own card covers the stack.",
"url": "",
"docs": "",
"probe": "192.168.0.235:3306",
"method": "tcp",
"wip": "closed",
"showLink": false
},
{
"name": "valkey",
"category": "admin",
"section": "Infrastructure",
"description": "SearXNG's cache/limiter (Dankclaw). Not probeable: 6379 is container-internal. SearXNG's own card covers the stack.",
"url": "",
"docs": "",
"probe": "127.0.0.1:6379",
"method": "tcp",
"wip": "closed",
"showLink": false
},
{
"name": "Prowlarr",
"category": "admin",
"section": "Media Library Apps",
"description": "Indexer manager.",
"url": "http://prowlarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:9696",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Radarr",
"category": "admin",
"section": "Media Library Apps",
"description": "Movie library and automation.",
"url": "http://radarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:7878",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Readarr",
"category": "admin",
"section": "Media Library Apps",
"description": "Book library and automation.",
"url": "http://readarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8787",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Lidarr",
"category": "admin",
"section": "Media Library Apps",
"description": "Music library and automation.",
"url": "http://lidarr.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8686",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "qBittorrent",
"category": "admin",
"section": "Media Library Apps",
"description": "Torrent client.",
"url": "http://qbittorrent.franksdank.cloud",
"docs": "",
"probe": "192.168.0.112:8080",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Tautulli",
"category": "admin",
"section": "Media Library Apps",
"description": "Plex statistics and notifications.",
"url": "http://192.168.0.235:8181",
"docs": "",
"probe": "192.168.0.235:8181",
"method": "http",
"wip": false,
"showLink": true
},
{
"name": "Postgres",
"category": "admin",
"section": "Infrastructure",
"description": "Authentik's and Gitea's databases (Dankclaw). Not probeable: 5432 is container-internal. Their apps' cards cover the stacks.",
"url": "",
"docs": "",
"probe": "127.0.0.1:5432",
"method": "tcp",
"wip": "closed",
"showLink": false
},
{
"name": "ComfyUI",
"category": "admin",
"section": "AI",
"description": "Node-based image generation.",
"url": "http://comfyui.franksdank.cloud:8188",
"docs": "",
"probe": "127.0.0.1:8188",
"method": "http",
"wip": false,
"showLink": true
}
]