// 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 via qwen3_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 vibe CLI 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.py applies quality-signal scoring + style gates; FLUX.1-schnell renders the matching hero image on the same Spark; scripts/blog-deploy-verify.sh orchestrates 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:8888 powers 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.