📖 Trading System – Wiki

← Startseite Stand: …

1 · Überblick & Architektur

Das System besteht aus vier eigenständigen Web-Apps (jeweils eine einzige HTML-Datei) plus einer Startseite, die alles verbindet. Alle Dateien liegen im iCloud-Ordner Trading-System/Maick Trading System und sind damit auf allen Macs synchron. Der Mac mini ist der Dauerläufer: Er liefert alle Apps per HTTP aus und stellt die Daten-Endpunkte bereit — dadurch funktioniert alles auch auf iPhone und iPad.

iPhone / iPad / MacBook ──HTTP──► Mac mini (Dauerläufer) │ Port 8090 MTS-Server ────────┤ Startseite, Hauptapp, Coach, Wiki, │ Preis-Proxy, Daten-Persistenz (/data) Port 8080 Markets-360-Server ┤ /markt /fred /sector-perf /status Port 8091 Signal-Hub-Server ─┤ Dashboard, Screening-Lauf, Push Port 8502 Streamlit-Cockpit ─┘ (optional, erweiterte Analyse) │ iCloud-Ordner = eine Datenquelle für alle Geräte

Live-Status der Server (wird beim Öffnen dieser Seite geprüft):

MTS-Server (8090) … Markets 360 (8080) … Signal-Hub (8091) …
Grundprinzip: Eine App = eine Datei = eine Aufgabe. Die Apps bleiben bewusst getrennt (Entflechtung) und verlinken sich gegenseitig — gemergt wird nichts. Inhalte existieren nur an einem Ort, andere Apps verlinken dorthin.

2 · Zugriff von allen Geräten

SituationAdresse
Offline-App / unterwegs (empfohlen)https://mts-hub.pages.dev/ — Cloudflare Pages, immer online (HTTPS). Auf dem iPhone in Safari öffnen → „Zum Home-Bildschirm". Läuft offline und ohne WLAN (Service-Worker-Cache); Live-Kurse/FRED über den Cloudflare Worker. Siehe cloudflare-pages/.
Zuhause im WLAN (Mac mini an)http://mac-mini-von-maick.local:8090/
Unterwegs zum Mac (Tailscale)http://mac-mini-von-maick-2.tail02bccd.ts.net:8090/ — nur wenn der Mac mini online ist

Die Pages-Version ist der robuste Offline-/Mobil-Zugang (unabhängig vom Mac). Der Mac mini wird nur für Signal-Hub-Neuberechnung, KI-Committee und geräteübergreifende Daten-Sync gebraucht; ist er per Tailscale erreichbar, nutzen die Apps ihn automatisch, sonst läuft alles aus Cache + Worker. Nach Änderungen an den Apps neu deployen: cloudflare-pages/deploy.command.

iPhone/iPad als Offline-App (PWA) einrichten

Damit eine App auch bei ausgeschaltetem Mini startet, braucht es einen Service Worker — und der läuft nur über HTTPS. Deshalb dafür die https://…ts.net/-Adresse verwenden. Die http://…-Adressen funktionieren weiter, aber nur solange der Server erreichbar ist.

  1. Die https://…ts.net/-Adresse in Safari öffnen (Mini an, Tailscale aktiv)
  2. Teilen-Symbol → „Zum Home-Bildschirm"
  3. Beim ersten Start cacht der Service Worker die App-Dateien auf dem Gerät
  4. Danach startet die App auch unterwegs ohne Mini: Kurse kommen direkt von Yahoo (CORS-Proxy), das Portfolio aus dem localStorage
Tailscale auf dem iPhone aktiv lassen. Die *.ts.net-Adresse löst nur auf, wenn der Tailscale-Client läuft — sonst startet die installierte App unterwegs nicht. Tailscale ist für genau diesen Dauerbetrieb gemacht.
Wichtig: Auf iPhone/iPad nie die HTML-Datei aus der Dateien-App öffnen — dort läuft kein JavaScript, nichts funktioniert. Immer eine http(s)://…-Adresse verwenden.

3 · Die Apps

🏠 Startseite / Hub (index.html)

Verteiler zu allen Apps mit Live-Status-Badges. Jede Karte prüft beim Laden, ob der zugehörige Server läuft („✓ Live-Daten") und schaltet dann automatisch auf die Live-Version um; ohne Server bleibt die statische iCloud-Version verlinkt (Badge „iCloud-Version").

🎯 Maick's Trading System (Hauptapp)

Portfolio-, Risiko- und Trade-Verwaltung. Tabs: Dashboard (Cockpit Terminal mit 6 KPIs, Risiko-Gauge, Klumpenrisiko, problematische Positionen), Trading Cockpit (Streamlit-iframe, Port 8502), Portfolio, Control Center, CRV-Coach, Risk Management, FIRE Kalkulator; unter „Mehr": Psychology, Committee, Steuer, Lernen & Tools.

Markt-Chip im Cockpit-Terminal-Header: objektiver Schnellcheck aus Live-Daten — 🟢 = S&P 500 über MA50 und MA200 bei VIX < 20 · 🔴 = unter MA200 oder VIX > 25 · 🟡 = dazwischen. Klick öffnet Markets 360 mit der vollen Marktampel. Der Chip ist bewusst keine Kopie der Ampel (die hat manuelle Kategorien).

🚦 Trade-Gate: Beim Anlegen eines neuen Trades zeigt das Formular die aktuelle Marktphase (grün/gelb/rot mit Begründung). Wird im roten Umfeld eine neue Position eröffnet, fragt die App noch einmal nach — Minervinis Kernregel: in einem schwachen Markt keine neuen Käufe. Geschlossene/historische Trades werden nie geblockt.

Daten werden bei jeder Änderung an den Server gespeichert (mts_data.json, siehe Daten & Sicherung).

📲 Proaktive Alarme: Der 8090-Server überwacht die offenen Positionen automatisch (alle 20 Min, außerhalb der Ruhezeit 22–08 Uhr und am Wochenende pausiert) und schickt einen Push an deinen ntfy-Kanal (derselbe wie der Signal-Hub, nichts Neues abonnieren) bei: Stop-Loss-Bruch (Priorität „urgent"), SL-Nähe (Kurs < 3 % über dem Stop), Teilverkaufszonen +8 % / +20 % / +40 % (Minervini 50/25/25) und erreichtem Kursziel. Anti-Spam: Beim ersten Sichten einer Position wird nur der Ist-Zustand gemerkt — gepusht wird erst bei einem echten Übergang. Logik: mts_alarms.py. Test: python3 mts_alarms.py --test.

🔍 Verkaufs-Check (Sell-Coach): Knopf über den offenen Positionen. Prüft je Position die Minervini-Ausstiegsregeln aus Tageskursen (vom /history-Endpunkt) und zeigt eine Ampel in der Spalte „🔍 Verkauf": 🔴 Verkauf prüfen bei hartem Signal (Bruch der 50-Tage-Linie auf erhöhtem Volumen oder Kurs unter der 200-Tage-Linie = Stage-2-Ende), 🟡 Beobachten bei weichem Signal (Schluss unter 50-Tage-Linie, größter Tagesverlust seit Einstieg, Bruch des jüngsten Swing-Tiefs oder > 15 % unter dem jüngsten Hoch), sonst 🟢 Halten. Die Begründungen stehen im Tooltip der Ampel. Das ist das Gegenstück zur SEPA-Kaufprüfung im Coach — die Verkaufsdisziplin, wo bei Minervini die Rendite entschieden wird. Der Check schlägt zusätzlich einen nachgezogenen Stop-Loss vor (⤴ Stop → …): ab +8 % Break-Even, ab +20 % unter die 50-Tage-Linie bzw. das jüngste Swing-Tief — nur anhebend, nie senkend. Ein Klick übernimmt den neuen Stop (mit Rückfrage).

🩺 Status-Leiste: Oben zeigt die App den Live-Zustand: „Mac mini: online/offline" (alle 30 s neu geprüft — ein Ausfall des Dauerläufers wird sofort sichtbar, nicht erst an leeren Charts) und das Kurs-Datenalter („HH:MM · vor X Min", grün < 15 Min, orange < 60 Min, rot darüber). So ist immer klar, ob die angezeigten Zahlen frisch sind.

📊 Sektor-Rotation (Portfolio-Tab): zeigt die 11 US-Sektoren nach 1-Monats-Performance gerankt (stark → schwach). „🔄 Laden & einordnen" ordnet zusätzlich die offenen Positionen ihrem Sektor zu (Sektor kommt vom 8090-Server: FMP, sonst yfinance-Fallback) und markiert Positionen in den drei schwächsten Sektoren. Minervini-Logik: Leader in starken Sektoren halten, relative Schwäche im Auge behalten.

🏛️ Committee-Verdikt inline: Hat eine offene Position eine Investment-Committee-Analyse (Minervini/Weinstein/O'Neil), erscheint in der Ticker-Spalte ein farbiges Score-Badge (🏛️ Score). Tooltip zeigt Entscheidung + Entry/Stop/Ziel; Klick öffnet den Committee-Tab. So sieht man das KI-Urteil direkt am Bestand statt nur im separaten Tab.

🎲 FIRE Monte-Carlo (FIRE-Tab): zusätzlich zur glatten Compound-Hochrechnung simuliert die App 2000 Verläufe mit schwankenden Jahresrenditen (einstellbare Volatilität) und zeigt eine ehrliche Bandbreite — optimistisch (P10), Median (P50), pessimistisch (P90) — plus die Wahrscheinlichkeit, das Ziel binnen 40 Jahren zu erreichen.

🔬 Kelly „Was-wäre-wenn" (Risk-Management-Tab): wendet ein konsequentes fixes Risiko (1,0 / 1,25 / 2,0 %) auf die realen R-Multiples deiner geschlossenen Trades an und zeigt den kumulierten Depot-Multiplikator. Macht greifbar, wie stark stures Risikomanagement die Equity-Kurve verändert.

🧠 Minervini Coach 2 (minervini-coach-2.html)

Lern- und Analyse-App mit den Seiten Coach, Quiz, SEPA-Analyse (prüft die Trend-Kriterien automatisch aus Live-Daten), Academy (Stage-2-Basen, VCP, Entry, Pyramidisieren), Mental und Guide. Lernfortschritt synchronisiert über GitHub-Gist.

Deeplinks: ?page=sepa öffnet eine Seite direkt, ?ticker=NVDA startet sofort die SEPA-Analyse (wird u. a. vom Signal-Hub und der Hauptapp genutzt). Der Pre-Trade-Check lebt nur hier — die Hauptapp verlinkt darauf.

Kursquelle: SEPA-Analyse und Batch-Screener holen die Tageskurse jetzt zuerst vom MTS-Server (8090, /history) — beste Symbol-Auflösung (ISIN/onvista/EUR), kein öffentlicher CORS-Proxy, kein Rate-Limit. Ist der Mac mini aus, greift automatisch die bisherige Kette (Twelve Data → Stooq → Yahoo über Proxy).

📊 Minervini Markets 360 (Minervini/Minervini Dashboard.html)

Die 360°-Marktsicht. Tabs: 🚦 Marktampel (8 Bewertungskategorien, teils automatisch, teils manuell — Score ≥ 65 % bullish, ≤ 38 % bearish), Technik, Marktbreite, Sentiment, Makro, Rohstoffe, Sektoren, COT, Grundlagen, Links.

Markt-Heatmaps (im Marktampel-Tab): „US Sektoren · live" ist selbst gebaut aus eigenen Daten (Yahoo, ±15 Min — Standardansicht). „US Aktien · Vortag" ist das TradingView-Widget, das für US-Aktien prinzipbedingt nur den Vortagesschluss liefert (E-Badge) — daher die Beschriftung.

Datenquelle: Läuft der 8080-Server, kommen Marktampel/FRED/Sektoren über ihn (lokaler Cache). Ist der Mac mini aus, holt die App die Kurse selbst — direkt von Yahoo bzw. über CORS-Proxies (Marktampel, VIX, FRED und US-Sektoren-Heatmap). Als robusten, eigenen Proxy gibt es einen Cloudflare Worker (kostenlos, immer erreichbar) — Code + Anleitung in cloudflare-worker/. Nach dem Deploy die Worker-URL in die Konstante MTS_PROXY der drei Apps eintragen; dann wird er bevorzugt genutzt und die unzuverlässigen öffentlichen Gratis-Proxys (corsproxy.io ist kostenpflichtig geworden) nur noch als Notnagel. Markets 360 funktioniert damit auch unterwegs ohne Server; nur der lokale 15-Min-Cache entfällt dann. Über die HTTPS-PWA (https://…ts.net/) reicht zudem der 8090-Server die Datenendpunkte (/markt, /sector-perf, /fred) an den 8080-Server durch — so kommen echte Server-Daten ohne Mixed-Content, ohne Umweg über öffentliche Proxies. Minervinis Kernregel: Nur kaufen, wenn der Markt grün ist.

🛰️ Daily Signal Hub (Signal-Hub/signal-hub.html)

Tägliche, gerankte Ideen-Liste aus drei Quellen: PDF (Traderfox-Magazine aus dem iCloud-Ordner), Mail (Traderfox-Signale via IMAP/freenet, Passwort im macOS-Schlüsselbund signal-hub-imap) und Finviz (8 Screener: Momentum, VCP, SEPA, Zanger, Darvas, Livermore, High-Tight-Flag, Pullback).

Unified Score (0–100) aus Stage-2-Trend, relativer Stärke, 52W-Hoch-Nähe, Basis, Volumen und Quellen-Konsens. Schwellen: ≥ 70 Kauf-Kandidat, ≥ 50 beobachten. Earnings-Warnung und Depot-Abgleich („hältst du bereits") sind integriert.

Push: zweimal täglich (07:30 / 21:30) via ntfy an alle Geräte — nur neue Kandidaten ≥ 70. Der Zeitplan läuft vollautomatisch auf dem Mac mini.

📈 Trade-Funnel: Jede Kachel hat (im HTTP-Modus) einen „📈 Trade"-Link, der in der Hauptapp das Trade-Formular vorbefüllt öffnet (Ticker + Quelle = „Signal-Hub"). Die Hauptapp speichert die Quelle am Trade (Feld im Formular, frei wählbar/Vorschlagsliste). Im Psychology-Tab wertet „Performance nach Quelle" dann aus, welche Ideen-Quelle tatsächlich Gewinner bringt (Trades, Win-Rate, Ø-CRV, P&L je Quelle) — so lassen sich schwache Quellen datenbasiert aussortieren.

🧭 Regel-Check (Psychology-Tab): wertet automatisch deine Disziplin aus — Positionsgröße ≤ 2 % Depotrisiko, Stop-Loss eingehalten (Verlust nicht größer als geplant), Verlierer schneller geschnitten als Gewinner gehalten, Ø Gewinn ≥ 2× Ø Verlust. Jede Regel mit ✅/⚠️ und konkreten Zahlen. Verhaltensmuster sind bei Minervini der eigentliche Edge.

Zugriff (iPhone/PWA): Der Signal Hub wird über denselben 8090-Origin geöffnet (relativer Link) — der 8090-Server reicht /Signal-Hub/api/* an den 8091-Server durch. So funktioniert er in der installierten PWA und über Tailscale-HTTPS, ohne dass das Gerät den separaten Port 8091 erreichen muss (früher zeigte der Link direkt auf http://…:8091 → auf dem iPhone „Seite nicht erreichbar").

Token: Lesen ist offen; Schreiben (Aktualisieren/Einstellungen speichern) verlangt das Token aus Signal-Hub/config.json. Einmal mit ?token=… öffnen — danach merkt sich das Gerät den Zugang (Cookie, 1 Jahr).

4 · Server & Ports

PortServerAufgabe
8090server_mts.pyLiefert den ganzen Projektordner aus (Startseite, Hauptapp, Coach, Wiki). Preis-Proxy (yfinance + onvista für dt. Derivate), Daten-Persistenz /data, /status; reicht /markt /sector-perf /fred an den 8080-Server durch (Markets 360 über HTTPS)
8080Minervini/server.pyMarkets 360 + Daten-Endpunkte /markt/<symbol>, /fred/<serie>, /sector-perf (15-Min-Cache), /status
8091Signal-Hub/src/server.pySignal-Hub-Dashboard, Screening-Lauf (POST /api/run), Konfiguration, /api/status; liefert auch den Coach aus (Fernzugriff über einen Port)
8502StreamlitTrading Cockpit (optional, manuell gestartet)

5 · Dauerbetrieb auf dem Mac mini

Alle Dienste laufen als LaunchAgents: Sie starten beim Login automatisch und arbeiten als Watchdog — alle 5 Minuten wird geprüft, ob der Server noch läuft; wenn nicht, wird er neu gestartet. Ein abgestürzter Server ist also spätestens nach 5 Minuten von selbst wieder da.

LaunchAgentDienst
de.maickschwillo.mts-serverMTS-Server (8090)
de.maickschwillo.minervini-dashboardMarkets-360-Server (8080)
com.maick.signalhub.serverSignal-Hub-Server (8091)
com.maick.signalhubPush-Zeitplan: prüft alle 15 Min, löst je einmal pro Slot (07:30/21:30) Lauf + Push aus
TCC-Besonderheit: launchd-Python darf iCloud-Dateien nicht direkt öffnen („Operation not permitted"). Alle Plists nutzen deshalb einen osascript-Wrapper, der den Server entkoppelt startet. Folge: launchctl bootout beendet den Server nicht — erst den Prozess am Port beenden.

Nützliche Kommandos (Terminal am Mac mini)

# Status aller Agents
launchctl list | grep -E "maick|signalhub|minervini|mts"

# Server neu starten (Beispiel Signal-Hub, Port anpassen)
kill $(lsof -tnP -iTCP:8091 -sTCP:LISTEN)
launchctl kickstart gui/$(id -u)/com.maick.signalhub.server

# Logs
tail -f /tmp/mts-server.log
tail -f /tmp/minervini-dashboard.log
tail -f /tmp/signalhub-server.log        # Server
tail -f /tmp/signalhub-scheduled.log     # Screening-Läufe/Push

Energie: sleep 0, per Netzwerk weckbar (womp 1), nur das Display geht aus. Den Mini nicht herunterfahren.

Zwei Regeln:Automatik installieren.command / Mac Mini Dauerbetrieb.command nie auf dem MacBook ausführen (sonst doppelte Pushes, und das MacBook verlernt den Ruhezustand). ② Keine gleichzeitigen Screening-Läufe von zwei Macs — Risiko von iCloud-Sync-Konflikten in data/signals.json. Anschauen/Lesen ist immer unkritisch.

HTTPS für die Offline-App (einmalig)

Die PWA (Abschnitt 2) braucht HTTPS. Das liefert tailscale serve mit gültigem Zertifikat — rein im Tailnet, nichts wird öffentlich (kein funnel).

  1. Einmalig in der Admin-Konsole: login.tailscale.com/admin/dnsHTTPS Certificates aktivieren (sonst hängt der nächste Schritt beim Zertifikat).
  2. Auf dem Mini: tailscale serve --bg --https=443 http://127.0.0.1:8090
  3. Prüfen: tailscale serve status → zeigt https://…ts.net/ → http://127.0.0.1:8090

--bg macht die Weiterleitung dauerhaft (übersteht Neustarts). Rückgängig: tailscale serve --https=443 off. Nach Code-Änderungen am 8090-Server diesen wie oben neu starten, damit die PWA-Verdrahtung (Manifest/Service Worker) aktuell ist.

6 · Daten & Sicherung

WasWoSicherung
Trades, Portfolio, Einstellungenmts_data.json (geschrieben vom 8090-Server bei jedem Speichern)① Rotierende Backups: data-backups/, die letzten 30 Stände, automatisch vor jedem Überschreiben · ② iCloud-Versionierung. Nicht mehr in Git (private Trading-Daten gehören nicht ins Repo — seit 2026-06 in .gitignore; Quelle der Wahrheit sind die data-backups/). Backup-Wächter: Die Hauptapp prüft über /backup-status die jüngste Sicherung (Alter, Lesbarkeit, Trade-Zahl) und warnt in der Status-Leiste, falls das Backup > 7 Tage alt, leer oder unlesbar ist.
Signal-Hub-ErgebnisseSignal-Hub/data/signals.jsonWird bei jedem Lauf neu erzeugt — kein Backup nötig
Signal-Hub-Konfiguration (inkl. Token)Signal-Hub/config.jsoniCloud; bewusst nicht in Git (Secrets)
Coach-LernfortschrittGitHub-GistCloud-seitig
Mail-Passwort (IMAP)macOS-Schlüsselbund signal-hub-imap (pro Mac)
Konvention: mts_data.json wird in Git nur als bewusster, separater Snapshot committet („Daten: …"), nie vermischt mit Code-Änderungen. So kann ein Code-Rollback nie Trading-Daten zurückdrehen.

7 · Wartung & Fehlerbehebung

SymptomUrsache / Lösung
Startseiten-Badge zeigt „iCloud-Version"Zugehöriger Server läuft nicht → der Watchdog startet ihn binnen 5 Min selbst neu; sofort: launchctl kickstart gui/$(id -u)/<agent> (siehe Abschnitt 5)
Startseite: „Server nicht erreichbar", obwohl der Mini läuftMini und Gerät im selben WLAN? Von unterwegs: Tailscale aktiv? Die Seite findet den Server selbst, wenn sie als Datei geöffnet wurde — erreichbar muss er aber sein
Markets 360: Marktampel/Sektoren leerDaten kommen sonst per CORS-Proxy auch ohne Server → bleibt alles leer, ist die Internet-Verbindung weg oder die öffentlichen Yahoo-Proxies (allorigins/corsproxy) gerade gestört; einfach erneut laden
Derivate-/Optionsschein-Kurse fehlen oder zeigen den BasiswertKurse deutscher Derivate (Turbos/OS/Faktor-/Knock-Out-Zertifikate) holt der 8090-Server per ISIN über die onvista-API (Yahoo listet sie nicht; daher nie den Basiswert verwenden). Zeigt eine Position „—", war onvista kurz nicht erreichbar → erneut „🔄 Kurse". Der Abruf nutzt zuerst den lokalen Proxy (8090); ohne ihn bleiben reine Derivate „—".
Signal-Hub: keine Mail-SignaleSchlüsselbund-Eintrag fehlt auf dem Mac, der den Lauf ausführt → security add-generic-password -a "mschwillo@freenet.de" -s "signal-hub-imap" -U -w
Signal-Hub: keine PDF-Signalepypdf fehlt → /usr/bin/python3 -m pip install --user pypdf; Magazin-Ordner-Pfad in config.json prüfen
„Speichern" im Signal-Hub geht nicht (403)Token fehlt auf dem Gerät → Seite einmal mit ?token=… öffnen
Pushes kommen doppeltPush-Zeitplan läuft auf zwei Macs → auf dem MacBook: launchctl bootout gui/$(id -u)/com.maick.signalhub
iPhone: Seite „tot", nichts klickbarHTML-Datei statt HTTP-Adresse geöffnet → http://mac-mini-von-maick.local:8090/ verwenden
Markets 360: FRED/Makro oder Marktdaten veraltetDer Service-Worker (PWA) reicht /markt, /fred, /sector-perf jetzt immer frisch ans Netz (nie aus dem Cache). Falls nach einem Update noch alte Werte erscheinen: Seite neu laden (ggf. zweimal) bzw. die PWA einmal schließen und neu öffnen, damit der neue Service-Worker (Cache mts-pwa-v3) aktiv wird.
Signal-Hub „Aktualisieren" tut nichts / „Lauf läuft bereits"Ein früherer Lauf hing → das in-memory-Lock blieb gehalten. Behoben: server.py bricht einen Lauf nach RUN_TIMEOUT (10 Min) hart ab und gibt das Lock frei. Sofort-Abhilfe: 8091-Server neu starten (Port-Prozess killen, dann launchctl bootstrap gui/$(id -u) Signal-Hub/com.maick.signalhub.server.plist). Der Server-Job läuft jetzt mit KeepAlive — stirbt der Server, startet launchd ihn binnen ~10 s neu (zusätzlich 5-Min-Watchdog via StartInterval). Voraussetzung: Der Job muss in launchd geladen sein (einmalig per bootstrap bzw. „Automatik installieren.command"). Der Timeout killt jetzt die ganze Prozessgruppe (run.py + scorer.py), sonst hielt ein überlebendes Kind die Pipe offen und das Lock blieb hängen.
Signal-Hub aktualisiert nicht automatisch (kein Morgen-/Abend-Push)Der Scheduler-Job com.maick.signalhub muss die osascript-Variante der Plist nutzen (wegen TCC/iCloud) und nach /tmp loggen — nicht python3 direkt mit iCloud-Logpfad (das bricht mit EX_CONFIG 78 ab, bevor etwas läuft). Korrekte Plist: Signal-Hub/com.maick.signalhub.plist nach ~/Library/LaunchAgents/ kopieren, dann bootout + bootstrap. Außerdem: run.py läuft unter /usr/bin/python3 (3.9) — dort muss pypdf installiert sein (/usr/bin/python3 -m pip install --user pypdf certifi), sonst überspringen PDF/Mail still (Code 1) und es kommen keine frischen Signale. Prüfen: tail /tmp/signalhub-scheduled.log.
Markt-Chip im Cockpit fehlt8080-Server nicht erreichbar — Chip blendet sich dann bewusst aus
Kein Zugriff von unterwegsTailscale auf iPhone und Mini aktiv? Mini wach? (Display darf aus sein)

8 · Tests

  • tests/test-hub-token.sh — prüft Token/Cookie/CORS-Logik des Signal-Hub-Servers (nur GETs bzw. nebenwirkungsfreie POSTs)
  • tests/ — Playwright-Setup für Browser-Tests der Apps
Eiserne Regel: Browser-Tests gegen die Live-Server dürfen keine POSTs absetzen — MTS.save() würde die echte mts_data.json überschreiben. In Playwright immer alle POST-Requests blocken.

9 · Pflege dieses Wikis

Dieses Wiki ist Teil des Repos und wird bei jeder Systemänderung im selben Commit mitgepflegt (Regel in CLAUDE.md verankert — gilt damit für jede Claude-Code-Session). Das „Stand"-Datum oben rechts kommt automatisch vom Dateidatum, die Server-Status-Chips in Abschnitt 1 sind live. Da die Datei in iCloud liegt und über Port 8090 ausgeliefert wird, ist immer und überall die aktuelle Fassung sichtbar.