// hardware + software inventory
The Stack
What actually runs, where it runs, and what it talks to. Snapshot date is printed below; check the engineering log for in-flight changes.
Snapshot: 2026-09-30
Hardware
- Primary host
- NVIDIA DGX Spark: GB10 Blackwell, 128 GB LPDDR5x unified memory, 4 TB NVMe, ARM v9.2-A. In daily operation since 2026-04. The buy-or-skip reasoning is in Should You Buy a DGX Spark in 2026.
- Public VPS
- FlokiNET no-KYC EU VPS: Debian 13, 1.9 GiB RAM, 50 GB disk, Docker CE + Caddy. Serves sovgrid.org and mcp.sovgrid.org (Floki VPS setup).
- Lightning node
- Raspberry Pi 4 (4 GB): Alby Hub + LNbits for V4V zaps (self-hosted Lightning operator's guide).
- Mobile companion
- Pixel Android: Termux + Tailscale + SSH-on-2222 into Spark, running opencode in tmux (mobile terminal setup).
Inference
- Daily driver
- Qwen3.6-35B-A3B NVFP4 (
nvidia/Qwen3.6-35B-A3B-NVFP4) via vLLM, always on: about 80 to 90 tok/s on prose and about 119 on code single-stream, counted from the server's own token usage (MTP speculative decoding makes predictable text faster). MTP k=3, FP8 KV cache, FlashInfer attention with the Marlin MoE backend, 262k context, tool calling viaqwen3_xml, vision on the same endpoint. gpu-memory-utilization 0.35 since 2026-09-30: same decode speed as 0.45, still a 2.76M-token KV cache, 14 GB more room for everything else. It is the most reliable model here in agent loops (18/18 on the agent benchmark). How it compares with its Spark Arena recipe: the recipe check. - Hard problems
- Qwen3.8-27B NVFP4 (
nvidia/Qwen3.8-27B-NVFP4, dense), on demand: 20 to 30 tok/s, but the strongest local reasoner (25 of 28 on my hard task set, Artificial Analysis index 34 against 18 for the daily driver). Switching to it pauses the daily driver, because two big models do not fit in memory at once. How it was picked over Gemma 4 and others: the lineup test. - Engine control
- A small switch script owns the GPU: one big model at a time, the daily driver comes back automatically after a detour, and a watchdog restarts it only if it is truly hung (a token counter that stops moving), not merely busy. Only OSI-licensed open models run locally.
- Image generation
- FLUX.1-schnell on ComfyUI (SparkyUI image, CUDA 13 + SM121A SageAttention). Sub-second per image on the Spark; 32-hero blog batches render in ~5 minutes. Runs sequentially via the switch-script mutex, or beside the resident LLM when unified memory has headroom (the LLM is OOM-protected, ComfyUI is the sacrifice). Setup: ComfyUI + FLUX.
- TTS
- Qwen3-TTS-1.7B-CustomVoice loads beside the resident LLM in unified memory (no mutex needed, about 3.4 GB). It replaced the retired Voxtral after the V6 spot-listen showed a ceiling on long-form expressivity (the Voxtral ceiling and the pivot).
Agents & clients
- Local CLI
- opencode 1.18 against the resident vLLM model as the primary coder, with goose (Block, Apache-2.0) as the backup; both OpenAI-compatible, no strict-alternation issues. The old Mistral-tied
vibeCLI was retired. Tradeoffs: coding-agent comparison. - UI
- OpenWebUI behind Tailscale + Caddy mkcert: custom model "Sovereign Qwen" with system prompt + sovereign-kb RAG + SearXNG web search + mcpo bridge to sovereign-mcp.
- Mobile
- Termux + SSH into a tmux session running opencode against Qwen3.6. The browser-based opencode-web behind Caddy on the tailnet is the secondary path, not the daily driver.
- MCP
- Claude Code targets sovgrid via Streamable-HTTP (mcp.sovgrid.org). opencode, goose and OpenClaw target the local knowledge + sovereign MCP servers. When the MCP is worth installing: the honest MVP.
Publishing & operations
- Blog
- Astro 6 static site, no database, full rebuild under 3 s. Built locally, rsynced to the Floki VPS, served by Caddy. Source mirrored on Gitea (canonical) and GitHub (public). Around 188 articles live as of September 2026. Stack writeup: Astro 6 + Caddy.
- Article pipeline
- Local LLM drafts articles from engineering notes;
scripts/update_blog_from_gitea.pyapplies quality-signal scoring + style gates; FLUX.1-schnell renders the matching hero image on the same Spark;scripts/blog-deploy-verify.shorchestrates build, rsync, drift-commit, axe a11y, and NSM refresh. Zero cloud cost per article once the infrastructure runs. Full mechanism: how this blog actually gets built. - Dashboard
- FastAPI + React single-file SecOps dashboard on the Spark. An Overview page answers one question, "is everything as it should be?": an hourly status engine checks about 30 points on both hosts, including whether the automations themselves (container updates, backups, watchdogs) still succeed, and says for each open item who acts. Service start/stop, AIDE alerts, backup status, MCP restart. Reachable over Tor (.onion) and Tailscale; not exposed on the public internet.
- Payments
- Lightning over the Alby Hub on the Pi 4 (V4V model: no accounts, no platform cut, no subscriptions). Lightning Address in every page footer. Bank transfer on every invoice. No Stripe, no PayPal, no third-party processor in the path.
- Web research backend
- SearXNG on
127.0.0.1:8888powers web search for the article pipeline and the "Sovereign Qwen" custom model in OpenWebUI. No query logging to third parties; meta-search results are aggregated locally.
Storage & secrets
- Layout
/ai/models(LLM weights, HF cache),/data/config,/data/scripts,/data/projects,/data/secrets(chmod 700).- Backups
- age-encrypted tarball, dual-target: nightly to local /data/backups, manual to an offline USB stick. A nightly Floki snapshot pull (NSM stats + Caddy logs) feeds the same backup, and a weekly encrypted Floki full backup goes to the USB stick. The private key is kept off the Spark (the backup rebuild).
- Code
- Local Gitea on 127.0.0.1:3002, not on the public internet (loopback plus a Tor onion), sign-up closed. Two public mirrors on github.com/cipherfoxie: sovereign-mcp (MCP server, MIT) and vps-healthcheck (ops audit, MIT). Per agent-mirroring policy: public-facing tooling only; internal persona-MCPs stay in Gitea.
Public edge
- Domain
- sovgrid.org via FlokiNET-friendly registrar, points at the Floki VPS.
- Reverse proxy
- Caddy with Let's Encrypt: both sovgrid.org and mcp.sovgrid.org, HTTP/2 only (no QUIC over DERP).
- Hardening
- UFW default-deny + fail2ban (sshd, caddy-mcp jails). SSH key-only, AllowUsers cipherfox, MaxAuthTries 3. unattended-upgrades active on Debian-Security origin. Confirmed hostile source nets are dropped at the firewall edge (iptables
DOCKER-USER, because Docker-published ports bypass UFW). - Analytics
- NSM (North Star Metric) aggregator scans raw Caddy logs into /insights/: 30-day external tool-calls, distinct agents (UA + /24 deduped), self-traffic filtered out by CIDR, and distributed-scraper clusters filtered out by UA-over-many-/24s signature. No JS pixel, no cookies, no third-party tracker. Methodology: Insights Dashboard for a DGX Business.
- Daily audit
- floki-healthcheck.sh runs daily from Spark via SSH: 18 checks, one Matrix push. Results stay private and feed the internal status page, never a public endpoint.