Tabby-Tavern Development Log
Engineering history for the containerized local AI lab. Public tree is sanitized β no live keys, no weights, no chat logs.
Hardware baseline
- GPU: NVIDIA GeForce RTX 4070 (12 GB)
- Environment: WSL2 Ubuntu + Docker Compose with NVIDIA GPU passthrough
- Primary inference path (v3 UNIFIED): Qwen3.5-9B GGUF on llama.cpp CUDA (
qwenservice) - Alternate inference (profile): TabbyAPI EXL3 + Ollama GGUF
- Character frontend: SillyTavern (PNG character cards)
- Tooling: MCPO + FastMCP; optional dockroot diagnostics
- Coding pack: former Basecamp volumes on the same network
v3.0.0 UNIFIED β Taproot + Basecamp folded in (2026-08-25)
Hermes session 20260825_002829 merged the running Taproot Qwen stack and Basecamp coding pack into /home/jpanasuk/tabby-tavern/docker-compose.yml.
- Compose project:
tabby-tavern - Network:
tabby-tavern_ai-network - Default: 15 services. Qwen and Postgres healthy. SearXNG / MCPO / code-server / Qdrant / Meilisearch HTTP 200.
- Primary endpoint:
http://qwen:8080/v1in-network,http://localhost:1234/v1on the host. Model aliasQwen3.5-9B. - TabbyAPI + Ollama:
--profile alternate-inference(VRAM contention). - dockroot:
--profile diagnostics, socket read-only, no host port. - Basecamp named volumes preserved (
basecamp_*). - Public tree sanitizes host model paths to
./models/...and dropsexternal: trueso a stranger canupwithout those volume names pre-created. - Sell sheet rewritten from this live graph β not the old 6-service pitch and not the fake 21-service pitch.
Week 1 β Core integration
- Consolidated TabbyAPI, SillyTavern, Open WebUI, Ollama, SearXNG into one compose file
- Adopted EXL3 weights for faster VRAM load vs earlier experiments
- Fixed cross-container TabbyAPI auth/whitelist failures that blocked peer services
- Added persistent volume mounts for configs and data directories
Week 2 β Model bring-up & GPU tuning
- Loaded Llama-3.1-8B-Instruct EXL3 (6.0 bpw class) into
tabby_models/ - Tuned container env: flash attention / KV cache flags,
shm_size: 16g, CUDA device ordering - Documented start/stop operational loop (
docker compose down && up -d)
Week 3 β Public packaging
- Created sanitized publish tree (no weights, no user DBs, no tokens)
- Added SECURITY.md and example TabbyAPI config
- Mirrored narrative to GitHub portfolio rebuild (Aug 2026)
- Early public revisions accidentally included lab convenience keys β treat those as burned (see SECURITY.md)
Week 4 β WSL2 fresh install + MCPO (Aug 2026)
Full from-scratch rebuild on clean WSL2 (same RTX 4070). Every fix is in the README WSL2 field notes.
Issues hit and resolved
- EXL2 dropped from TabbyAPI.
ghcr.io/theroyallab/tabbyapi:latestno longer loads EXL2. Switched toturboderp/Llama-3.1-8B-Instruct-exl36.0bpw. - NVIDIA Container Toolkit repo URL.
deb ... noble mainβ aptMalformed entry (Component). Flat repo line withamd64 /works. - libcuda.so missing in container. Triton/exllamav3 link step needs
-lcuda. Dockerfile now symlinks/usr/local/cuda-12.8/compat/libcuda.so. - Port conflict with host Ollama. Docker Ollama remapped to host 11435.
- Open WebUI only wired to Ollama. Added
OPENAI_API_BASE_URL=http://tabbyapi:5000/v1so the UI can use EXL3 and GGUF. - SillyTavern browser launch in Docker.
browserLaunch.enabled: false. KeepbasicAuthMode: trueor ST will refuse to start on 0.0.0.0. - SearXNG JSON format. Default was HTML-only; added
jsonfor MCPO + Open WebUI RAG. - 12 GB VRAM tuning.
cache_8bit: true,max_seq_len: 8192,cache_size: 8192. ~8 GB used by 6.0bpw EXL3, ~4 GB left for a small GGUF.
MCPO MCP server β built and integrated
- FastMCP server at
mcp-servers/server.py(not raw JSON-RPC) - Seven tools via MCPO OpenAPI at
/host-master/:list_tabbyapi_modelstabbyapi_chatlist_ollama_modelsollama_pull_modelollama_chatget_stack_statussearxng_search
- MCPO config uses
/app/.venv/bin/python3because that venv hasmcp - Empty
mcpServerscrashes MCPO β always ship at least one entry - Companion
tavern_mcp.pyis the connectivity toolkit (status / self-check / wire)
Character cards
- SillyTavern PNG character cards are first-class in this tree (
cards/) - Default Seraphina card + expression sprites copied from the lab ST data dir (no chats, no secrets)
- README documents import into a fresh SillyTavern
Compose shape vs earlier public tree
- In:
mcposervice (port 8001), Open WebUI dual-backend env, Ollama host 11435, character cards - Out of core compose: SearXNG Redis (SearXNG runs fine without it; JSON search still works)
- Optional
docker-compose.starter.ymloverlay for extra coding tools (not required)
Final verified state (24/24 checks)
- Six containers running, no restart loops
- TabbyAPI: EXL3 model loaded, chat ~53 tok/s processing
- Ollama:
llama3.1:8bpulled - Open WebUI: healthy, connected to TabbyAPI and Ollama
- SillyTavern: running with basic auth; cards importable
- SearXNG: serving with JSON format
- MCPO: 7 tool endpoints live
- GPU: 8 GB / 12 GB VRAM on RTX 4070
v2.0.0 public release (2026-08-25)
- Hugging Face model card (this README YAML) brought in sync with the live lab
- GitHub first tagged release (
v2.0.0) - Public
mcpo/config.jsonno longer contains a live TabbyAPI key (placeholder only) - Cards, MCPO, WSL2 Dockerfile fix, and dual-backend Open WebUI are in the published compose
Open follow-ups
- One-command bootstrap that builds the TabbyAPI image + prints next model download
- Healthcheck targets in compose
- Optional Traefik/Caddy reverse-proxy profile for LAN HTTPS
- Keep Redis as an optional compose profile if SearXNG cache becomes a bottleneck