← All entries

Dev Log

Build notes from the Jefe ecosystem

Titan Online, Network Segmentation, and a Training Pipeline That Actually Works

Mission Control March 22, 2026

Marathon session: Titan server went from parts on a desk to a fully operational GPU inference box. We segmented the home network into three VLANs via the UniFi API, pivoted the GPU rental business model to an inference API, added Goose as a second agent runtime, fixed Jefebot's daily crashes, polished two idle games, and deployed Forgejo for self-hosted git. Twelve repos touched, seven pushed.

Titan Lives

The motherboard booted on first try with 48GB of RAM (one DIMM was incompatible). Secure boot and a missing GPU power cable caused initial black screens, but once sorted, Ubuntu 24.04.4 installed cleanly. Post-install script handled NVIDIA drivers, CUDA, Docker with NVIDIA Container Toolkit, Ollama, UFW firewall, and SSH hardening. The enterprise NVIDIA GPU showed up with high-VRAM capacity at 41C idle. We pulled qwen2.5:7b, llama3.1:8b, and qwen2.5:32b — the 32B model loads comfortably with plenty of VRAM to spare. A 3.4TB LVM data volume was carved out for Docker and model storage, and Prometheus exporters (node_exporter + DCGM) are feeding GPU metrics back to the local monitoring stack.

Network Segmentation via UniFi API

Built a full UniFi gateway client into JefeHome (async httpx, local API, no cloud dependency). Created two local admin accounts on the gateway (read-only for monitoring, admin for changes), then used the API to create a Media VLAN for entertainment devices with mDNS reflection for Chromecast casting, moved all IoT devices to a separate IoT network segment, and deployed seven inter-VLAN firewall rules. The firewall API turned out to use 5-digit indices on current firmware — that took some discovery. Added a background monitoring service that polls network health every 5 minutes and will alert via ntfy on device offline, health changes, or new unknown devices joining.

Product Roadmap Pivot

GPU rental via Vast.ai/RunPod was dropped — RunPod closed Community Cloud to new hosts, and Vast.ai requires a dedicated machine which conflicts with running our own services. Pivoted to an Inference API + Custom Distillation model: sell API access to hosted LLMs, offer scheduled fine-tuning jobs as a premium upsell. Titan runs both customer inference and internal workloads (AIMemeLord, Ollama, ComfyUI) without conflict. Explored Kimi K2.5 (Modified MIT, commercially viable) as a Tier 3 evaluation model alongside local Qwen.

JefeAgentOS Gets Goose

Added Goose (Block's open-source AI agent framework, Apache 2.0) as a second runtime in JefeAgentOS alongside Claude CLI. New agent model fields (runtime, goose_provider), Goose command builder, stream-json output parser, three Goose presets (Local Ollama, Cloud Anthropic, Cloud OpenAI), and a GET /models/goose endpoint. JefeAgentOS now orchestrates both Claude and Goose agents with the same lifecycle management, cost tracking, and persistence.

Training Pipeline Dressed Up

Enriched the persona generator with production-accurate system prompts from GygaxBot and Jefebot, expanded DM scenarios from 5 to 8 categories (added rule adjudication, encounter design, improvisation), added campaign-specific grounding (Spitwater locations, actual party characters), added a Goldengloom NPC persona group, and built robust field extraction with fallback matching for model JSON variations. Fixed MLflow's fallback so it disables globally on first connection failure instead of retry-storming. Training data generation is now running against Titan's 32B model.

Jefebot Stops Dying

Jefebot was crashing daily because process.exit(1) fired on any service initialization failure — including transient Twitch auth errors during network blips. Moved uncaught exception handlers to register before service init, made service failures non-fatal (only Discord login is fatal), added TMI.js auth failure auto-recovery with token refresh, EventSub double-reconnect guard, 5-minute heartbeat logging, and log rotation at 5MB.

Game Polish

The Grindstone got death consequences (red flash + XP penalty), a pause system for retreating from deadly zones, auto-retreat after 3 rapid deaths, VFX intensity settings (Full/Reduced/Off), chat log filters, quest completion tallies, smart loot filtering (upgrades only by default), mobile layout fixes, and expanded spells for all four classes (Paladin went from 3 to 7 abilities). Idle Dread got autopilot cost reduced to $50, variable click counts per task, and the coffee debuff cut from 80% to 30%.

VibeBot4000 Upgrades

Added EventSub message deduplication (half-eviction at 500), channel emote system with per-channel modes and dashboard toggle, sub verification, JefeHQ heartbeat reporting, spam scheduler editing and "send now" buttons, and fixed the live channel detection (was passing #channel to Helix API). The emote system fetches tier 1 subscriber emotes per channel and sprinkles them into greetings and vibe responses.

What's Next

  • Run full persona training data generation on Titan's 32B, then QLoRA training
  • Deploy Forgejo mirrors of key repos
  • JefePass credential management (priority for tightening server access on Titan)
  • Set up ComfyUI on Titan for AIMemeLord GPU workloads
  • Create a dedicated Server VLAN when Titan moves to permanent location
  • Fix Enclave user management and commit prior-session freechat/ourspace changes
  • Create remotes for games and jefeworks_dotcom repos