Files
serverAppConfigs/shared/homepage/services.json
T
Frank 8fefe6e1a9 feat(frank-tts): deploy wiring for the 7772 voice endpoint, and voice naming written down
Stage 2 of the voice stack. Repo state only: nothing deployed, no host touched,
no container started.

- `frank-tts` is now registered everywhere a dankclaw service has to be:
  `SERVICE_ORDER` (after `frank-tts-engine`, before the consumers), the planner's
  dankclaw set, `deploy-remote.sh`'s allowlist + dispatch + a
  `deploy_frank_tts` handler, and `deploy.sh`'s dispatch regex — plus the
  `build_compose_image` arm naming `dankclaw/voiceservice/Containerfile`, without
  which the build silently returns 0 and the unit's `Pull=never` tag never
  exists.
- The unit joins TWO networks, in order: `dankclaw_default` first (default route,
  where consumers and open-notebook live), then the voice bridge. `TTS_UPSTREAM`
  moves from `host.containers.internal:8880` to `http://frank-tts-engine:8880` —
  the actual fix for a shape that could never work, since a bridge container
  cannot reach a host-loopback bind and the engine publishes nothing at all.
- `Wants=`/`After=` on the engine, never `Requires=`: the `llama-tts-cli` rollback
  backend needs no upstream, so a broken engine may delay this endpoint but must
  not take its unit down.
- The handler installs the engine's quadlet pair too, because a referenced
  `Network=` file the generator cannot find means no façade unit is produced at
  all, and `--only frank-tts` has no other way to get it. It creates
  `/home/dank/voices` as the deploy user (rootless podman would auto-create a
  missing bind source root-owned, which reads as "no voices"), and gates on
  podman's recorded health.
- Voice naming is now written down where it can be found: a voice is a lowercase
  directory name matching `^[a-z0-9][a-z0-9._-]*$`, at most 64 chars. That shape
  is the intersection of two rules that disagree — the shim would accept mixed
  case, the engine lowercases names — so a mixed-case pack resolves on one side
  only, and the boot warmer refuses it loudly. `narrator1/2/3` are load-bearing
  for open-notebook.
- Homepage card for the pair, `wip: down` and hidden, probing `127.0.0.1:7772`;
  the engine gets no card because it publishes nothing and could never be probed.
- **No Prometheus job, deliberately.** No `/metrics` exists on the shim, this
  Prometheus 3 refuses HTML/JSON bodies (the existing `comfyui` and `services`
  probes are documented down for exactly that), and `LlmEndpointDown` is scoped
  `up{job=~"frank-.*"}` — so a `/health` job would page on Signal for a healthy
  endpoint. Recorded in the page instead of quietly skipped.
- Vault: new [[Frank TTS]] page linked from the index; [[Frank TTS Engine]] now
  points at it for the pair's public signal; log entry for the day.
- Seam grows to 25 tests: the generator's rendering of the pair (both
  attachments, first-network order, one publish, Wants-not-Requires, bounded
  per-unit blocks), the env file's upstream checked as a network JOIN rather than
  a string, planner separation and order, the handler's steps, the card's gating,
  routing that selects both seams for either deployable.
2026-10-18 17:43:08 -07:00

554 lines
16 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[
{
"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,
"warn": "Searches are obfuscated, not anonymous: SearXNG hides you from the upstream engines and the VPN tunnel hides the traffic from the LAN — but the upstream search API keys are tied to Frank’s identity. Don’t treat it as Tor.",
"art": "/img/apps/searxng.svg"
},
{
"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,
"art": "/img/apps/openwebui.png",
"art_bg": "#f5f5f5",
"warn": "Chats stay on Frank's server, but OpenWebUI's web search rides the same SearXNG path as the search app: obfuscated, not anonymous. The upstream search API keys are tied to Frank’s identity."
},
{
"name": "open-notebook",
"category": "user",
"section": "AI",
"description": "Podcast generator — notes in, spoken episode out: script written by frank-zealot, voices rendered by frank-tts. No public route; LAN UI only once it is deployed.",
"url": "",
"docs": "",
"probe": "127.0.0.1:8502",
"method": "http",
"wip": "down",
"showLink": false,
"art": "/img/apps/mono-on.svg"
},
{
"name": "Gitea",
"category": "user",
"section": "Web Apps",
"description": "Git code hosting and review platform. Needs its own login, separate from the dankcloud single sign-on — use the sign-up flow in the app to get an account; no need to ask Frank.",
"url": "http://gitea.franksdank.cloud",
"docs": "",
"probe": "127.0.0.1:3000",
"method": "http",
"wip": false,
"showLink": true,
"art": "/img/apps/gitea.svg"
},
{
"name": "Calibre-Web",
"category": "user",
"section": "Media Library Apps",
"description": "E-book library. Work in progress: not open to family users yet.",
"url": "",
"docs": "",
"probe": "192.168.0.235:8083",
"method": "http",
"wip": "down",
"showLink": false,
"art": "/img/apps/app-calibre.svg"
},
{
"name": "RomM",
"category": "user",
"section": "Media Library Apps",
"description": "ROM and emulator library. Work in progress: not open to family users yet.",
"url": "",
"docs": "",
"probe": "192.168.0.235:8085",
"method": "http",
"wip": "down",
"showLink": false,
"art": "/img/apps/app-gameboy.svg"
},
{
"name": "Copyparty",
"category": "user",
"section": "Web Apps",
"description": "Direct downloads from Frank's server. Everything the other media apps hold — including the work-in-progress ones (Calibre-Web, RomM, Seerr) — is available here.",
"url": "http://files.franksdank.cloud",
"docs": "",
"probe": "192.168.0.235:3923",
"method": "http",
"wip": false,
"showLink": true,
"art": "/img/apps/app-folder.svg"
},
{
"name": "Plex",
"category": "user",
"section": "Media Library Apps",
"description": "Closed source media server with apps for everything. Needs its own Plex login, separate from the dankcloud single sign-on (ask Frank).",
"url": "http://plex.franksdank.cloud/web/index.html",
"docs": "",
"probe": "192.168.0.235:32400",
"method": "tcp",
"wip": false,
"showLink": true,
"art": "/img/apps/plex.svg"
},
{
"name": "Jellyfin",
"category": "user",
"section": "Media Library Apps",
"description": "Open source media server. Work in progress: not open to family users yet.",
"url": "",
"docs": "",
"probe": "192.168.0.235:8096",
"method": "http",
"wip": "down",
"showLink": false,
"art": "/img/apps/jellyfin.svg"
},
{
"name": "Seerr",
"category": "user",
"section": "Media Library Apps",
"description": "Download requests. Work in progress: not open to family users yet.",
"url": "",
"docs": "",
"probe": "127.0.0.1:5055",
"method": "http",
"wip": "down",
"showLink": false,
"art": "/img/apps/seerr.svg"
},
{
"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,
"art": "/img/apps/app-wall.svg"
},
{
"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,
"art": "/img/apps/sonarr.svg"
},
{
"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,
"art": "/img/apps/mono-hm.svg"
},
{
"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,
"art": "/img/apps/mono-hd.svg"
},
{
"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,
"art": "/img/apps/grafana.svg"
},
{
"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,
"art": "/img/apps/prometheus.svg"
},
{
"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,
"art": "/img/apps/mono-lk.svg"
},
{
"name": "node-exporter",
"category": "admin",
"section": "Observability",
"description": "Host metrics.",
"url": "",
"docs": "",
"probe": "127.0.0.1:9100",
"method": "http",
"wip": false,
"showLink": false,
"art": "/img/apps/mono-ne.svg"
},
{
"name": "alloy",
"category": "admin",
"section": "Observability",
"description": "Log shipping.",
"url": "",
"docs": "",
"probe": "127.0.0.1:12345",
"method": "http",
"wip": false,
"showLink": false,
"art": "/img/apps/mono-ay.svg"
},
{
"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,
"art": "/img/apps/mono-am.svg"
},
{
"name": "Caddy",
"category": "admin",
"section": "Infrastructure",
"description": "The reverse proxy.",
"url": "",
"docs": "",
"probe": "127.0.0.1:80",
"method": "http",
"wip": false,
"showLink": false,
"art": "/img/apps/caddy.svg"
},
{
"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,
"art": "/img/apps/pihole.svg"
},
{
"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,
"art": "/img/apps/mono-gt.svg"
},
{
"name": "frank-zealot",
"category": "user",
"section": "AI",
"model": {
"unit": "zealot",
"role": "Frank's utility model",
"hf": "https://huggingface.co/prism-ml/Ternary-Bonsai-2-9B-gguf",
"tagline": "HONOR GUIDE ME!",
"sfx": [
"zealot-honor.ogg"
],
"equiv": "Equivalent to last year's frontier level (2025).",
"spec": "Ternary-Bonsai-2-9B (PQ2_0 ternary weights, MTP head in the file) on an NVIDIA RTX 3090 — ~167 tokens/s; 262k-token context, three submissions at a time; sees images.",
"inputs": [
"text",
"image"
],
"use": "Code editor autocomplete, agentic search, RAG, research subagents, translation, roleplay, and summarization.",
"voice": {
"text": "I LONG FOR COMBAT!",
"sfx": [
"zealot-combat.ogg"
]
},
"supervision": "Requires tight human supervision.",
"warn": "Base-alignment (censored) model: refusals are possible on sensitive topics, and any model can still be steered into risky output. Take this warning seriously — don’t ruin this server for everybody.",
"compaction": "If your agent harness lets you set a compaction model, set this one: a compaction job on the bigger models blocks them for far longer."
},
"url": "",
"docs": "/docs#models",
"probe": "127.0.0.1:7771",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "frank-dragoon",
"category": "user",
"section": "AI",
"model": {
"unit": "dragoon",
"role": "Frank's deep reasoning model",
"hf": "https://huggingface.co/Quat3rnion/halogen-qwen3.8-flash-next-v2-abliterated",
"tagline": "I have returned — make use of me.",
"sfx": [
"dragoon-tagline.ogg"
],
"equiv": "Equivalent to Claude Sonnet 5 / OpenAI-Luna (Summer 2026 frontier intelligence).",
"spec": "Qwen3.8-Flash-Next v2 native abliterated (halogen flash-server, ~62 GiB) on the Strix Halo iGPU — 200k-token context, two submissions at a time; sees images.",
"inputs": [
"text",
"image"
],
"use": "Complex agentic tasks, programming, system administration, and \"claw\"-style personal agents.",
"voice": {
"text": "Awaiting instructions.",
"sfx": [
"dragoon-awaiting.ogg"
]
},
"supervision": "Safe for autonomous, low-supervision use.",
"warn": "Uncensored model: output can include adult content, content that describes harmful, hateful, or illegal acts, content concerning “sensitive offensive cybersecurity topics”, and other output that may carry severe legal risk. Take this warning seriously — don’t ruin this server for everybody."
},
"url": "",
"docs": "/docs#models",
"probe": "127.0.0.1:7770",
"method": "http",
"wip": false,
"showLink": false
},
{
"name": "frank-archon",
"category": "user",
"section": "AI",
"model": {
"unit": "archon",
"role": "Frank's strongest and fastest model runtime",
"hf": "https://huggingface.co/StillDeadcode/qwen3.8-next-flash-fp8-iq4r-moe",
"tagline": "...Power Overwhelming...",
"sfx": [
"archon-power.ogg"
],
"equiv": "Equivalent to Claude Opus 4.8 / OpenAI-Terra (Summer 2026 frontier intelligence).",
"spec": "The engine author's published quant: 4-bit codebook experts + int8 trunk of Qwen3.8-Flash-Next (radiance, ~114 GiB) on twin AMD R9700s with more than 200 GB of system RAM — 200k-token context, three submissions at a time; sees images.",
"inputs": [
"text",
"image"
],
"use": "Software engineering, system administration, and instruction tasks.",
"voice": {
"text": "...we BURN.",
"sfx": [
"archon-burn.ogg"
]
},
"supervision": "Safe for autonomous, low-supervision use.",
"permission": "Ask Frank for permission before use — this is his primary model; he uses it more than anything else on the fleet."
},
"url": "",
"docs": "/docs#models",
"probe": "192.168.0.235:7770",
"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,
"art": "/img/apps/mariadb.svg"
},
{
"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,
"art": "/img/apps/mono-vk.svg"
},
{
"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,
"art": "/img/apps/mono-pw.svg"
},
{
"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,
"art": "/img/apps/radarr.svg"
},
{
"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,
"art": "/img/apps/mono-ra.svg"
},
{
"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,
"art": "/img/apps/mono-ld.svg"
},
{
"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,
"art": "/img/apps/qbittorrent.svg"
},
{
"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,
"art": "/img/apps/mono-tt.svg"
},
{
"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,
"art": "/img/apps/postgresql.svg"
},
{
"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,
"art": "/img/apps/mono-cu.svg"
},
{
"name": "frank-tts",
"category": "admin",
"section": "AI",
"description": "The fleet's cloned-voice speech endpoint: POST /v1/audio/speech with voice=<name>, audio back in that voice. Public on 7772; the engine behind it (frank-tts-engine) is unpublished on purpose. Hidden until deployed.",
"url": "",
"docs": "",
"probe": "127.0.0.1:7772",
"method": "http",
"wip": "down",
"showLink": false,
"art": "/img/apps/mono-ft.svg"
}
]