# TOOLS.md - Local Notes

Skills define _how_ tools work. This file is for _your_ specifics — the stuff that's unique to your setup.

## What Goes Here

Things like:

- Camera names and locations
- SSH hosts and aliases
- Preferred voices for TTS
- Speaker/room names
- Device nicknames
- Anything environment-specific

## Examples

```markdown
### Cameras

- living-room → Main area, 180° wide angle
- front-door → Entrance, motion-triggered

### SSH

- home-server → 192.168.1.100, user: admin

### TTS

- Preferred voice: "Nova" (warm, slightly British)
- Default speaker: Kitchen HomePod
```

## Why Separate?

Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure.

---

Add whatever helps you do your job. This is your cheat sheet.

### Paperless-ngx

- URL: https://docs.home.kies-media.de/
- User: greggy
- Credentials in `.bashrc`/`.profile` (`$PAPERLESS_USER`, `$PAPERLESS_PASS`)
- Dokumenttypen: Rechnungen, Versicherungspolicen, Verträge, wichtige Entscheidungen
- Workflow: Bei Email-Check relevante Dokumente automatisch archivieren

### Google Workspace (gog CLI)

- Version: v0.12.0
- Account: `mkiesewetter9@googlemail.com`
- OAuth authentifiziert für: contacts, calendar
- Keyring-Passwort: `$GOG_KEYRING_PASSWORD` in `.bashrc`/`.profile`
- Befehle:
  - Contacts: `gog contacts list --max 20`
  - Calendar: `gog calendar events primary --account mkiesewetter9@googlemail.com --from <iso> --to <iso>`
  - Kalender-Farben: `gog calendar colors`

### Email (AgentMail)

- Inbox: `max-kies-media-ai-assistent@agentmail.to`
- Name: Max Kies-Media AI Assistent
- API Key: `$AGENTMAIL_API_KEY` in `.bashrc`
- Signatur: "Max von Kies-Media – KI-Assistent von Martin"
- Footer in jeder Email:
  ```
  --
  Martin Kiesewetter
  Tel.: 0176-45853923
  Email: mki@kies-media.de
  ```
- Reply-To: `mki@kies-media.de` verwenden wenn möglich

### Aktive OpenClaw-Modelle
- **Primary:** `z-ai/glm-5.1` (Alias: GLM-5.1)
- **Fallback:** `openrouter/google/gemma-4-31b` (Alias: Gemma-4-31B) – auch für Coding & Git
- **Free:** `z-ai/glm-4.7-flash` (GLM-4.7-flash-free), `openrouter/deepseek/deepseek-v4-flash:free` (DeepSeek-V4-Flash)

### OpenRouter
- API Key: `$OPENROUTER_API_KEY` in `.bashrc`
- URL: https://openrouter.ai/api/v1
- ⚠️ **SICHERHEITSREGEL:** Niemals API-Keys, Passwörter, Tokens oder andere geheime Informationen an kostenlose OpenRouter-Modelle (free-Tier) weiterleiten. Diese Modelle können Daten loggen oder für Training nutzen.
  - Free-Modelle (z.B. `deepseek/deepseek-v4-flash:free`) nur für unkritische Anfragen nutzen
  - Bei Anfragen die Credentials/Secrets enthalten → bezahltes Modell oder lokales Modell verwenden
- ⚠️ **PATCH NACH JEDEM OPENCLAW-UPDATE:** Datei `/usr/lib/node_modules/openclaw/dist/openai-transport-stream-BkI6rJ3U.js` patchen:
  - Zeile mit `function flattenStringOnlyCompletionContent(content) {` suchen
  - Direkt danach, vor `if (!Array.isArray(content)) return content;`, einfügen: `if (content === null || content === undefined) return "";`
  - Grund: DeepSeek V4 Flash (free) akzeptiert kein `null` in message content – OpenClaw sendet das aber bei Tool-Result-Nachrichten
  - Nach dem Patch: Gateway neu starten

### Git

- Remote: `https://git.home.kies-media.de/greggy/openclaw.git`
- Branch: `master`
- User: `greggy`
- Workspace Repo: `/root/.openclaw/workspace`
- Credentials in `.bashrc`/`.profile`



### TrueNAS Server (192.168.8.112)

**Hardware:**
- Mainboard: Supermicro H12SSL-i (Milan, Dual-Sockel-fähig)
- CPU: AMD EPYC 7C13 (64 Cores)
- RAM: 512 GB DDR4 2666 MHz
- GPU: NVIDIA RTX 3060 Ti Lite Hash Rate (8 GB VRAM)
- HBA: LSI SAS 9300-16i (IT Mode, 12 Gbit/s, 16 Ports, 2× SAS3008 via PLX PEX 8724 Switch)
- Netzwerk: Mellanox ConnectX-2 MNPA19-XTR (10 GbE SFP+, PCIe x8)
- Netzwerk: 2× Broadcom BCM5720 Gigabit Ethernet (onboard)
- IPMI/BMC: ASPEED Graphics (Remote Management)
- NVMe: WD Black SN850X 1TB (boot-pool)

**Storage (Pool: Main):**
- 1× WD Black SN850X 1TB NVMe (boot-pool)
- 2× TeamGroup T253 512GB SSD (sdd, sdf)
- 2× Seagate Exos X18 16TB HDD 7200rpm (sdg, sdh) – ST16000NM000J
- 2× Toshiba MG08 16TB HDD 7200rpm (sdi, sdj) – MG08ACA16TE
- 2× HGST Ultrastar 8TB HDD 7200rpm (sdk, sdc) – HUH721008ALE600
- 2× Toshiba 8TB HDD 7200rpm (sdb, sde) – HDWG480
- 1× Seagate Exos X18 18TB HDD 7200rpm (sda, unassigned) – ST18000NM000J

**ZFS-Layout (Main-Pool):**
- 2× RAIDZ1 VDEVs (je 5 HDDs, 1 Parität pro VDEV)
- 1× Mirror SLOG (2× 512GB SSD als ZIL)
- Effektiv: ~102 TB nutzbar von ~128 TB roh
- Belegt: 65.3 TB (64%), Frei: 36.6 TB (Stand: Mai 2026)
- **Zusätzlich:** 18TB Seagate Exos X18 (sda) nicht zugewiesen, S.M.A.R.T. ✅ gesund
- ⚠️ RAIDZ1 bei 16TB-Platten: nur single parity

### TrueNAS SMB (192.168.8.112)
- Über WireGuard erreichbar: `192.168.8.112`
- User: `openclaw` (eingeschränkter User, nicht admin)
- Credentials in `.bashrc`: `$TRUENAS_SMB_USER`, `$TRUENAS_SMB_PASS`, `$TRUENAS_SMB_HOST`
- SMB-Credentials-Datei: `/root/.smb-credentials` (für fstab)
- SMB-Befehl: `smbclient //$TRUENAS_SMB_HOST/<share> -U $TRUENAS_SMB_USER%$TRUENAS_SMB_PASS`
- Shares auflisten: `smbclient -L $TRUENAS_SMB_HOST -U $TRUENAS_SMB_USER%$TRUENAS_SMB_PASS`

#### Verfügbare Shares & Berechtigungen (Stand 05/2026)

**SMB-Share-Level ACLs (alle aktiv außer ix-applications):**

| Share | Pfad | openclaw Zugriff | greggy Zugriff | Bemerkung |
|---|---|---|---|---|
| openclaw | /mnt/Main/openclaw | ✅ FULL | ✅ (via admin) | Workspace-Backup, gemounted `/mnt/openclaw-smb` |
| Austausch | /mnt/Main/Austausch | ✅ FULL (everyone@) | ✅ FULL (everyone@) | Allgemeiner Austausch-Ordner |
| martin | /mnt/Main/martin | 🔍 READ | ✅ FULL | greggy = Owner |
| Filme | /mnt/Main/Filme | ❌ | ✅ (via admin) | homelab-family: READ, rene: READ |
| isos | /mnt/Main/isos | ❌ | ✅ FULL | Nur greggy |
| Spiele | /mnt/Main/Spiele | ❌ | ✅ (via admin) | homelab-family: READ, rene: READ |
| Programme | /mnt/Main/Programme | ✅ FULL (everyone@) | ✅ FULL (everyone@) | Alle haben Vollzugriff |
| Audiobooks | /mnt/Main/Musik/Audiobooks | ❌ | ✅ (via homelab-family) | Unterverzeichnis von Musik |
| Google | /mnt/Main/Google | ❌ | ✅ (via admin) | Nur truenas_admin |
| Musik | /mnt/Main/Musik | 🔍 READ (everyone@) | ✅ FULL | Alle lesen, greggy schreibt |
| Familiensachen | /mnt/Main/Familiensachen | ❌ | ✅ (via admin) | admin + homelab-family: READ |
| Lara | /mnt/Main/Lara | ❌ | ✅ FULL | lara + greggy |
| Luisa | /mnt/Main/Luisa | ❌ | ✅ FULL | luisa + greggy |
| ix-applications | /mnt/Main/ix-applications | ❌ | ❌ | Deaktiviert |

**Wichtige Users:**
- `greggy` (uid 3000) – Gruppen: nogroup, truenas_admin, homelab-family
- `openclaw` (uid 3004) – Gruppe: AI-Martin
- `lara` (uid 3001), `luisa` (uid 3002), `rene` (uid 3003)

**⚠️ Bekanntes Problem (05/2026):** Einige Ordner hatten verwaiste Gruppe 3000 (gelöscht) – Docker-Homelab wurde auf `homelab-family` korrigiert. Bei weiteren Zugriffsproblemen Gruppenzugehörigkeit prüfen.

### OpenClaw Arbeitsbereich (TrueNAS)
- SMB-Share: `//192.168.8.112/openclaw` → gemountet auf `/mnt/openclaw-smb`
- Workspace-Spiegel: `/mnt/openclaw-smb/workspace/`
- Auto-Mount via `/etc/fstab` (credentials: `/root/.smb-credentials`)
- Sync-Scripts:
  - `scripts/sync-to-truenas.sh` – synct Workspace zum TrueNAS
  - `scripts/commit-and-sync.sh` – git commit + push + sync zu TrueNAS
- Workflow: Nach Datei-Änderungen → `bash scripts/commit-and-sync.sh`

### Schach-App (lara-schach-live) Testumgebung
- **Repo:** `greggy/lara-schach-live`
- **Deploy-Pfad:** `/var/www/test/html/`
- **Frontend:** Statische Dateien via Apache (Port 80/6427)
- **Backend:** `python3 server.py` (Port 8111, Stockfish-Analyse)
- **Stockfish:** `/usr/games/stockfish`
- **Log:** `/tmp/lara-schach-server.log`
- **Deploy-Workflow:**
  1. `cd /tmp && rm -rf lara-schach-live && git clone https://git.home.kies-media.de/greggy/lara-schach-live.git`
  2. `rsync -av --delete --exclude='.git' /tmp/lara-schach-live/ /var/www/test/html/`
  3. Backend neustarten: `kill $(pgrep -f 'python3 server.py'); sleep 1; cd /var/www/test/html && STOCKFISH_PATH=/usr/games/stockfish nohup python3 server.py >> /tmp/lara-schach-server.log 2>&1 &`
  4. URL posten: http://178.104.150.0:6427/

### Landingpage Testumgebung
- **Server:** Apache auf dem OpenClaw-Server (lokal)
- **DocumentRoot:** `/var/www/test/html`
- **URL (localhost):** `http://localhost:6427/`
- **URL (extern):** `http://178.104.150.0:6427/`
- **Port:** 80 + 6427
- **Deploy:** Branch klonen → rsync nach `/var/www/test/html/`
- **Repo:** `greggy/landingpage-haus-schleusingen`
- ⚠️ **Nach jedem Deploy:** URL als klickbarer Link im Chat posten: http://178.104.150.0:6427/
- **⚠️ Wichtig:** Feature-Branches werden VOR dem Merge auf die Testumgebung deployed. Nach PR-Merge ist kein erneuter Deploy nötig – main ist dann automatisch auf dem gleichen Stand.

### CloudPanel / Hetzner Server (188.245.242.194)

- **SSH:** `ssh -i /root/.ssh/hetzner-cp-kies-media root@188.245.242.194`
- **CloudPanel URL:** https://cp.kies-media.de/ (Port 8443)
- **CloudPanel CLI:** `clpctl` (v6.0.8)
- **Hetzner API Key:** `$HETZNER_API_KEY` in `.bashrc`
- **Hetzner Server-ID:** 62963324 (cpx21, 3 Cores, 4GB RAM, 80GB Disk)
- **SSH Key:** `/root/.ssh/hetzner-cp-kies-media` (ed25519)
- **Provider:** Hetzner Cloud
- **Hostname:** Cloudpanel
- **OS:** Ubuntu, Kernel 6.8.0-57-generic (x86_64)
- **Disk:** 38 GB (61% belegt)
- **RAM:** 4 GB

#### SSH Hardening (25.05.2026)
- **Config:** `/etc/ssh/sshd_config.d/99-hardening.conf`
- PasswordAuthentication: no
- PubkeyAuthentication: yes
- PermitRootLogin: prohibit-password
- MaxAuthTries: 10
- MaxSessions: 10
- X11Forwarding: no
- AllowTcpForwarding: no
- AllowAgentForwarding: no

#### UFW Firewall
- SSH (22): Nur 91.137.60.185 (Martin), 178.104.150.0, 2a01:4f8:c2c:ece1::1 (OpenClaw)
- HTTP (80): Anywhere
- HTTPS (443/tcp + udp): Anywhere
- CloudPanel (8443): Anywhere
- MySQL (3306): 172.68.159.220

#### Fail2Ban
- Aktiv, Jail: sshd
- 3 Fehlversuche → 1h Ban (bantime=3600)
- Ban via UFW

#### Hetzner Cloud API
- SSH-Key OpenClaw: ID 112794687
- SSH-Key Docker-SSH: ID 28435737
- Firewall "Firewall für Cloudpanel": ID 2055950
- ⚠️ NICHT rescue-mode aktivieren ohne Reboot-Plan (Deaktivierung allein reicht nicht, Server bootet sonst ins Rescue)

### Jellyfin / Filme & Serien
- **Episoden-/Filmtitel immer bei TMDB (themoviedb.org) nachschlagen** – nicht Wikipedia, nicht Perplexity
- Grund: Jellyfin nutzt TMDB als primäre Metadatenquelle → TMDB-Titel = das was Jellyfin anzeigt
- URL: https://www.themoviedb.org/tv/655-star-trek-the-next-generation

### TrueNAS Filme-Suche
- **Immer via SSH** auf TrueNAS suchen: `ssh root@192.168.8.112 "ls /mnt/Main/Filme/..."`
- SMB-Zugriff mit openclaw-User funktioniert nicht für alle Shares
- Filme liegen in: `/mnt/Main/Filme/` (Kategorie-Unterordner)
- Serien in Season-Unterordnern, Episoden als .mkv/.mp4/.m4v

### Download-Quellen (Warez)

**Filme / Serien:**
- https://nima4k.org/
- https://serienfans.org/
- https://serienjunkies.org/
- https://nox.to/
- https://warez.cx/

**PC-Spiele:**
- https://warez.cx/

**Hörbücher:**
- https://www.rssing.com/

### OpenBookshelf (Audiobooks)
- **URL:** https://audiobooks.home.kies-media.de/
- **API-Key:** `$OPENBOOKSHELF_API_KEY` in `.bashrc`
- API-Key in `.bashrc` speichern und über Umgebungsvariable nutzen

### TrueNAS GPU-Regeln
- **NIEMALS** den `xe`-Treiber manuell per `echo ... > /sys/bus/pci/drivers/xe/bind` oder `drivers_probe` an eine Intel Arc GPU binden – **das crasht den TrueNAS-Server (Kernel Panic/Reset)!** Schon mehrfach passiert.
- Stattdessen: vfio-pci Bindung entfernen + Server normal rebooten, damit der Treiber beim Boot sauber lädt.
- Oder TrueNAS-eigene GPU-Zuweisung (WebUI) nutzen.
- Die Intel Arc B70 Pro hat PCI-ID `8086:e223` auf Bus `0000:83:00.0`.

### Exec-Timeouts (Konventionen)

- Kurze CLI-Abfragen: **150 Sekunden**
- Python-Skripte: **300 Sekunden**
- Browser-Vorgänge: **300 Sekunden**
