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.
438 lines
11 KiB
JSON
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
|
|
}
|
|
]
|