300 lines
17 KiB
Markdown
300 lines
17 KiB
Markdown
# ChatGPT Handoff
|
|
|
|
## Projektziel
|
|
|
|
Javis ist Pascals langfristiges, lokal-first ausgerichtetes Projekt für einen realistischen persönlichen KI-Assistenten. Geplant sind schrittweise:
|
|
|
|
- lokaler Textchat und nachvollziehbarer Sitzungsspeicher
|
|
- Aufgaben, Notizen und ein kontrolliertes Gedächtnis
|
|
- später lesender und danach eng begrenzter Obsidian-Zugriff
|
|
- feste, überprüfbare Werkzeuge statt freier Shell
|
|
- später Sprache, technische Statusabfragen, Mobilzugriff und Living Mind
|
|
|
|
Nicht Ziel sind ein fiktiver Film-Jarvis, unbegrenzte Autonomie oder ein selbst trainiertes Foundation Model. Hauptsprache für Pascal und Benutzeroberflächen ist Deutsch.
|
|
|
|
## Verbindliche Pfade und Umgebung
|
|
|
|
- Repository und Git-Toplevel: `D:\Javis-Projekt`
|
|
- Branch für stabile Arbeit: `main`
|
|
- Gitea-Remote: `https://git.peli-server.de/Dystroyer8/Jarvis-Ai.git`
|
|
- aktiver Obsidian-Vault: `D:\Obsidian Vault`
|
|
- alte OneDrive-Kopie: am früher vermuteten Pfad nicht vorhanden und niemals verändern
|
|
- kanonischer Handoff: `docs/CHATGPT_HANDOFF.md`
|
|
- historisches Vollarchiv: `docs/archive/handoffs/2026-07-30-full-initial-handoff.md`
|
|
|
|
Gaming-PC:
|
|
|
|
- Windows 11 Pro, Build 26200
|
|
- AMD Ryzen 7 9700X, 64 GB DDR5-6000
|
|
- MSI RTX 3060 VENTUS 2X 12G OC
|
|
- ASRock X870 Nova WiFi
|
|
- Projekt auf Samsung 870 QVO 1 TB unter `D:`
|
|
|
|
Späterer möglicher Javis-Host:
|
|
|
|
- ASUS ROG Strix GL553VD mit Ubuntu 24.04
|
|
- Intel i7-7700HQ, 16 GB RAM, GTX 1050 4 GB
|
|
- 128-GB-SSD plus 1-TB-HDD
|
|
- zeitweise alternativ ATM10-Server; Javis- und ATM10-Modus sollen getrennt sein
|
|
|
|
Rootserver:
|
|
|
|
- Netcup RS 2000 G11, 8 vCores, 16 GiB RAM, ungefähr 512 GB
|
|
- Ubuntu 24.04; Infrastruktur für Gitea, CouchDB, Reverse Proxy, AMP und Gameserver
|
|
- kein lokales Javis-Modell und kein freier Root- oder Shellzugang für Javis
|
|
|
|
## Aktueller technischer Stand
|
|
|
|
- Der erste lokale Textchat ist auf `main` implementiert, abgenommen und nach Gitea gepusht.
|
|
- `uv run javis chat` liefert echte lokale Antworten und speichert Sitzungen in SQLite.
|
|
- Konfigurationsbeispiel, Sicherheitsdokumente, ADRs und Strukturtest sind vorhanden.
|
|
- Living-Mind-Verzeichnis ist ausschließlich ein inaktiver Vertrag ohne Frontend oder Fantasiedaten.
|
|
- Projektbezogene Codex-Rollen Scout, Architect, Builder, Verifier und Security Reviewer sind konfiguriert; maximal zwei Unteragenten, nur Builder schreibend.
|
|
- Toolchain eingerichtet: uv 0.11.32 und CPython 3.12.13 isoliert unter `D:\Javis-Tools`; Ruff 0.16.0 in der lokalen `.venv`.
|
|
- Offizielle VS-Code-Erweiterungen installiert: Python 2026.4.0, Pylance 2026.3.1, Python Environments 1.36.0 und Debugpy 2026.6.0.
|
|
- Windows-PATH und vorhandene Python-Installationen wurden nicht verändert.
|
|
- Ollama 0.32.5 ist portabel unter `D:\Javis-Tools\ollama` installiert.
|
|
- Genau ein Modell ist installiert: `qwen3:8b`, GGUF `Q4_K_M`, 5,2 GB, Apache-2.0.
|
|
- Modelle liegen außerhalb von Git unter `D:\Javis-Data\ollama-models`.
|
|
- Der lokale Ollama-Dienst bindet nur an `127.0.0.1:11434`; PATH, Registry,
|
|
Autostart und Windows-Dienste blieben unverändert.
|
|
- CLI-Befehle: `/new`, `/sessions`, `/load <NR|ID>`, `/search <Text>`,
|
|
`/rename <Titel>`, `/clear`, `/provider`, `/privacy`, `/status`, `/help`, `/exit`.
|
|
- Sitzungsdaten liegen über `JAVIS_DATA_DIR` außerhalb von Git; der bestätigte
|
|
Smoke-Test nutzte `D:\Javis-Data\runtime\core-chat-smoke`.
|
|
- Kein Obsidian-, Laptop- oder Rootserverzugriff wurde implementiert.
|
|
- Keine Tool-, Sprach-, Mobil- oder Living-Mind-Funktion ist implementiert.
|
|
- Offizielle Gemini-Prüfung abgeschlossen: `gemini-3.6-flash` und
|
|
`gemini-3.5-flash-lite` sind stabile GA-Modelle mit Free-Tier-Textnutzung;
|
|
Standard dieses Pakets wird ausschließlich `gemini-3.6-flash`.
|
|
- Sicherer Secret-Provider mit `keyring` 25.7.0 implementiert; unter Windows wird
|
|
der Windows Credential Locker verwendet.
|
|
- Secret-CLI: `javis secrets set gemini`, `status` und `delete gemini`; Setzen
|
|
verwendet verdeckte Eingabe und kein Befehl gibt den Schlüsselwert aus.
|
|
- Lokaler Datenschutzrouter klassifiziert jeden späteren Cloudaufruf konservativ
|
|
als `allowed`, `ask` oder `never`; `never` kann auch durch einen ausdrücklichen
|
|
Cloudwunsch nicht überstimmt werden.
|
|
- Nullkosten-Vorgaben und lokale Schutzgrenzen sind zentral konfiguriert:
|
|
Gemini standardmäßig deaktiviert, `free_only = true`, keine bestätigte
|
|
Billing-Freiheit ohne Pascals lokale Bestätigung, höchstens ein Retry.
|
|
- Provider-Nutzung wird separat in SQLite ausschließlich als technische Metadaten
|
|
protokolliert; Prompts, Antworten und Secrets werden dort nicht gespeichert.
|
|
- Isolierter Gemini-Provider nutzt das offizielle `google-genai` 2.16.0 mit API
|
|
`v1`, begrenztem Timeout und maximal einem Retry; 429 wird nicht wiederholt.
|
|
- Fehlender/ungültiger Schlüssel, 429, Netzwerkfehler und ungültige Antworten
|
|
werden als getrennte, bereinigte Fehler signalisiert.
|
|
- Hybridrouter erzwingt lokal Datenschutz, Freigabe, Billing-Bestätigung,
|
|
Tages-/Größenlimits und sichtbares Ollama-Fallback vor jedem Cloudaufruf.
|
|
- Ein abgelehnter Schlüssel deaktiviert Gemini für den restlichen CLI-Prozess;
|
|
alte reine Ollama-Sitzungen bleiben mit dem Hybridprovider ladbar.
|
|
- Nicht geheime Provider-Einstellungen werden aus
|
|
`JAVIS_DATA_DIR\javis.toml` geladen; Umgebungsvariablen können sie sicher
|
|
überschreiben. Die Aktivierungsvorlage enthält `free_only = true` und die
|
|
lokale Billing-Bestätigung, aber niemals einen API-Key.
|
|
- `javis configure gemini` verlangt zwei ausdrückliche Bestätigungen und lässt
|
|
Gemini bei leerer oder negativer Antwort deaktiviert.
|
|
- Der echte CLI-Chat verwendet nun `hybrid/auto`; der Key wird erst vor einem
|
|
zulässigen Cloudaufruf gelesen. `/provider`, `/privacy` und `/status` zeigen
|
|
ausschließlich bereinigte Modi, Entscheidungen und Zähler.
|
|
- `scripts/start-javis.ps1` verifiziert das Repository, setzt nur
|
|
Prozessvariablen, prüft Ollama auf Loopback, startet es bei Bedarf versteckt
|
|
und wartet begrenzt. Pfade sind per Parameter oder `JAVIS_*` überschreibbar.
|
|
- Allgemeine unpersönliche Technikfragen zu RAM/SSD, SQLite, HTTP, Git und
|
|
ähnlichen Begriffen werden gezielter `allowed`; `never` und `ask` behalten
|
|
Vorrang bei Secrets, interner Infrastruktur und persönlichem Kontext.
|
|
- Gesundheits-, Symptom-, Blutungs-, Verletzungs-, Medikamenten-, Diagnose-,
|
|
Behandlungs- und medizinische Notfallfragen sind zwingend lokal `never`.
|
|
- `/privacy` trennt Inhaltsklassifikation, tatsächlichen Provider, Unterdrückung
|
|
durch Modus `local` und technischen Provider-Fallback.
|
|
- Ollama, Gemini, Hybridrouter, Chatservice und CLI streamen sichtbare Antwortteile.
|
|
Verdeckte Gedanken werden nicht angefordert oder ausgegeben; Terminal-Markdown
|
|
wird lesbar bereinigt. Strg+C verwirft Teilantworten atomar und kehrt zum Chat zurück.
|
|
- Desktop-MVP auf `feat/desktop-ui` begonnen: PySide6, gemeinsamer CLI-/GUI-
|
|
Runtime-Builder, Qt-freier Controller und ruhiges Drei-Spalten-Grundgerüst vorhanden.
|
|
- Sitzungen, Suche, Umbenennen, Markdownanzeige, Qt-Streamingworker, sicherer
|
|
Abbruch, Modus und bereinigte Statusanzeige sind im Desktopclient verdrahtet.
|
|
- `ask` unterstützt `Einmal erlauben`, `Lokal beantworten` und `Abbrechen`;
|
|
`never` erreicht weiterhin keinen Cloudfreigabedialog.
|
|
- Startwege `uv run javis gui` und `scripts/start-javis-gui.ps1` funktionieren;
|
|
der GUI-Starter verwendet die sichere Loopback-/Prozesslogik des CLI-Starters.
|
|
|
|
## Aktuelle Architektur
|
|
|
|
- modularer Monolith, bevorzugt Python
|
|
- plattformunabhängige Pfade und zentrale Konfiguration
|
|
- Modell-Provider als kleine austauschbare Schnittstelle
|
|
- Ollama-Provider akzeptiert nur lokale HTTP-Loopback-Adressen
|
|
- SQLite-Sitzungsspeicher mit atomaren Benutzer-/Assistentenpaaren, neutralem
|
|
Starttitel, lokaler sicherer Titelerzeugung und zuletzt genutztem Provider
|
|
- Streaming wird erst nach vollständigem Abschluss atomar gespeichert; bei Abbruch
|
|
bleibt weder die Benutzerfrage noch eine unvollständige Antwort im Verlauf.
|
|
- Laufzeitdaten außerhalb von Git über `JAVIS_DATA_DIR` oder sicheren Plattformstandard
|
|
- Hybridprovider bevorzugt Gemini für cloudgeeignete Inhalte und verwendet
|
|
Ollama bei Datenschutz, Ablehnung, Offline-, Quota- und Providerfehlern
|
|
- strikter Nullkostenmodus ohne Billing-Aktivierung oder kostenpflichtigen Fallback;
|
|
lokales Modell bleibt Offline-, Datenschutz-, Ausfall- und Quota-Fallback
|
|
- Secret-Werte außerhalb von Code, Git, Prompts und Logs
|
|
- Modell erhält niemals Passwörter, Tokens oder private Schlüssel
|
|
- keine freie Shell; spätere Tools benötigen feste Schemas, Allowlists, Timeouts und Freigaben
|
|
- Obsidian zunächst nur lesend; `.obsidian` niemals verändern
|
|
- Obsidian-Wikilinks nur bei echter inhaltlicher Beziehung, niemals nur für Graphoptik
|
|
|
|
## Seit der letzten Übergabe erledigt
|
|
|
|
- Projekt- und Vault-Pfade erneut bestätigt.
|
|
- Sicheres, plattformunabhängiges Grundgerüst erstellt.
|
|
- `READ.ME` unter Erhalt des historischen Inhalts zu `README.md` überführt.
|
|
- Architektur, Sicherheit, Bedrohungsmodell, Berechtigungen und Roadmap dokumentiert.
|
|
- Tokenbewusster Arbeitsablauf festgelegt: gezielte Reads, kurze Ergebnisse, keine unnötigen Agenten oder Plugins.
|
|
- Werkzeugempfehlung auf `uv`, Microsoft Python/Pylance/Python Environments und Ruff begrenzt.
|
|
- Langer Handoff einmalig unverändert archiviert und durch diese kompakte aktuelle Zusammenfassung ersetzt.
|
|
- Handoff-Verdichtung als Commit `e6eb995` nach `origin/main` gepusht.
|
|
- Branch `feat/core-chat` von diesem Stand erstellt.
|
|
- uv, CPython 3.12, lokale `.venv`, Ruff, Lockfile und offizielle VS-Code-Python-Erweiterungen eingerichtet.
|
|
- Ollama und llama.cpp anhand offizieller Quellen verglichen; Ollama als einfachere
|
|
erste Windows-Laufzeit gewählt.
|
|
- Ollama-Archiv gegen die offizielle SHA-256-Prüfsumme verifiziert und portabel installiert.
|
|
- `qwen3:8b` außerhalb des Repositories geladen und mit zwei echten deutschen
|
|
Modellantworten auf der RTX 3060 geprüft.
|
|
- Chatkern, Ollama-Provider, zentrale Konfiguration, SQLite-Speicher und CLI implementiert.
|
|
- 13 Unit-Tests für Konfiguration, Speicher, Verlauf, Providervertrag und CLI ergänzt.
|
|
- Echten CLI-Chat ausgeführt und dieselbe Sitzung in einem neuen Prozess geladen,
|
|
aufgelistet und erfolgreich mit einer weiteren Modellantwort fortgesetzt.
|
|
- Obsidian, Ubuntu-Laptop und Rootserver blieben unverändert.
|
|
- Aktuelle offizielle Gemini-Modelle, Free-Tier-Preise, dynamische Quoten,
|
|
Auth-Keys, GA-SDK, Fehlercodes und Datenschutzbedingungen geprüft und unter
|
|
`docs/GEMINI_PROVIDER.md` kompakt dokumentiert.
|
|
- Betriebssystemgebundenen Secret-Provider und isolierte Fake-Backend-Tests ergänzt.
|
|
- Datenschutzrouter, minimale Cloud-Kontextauswahl, strikte Nullkosten-Defaults,
|
|
lokale Tages-/Größenlimits und metadatenbasiertes Provider-Audit ergänzt.
|
|
- Offiziellen Gemini-SDK-Client isoliert angebunden und ausschließlich mit
|
|
Test-Doubles gegen Erfolg, Key-, Quota-, Netzwerk- und Antwortfehler geprüft.
|
|
- Hybridrouting und Audit mit Test-Doubles integriert: `never` konstruiert keinen
|
|
Cloudclient, `ask` verlangt Freigabe, 429/Netzwerk/Keyfehler fallen lokal zurück.
|
|
- Lokalen TOML-Loader und sicheren Erzeuger ergänzt; vorhandene Konfigurationen
|
|
werden nicht ungefragt überschrieben und fehlerhafte TOML wird abgelehnt.
|
|
- Hybridprovider in die CLI verdrahtet, sicheren Aktivierungsdialog und
|
|
bereinigte Provider-/Datenschutz-/Statusbefehle ergänzt.
|
|
- Lesender Ollama-Status prüft nur Loopback-Erreichbarkeit und Modellliste.
|
|
- Sicheres PowerShell-Startskript und kompakte Startdokumentation ergänzt; keine
|
|
PATH-, Registry-, Autostart-, Dienst- oder Richtlinienänderung.
|
|
- Medizinische Inhalte vor Cloudclient-Erstellung strikt auf `never` gesetzt;
|
|
bestehende SQLite-Daten transaktional und wiederholbar um Titel/Provider migriert.
|
|
- Echtes Ollama-/Gemini-Streaming, providerübergreifendes Fallback vor der ersten
|
|
Ausgabe und sicheren Streaming-Abbruch nach Teilausgabe implementiert.
|
|
- CLI-Streaming mit lesbarer Markdown-Bereinigung und sicherem Strg+C ergänzt.
|
|
|
|
## Aktuelle Tests
|
|
|
|
Letzter bestätigter Projektstand:
|
|
|
|
- Strukturprüfung: bestanden
|
|
- Unit-Test des Paketgerüsts: bestanden
|
|
- TOML-Parsing: bestanden
|
|
- UTF-8- und interne Markdown-Linkprüfung: bestanden
|
|
- Secret-Musterprüfung: keine Treffer
|
|
- Gitignore-Prüfung für lokale Secret-Dateien: bestanden
|
|
- uv-Lock und `uv sync --dev`: bestanden
|
|
- Python in `.venv`: 3.12.13
|
|
- Ruff in `.venv`: 0.16.0
|
|
- Tests: 101 bestanden; zusätzlich Qt-Offscreen-Fenster, Dialogzuordnung und
|
|
sichere Wiederverwendung des Startskripts abgedeckt
|
|
- `uv run javis gui` im Offscreen-Modus: erfolgreich, Exitcode 0
|
|
- echter lokaler GUI-Smoke: erfolgreich; 1 Sitzung, 2 Nachrichten, Provider Ollama
|
|
- GUI-Startskript mit prozesslokalem ExecutionPolicy-Bypass: erfolgreich
|
|
- manuelle Desktop-Abnahme durch Pascal: noch offen
|
|
- PowerShell-Syntax des Startskripts: erfolgreich geparst
|
|
- Ruff Lint: bestanden
|
|
- Ruff Formatprüfung: bestanden
|
|
- lokaler CLI-Smoke ohne Secretzugriff: bestanden
|
|
- echter Ollama-CLI-Streaming-Smoke mit Neustart/Laden: bestanden
|
|
- echter Gemini-Streaming-Smoke mit öffentlichem Inhalt: bestanden; ein Abschnitt,
|
|
20 sichtbare Zeichen, 14 Eingabe- und 4 Ausgabetoken; kein Keywert ausgegeben
|
|
- Obsidian-Vault unverändert: 1 Markdown-, 11 Gesamtdateien, letzter
|
|
Schreibzeitpunkt weiterhin 30.07.2026 15:42:31
|
|
- Rootserver und Ubuntu-Laptop wurden nicht kontaktiert
|
|
|
|
Lokaler Modell-Smoke-Test:
|
|
|
|
- Ollama-Version/API: 0.32.5, localhost erreichbar
|
|
- Modell: 5.225.388.164 Byte, 8,2B, Q4_K_M, Apache-2.0
|
|
- kalter Aufruf: 36,19 s Wandzeit, davon 17,53 s Laden, ungefähr 7,22 Token/s
|
|
- warmer kurzer Aufruf: 0,56 s Wandzeit, ungefähr 55,51 Token/s
|
|
- GPU-Belegung: 1.418 MiB vorher, 6.842 MiB mit geladenem Modell
|
|
- Ollama meldet 100 % GPU und 5,6 GB Modellbelegung
|
|
|
|
CLI-/Persistenz-Smoke:
|
|
|
|
- neuer CLI-Prozess erzeugte eine Sitzung und erhielt eine echte Modellantwort
|
|
- zweiter CLI-Prozess lud dieselbe UUID und zeigte zwei gespeicherte Nachrichten
|
|
- `/sessions` listete Provider, Modell und Nachrichtenanzahl korrekt
|
|
- fortgesetzte Frage erhielt die echte lokale Antwort `4`
|
|
|
|
Abnahmestatus:
|
|
|
|
- automatisiert durch Codex getestet: Core-Chat, SQLite, CLI und lokales Modell
|
|
- manuell durch Pascal getestet: am 30.07.2026 erfolgreich; CLI-Start, echte
|
|
deutsche Antworten, Sitzungskontext, `/sessions`, `/exit`, Neustart,
|
|
`/load <UUID>`, vollständiger Verlauf und Fortsetzung
|
|
- Gemini/Datenschutz/Fallback automatisiert durch Codex getestet: ja
|
|
- Gemini/Datenschutz/Fallback manuell durch Pascal getestet: am 30.07.2026;
|
|
verdeckte Key-Speicherung ohne Wertausgabe, vollständiger `/status`, echter
|
|
Gemini-Erfolg, Cloudzähler, `ask`-Ablehnung, `never`, `/provider local` und
|
|
Startskript erfolgreich
|
|
- für Merge freigegeben: ja, nach den dokumentierten kleinen Korrekturen
|
|
- für produktive Nutzung freigegeben: nicht separat erklärt; keine Freigabe für
|
|
spätere Tools, Obsidian oder autonome Aktionen
|
|
|
|
## Git-Stand
|
|
|
|
- aktueller Arbeitsbranch: `feat/desktop-ui`
|
|
- stabiler Ausgangsstand: `main` bei `d3e85f2`
|
|
- GUI-Grundgerüst und Kernadapter: `1658e04`
|
|
- Sitzungen, Streaming, Abbruch und Datenschutz: `cf35148`
|
|
- Sitzungsnavigation: `43c1f76`
|
|
- Dokumentation: `328dcd9`
|
|
- Chatkomfort-Merge nach `main`: `cbba102`
|
|
- 91 Unit-Tests, Ruff und Strukturprüfung auf dem gemergten `main` bestanden
|
|
- Feature-Branch erfolgreich zu `origin/feat/chat-comfort` gepusht
|
|
- `main` erfolgreich bis `3361eae` zu `origin/main` gepusht und synchron verifiziert
|
|
- `origin` verwendet HTTPS
|
|
- kein Force-Push und keine umgeschriebene Historie
|
|
|
|
## Offene Entscheidungen und Fehler
|
|
|
|
- endgültiger Produkt-/Repositoryname bleibt offen
|
|
- Startskript startet Ollama bei Bedarf pro Prozess; kein Autostart oder Dienst
|
|
- Antworten werden gestreamt; Titel, Navigation und Suche sind implementiert
|
|
- genauer späterer Obsidian-Schreibbereich ist nicht freigegeben
|
|
- normaler Secret-Provider ist festgelegt: Betriebssystem-Keyring; eine
|
|
Klartext-XML wird nicht für API-Schlüssel verwendet
|
|
- Google-Quoten bleiben projektabhängig und müssen in AI Studio geprüft werden;
|
|
lokale Limits sind nur zusätzliche Schutzgrenzen
|
|
- Gaming-PC zeigt derzeit nur 8 statt 16 logische CPU-Prozessoren; Ursache ungeklärt
|
|
- ASUS-Laptop ist nicht automatisch für dasselbe Modell wie die RTX 3060 geeignet
|
|
|
|
## Bekannte Risiken
|
|
|
|
- lokale Modellqualität und Geschwindigkeit unterscheiden sich stark zwischen RTX 3060 und GTX 1050
|
|
- ATM10 und Javis dürfen den ASUS-Laptop nicht gleichzeitig überlasten
|
|
- Secrets können über Logs, Prompts, Screenshots oder Git abfließen
|
|
- Cloudrouting könnte sensible Daten preisgeben; vor jedem Cloudaufruf ist deshalb
|
|
lokal `allowed`, `ask` oder `never` zu entscheiden und Kontext zu minimieren
|
|
- kostenlose Gemini-Kontingente und Modellnamen können sich ändern
|
|
- Prompt Injection aus später eingelesenen Notizen oder Webseiten
|
|
- unkontrollierter Obsidian-Schreibzugriff könnte Wissen beschädigen
|
|
- Self-hosted LiveSync ist kein Ersatz für ein getestetes Backup
|
|
- unnötige Plugins, Agenten und Cloud-Connectoren erhöhen Rechte-, Wartungs- und Tokenbedarf
|
|
|
|
## Nächster sinnvoller Auftrag
|
|
|
|
Auf `feat/desktop-ui` als Nächstes vollständige Abschlussprüfungen ausführen,
|
|
Dokumentation committen und Feature-Branch pushen. Danach für Pascals manuelle
|
|
Desktop-Abnahme stoppen; noch nicht nach `main` mergen.
|
|
Medizinische Antwortqualität bleibt ein späteres Sicherheits-/Systemprompt-Thema.
|
|
Noch keine Obsidian-Integration oder Tools beginnen.
|
|
|
|
Keinen API-Key in Chat, Git, Obsidian, Logs oder Dokumentation übernehmen.
|
|
|
|
Nicht Teil dieses Meilensteins: Obsidian-Integration, Serverzugriff, Sprache, Mobile Client oder Living-Mind-Code.
|