{"status":"ok","note":"Live service catalog for api.hofmanns.ai. PlanB is the UI cockpit on top.","services":{"api_gateway":{"name":"prototype-api","role":"public REST gateway for api.hofmanns.ai","public_base":"https://api.hofmanns.ai","endpoints":["/health","/v1/chat/completions","/v1/image","/v1/stt","/v1/tts","/v1/services"],"health":{"ok":true,"status":200,"body":{"status":"ok","service":"api.hofmanns.ai","version":"2.0.0","models":{"image":"gpt-image-1","image_provider":"openai","stt":"openai/gpt-audio-mini","tts":"elevenlabs"}}}},"dee_tools":{"name":"dee-tools","role":"REST tools gateway: ask.*, media/static files, FreeWillyBrowser proxy","public_paths":["/tools/*","/v1/ask/*","/v1/media/static/*","/v1/fwb/*"],"upstream":"dee-tools:8765","health":{"ok":true,"status":200,"body":{"service":"dee-tools","ok":true}}},"freewillybrowser":{"name":"FreeWillyBrowser","role":"browser/crawl service exposed through dee-tools and /v1/fwb","public_bases":["https://freewillybrowser.hofmanns.ai","https://browser.hofmanns.ai"],"gateway_paths":["/v1/fwb/health","/v1/fwb/fetch","/v1/fwb/instances"],"health":{"ok":true,"status":200,"body":{"ok":true}}},"tinderme":{"name":"tinderme","role":"Mieze swipe UI + persisted state","public_base":"https://tinderme.hofmanns.ai","gateway_paths":["/tinderme/state","/tinderme/miezen"],"health":{"ok":true,"status":200,"body":{"miezen_count":10,"chats_count":7,"log_count":300,"images_count":9}}},"planb":{"name":"PlanB","role":"UI cockpit over api.hofmanns.ai: notifications, status, storyboards, search, media production, ask.* tools, operator decisions","public_base":"https://planb.hofmanns.ai","gateway_paths":["/planb/*","/v1/planb/*","/api/storyboards","/api/search","/api/image","/api/tts","/api/inbox","/api/tools/*"],"health":{"ok":false,"status":0,"error":"fetch failed"}},"wardrobe":{"name":"mieze-wardrobe","role":"static wardrobe manifest/media served by dee-tools","gateway_paths":["/v1/wardrobe","/v1/wardrobe/random","/v1/media/static/mieze-wardrobe/manifest.json"]}},"infrastructure":{"forgejo":{"name":"forgejo","role":"git server + issues/PRs for hofmanns code repos","public_base":"https://git.hofmanns.ai","ssh":"ssh://git@git.hofmanns.ai:2222","health":{"ok":true,"status":200,"body":{"version":"14.0.3+gitea-1.22.0"}}},"mongo":{"name":"gogo-mongo","role":"shared MongoDB for gogo, tinderme state, planb state","upstream":"gogo-mongo:27017 (internal only)","health":{"ok":true,"status":200,"body":{"service":"gogo","version":"1.2.0","models":{"llm":"anthropic/claude-opus-4.7","image":"google/gemini-3-pro-image-preview","voice":"fish-audio"},"obsidian":4267}}},"qdrant":{"name":"qdrant","role":"vector DB for RAG / memory embeddings","upstream":"qdrant:6333 (internal)","admin_port":6334,"health":{"ok":true,"status":200,"body":{"version":"1.17.1"}}},"gandalf_search":{"name":"gandalf-search","role":"meilisearch full-text index over the obsidian vault + indexer + ui","public_base":"https://search.hofmanns.ai","upstream":"gandalf-search:7700","health":{"ok":true,"status":200,"body":{"status":"available"}}},"dns":{"name":"technitium-dns","role":"authoritative DNS for *.hofmanns.ai + AdGuard-style filtering","public_admin":"https://dns.hofmanns.ai (port 5380)","health":{"ok":true,"status":200,"body":null}},"mailserver":{"name":"docker-mailserver","role":"SMTP/IMAP/Sieve for *@hofmanns.ai + claude@hofmanns.ai inbox","public_endpoints":["smtp.hofmanns.ai:465","imap.hofmanns.ai:993","submission:587"],"health":{"ok":false,"status":0,"error":"fetch failed"}},"authentik":{"name":"authentik","role":"SSO + LDAP outpost (codex rebuilding 2026-05-20)","public_base":"https://auth.hofmanns.ai","health":{"ok":true,"status":204,"body":null}},"typo_enhancer":{"name":"typo-enhancer","role":"OR-free-model cascade enhancer for typing correction","upstream":"typo-enhancer:8111"},"ewa_bot":{"name":"ewa-bot","role":"Telegram bot for Ewa persona (Telegram only — no HTTP)"},"aop":{"name":"aop-revival-test","role":"AoP-Eclipse Java app (codex rebuilding 2026-05-20)","upstream":"127.0.0.1:3901"},"prototype_redis":{"name":"prototype-redis","role":"cache for prototype-api (this gateway)","upstream":"prototype-redis:6379 (internal)"},"fwb_redis":{"name":"fwb-redis","role":"queue/state for FreeWillyBrowser fleet (prod+session+debug)","upstream":"fwb-redis:6379 (internal)"}},"summary":{"total_listed":17,"docker_running":"27 containers (incl. internal supporting services like authentik-postgres/redis/worker, fwb-prod/debug/session, gandalf-indexer/ui, socat-imap, ldap-outpost)","note":"Listed = user-facing or operator-relevant. Full docker fleet via planb cockpit (operator-only)."}}