Work produced by the /kb driver on 2026-07-30. Each change is recorded on its Kanboard task; all remain Done-unverified or parked pending alvis's decisions. #183 agap-mcp/src/gitea.js askpassScript() and giteaWikiWrite()'s wiki checkout both used /tmp/agap-mcp-wiki, so writing the askpass helper made the dir non-empty and git clone always failed. gitea_wiki_write had likely never succeeded in production. Askpass moved to its own dir. #181 agap-mcp/src/server.js Initialise registeredToolCount at module load so /health reports the real count immediately instead of 0 until the first MCP request. #189 kanboard/backup.sh, seafile/backup.sh, vaultwarden/backup.sh, users-backup.sh, openai/backup-{hindsight-adolf,llm-dbs}.sh Remove the dead *.ts Zabbix trapper pushes (never landed). users-backup.sh also pointed at localhost:81 instead of 192.168.1.4:81 and pushed a date string into a numeric item. Freshness monitoring now rides the .age items. #192 RESTORE-RUNBOOK.md, {kanboard,seafile,vaultwarden}/restore.sh Restore path for the three services, verified in throwaway containers. Note: this work found Seafile backups have carried an empty ccnet_db.sql since 2026-07-07 -- filed as kb#222, not fixed here. #164 openai/litellm-config.yaml Metered `judge` (anthropic/claude-haiku-4-5) entry removed per alvis's 2026-07-30 decision. ANTHROPIC_API_KEY was never wired, so it could not spend. #128 openai/agent_registry.py litellm_key_spec() now also grants the routing-mode aliases, gated by the same _reachable_tiers() check as raw grants, so a small-tier agent cannot acquire automatic routing that resolves to tier-large. #219 openai/migrate-adolf-state.sh Migration script only; inert until run. Copies (never moves) the openai_adolf-state volume to /mnt/ssd/dbs/adolf, verifying a full sha256 manifest before declaring success. Tested against a throwaway volume. Deliberately NOT included, both awaiting alvis: agap-mcp/docker-compose.yml -- kb#174's contested BW_EMAIL revert (parked). openai/docker-compose.yml -- kb#219's bind-mount switch; the target dirs under /mnt/ssd/dbs/adolf do not exist yet, so committing it would let a later `compose up` recreate Adolf against empty paths. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Y5QPagv4iun1ghpwM96Ff
agap_git — Agap Server Configuration
agap_git is the configuration repo for Agap, the self-hosted home server. It holds:
docker-composefiles for services running on Agap- host-level config: Caddy (
Caddyfile), backup/install scripts,.envfiles
Convention: a Dockerfile, application source, or anything you'd build: from an
image belongs in the service's own Gitea repo — not here. agap_git keeps the
compose file that runs the resulting image, plus whatever config the compose needs.
Third-party services (pulling a public image) live here in full, since there's no
source to split out.
Self-developed services
Services with source written in-house are meant to be dual: source lives in their own Gitea repo, and the compose that runs them is described here.
| Service | Own repo | Compose in agap_git |
|---|---|---|
| matrixbot (Matrix bot, Adolf channel adapter) | alvis/matrixbot |
not present — runs from ~/matrixbot/docker-compose.yml in its own repo |
| moodtracker | alvis/moodtracker |
not present — runs from ~/moodtracker/docker-compose.yml |
| marketplace-mcp | alvis/marketplace-mcp |
not present — runs from ~/marketplace-mcp/docker-compose.yml |
| oO | alvis/oO |
not present — runs from oO/infra/docker/docker-compose.yml; oO was already a fully separate project before this convention existed |
| mood (mood-archive) | none yet | fully vendored here (mood/, source + compose) — Kanboard #209 will extract it to its own repo |
Known gap: the convention calls for compose to be described in agap_git and
source to live in its own repo. For matrixbot / moodtracker / marketplace-mcp / oO,
extraction (kb#78) moved the compose file along with the source into each new repo,
so agap_git currently has zero footprint for these four — no compose, no config.
Not fixed in this doc-only pass; flagged for a follow-up decision: either copy each
compose back into agap_git, or formally amend the convention to let self-developed
services keep compose in their own repo.
Third-party services (compose lives here in full)
| Directory | Service | Port |
|---|---|---|
immich-app/ |
Immich — photo management | 2283 |
gitea/ |
Gitea — git hosting + Postgres | 3000, 222 |
openai/ |
Adolf (OpenClaw gateway) + LiteLLM + Hindsight + Qdrant + Langfuse + Whisper/TTS stack | see openai/docker-compose.yml (adolf-llm on 8010) |
adolf/ |
Adolf config only (openclaw.json, design docs) — the adolf compose service lives in openai/docker-compose.yml; the OpenClaw fork source is a separate tree at ~/adolf |
— |
vaultwarden/ |
Password manager | 8041 |
kanboard/ |
Kanban board, task orchestration for the claude bot |
4800 |
seafile/ |
File sync, OnlyOffice, WebDAV (multiple compose files) | 8078 (server), 8077 (Caddy) |
matrix/ |
Synapse homeserver + coturn + LiveKit (not the matrixbot bot — see above) |
— |
overleaf/ |
LaTeX editor (ShareLaTeX/Overleaf CE) | — |
linkwarden/ |
Bookmark manager | 3012 |
vikunja/ |
Task manager | 3457 |
radicale/ |
CalDAV/CardDAV server | 5232 |
ntfy/ |
Push notifications | 8840 |
syncthing/ |
File sync | 8384 |
qbittorrent/ |
Torrent client | 8085 |
searxng/ |
Metasearch engine | 11437 |
ollama/ |
Local LLM runtime | 11436 |
openwebui/ |
AI chat UI | 3125 |
anki/ |
Anki sync server | 8180 |
family/ |
MediaWiki (family wiki) | 8099 |
freshrss/ |
RSS reader | 8091 |
iperf3/ |
Network throughput testing | 8095 |
otter/ |
OtterWiki | 8083 |
agap-mcp/ |
MCP tool server for Claude (Node/Express) — vendored source, no separate repo | 3100 |
personal-sensing/ |
SQLite store + schema for HA/Health Connect data (no compose; library used by an ETL, see kb#207) | — |
Removed / moved out
windows/— removed (kb#82): no VM, no container, dead config.zabbix/,haos/— moved toalvis/lizacer(kb#81). Zabbix runs on the lizacer server (192.168.1.4:81), not Agap.
Top-level files
Caddyfile— reverse proxy / TLS routing for all servicesnvidia-docker-install.sh,install-cuda.sh— GPU host setupusers-backup.sh— host user backup
Quick Start
Each service is standalone; from its directory:
docker compose up -d
docker compose restart
docker compose logs -f
docker compose pull
The root docker-compose.yml is an alias that includes immich-app/docker-compose.yml.
Storage
/mnt/media/upload— Immich originals/mnt/ssd1/media/— Immich thumbnails, encoded video, Postgres/mnt/misc/gitea— Gitea repositories and data
GPU Support
For GPU acceleration (Ollama/Open WebUI, Immich ML):
sudo ./nvidia-docker-install.sh— Docker + NVIDIA Container Toolkit./install-cuda.sh— CUDA toolkit
Documentation
See CLAUDE.md for developer instructions, credentials handling, and Gitea/Zabbix/Home Assistant API integration details.
See the Gitea wiki for infrastructure documentation (storage, network, per-service setup).