GITHUB REPO

Bau dir deinen eigenen Jarvis.

Ein KI-Assistent auf deinem eigenen Server: kennt dich per Telegram, schickt dir um 7 dein Briefing und erinnert sich mit einer Vektordatenbank an alles. 43 Schritte für absolute Einsteiger.

  • Hermes Agent
  • ChatGPT
  • Telegram
  • Hetzner
  • Supabase
  • Voyage AI
  • ElevenLabs
  • Claude
  • ein Wochenende
  • Einsteiger

FEATURES

Was es kann.

Läuft rund um die Uhr.

Dein Laptop kann zu sein, dein Handy im Flugmodus. Jarvis sitzt auf einem eigenen Server in Deutschland und ist immer wach. Du schreibst ihm, wann du willst, und er meldet sich, wann er soll.

Kennt dich und dein Business.

Nach einem kurzen Kennenlern-Interview weiß Jarvis, was du machst, welche Projekte laufen und was er nicht darf. Das speichert er in drei kleinen Notizdateien und lernt im Alltag weiter.

  • SOUL.md: Persönlichkeit, Ton und Grenzen
  • MEMORY.md: Fakten, bis 2.200 Zeichen
  • USER.md: dein Profil, bis 1.375 Zeichen

Meldet sich von selbst.

Du sagst Jarvis in normalen Worten, was er regelmäßig tun soll: „Jeden Morgen um 7 mein Briefing.“ Er legt daraus einen Zeitplan an und schickt dir das Ergebnis auf Telegram. Ohne Programmieren.

Bedienung per Telegram.

Keine neue App, kein Dashboard. Du chattest mit Jarvis wie mit einem Kollegen, auch per Sprachnachricht. Und nur du: Der Bot antwortet ausschließlich deiner Telegram-Nutzer-ID.

USE CASES

Wofür du es einsetzt.

  1. Morgenbriefing um 7

    Welche Mails brauchen heute eine Antwort, welche Termine stehen an, was sind die drei wichtigsten Aufgaben, wo ist ein freier Block von 90 Minuten? Liegt fertig auf dem Handy, bevor du den ersten Kaffee hast.

  2. Wochenrecherche am Montag

    Jeden Montag um 8 sucht Jarvis sechs aktuelle Quellen zu deinem Thema, sortiert unseriöse aus und schickt dir fünf Kernaussagen mit Links. Die ganze Recherche legt er zusätzlich als Datei ab.

  3. Zweites Gedächtnis

    „Merk dir: Rechnungen schreibe ich freitags.“ Ab dann weiß Jarvis das, auch nächste Woche. Mit „Vergiss:“ löschst du es wieder. So wird er jeden Tag ein bisschen mehr dein Assistent.

  4. Schnell mal von unterwegs

    Im Auto eine Sprachnachricht: „Such mir die Mail von gestern zum Angebot raus und fass sie in drei Sätzen zusammen.“ Jarvis erledigt es, während du fährst.

SPICKZETTEL

Schon mal gemacht? Alles am Stück.

Hier stehen alle Befehle und Texte kompakt zum Kopieren. Du machst das zum ersten Mal? Dann spring direkt zur Anleitung darunter: Dort steht jeder Befehl noch einmal genau in dem Schritt, in dem du ihn brauchst, mit Erklärung. Alles in GROSSBUCHSTABEN ersetzt du durch deine eigenen Angaben.

01-server.sh
# LAPTOP
ssh-keygen -t ed25519 -C "jarvis"
cat ~/.ssh/id_ed25519.pub
ssh root@DEINE-SERVER-IP

# SERVER (root)
apt update && apt upgrade -y
apt install -y git curl xz-utils libatomic1
timedatectl set-timezone Europe/Berlin
adduser jarvis
usermod -aG sudo jarvis
rsync --archive --chown=jarvis:jarvis ~/.ssh /home/jarvis
exit

# LAPTOP, ab jetzt immer:
ssh jarvis@DEINE-SERVER-IP

DIE ANLEITUNG

In 43 Schritten zu deinem Jarvis.

Für alle, die so etwas noch nie gemacht haben. Jeder Schritt sagt dir, wo du bist, was du klickst oder einfügst und woran du erkennst, dass es geklappt hat. Geh erst weiter, wenn der grüne Kasten stimmt. Teil 1 bis 5 schaffst du an einem Nachmittag, Google, Automationen und Gedächtnis am nächsten Tag. Stimme und Oberfläche sind Extras.

  1. Teil 1 · Vorbereitung
  2. Überall · 10 Min

    Das brauchst du

    Leg dir diese Dinge bereit, bevor du anfängst. Keine Sorge wegen der Fachwörter: Du musst sie nicht verstehen, nur wiedererkennen. Die sechs wichtigsten erklären wir gleich im nächsten Schritt.

    1. Einen Laptop (Mac oder Windows) und dein Handy.
    2. Eine Kreditkarte oder PayPal für den Server (rund 6 € netto im Monat, ca. 7 € brutto).
    3. Ein ChatGPT-Abo (Plus reicht). Das ist das Gehirn von Jarvis.
    4. Die App Telegram auf dem Handy, kostenlos im App Store oder bei Google Play. Einmal mit deiner Handynummer anmelden.
    5. Ein Google-Konto, wenn Jarvis deine Mails und Termine lesen soll.
    6. Optional: ein kostenloses ElevenLabs-Konto (Stimme) und ein Claude-Abo Pro oder Max (eigene Oberfläche).
    7. Einen Notizzettel (Papier oder Notizen-App). Du wirst dir unterwegs eine IP-Adresse, ein Passwort und zwei Schlüssel notieren.

    Geklappt, wenn: alle Konten stehen und du hast rund drei Stunden Zeit am Stück für Teil 1 bis 5.

  3. Zum Nachschlagen

    Sechs Wörter, kurz erklärt

    Diese Begriffe kommen gleich ständig vor. Wenn du später unsicher bist, schau hier in Schritt 2 nach.

    1. Server: ein Computer in einem Rechenzentrum, den du mietest. Er läuft Tag und Nacht, auch wenn dein Laptop zu ist. Dort wohnt Jarvis.
    2. Terminal: ein Fenster, in das du Befehle tippst statt zu klicken. Du kopierst sie nur von dieser Seite hinein und drückst Enter.
    3. Befehl: eine Zeile Text, die der Computer ausführt. Zeilen, die mit # beginnen, sind nur Erklärungen und werden ignoriert.
    4. SSH-Schlüssel: dein digitaler Hausschlüssel für den Server. Er besteht aus zwei Teilen: einem geheimen, der auf deinem Laptop bleibt, und einem öffentlichen, den du dem Server gibst.
    5. Hermes: das kostenlose Programm, das aus ChatGPT einen Assistenten macht, der sich Dinge merkt und von selbst arbeitet.
    6. Bot und Token: ein Bot ist ein Telegram-Konto, hinter dem ein Programm statt eines Menschen steckt. Der Token ist sein Passwort. Wer ihn hat, kann den Bot steuern, also niemals weitergeben.
  4. Dein Laptop · 2 Min

    Terminal öffnen

    Das Terminal ist schon auf deinem Laptop, du musst nichts installieren. Lass das Fenster ab jetzt offen.

    1. Mac: Drück Cmd + Leertaste, tipp Terminal und drück Enter.
    2. Windows: Klick auf Start, tipp PowerShell und klick auf „Windows PowerShell“.
    3. Einfügen geht am Mac mit Cmd + V, in der PowerShell mit Rechtsklick oder Strg + V.
    4. Jeder Befehl auf dieser Seite steht in einem eigenen Kasten mit Kopier-Button. Füg immer einen Kasten ein, drück Enter und warte, bis wieder eine leere Eingabezeile erscheint. Erst dann kommt der nächste.

    Geklappt, wenn: ein Fenster mit blinkendem Cursor ist offen.

  5. Terminal auf dem Laptop · 3 Min

    Deinen Hausschlüssel erzeugen

    Du erzeugst jetzt deinen SSH-Schlüssel, also den Hausschlüssel für den Server. Das passiert nur auf deinem Laptop, einen Server hast du noch nicht.

    1. Befehl 1 kopieren, ins Terminal einfügen, Enter.
    2. Er fragt dreimal etwas (wo der Schlüssel liegen soll und zweimal nach einem Passwort für den Schlüssel). Drück jedes Mal einfach nur Enter.
    3. Ist wieder eine leere Eingabezeile da: Befehl 2 einfügen, Enter. Er zeigt den öffentlichen Teil deines Schlüssels.
    1-schluessel-erzeugen.sh
    ssh-keygen -t ed25519 -C "jarvis"
    2-schluessel-anzeigen.sh
    cat ~/.ssh/id_ed25519.pub

    Geklappt, wenn: eine lange Zeile erscheint, die mit ssh-ed25519 beginnt und mit jarvis endet. Markier sie komplett und kopier sie.

    Falls es hakt: Windows meldet „ssh-keygen wurde nicht erkannt“? Dann öffne Einstellungen → System → Optionale Features → Feature hinzufügen → „OpenSSH-Client“ installieren und die PowerShell neu öffnen.

  6. Teil 2 · Der Server
  7. hetzner.com/cloud · 15 MinRegistrieren → Neues Projekt → Server hinzufügen

    Server bei Hetzner mieten

    Hetzner ist ein deutscher Anbieter mit Rechenzentren in Deutschland. Der kleinste Server reicht völlig und kostet rund 6 € netto im Monat (ca. 7 € brutto). Bei der ersten Anmeldung prüft Hetzner deine Identität, das kann ein paar Minuten bis Stunden dauern.

    1. Auf hetzner.com/cloud auf „Registrieren“ klicken, Konto anlegen, Zahlungsmittel hinterlegen.
    2. In der Console auf „+ Neues Projekt“, Name Jarvis, dann das Projekt öffnen.
    3. Oben rechts auf „Server hinzufügen“ klicken.
    4. Typ: „Shared vCPU“ → CX23 (2 Kerne, 4 GB). Ist er ausverkauft, nimm CAX11.
    5. Standort: Falkenstein oder Nürnberg.
    6. Image: Ubuntu 24.04.
    7. Networking: „Öffentliche IPv4“ und „IPv6“ angehakt lassen.
    8. SSH-Keys: „SSH-Key hinzufügen“, die kopierte Zeile aus Schritt 4 einfügen, Name laptop, speichern. Er muss danach angehakt sein.
    9. Den Rest leer lassen, ganz unten den Namen jarvis eintragen und auf „Kostenpflichtig erstellen“ klicken.

    Geklappt, wenn: der Server steht auf „Läuft“ und in der Übersicht steht eine IPv4-Adresse wie 203.0.113.10. Notier sie dir, das ist ab jetzt DEINE-SERVER-IP.

  8. Hetzner Console · 5 MinProjekt Jarvis → Firewalls → Firewall erstellen

    Tür abschließen: die Firewall

    Eine Firewall ist ein Türsteher: Sie lässt nur rein, was du erlaubst. Jarvis braucht von außen nur eine einzige Tür, nämlich die für deinen SSH-Schlüssel. Telegram, ChatGPT und Google baut er selbst von innen auf.

    1. Links im Projekt auf „Firewalls“ → „Firewall erstellen“.
    2. Bei Eingehend steht schon eine Regel für Port 22 (SSH). Die bleibt, alle anderen eingehenden Regeln löschst du.
    3. Ausgehend bleibt leer, das heißt: alles erlaubt.
    4. Unten bei „Anwenden auf“ deinen Server jarvis auswählen, Name nur-ssh, erstellen.

    Geklappt, wenn: beim Server steht unter „Firewalls“ der Eintrag nur-ssh.

  9. Terminal auf dem Laptop · 3 Min

    Zum ersten Mal einloggen

    Jetzt verbindest du dein Terminal mit dem Server. Ab dann landet alles, was du tippst, auf dem Server und nicht mehr auf deinem Laptop.

    1. Befehl kopieren und DEINE-SERVER-IP durch die Zahl von deinem Zettel (aus Schritt 5) ersetzen, bevor du Enter drückst. Am einfachsten tauschst du sie erst in einer Notiz aus und kopierst den fertigen Befehl von dort.
    2. Im Terminal einfügen, Enter.
    3. Beim ersten Mal fragt das Terminal „Are you sure you want to continue connecting?“. Tipp yes und drück Enter.
    laptop.sh
    ssh root@DEINE-SERVER-IP

    Geklappt, wenn: die Eingabezeile beginnt jetzt mit root@jarvis. Du bist auf dem Server.

    Falls es hakt: „Permission denied“ heißt: Der Schlüssel aus Schritt 4 wurde bei Hetzner nicht vollständig eingefügt.

  10. Server, als root · 10 Min

    Server auf den neuesten Stand bringen

    Du bringst den Server auf den neuesten Stand, installierst vier kleine Helfer und stellst die deutsche Uhrzeit ein. Ohne die Uhrzeit käme dein Briefing später um 9 statt um 7.

    1. Befehl 1 einfügen, Enter. Es läuft ein paar Minuten lang viel Text durch. Warte, bis wieder eine leere Eingabezeile kommt.
    2. Befehl 2 einfügen, Enter, wieder warten.
    3. Befehl 3 einfügen, Enter. Er zeigt nichts an, das ist richtig.
    1-aktualisieren.sh
    apt update && apt upgrade -y
    2-helfer.sh
    apt install -y git curl xz-utils libatomic1
    3-uhrzeit.sh
    timedatectl set-timezone Europe/Berlin

    Geklappt, wenn: alle drei Befehle sind ohne rote Fehlermeldung durchgelaufen und die Eingabezeile beginnt wieder mit root@jarvis.

    Falls es hakt: Bei Befehl 1 erscheint ein lila Fenster mit einer Frage? Einfach Enter drücken, die Vorauswahl passt. Meldet Befehl 1 „Could not get lock“? Der Server ist direkt nach dem Start noch mit sich selbst beschäftigt: ein bis zwei Minuten warten, Befehl noch einmal einfügen.

  11. Server, als root · 5 Min

    Eigenen Benutzer jarvis anlegen

    Damit nicht alles mit vollen Admin-Rechten läuft, legst du einen eigenen Benutzer namens jarvis an. Er bekommt denselben Hausschlüssel wie du.

    1. Befehl 1 einfügen, Enter. Er fragt zweimal nach einem neuen Passwort: Denk dir eins aus und tipp es ein (beim Tippen sieht man nichts, das ist normal). Notier es, du brauchst es später für Befehle mit sudo.
    2. Danach fragt er nach Name, Telefonnummer und Ähnlichem: jedes Mal nur Enter. Bei „Is the information correct?“ tippst du Y und Enter.
    3. Befehl 2 einfügen, Enter. Er erlaubt jarvis, bei Bedarf Admin-Befehle zu nutzen.
    4. Befehl 3 einfügen, Enter. Er gibt jarvis deinen Hausschlüssel.
    5. Befehl 4 einfügen, Enter. Damit verlässt du den Server und bist wieder auf deinem Laptop.
    1-benutzer.sh
    adduser jarvis
    2-adminrechte.sh
    usermod -aG sudo jarvis
    3-schluessel.sh
    rsync --archive --chown=jarvis:jarvis ~/.ssh /home/jarvis
    4-abmelden.sh
    exit

    Geklappt, wenn: im Terminal steht „Connection to … closed.“ und die Eingabezeile sieht wieder aus wie vorher auf deinem Laptop.

  12. Terminal auf dem Laptop · 1 Min

    Als jarvis einloggen

    Ab jetzt meldest du dich immer als jarvis an, nie mehr als root. Diesen Befehl brauchst du jedes Mal, wenn du zum Server willst.

    1. Befehl kopieren, DEINE-SERVER-IP durch die Zahl von deinem Zettel ersetzen, einfügen, Enter.
    2. Speicher dir den fertigen Befehl in einer Notiz. Du brauchst ihn noch oft.
    laptop.sh
    ssh jarvis@DEINE-SERVER-IP

    Geklappt, wenn: du kommst ohne Passwortfrage rein und die Eingabezeile beginnt mit jarvis@jarvis.

    Falls es hakt: „Permission denied“, obwohl Schritt 7 geklappt hat? Dann ist Befehl 3 aus Schritt 9 nicht durchgelaufen. Log dich mit ssh root@DEINE-SERVER-IP ein, wiederhol ihn und dann exit.

  13. Teil 3 · Das Gehirn
  14. Server, als jarvis · 10 Min

    Hermes installieren

    Hermes ist Open Source (MIT-Lizenz) und kostet nichts. Der erste Befehl installiert es (ohne weitere Fragen, die Einrichtung folgt im nächsten Schritt), der zweite lädt die neuen Befehle ins Terminal, der dritte prüft, ob alles da ist.

    1. Prüf zuerst: Die Eingabezeile im Terminal beginnt mit jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.
    2. Befehl 1 einfügen, Enter. Fragt er nach einem Passwort, tipp dein jarvis-Passwort aus Schritt 9. Es läuft einige Minuten viel Text durch. Warte, bis wieder eine leere Eingabezeile kommt.
    3. Befehl 2 einfügen, Enter.
    4. Befehl 3 einfügen, Enter.
    1-installieren.sh
    curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --non-interactive
    2-laden.sh
    source ~/.bashrc
    3-pruefen.sh
    hermes --version

    Geklappt, wenn: Befehl 3 zeigt eine Versionsnummer.

    Falls es hakt: „hermes: command not found“? Einmal exit, neu einloggen mit ssh jarvis@DEINE-SERVER-IP, dann ist der Befehl da.

  15. Server und Handy · 10 Min

    ChatGPT als Gehirn anschließen

    Hermes selbst denkt nicht, es leiht sich das Denken bei ChatGPT. Weil der Server keinen Bildschirm hat, meldest du dich mit einem Code über dein Handy an. Ein API-Schlüssel ist dafür nicht nötig.

    1. Befehl einfügen, Enter. Hermes fragt, womit es denken soll.
    2. Es kommt eine nummerierte Liste mit vielen Anbietern. Tipp die Zahl vor „OpenAI“, Enter. Danach gibt es eine zweite, kurze Liste: tipp die Zahl vor „ChatGPT or Codex Subscription“, Enter.
    3. Hermes zeigt einen Link und einen Code. Link am Handy öffnen (abtippen oder vom Laptop schicken), mit deinem ChatGPT-Konto anmelden, Code eingeben, bestätigen.
    4. Zurück im Terminal das Modell wählen: gpt-5.6-terra ist ein guter Standard für alles in dieser Anleitung. Enter.
    server.sh
    hermes model

    Geklappt, wenn: das Terminal zeigt ohne Fehlermeldung wieder eine leere Eingabezeile mit jarvis@jarvis.

    Falls es hakt: Fehler oder „logged out“ bei der Anmeldung? hermes model noch einmal ausführen und den Code frisch eingeben, er ist nur ein paar Minuten gültig.

  16. Server, als jarvis · 5 Min

    Anmeldung prüfen und erster Test

    Du prüfst, ob die Anmeldung bei ChatGPT sitzt und stellst Hermes auf deutsche Zeit, damit Zeitpläne später zur richtigen Uhrzeit laufen. Dann redest du zum ersten Mal mit Jarvis.

    1. Befehl 1 einfügen, Enter. Er zeigt, ob du bei ChatGPT angemeldet bist.
    2. Befehl 2 einfügen, Enter. Er zeigt nichts an oder bestätigt kurz die Einstellung, beides ist richtig.
    3. Befehl 3 einfügen, Enter. Der Chat mit Jarvis öffnet sich direkt im Terminal.
    4. Die Frage 4 einfügen, Enter.
    5. Zum Verlassen des Chats Strg + C drücken (notfalls zweimal), bis wieder jarvis@jarvis dasteht.
    1-anmeldung-pruefen.sh
    hermes auth status openai-codex
    2-zeitzone.sh
    hermes config set timezone Europe/Berlin
    3-chat-starten.sh
    hermes
    4-erste-frage.txt
    Hallo, wer bist du?

    Geklappt, wenn: auf „Hallo, wer bist du?“ kommt eine Antwort.

    Falls es hakt: Befehl 1 meldet „logged out“? Schritt 12 wiederholen und den Code frisch eingeben, er ist nur ein paar Minuten gültig.

  17. Teil 4 · Telegram
  18. Telegram am Handy · 5 Min

    Deinen Bot beim BotFather bauen

    Der BotFather ist der offizielle Bot von Telegram, mit dem man eigene Bots anlegt. Du chattest mit ihm wie mit einem Menschen, er fragt dich zwei Dinge und gibt dir am Ende den Token.

    1. Telegram öffnen und oben auf die Lupe (Suche) tippen.
    2. BotFather eintippen und den Eintrag @BotFather öffnen. Achte auf die exakte Schreibweise, es gibt Nachahmer mit ähnlichen Namen.
    3. Unten auf „Starten“ tippen.
    4. /newbot schreiben und abschicken.
    5. Er fragt nach dem Namen: Das ist der Anzeigename im Chat, z. B. Jarvis.
    6. Er fragt nach dem Benutzernamen: Der muss einmalig sein und auf bot enden, z. B. tills_jarvis_bot. Ist er vergeben, probier einen anderen.
    7. Er antwortet mit „Done! Congratulations…“ und einer Zeile wie 7123456789:AAH…. Das ist dein Token. Tipp drauf, um ihn zu kopieren, und schick ihn dir selbst (z. B. in „Gespeicherte Nachrichten“), damit du ihn am Laptop hast.

    Geklappt, wenn: du hast einen Token, der aus einer Zahl, einem Doppelpunkt und einer langen Zeichenkette besteht.

    Falls es hakt: Token versehentlich geteilt? Beim BotFather /revoke senden, Bot wählen, und du bekommst einen neuen.

  19. Telegram am Handy · 2 Min

    Deine Telegram-Nutzer-ID herausfinden

    Damit Jarvis nur dir antwortet und niemandem sonst, braucht er deine Nutzer-ID. Das ist eine reine Zahl, nicht dein @-Name und nicht deine Telefonnummer.

    1. In der Telegram-Suche userinfobot eintippen und @userinfobot öffnen.
    2. Auf „Starten“ tippen.
    3. Er antwortet mit ein paar Zeilen. Die Zahl hinter Id (z. B. 123456789) ist deine Nutzer-ID. Notieren.

    Geklappt, wenn: du hast eine Zahl mit 8 bis 10 Ziffern notiert.

  20. Server, als jarvis · 5 Min

    Bot mit dem Server verbinden

    Ein Einrichtungs-Assistent fragt dich nacheinander nach Plattform, Token und Nutzer-ID. Leg dir Token und Nutzer-ID von deinem Zettel bereit. Am Ende richtet er Jarvis auch gleich als Dienst ein.

    1. Prüf zuerst: Die Eingabezeile im Terminal beginnt mit jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.
    2. Befehl einfügen, Enter.
    3. Er zeigt eine nummerierte Liste mit Plattformen. Tipp die Zahl vor „Telegram“, Enter.
    4. Er fragt „How would you like to create your Telegram bot?“: tipp 2 (Manual), Enter. Die Vorauswahl 1 würde einen Bot neu erzeugen, du hast ja schon deinen.
    5. Er fragt nach dem Token: deinen Token aus Schritt 14 einfügen, Enter.
    6. Er fragt „Allowed user IDs“: deine Nutzer-ID aus Schritt 15 eintippen, Enter.
    7. Bei „Use your user ID as the home channel? [Y/n]“ einfach Enter. Danach erscheint die Plattform-Liste noch einmal: wieder Enter (Vorauswahl Done).
    8. Am Ende fragt er „Start the gateway now?“, „Start the gateway automatically …?“ und nach der Art des Dienstes: überall Enter (Vorauswahl User service). Eine gelbe Warnung „Linger not enabled“ ist normal, die behebt der nächste Schritt.
    server.sh
    hermes gateway setup

    Geklappt, wenn: der Assistent ist fertig und die Eingabezeile jarvis@jarvis ist wieder da.

  21. Server, dann Telegram · 5 Min

    Jarvis dauerhaft starten

    Der Assistent hat Jarvis schon als Dienst eingerichtet. Jetzt sorgst du dafür, dass er auch läuft, wenn du nicht eingeloggt bist, und nach einem Neustart des Servers von selbst wieder startet.

    1. Befehl 1 einfügen, Enter. Der Server fragt nach deinem jarvis-Passwort aus Schritt 9: eintippen (man sieht nichts), Enter. Er zeigt sonst nichts an, das ist richtig.
    2. Befehl 2 einfügen, Enter. Er zeigt, ob der Dienst läuft.
    3. Am Handy in Telegram oben auf die Lupe tippen, den Benutzernamen deines Bots aus Schritt 14 suchen, „Starten“ tippen und „Hallo“ schreiben.
    1-dienst.sh
    sudo loginctl enable-linger jarvis
    2-status.sh
    hermes gateway status

    Geklappt, wenn: Befehl 2 meldet den Dienst als aktiv und dein Bot antwortet in Telegram.

    Falls es hakt: Keine Antwort? Meist ist die Nutzer-ID falsch. hermes gateway setup noch einmal laufen lassen, dann hermes gateway restart.

  22. Teil 5 · Jarvis beibringen, wer du bist
  23. Server, als jarvis · 10 Min

    Persönlichkeit festlegen

    Die Datei SOUL.md liest Jarvis vor jedem Gespräch. Darin steht, wer er ist, wie er schreibt und was er nie ohne dich tut. Du bearbeitest sie mit nano, einem einfachen Texteditor im Terminal: Die Maus geht dort nicht, du bewegst dich mit den Pfeiltasten.

    1. Befehl 1 einfügen, Enter. Der Editor öffnet sich.
    2. Steht schon Text drin: mehrmals Strg + K drücken, bis alles gelöscht ist.
    3. Den Text 2 kopieren und im Editor einfügen.
    4. Mit den Pfeiltasten zu DEIN NAME gehen, die zwei Wörter löschen und deinen Namen eintippen.
    5. Speichern: Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)
    6. Schick in Telegram /new, damit Jarvis die neue Datei lädt. Erst dann kennt er sie.
    1-oeffnen.sh
    nano ~/.hermes/SOUL.md
    2-SOUL.md
    Du bist Jarvis, der persönliche Assistent von DEIN NAME.
    
    Ton: direkt, knapp und freundlich. Auf Deutsch, per Du.
    Keine Floskeln, keine Entschuldigungen und keine Fragen,
    deren Antwort du selbst herausfinden kannst.
    
    Arbeitsweise: Erst das Wichtige, dann die Details. Namen, Zahlen
    und Uhrzeiten immer genau. Wenn du etwas nicht weißt, sag es in
    einem Satz und mach einen Vorschlag.
    
    Ergebnisse: kurze Listen, nie länger als ein Handybildschirm.
    Quellen immer als Link.
    
    Grenzen: Du schickst keine Mails oder Nachrichten an andere,
    sagst keine Termine ab, bewegst kein Geld und löschst nichts,
    ohne dass ich es vorher ausdrücklich freigebe.

    Geklappt, wenn: du schickst /new, schreibst deinem Bot „Wer bist du und was darfst du nicht?“ und er antwortet als Jarvis mit deinen Grenzen.

  24. Telegram-Chat mit deinem Bot · 20 Min

    Das Kennenlern-Interview

    Das ist der Teil, der aus einem Chatbot deinen Assistenten macht. Jarvis stellt dir Frage für Frage und speichert am Ende alles in seinem Gedächtnis.

    1. Den Text kopieren und deinem Bot in Telegram als Nachricht schicken.
    2. Beantworte jede Frage. Am schnellsten geht es per Sprachnachricht (die erste dauert länger, siehe Tipp). Tippen geht genauso.
    3. Am Ende zeigt Jarvis dir eine Liste, was er gespeichert hat (MEMORY.md für Fakten, USER.md für dich als Person). Lies sie durch.
    4. Schick danach /new. Jarvis lädt sein Gedächtnis beim Start eines Gesprächs, erst dann sieht er das Gespeicherte.
    nachricht-kennenlernen.txt
    Bevor du irgendetwas für mich erledigst, lernst du mich kennen.
    
    Interview mich. Stell mir immer nur EINE Frage und warte auf meine Antwort. Wenn eine Antwort zu vage ist, frag nach. Geh diese Themen durch:
    1. Was ich beruflich mache, für wen und womit ich Geld verdiene
    2. Welche Projekte gerade laufen, mit Stand und nächstem Schritt
    3. Welche Tools ich jeden Tag benutze (Mail, Kalender, Ablage, Buchhaltung, Chat)
    4. Was ich täglich, wöchentlich und monatlich immer wieder mache
    5. Wie Ergebnisse aussehen sollen (Länge, Ton, Liste oder Text)
    6. Was du nie ohne Rückfrage tun darfst
    7. Welche Menschen und Firmen ständig vorkommen, je mit einem Satz Kontext
    
    Wenn wir durch sind:
    - Speichere Fakten zu meiner Arbeit in deinem Memory und mich als Person in deinem User-Profil. Halte die Grenzen ein: Memory 2.200 Zeichen, Profil 1.375 Zeichen. Lieber knapp als vollständig.
    - Zeig mir als Liste, was du gespeichert hast, damit ich es prüfen kann.
    - Schlag mir zwei Aufgaben vor, die du ab morgen regelmäßig übernehmen könntest, und sag mir, was du dafür noch brauchst.
    
    Fang jetzt mit Frage 1 an.

    Geklappt, wenn: auf „Was hast du über mich gespeichert?“ kommt eine Liste, die dich wirklich beschreibt. Stimmt etwas nicht, schreib „Korrigier: …“.

    Falls es hakt: Die erste Sprachnachricht kann dauern: Jarvis richtet dafür die lokale Spracherkennung (faster-whisper) ein und lädt ein Modell, auf dem kleinen Server gern mehrere Minuten. Kommt danach noch keine Antwort, schreib ihm: „Richte die lokale Spracherkennung mit faster-whisper ein und stell die Sprache auf Deutsch.“

  25. Teil 6 · Gmail, Kalender und Drive
  26. console.cloud.google.com · 10 Min

    Google-Projekt anlegen und Dienste freischalten

    Das ist der fummeligste Teil der Anleitung, aber du machst ihn nur einmal. Google bietet offizielle Schnittstellen, über die Jarvis deine Mails, Termine und Dateien lesen darf. Dafür brauchst du ein kostenloses „Projekt“ in der Google Cloud. Mach das am besten am Laptop.

    1. console.cloud.google.com öffnen und mit dem Google-Konto anmelden, dessen Mails Jarvis lesen soll. Nutzungsbedingungen bestätigen.
    2. Oben links auf die Projektauswahl klicken → „Neues Projekt“, Name Jarvis, erstellen. Danach oben sicherstellen, dass „Jarvis“ ausgewählt ist.
    3. Auf der Projektseite die Projekt-ID notieren (z. B. jarvis-471234).
    4. Oben rechts auf das Symbol >_ klicken („Cloud Shell aktivieren“). Unten öffnet sich ein Terminal im Browser.
    5. Befehl kopieren, DEINE-PROJEKT-ID am Ende durch deine Projekt-ID ersetzen, in die Cloud Shell einfügen, Enter. Fragt Google nach, auf „Autorisieren“ klicken.
    cloud-shell.sh
    gcloud services enable gmail.googleapis.com calendar-json.googleapis.com drive.googleapis.com sheets.googleapis.com docs.googleapis.com people.googleapis.com --project=DEINE-PROJEKT-ID

    Geklappt, wenn: die Cloud Shell meldet „Operation … finished successfully“.

  27. Google Cloud Console · 5 MinMenü ☰ → APIs & Dienste → Google Auth Platform

    Zustimmungsbildschirm einrichten

    Wenn Jarvis zum ersten Mal auf deine Mails zugreifen will, fragt Google dich: „Darf die App Jarvis das?“ Diesen Fragebildschirm richtest du jetzt ein. Nur du wirst ihn je sehen.

    1. Auf „Jetzt starten“ (bzw. „Branding“) klicken. App-Name Jarvis, deine Mailadresse als Support-Adresse, weiter.
    2. Bei Zielgruppe „Extern“ wählen (bei einem normalen Gmail-Konto die einzige Option), weiter.
    3. Kontaktadresse eintragen, den Bedingungen zustimmen, „Erstellen“.
    4. Links auf „Zielgruppe“ → bei „Testnutzer“ auf „+ Nutzer hinzufügen“ und deine eigene Gmail-Adresse eintragen, speichern.

    Geklappt, wenn: unter „Zielgruppe“ steht deine Adresse als Testnutzer.

  28. Google Cloud Console · 5 MinGoogle Auth Platform → Clients → Client erstellen

    Zugangsschlüssel für Jarvis erstellen

    Jetzt bekommt Jarvis eine eigene Zugangsdatei. Darin stehen „Client-ID“ und „Secret“, mit denen er sich bei Google ausweist. Wichtig: Du lädst die Datei gleich beim Erstellen herunter, später geht das nicht mehr.

    1. Links auf „Clients“ → „+ Client erstellen“.
    2. Anwendungstyp: „Desktop-App“ (nicht „Webanwendung“). Name: Jarvis. Eine Weiterleitungs-URI musst du hier nicht eintragen.
    3. „Erstellen“. Es öffnet sich ein Fenster „OAuth-Client erstellt“.
    4. Dort auf „JSON herunterladen“ klicken. Die Datei client_secret_….json landet in deinem Download-Ordner. Behandle sie wie ein Passwort.

    Geklappt, wenn: im Download-Ordner liegt eine Datei client_secret_….json.

    Falls es hakt: Fenster aus Versehen zugemacht, ohne die Datei zu laden? Beim Client auf „Neuen Schlüssel hinzufügen“ bzw. einen neuen Client erstellen und es noch einmal machen.

  29. Server, als jarvis · 10 Min

    Zugangsdatei auf den Server bringen

    Jarvis nutzt für Google den fertigen Skill google-workspace, den Hermes schon mitbringt. Du gibst ihm die Zugangsdatei und legst zwei Abkürzungen an, damit der Skill in Hermes’ eigener Python-Umgebung läuft. Die Datei bekommt er nicht über Telegram, sondern direkt auf dem Server, damit das Secret nicht im Chat landet.

    1. Prüf zuerst: Die Eingabezeile im Terminal beginnt mit jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.
    2. Am Laptop die heruntergeladene Datei client_secret_….json mit einem Texteditor öffnen, alles markieren (Strg + A, am Mac Cmd + A) und kopieren.
    3. Befehl 1 einfügen, Enter. Der Editor öffnet eine leere Datei. Den kopierten Text einfügen, speichern mit Strg + O, Enter, schließen mit Strg + X. (Auch am Mac Strg, nicht Cmd.)
    4. Befehl 2 einfügen, Enter. Er legt die Abkürzungen google-setup und google-api an. Keine Ausgabe ist richtig.
    5. Befehl 3 einfügen, Enter. Er stellt Hermes’ Google-Bausteine bereit. Das kann ein paar Minuten dauern. Danach startet Jarvis neu.
    6. Befehl 4 einfügen, Enter. Er legt die Zugangsdatei bei Jarvis ab und löscht die Kopie wieder.
    1-datei-anlegen.sh
    nano ~/client_secret.json
    2-abkuerzungen.sh
    mkdir -p ~/.local/bin
    printf '#!/bin/sh\nexec hermes --run-module cProfile -o /dev/null "$HOME/.hermes/skills/productivity/google-workspace/scripts/setup.py" "$@"\n' > ~/.local/bin/google-setup
    printf '#!/bin/sh\nexec hermes --run-module cProfile -o /dev/null "$HOME/.hermes/skills/productivity/google-workspace/scripts/google_api.py" "$@"\n' > ~/.local/bin/google-api
    chmod +x ~/.local/bin/google-setup ~/.local/bin/google-api
    3-bausteine.sh
    google-setup --install-deps && hermes gateway restart
    4-ablegen.sh
    google-setup --client-secret ~/client_secret.json && rm ~/client_secret.json && chmod 600 ~/.hermes/google_client_secret.json

    Geklappt, wenn: Befehl 4 meldet „OK: Client secret saved to …“.

    Falls es hakt: Meldung „Run this script in the Hermes environment“ oder „unrecognized arguments“? Dann schreib Jarvis in Telegram: „Führ den Google-Setup aus dem Skill google-workspace mit der Python-Umgebung von Hermes aus und sag mir, welchen Befehl du genommen hast.“ „No such file“ beim Skript? Dann fehlt der Skill: hermes skills reset google-workspace --restore --yes eingeben und Befehl 2 wiederholen.

  30. Server und Browser am Laptop · 10 Min

    Bei Google anmelden

    Jetzt erlaubst du Jarvis den Zugriff, einmal für alle Dienste. Am Ende landet dein Browser auf einer Fehlerseite. Das ist richtig so: Du kopierst deren Adresse zurück ins Terminal.

    1. Befehl 1 einfügen, Enter. Das Terminal zeigt einen langen Link.
    2. Den Link markieren, kopieren und im Browser auf dem Laptop öffnen.
    3. Dein Google-Konto wählen. Google warnt, dass die App nicht überprüft ist: auf „Erweitert“ → „Zu Jarvis wechseln“ klicken.
    4. Alle Häkchen setzen und zustimmen. Fehlt eins, fehlen Jarvis später Rechte.
    5. Der Browser zeigt „Diese Website ist nicht erreichbar“ (Adresse beginnt mit http://localhost:1/?state=…). Kopier die komplette Adresse aus der Adresszeile.
    6. Im Terminal Befehl 2 einfügen, aber HIER-DIE-GANZE-ADRESSE durch die kopierte Adresse ersetzen. Die Anführungszeichen drum herum bleiben. Enter. Mach das zügig, der Code läuft nach kurzer Zeit ab.
    1-link-holen.sh
    google-setup --auth-url
    2-adresse-einfuegen.sh
    google-setup --auth-code "HIER-DIE-GANZE-ADRESSE"

    Geklappt, wenn: das Terminal meldet „OK: Authenticated. Token saved to …“.

    Falls es hakt: Google zeigt „Zugriff blockiert“ oder „Error 403: access_denied“? Dann fehlt deine Adresse als Testnutzer: Schritt 21 wiederholen. „Token exchange failed“ oder „state mismatch“? Befehl 1 neu ausführen und nur den neuesten Link verwenden.

  31. Server, dann Telegram · 5 Min

    Verbindung prüfen und Jarvis einweisen

    Erst prüfst du am Terminal, ob das Google-Token gültig ist, dann sagst du Jarvis in Telegram, wie er den Skill startet, und lässt ihn einmal echte Daten holen. Einen Neustart brauchst du dafür nicht.

    1. Befehl 1 einfügen, Enter.
    2. Befehl 2 einfügen, Enter. Er ruft wirklich bei Google an und prüft damit auch, ob die Dienste freigeschaltet sind.
    3. In Telegram die Nachricht aus Text 3 an deinen Bot schicken und die Antwort lesen.
    1-pruefen.sh
    google-setup --check
    2-live-pruefen.sh
    google-setup --check-live
    3-nachricht-google-einweisen.txt
    Merk dir: Für Gmail, Kalender und Drive nutzt du den Skill google-workspace. Seine Skripte starte ich nur über die Abkürzungen google-setup (für setup.py) und google-api (für google_api.py), zum Beispiel google-api calendar list. Teste es jetzt: Zeig mir meine Termine der nächsten zwei Tage und die Betreffzeilen meiner letzten drei ungelesenen Mails. Schick nichts und lösch nichts, ohne vorher zu fragen.

    Geklappt, wenn: Befehl 1 meldet „AUTHENTICATED“, Befehl 2 „LIVE_CHECK_OK“, und Jarvis nennt deine echten Termine und Mails.

    Falls es hakt: „AUTHENTICATED (partial)“ oder „HttpError 403“? Dann fehlt ein Häkchen oder eine freigeschaltete Schnittstelle: google-setup --revoke eingeben, bei Bedarf Schritt 20 prüfen, dann Schritt 24 wiederholen. Nach einer Woche „REFRESH_FAILED“ oder „TOKEN_REVOKED“, oder das Briefing hat keine Mails mehr? Solange die App bei Google im Status „Testen“ ist, läuft die Anmeldung nach 7 Tagen ab. Dann Schritt 24 wiederholen oder in der Cloud Console unter „Zielgruppe“ die App auf „In Produktion“ stellen. Der Skill ist so gebaut, dass er vor Senden, Löschen und Teilen nachfragen soll. Verlass dich darauf nicht blind.

  32. Teil 7 · Automationen
  33. Telegram-Chat mit deinem Bot · 15 MinDrei Nachrichten nacheinander

    Morgenbriefing: testen, speichern, planen

    Die Reihenfolge ist der Trick: erst von Hand testen, dann als Skill speichern, dann einplanen. Ein Skill ist eine feste Anleitung, die Jarvis jedes Mal gleich befolgt. Weil du den Zeitplan im Telegram-Chat anlegst, kommt das Ergebnis auch dort an.

    1. Nachricht 1 kopieren, deinem Bot schicken und das Ergebnis lesen.
    2. Passt etwas nicht, sag es in normalen Worten („kürzer“, „Newsletter ignorieren“, „Termine zuerst“) und lass es neu machen, bis es sitzt.
    3. Sitzt es: Nachricht 2 schicken (speichert den Skill) und Jarvis’ Antwort abwarten.
    4. Dann Nachricht 3 schicken (legt den Zeitplan an).
    nachricht-1-testen.txt
    Erstell mein Morgenbriefing.
    
    1. MAILS: Lies die Mails der letzten 24 Stunden und sortier sie in drei Gruppen: braucht heute eine Antwort, nur zur Kenntnis, kann weg. Für die erste Gruppe je eine Zeile: von wem, worum es geht, bis wann.
    2. TERMINE: heute und morgen, mit Uhrzeit, Titel und Teilnehmern. Markier, wo ich mich vorbereiten muss.
    3. TOP 3: die drei wichtigsten Dinge für heute, jeweils mit einem Satz warum.
    4. FREI: freie Zeitblöcke ab 90 Minuten.
    
    Überschrift mit Datum, dann die vier Punkte als kurze Listen, höchstens 25 Zeilen. Keine Einleitung. Beantworte keine Mail und schick nichts nach außen. Nutz für Mails und Kalender den Skill google-workspace (Abkürzung google-api). Wenn dir der Zugriff auf Mails oder Kalender fehlt, lass den Punkt nicht weg, sondern schreib dazu, was fehlt.
    nachricht-2-skill.txt
    Mach aus diesem Ablauf einen Skill namens morgenbriefing.
    nachricht-3-zeitplan.txt
    Richte eine Automation namens morgenbriefing ein: Jeden Tag um 7:00 Uhr (Europe/Berlin) führst du den Skill morgenbriefing aus und schickst mir das Ergebnis hier auf Telegram.

    Geklappt, wenn: auf „Welche Automationen laufen?“ nennt Jarvis „morgenbriefing“ mit der nächsten Ausführung morgen um 07:00.

  34. Server, dann Telegram · 10 Min

    Wochenrecherche einschalten

    Jarvis sucht jeden Montag Neues zu deinem Thema und legt die ganze Recherche als Datei ab. Die Websuche bringt Hermes schon mit, sie läuft ohne eigenen Schlüssel über kostenlose Suchdienste.

    1. Prüf zuerst: Die Eingabezeile im Terminal beginnt mit jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.
    2. Befehl 1 einfügen, Enter. Er legt den Ordner für die Recherche-Dateien an.
    3. Text 2 kopieren und DEIN THEMA durch dein Thema ersetzen.
    4. Den Text deinem Bot in Telegram schicken. Der erste Lauf startet sofort als Test.
    1-server.sh
    mkdir -p ~/jarvis/recherchen
    2-nachricht-wochenrecherche.txt
    Richte eine zweite Automation namens wochenrecherche ein: Jeden Montag um 8:00 Uhr (Europe/Berlin) recherchierst du zum Thema "DEIN THEMA".
    
    So gehst du vor:
    1. Such mindestens 6 aktuelle, verlässliche Quellen. Primärquellen (Behörden, Hersteller, Originalstudien) vor Blogs.
    2. Prüf jede Quelle auf Datum und Glaubwürdigkeit. Verwirf, was älter als 7 Tage ist oder unseriös wirkt.
    3. Schick mir hier auf Telegram 5 Kernaussagen, jede mit Link zur Quelle, und einen Absatz "Was das für mich bedeutet", bezogen auf mein Business.
    4. Speichere die komplette Recherche als Datei unter ~/jarvis/recherchen/ mit Datum und Thema im Dateinamen.
    
    Kein Satz ohne Quelle. Widersprechen sich Quellen, sag es. Wenn dir die Websuche fehlt, sag mir das, statt zu raten.
    
    Mach den ersten Lauf zum Test sofort.

    Geklappt, wenn: der Testlauf schickt dir fünf Kernaussagen mit Links und nennt einen Dateipfad unter ~/jarvis/recherchen/.

    Falls es hakt: Jarvis sagt, die Suche sei blockiert oder ausgelastet? Auf dem Server hermes tools eingeben, unter „Web“ Tavily auswählen. Das geht auch ohne eigenen Schlüssel.

  35. Teil 8 · Langzeitgedächtnis mit Vektordatenbank
  36. Erst lesen · 3 Min

    Wozu eine Vektordatenbank?

    Das eingebaute Gedächtnis (MEMORY.md und USER.md) ist wie ein Zettel am Kühlschrank: Jarvis hat ihn immer im Blick, aber er ist nach rund 3.500 Zeichen voll. Für alles darüber hinaus (Absprachen mit Kunden, Notizen, Protokolle, Wissen aus Dokumenten) bekommt Jarvis jetzt einen Aktenschrank mit einer besonderen Suchfunktion: Er findet Einträge nach Bedeutung, nicht nach genauen Wörtern. Fragst du „Wann mache ich meine Abrechnung?“, findet er „Rechnungen schreibe ich freitags“, obwohl kein einziges Wort gleich ist.

    1. Voyage AI verwandelt jeden Text in eine lange Zahlenreihe (einen „Vektor“). Texte mit ähnlicher Bedeutung bekommen ähnliche Zahlen.
    2. Supabase ist die Datenbank, in der Text und Vektor zusammen liegen. Die Erweiterung pgvector kann darin nach ähnlichen Zahlenreihen suchen.
    3. Ein kleines Skript auf deinem Server verbindet beides, und ein Skill sagt Jarvis, wann er es benutzen soll.
    4. Kosten: Supabase ist im kostenlosen Tarif gratis, Voyage schenkt dir 200 Millionen Tokens. Das reicht für Jahre an Notizen.
  37. supabase.com · 10 MinStart your project → New project

    Supabase-Projekt anlegen

    Leg für Jarvis ein eigenes, neues Projekt an, nicht eins, in dem schon andere Daten liegen. Der Schlüssel, den Jarvis bekommt, darf in diesem Projekt alles.

    1. Auf supabase.com auf „Start your project“ klicken und mit GitHub oder deiner Mailadresse registrieren.
    2. „New project“: Name jarvis-gedaechtnis, bei „Database Password“ auf „Generate a password“ klicken und das Passwort notieren.
    3. Region: „Central EU (Frankfurt)“, damit deine Daten in Deutschland liegen. Tarif „Free“, dann „Create new project“. Das Einrichten dauert ein, zwei Minuten.
    4. Adresse notieren: Auf der Projektseite oben auf „Connect“ klicken (oder „Project Settings“ → „Data API“). Die Project URL sieht aus wie https://abcdefgh.supabase.co.
    5. Schlüssel notieren: „Project Settings“ → „API Keys“ → bei „Secret keys“ den Schlüssel anzeigen und kopieren. Er beginnt mit sb_secret_. Behandle ihn wie ein Passwort.

    Geklappt, wenn: du hast eine Adresse https://….supabase.co und einen Schlüssel sb_secret_… notiert.

    Falls es hakt: Du findest nur Schlüssel, die mit eyJ beginnen? Das ist die ältere Form. Nimm dann den „service_role“-Schlüssel, das Skript kann beide. Gut zu wissen: Im Free-Tarif pausiert Supabase das Projekt nach etwa einer Woche ohne Zugriff und legt keine Backups an. Wie du es wach hältst, steht in Schritt 35. Für Daten, die du nicht verlieren willst, ist der Pro-Tarif die sichere Wahl.

  38. Supabase · 5 MinLinke Leiste → SQL Editor → New query

    Gedächtnis-Tabelle anlegen

    Mit diesem Text legst du in einem Rutsch alles an, was das Gedächtnis braucht: die Erweiterung für Vektoren, die Tabelle, einen Index für schnelles Suchen, die Sperre gegen fremden Zugriff und die Suchfunktion. Du musst den Text nicht verstehen, nur einfügen.

    1. Links auf das Symbol „SQL Editor“ klicken, dann „+ New query“ bzw. „New SQL snippet“.
    2. Den ganzen SQL-Text aus dem Kasten kopieren (Kopier-Button), einfügen und unten rechts auf „Run“ klicken (oder Strg/Cmd + Enter).
    3. Fragt Supabase nach, ob du wirklich ausführen willst, bestätigen.
    gedaechtnis.sql
    -- Jarvis-Langzeitgedächtnis: einmal komplett im Supabase SQL Editor ausführen.
    
    -- 1. Vektor-Erweiterung einschalten
    create extension if not exists vector with schema extensions;
    
    -- 2. Die Tabelle: ein Eintrag = ein Stück Wissen plus sein Vektor
    create table if not exists public.jarvis_gedaechtnis (
      id          bigint generated always as identity primary key,
      inhalt      text not null,
      quelle      text,
      erstellt_am timestamptz not null default now(),
      embedding   extensions.vector(1024) not null
    );
    
    -- 3. Index, damit die Suche auch bei vielen Einträgen schnell bleibt
    create index if not exists jarvis_gedaechtnis_embedding_idx
      on public.jarvis_gedaechtnis
      using hnsw (embedding extensions.vector_cosine_ops);
    
    -- 4. Abschließen: ohne Regeln kommt über die öffentlichen Schlüssel niemand ran.
    --    Nur dein geheimer Schlüssel (Secret Key) auf dem Server darf lesen und schreiben.
    alter table public.jarvis_gedaechtnis enable row level security;
    
    -- 5. Die Suchfunktion: liefert die Einträge, die der Frage inhaltlich am nächsten sind
    create or replace function public.jarvis_suchen(frage extensions.vector(1024), anzahl int default 5)
    returns table (id bigint, inhalt text, quelle text, erstellt_am timestamptz, aehnlichkeit float)
    language sql stable
    set search_path = public, extensions
    as $$
      select g.id, g.inhalt, g.quelle, g.erstellt_am,
             1 - (g.embedding <=> frage) as aehnlichkeit
      from public.jarvis_gedaechtnis g
      order by g.embedding <=> frage
      limit anzahl;
    $$;
    
    revoke execute on function public.jarvis_suchen(extensions.vector, int) from public, anon, authenticated;
    grant execute on function public.jarvis_suchen(extensions.vector, int) to service_role;

    Geklappt, wenn: unten steht „Success. No rows returned“ und links unter „Table Editor“ erscheint die Tabelle jarvis_gedaechtnis.

  39. dashboard.voyageai.com · 5 Min

    Voyage-Schlüssel holen

    Voyage AI gehört zu MongoDB und macht einige der besten Text-Vektoren, auch für Deutsch. Hol dir den Schlüssel direkt bei Voyage, nicht über MongoDB Atlas: Ein Atlas-Schlüssel funktioniert nur an einer anderen Adresse und scheitert sonst mit „401“.

    1. Auf dashboard.voyageai.com registrieren.
    2. Links „API Keys“ → „Create new secret key“, Name jarvis. Schlüssel sofort kopieren, er beginnt mit pa-.
    3. Wichtig: unter „Billing“ ein Zahlungsmittel hinterlegen. Die 200 Millionen Gratis-Tokens bleiben trotzdem gratis. Ohne Zahlungsmittel drosselt Voyage die Anfragen stark, dann wartet Jarvis ständig.

    Geklappt, wenn: du hast einen Schlüssel pa-… notiert und unter „Billing“ steht ein Zahlungsmittel.

  40. Server, als jarvis · 5 Min

    Schlüsseldatei für das Gedächtnis anlegen

    Die drei Angaben aus Schritt 29 und 31 kommen in eine eigene Datei, die nur du lesen darfst. Das Gedächtnis-Skript holt sie sich später von dort.

    1. Prüf zuerst: Die Eingabezeile im Terminal beginnt mit jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.
    2. Befehl 1 einfügen, Enter. Er legt den Ordner ~/jarvis an.
    3. Befehl 2 einfügen, Enter. Ein leerer Editor öffnet sich.
    4. Text 3 kopieren und die drei Platzhalter ersetzen: pa-DEIN-VOYAGE-SCHLUESSEL durch deinen Voyage-Schlüssel, https://DEIN-PROJEKT.supabase.co durch deine Project URL, sb_secret_DEIN-SUPABASE-SCHLUESSEL durch deinen Supabase-Schlüssel. Am einfachsten machst du das in einer Notiz und fügst dann den fertigen Text im Editor ein.
    5. Speichern: Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)
    6. Befehl 4 einfügen, Enter. Jetzt darf nur noch jarvis die Datei lesen.
    1-ordner.sh
    mkdir -p ~/jarvis
    2-oeffnen.sh
    nano ~/jarvis/gedaechtnis.env
    3-gedaechtnis.env
    VOYAGE_API_KEY=pa-DEIN-VOYAGE-SCHLUESSEL
    SUPABASE_URL=https://DEIN-PROJEKT.supabase.co
    SUPABASE_SECRET_KEY=sb_secret_DEIN-SUPABASE-SCHLUESSEL
    4-abschliessen.sh
    chmod 600 ~/jarvis/gedaechtnis.env

    Geklappt, wenn: Befehl 4 läuft ohne Meldung durch. Ob die Schlüssel stimmen, zeigt der Test in Schritt 33.

  41. Server, als jarvis · 10 Min

    Gedächtnis-Skript anlegen und testen

    Das Skript ist das Bindeglied: Es schickt Texte an Voyage, legt Text und Vektor in Supabase ab und sucht dort. Es braucht nur Python, das auf dem Server schon installiert ist.

    1. Befehl 1 einfügen, Enter. Ein leerer Editor öffnet sich.
    2. Das ganze Skript 2 mit dem Kopier-Button kopieren und einfügen. Nichts daran ändern.
    3. Speichern: Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)
    4. Test: Befehl 3 einfügen, Enter. Jarvis merkt sich einen Beispielsatz.
    5. Befehl 4 einfügen, Enter. Er sucht mit ganz anderen Wörtern danach.
    6. Befehl 5 einfügen, Enter. Er zeigt die letzten 20 Einträge.
    1-oeffnen.sh
    nano ~/jarvis/gedaechtnis.py
    2-gedaechtnis.py
    #!/usr/bin/env python3
    """Jarvis-Langzeitgedächtnis: Texte mit Voyage AI in Vektoren verwandeln,
    in Supabase (pgvector) ablegen und nach Bedeutung wiederfinden.
    
      python3 ~/jarvis/gedaechtnis.py merken "Text" [--quelle telegram]
      python3 ~/jarvis/gedaechtnis.py datei ~/pfad/zur/datei.md
      python3 ~/jarvis/gedaechtnis.py suchen "Frage" [--anzahl 5]
      python3 ~/jarvis/gedaechtnis.py liste
      python3 ~/jarvis/gedaechtnis.py vergessen 42
    """
    import json
    import os
    import sys
    import time
    import urllib.error
    import urllib.request
    
    KONFIG = os.path.expanduser("~/jarvis/gedaechtnis.env")
    MODELL = "voyage-4-lite"        # 1024 Dimensionen, passt zur Tabelle
    SCHON_BEKANNT = 0.95            # ab dieser Ähnlichkeit gilt ein Text als Dublette
    STUECK = 1500                   # Zeichen pro Abschnitt beim Einlesen von Dateien
    
    
    def konfig():
        werte = {}
        if os.path.exists(KONFIG):
            for zeile in open(KONFIG, encoding="utf-8"):
                zeile = zeile.strip()
                if zeile and not zeile.startswith("#") and "=" in zeile:
                    k, v = zeile.split("=", 1)
                    werte[k.strip()] = v.strip().strip('"')
        for k in ("VOYAGE_API_KEY", "SUPABASE_URL", "SUPABASE_SECRET_KEY"):
            if not werte.get(k):
                sys.exit("Fehlt in %s: %s" % (KONFIG, k))
        return werte
    
    
    def anfrage(url, daten, kopf, methode="POST"):
        body = None if daten is None else json.dumps(daten).encode("utf-8")
        for versuch in range(4):
            req = urllib.request.Request(url, data=body, method=methode, headers=kopf)
            try:
                with urllib.request.urlopen(req, timeout=60) as r:
                    text = r.read().decode("utf-8")
                    return json.loads(text) if text else None
            except urllib.error.HTTPError as e:
                # 429 = zu viele Anfragen. Ohne Zahlungsmittel erlaubt Voyage nur 3 pro Minute.
                if e.code == 429 and versuch < 3:
                    print("Voyage bremst (429), warte 25 Sekunden ...", file=sys.stderr)
                    time.sleep(25)
                    continue
                sys.exit("Fehler %s bei %s: %s" % (e.code, url.split("?")[0], e.read().decode("utf-8")[:300]))
    
    
    def vektoren(k, texte, art):
        """art = document (zum Speichern) oder query (zum Suchen)"""
        basis = k.get("VOYAGE_BASE_URL", "https://api.voyageai.com/v1").rstrip("/")
        ergebnis = []
        for i in range(0, len(texte), 64):
            antwort = anfrage(basis + "/embeddings",
                              {"input": texte[i:i + 64], "model": MODELL, "input_type": art},
                              {"Authorization": "Bearer " + k["VOYAGE_API_KEY"],
                               "Content-Type": "application/json"})
            ergebnis += [d["embedding"] for d in sorted(antwort["data"], key=lambda d: d["index"])]
        return ergebnis
    
    
    def db(k, pfad, daten=None, methode="POST", extra=None):
        kopf = {"apikey": k["SUPABASE_SECRET_KEY"], "Content-Type": "application/json"}
        kopf.update(extra or {})
        return anfrage(k["SUPABASE_URL"].rstrip("/") + "/rest/v1/" + pfad, daten, kopf, methode)
    
    
    def suchen(k, frage, anzahl=5):
        v = vektoren(k, [frage], "query")[0]
        return db(k, "rpc/jarvis_suchen", {"frage": v, "anzahl": anzahl})
    
    
    def speichern(k, texte, quelle):
        neu = 0
        for text, v in zip(texte, vektoren(k, texte, "document")):
            treffer = db(k, "rpc/jarvis_suchen", {"frage": v, "anzahl": 1})
            if treffer and treffer[0]["aehnlichkeit"] >= SCHON_BEKANNT:
                print("Schon bekannt (#%s): %s" % (treffer[0]["id"], treffer[0]["inhalt"][:80]))
                continue
            db(k, "jarvis_gedaechtnis", {"inhalt": text, "quelle": quelle, "embedding": v},
               extra={"Prefer": "return=minimal"})
            neu += 1
        print("Gespeichert: %d neue(r) Eintrag/Einträge." % neu)
    
    
    def abschnitte(text):
        teile, aktuell = [], ""
        for absatz in [a.strip() for a in text.split("\n\n") if a.strip()]:
            while len(absatz) > STUECK:
                teile.append(absatz[:STUECK])
                absatz = absatz[STUECK:]
            if len(aktuell) + len(absatz) + 2 > STUECK and aktuell:
                teile.append(aktuell)
                aktuell = ""
            aktuell = (aktuell + "\n\n" + absatz).strip()
        if aktuell:
            teile.append(aktuell)
        return teile
    
    
    def option(args, name, standard):
        if name in args:
            i = args.index(name)
            wert = args[i + 1]
            del args[i:i + 2]
            return wert
        return standard
    
    
    def main():
        args = sys.argv[1:]
        if not args:
            sys.exit(__doc__)
        befehl = args.pop(0)
        k = konfig()
        if befehl == "merken":
            quelle = option(args, "--quelle", "telegram")
            speichern(k, [" ".join(args).strip()], quelle)
        elif befehl == "datei":
            pfad = os.path.expanduser(args[0])
            teile = abschnitte(open(pfad, encoding="utf-8").read())
            speichern(k, teile, os.path.basename(pfad))
        elif befehl == "suchen":
            anzahl = int(option(args, "--anzahl", "5"))
            for t in suchen(k, " ".join(args), anzahl):
                print("#%s  %.2f  [%s, %s]\n%s\n" % (t["id"], t["aehnlichkeit"], t["quelle"],
                                                     t["erstellt_am"][:10], t["inhalt"]))
        elif befehl == "liste":
            for t in db(k, "jarvis_gedaechtnis?select=id,inhalt,quelle,erstellt_am"
                           "&order=erstellt_am.desc&limit=20", None, "GET"):
                print("#%s  [%s]  %s" % (t["id"], t["erstellt_am"][:10], t["inhalt"].replace("\n", " ")[:100]))
        elif befehl == "vergessen":
            db(k, "jarvis_gedaechtnis?id=eq.%d" % int(args[0]), None, "DELETE")
            print("Eintrag #%s gelöscht." % args[0])
        else:
            sys.exit(__doc__)
    
    
    if __name__ == "__main__":
        main()
    3-merken.sh
    python3 ~/jarvis/gedaechtnis.py merken "Rechnungen schreibe ich immer freitags."
    4-suchen.sh
    python3 ~/jarvis/gedaechtnis.py suchen "Wann mache ich meine Abrechnung?"
    5-liste.sh
    python3 ~/jarvis/gedaechtnis.py liste

    Geklappt, wenn: die Suche zeigt „Rechnungen schreibe ich immer freitags.“ mit einer Nummer und einer Ähnlichkeit wie 0.65, obwohl in der Frage ganz andere Wörter stehen.

    Falls es hakt: „Voyage bremst (429)“: Das Skript wartet selbst und versucht es erneut. Kommt das ständig, fehlt bei Voyage das Zahlungsmittel. „Fehler 401“ heißt: Schlüssel in Schritt 32 falsch kopiert. „Fehler 404“ bei jarvis_suchen heißt: Der SQL-Text aus Schritt 30 ist nicht durchgelaufen.

  42. Server, als jarvis · 5 Min

    Jarvis das Gedächtnis beibringen

    Jetzt bekommt Jarvis einen Skill, der ihm sagt, wann er speichern und wann er nachschlagen soll. Wichtigster Satz darin: Bevor er Fragen zu Kunden, Projekten oder Absprachen beantwortet, sucht er erst im Gedächtnis.

    1. Befehl 1 einfügen, Enter. Er legt den Ordner für den Skill an.
    2. Befehl 2 einfügen, Enter. Du wechselst in diesen Ordner.
    3. Befehl 3 einfügen, Enter. Ein leerer Editor öffnet sich.
    4. Text 4 kopieren und einfügen. Speichern: Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)
    5. Befehl 5 einfügen, Enter. Du bist zurück in deinem Hauptordner.
    6. Befehl 6 einfügen, Enter. Jarvis startet neu und kennt jetzt den Skill.
    1-ordner.sh
    mkdir -p ~/.hermes/skills/langzeitgedaechtnis
    2-wechseln.sh
    cd ~/.hermes/skills/langzeitgedaechtnis
    3-oeffnen.sh
    nano SKILL.md
    4-SKILL.md
    ---
    name: langzeitgedaechtnis
    description: Dauerhaftes Gedächtnis in der Vektordatenbank. Speichert Wissen und findet es nach Bedeutung wieder.
    ---
    
    # Langzeitgedächtnis
    
    ## Wann benutzen
    - Ich sage "Speicher dauerhaft: ..." oder "Merk dir für immer: ..." -> merken.
    - Ich schicke dir eine Notiz oder Datei, die du behalten sollst -> datei.
    - Bevor du eine Frage zu Kunden, Projekten, Absprachen, Vorlieben oder
      früheren Gesprächen beantwortest -> erst suchen, dann antworten.
    - Taucht im Gespräch eine wichtige Absprache oder Entscheidung auf, frag:
      "Soll ich mir das dauerhaft merken?" und speichere erst nach meinem Ja.
    
    ## Befehle (im Terminal ausführen)
    python3 ~/jarvis/gedaechtnis.py merken "TEXT" --quelle telegram
    python3 ~/jarvis/gedaechtnis.py datei PFAD
    python3 ~/jarvis/gedaechtnis.py suchen "FRAGE" --anzahl 5
    python3 ~/jarvis/gedaechtnis.py liste
    python3 ~/jarvis/gedaechtnis.py vergessen NUMMER
    
    ## Regeln
    - Speichere kurze, eigenständige Sätze: wer, was, wann. Nicht "er will das
      so", sondern "Herr Biermann möchte Angebote immer als PDF".
    - Nie speichern: Passwörter, Kontonummern, Gesundheitsdaten.
    - Prüf, ob die Suchtreffer wirklich zur Frage passen. Passt keiner, sag
      ehrlich, dass du nichts gefunden hast, statt zu raten.
    - Nenn bei Antworten aus dem Gedächtnis die Eintragsnummer (#12).
    - "vergessen" nur nach meiner ausdrücklichen Bestätigung.
    5-zurueck.sh
    cd ~
    6-neustart.sh
    hermes gateway restart

    Geklappt, wenn: Befehl 6 läuft ohne Fehlermeldung durch und die Eingabezeile jarvis@jarvis ist wieder da.

  43. Telegram-Chat mit deinem Bot · 3 Min

    Gedächtnis in Telegram testen

    Ab jetzt redest du wie gewohnt per Telegram mit Jarvis. Probier aus, ob er dauerhaft speichert und wiederfindet.

    1. Nachricht 1 kopieren und deinem Bot schicken.
    2. Hat er bestätigt: Nachricht 2 schicken.
    3. Für später: Längere Notizen oder Protokolle schickst du als Datei und schreibst dazu: „Leg das in dein Langzeitgedächtnis.“
    4. Optional, im Free-Tarif empfohlen: Nachricht 3 schicken. Sie hält das Projekt wach, sodass Supabase es nicht pausiert.
    nachricht-1.txt
    Speicher dauerhaft: Herr Biermann möchte Angebote immer als PDF.
    nachricht-2.txt
    Wie will Biermann seine Angebote haben?
    nachricht-3-wachhalten.txt
    Richte eine Automation namens gedaechtnis-wachhalten ein: Jeden Sonntag um 12:00 Uhr (Europe/Berlin) führst du im Terminal python3 ~/jarvis/gedaechtnis.py liste aus. Schick mir dazu nichts, melde dich nur, wenn der Befehl einen Fehler zeigt.

    Geklappt, wenn: Jarvis antwortet „als PDF“ und nennt die Eintragsnummer, zum Beispiel „(#12)“. In Supabase siehst du den Eintrag unter „Table Editor“ → jarvis_gedaechtnis.

    Falls es hakt: Jarvis sagt, er habe keinen Zugriff? Schreib ihm: „Benutze den Skill langzeitgedaechtnis und führ den Befehl im Terminal aus.“ Fragt er vor dem Ausführen um Erlaubnis, gib sie dauerhaft für diesen Befehl frei.

  44. Teil 9 · Extra: Jarvis bekommt eine Stimme
  45. elevenlabs.io · 10 Min

    ElevenLabs-Konto, Schlüssel und Stimme

    Ab jetzt ist alles optional, aber das ist der Moment, in dem Jarvis sich wie ein echter Assistent anfühlt: Er liest dir das Briefing beim Kaffee vor. ElevenLabs hat die natürlichsten Stimmen, auch auf Deutsch. Der kostenlose Tarif enthält 10.000 Credits im Monat, das reicht für einige kurze Briefings. Wer es jeden Tag hören will, nimmt Starter für 6 $ im Monat (30.000 Credits).

    1. Auf elevenlabs.io kostenlos registrieren.
    2. Stimme aussuchen: links „Voices“ → „Voice Library“ (Explore), nach Sprache Deutsch filtern, Stimmen probehören. Bei deiner Lieblingsstimme auf „+“ / „Add to my voices“.
    3. Voice-ID kopieren: unter „My Voices“ bei der Stimme auf die drei Punkte → „Copy voice ID“. Notieren.
    4. Schlüssel erstellen: links „Developers“ → Reiter „API Keys“ → „Create API key“, Name Jarvis.
    5. Bei den Berechtigungen „Text to Speech“ auf Zugriff und „Voices“ auf Lesen stellen, erstellen, Schlüssel sofort kopieren. Er wird nur einmal angezeigt.

    Geklappt, wenn: du hast eine Voice-ID (rund 20 Zeichen) und einen Schlüssel notiert, der mit sk_ beginnt.

    Falls es hakt: Der Gratis-Tarif lässt Stimmen aus der Voice Library per Schlüssel womöglich nicht zu (Fehler „paid_plan_required“). Nimm dann eine Standardstimme aus „My Voices“, eine eigene Stimme oder den Tarif Starter. Ohne passende Stimme springt Jarvis auf die kostenlose Roboterstimme (Edge TTS).

  46. Server, als jarvis · 5 Min

    Stimme in Jarvis einbauen

    Du gibst Jarvis den ElevenLabs-Schlüssel und sagst ihm, welche Stimme er nehmen soll. Das Modell eleven_multilingual_v2 klingt auf Deutsch sehr natürlich.

    1. Prüf zuerst: Die Eingabezeile im Terminal beginnt mit jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.
    2. Befehl 1 kopieren und sk_DEIN-SCHLUESSEL durch deinen kompletten Schlüssel aus Schritt 36 ersetzen (er beginnt auch mit sk_). Einfügen, Enter.
    3. Befehl 2 einfügen, Enter.
    4. Befehl 3 kopieren und DEINE-VOICE-ID durch deine Voice-ID aus Schritt 36 ersetzen. Einfügen, Enter.
    5. Befehl 4 einfügen, Enter.
    6. Befehl 5 einfügen, Enter. Jarvis startet mit Stimme neu.
    1-schluessel.sh
    hermes config set ELEVENLABS_API_KEY sk_DEIN-SCHLUESSEL
    2-anbieter.sh
    hermes config set tts.provider elevenlabs
    3-stimme.sh
    hermes config set tts.elevenlabs.voice_id DEINE-VOICE-ID
    4-modell.sh
    hermes config set tts.elevenlabs.model_id eleven_multilingual_v2
    5-neustart.sh
    hermes gateway restart

    Geklappt, wenn: alle fünf Befehle laufen ohne Fehlermeldung durch.

  47. Telegram-Chat mit deinem Bot · 2 Min

    Stimme in Telegram einschalten

    Jetzt sagst du Jarvis in Telegram, wann er sprechen soll. Der beste Alltagsmodus: Er antwortet mit Sprache, wenn du ihm eine Sprachnachricht schickst.

    1. Den Befehl aus dem Kasten deinem Bot schicken: Ab jetzt antwortet Jarvis mit Sprache, wenn du ihm eine Sprachnachricht schickst.
    2. Andere Möglichkeit: /voice tts, dann kommt jede Antwort als Sprachnachricht. Verbraucht schnell Credits.
    3. /voice off schaltet zurück auf Text, /voice status zeigt die Einstellung.
    telegram.txt
    /voice on

    Geklappt, wenn: du schickst eine Sprachnachricht „Lies mir mein Briefing vor“ und bekommst es in deiner gewählten Stimme zurück.

    Falls es hakt: Kommt eine Roboterstimme statt deiner? Dann greift die kostenlose Standardstimme, weil der Schlüssel nicht passt. Schlüssel neu erzeugen (Schritt 36), Berechtigung „Text to Speech“ prüfen, dann Befehl 1 und Befehl 5 aus Schritt 37 wiederholen. Die erste Sprachnachricht kann langsam sein oder scheitern, weil die Spracherkennung erst startet. Dann nochmal schicken. Hilft das nicht, auf dem Server hermes config set stt.provider elevenlabs und danach hermes gateway restart.

  48. Teil 10 · Extra: eine eigene Oberfläche
  49. Laptop und Server · 5 Min

    Der schnelle Weg: das eingebaute Dashboard

    Hermes bringt eine Weboberfläche mit: Chat, Einstellungen und Automationen im Browser. Aus Sicherheitsgründen ist sie nur auf dem Server selbst erreichbar. Du holst sie dir über einen Tunnel auf den Laptop, eine verschlüsselte Leitung durch deine SSH-Verbindung.

    1. Bist du gerade auf dem Server (Eingabezeile jarvis@jarvis), tipp erst exit und Enter.
    2. Befehl 1 kopieren, DEINE-SERVER-IP durch deine Zahl ersetzen, im Laptop-Terminal einfügen, Enter. Du bist jetzt auf dem Server, mit Tunnel.
    3. Befehl 2 im selben Fenster einfügen, Enter. Lass das Fenster offen, solange du das Dashboard nutzt.
    4. Im Browser auf dem Laptop die Adresse 3 öffnen. Beim allerersten Start baut Hermes die Oberfläche, das dauert einige Minuten. Warte, bis im Terminal eine Adresse erscheint.
    1-laptop.sh
    ssh -L 9119:127.0.0.1:9119 jarvis@DEINE-SERVER-IP
    2-server.sh
    hermes dashboard
    3-browser.txt
    http://127.0.0.1:9119

    Geklappt, wenn: im Browser deines Laptops öffnet http://127.0.0.1:9119 das Hermes-Dashboard.

    Falls es hakt: Öffne für das Dashboard nie die Firewall. Offen erreichbare Oberflächen wurden 2026 schon für Angriffe missbraucht, der Tunnel reicht völlig.

  50. claude.ai · 30 Min

    Jarvis OS entwerfen mit Claude Design

    Wer mehr will als das Standard-Dashboard, baut sich „Jarvis OS“: eine eigene Oberfläche mit animiertem Jarvis-Kern, Chat, Automationen und Tool-Status. Den Entwurf macht Claude Design, das laut Anthropic auch im kostenlosen Tarif verfügbar ist. Du beschreibst, Claude zeichnet, du verfeinerst.

    1. claude.ai öffnen, Claude Design starten (Anleitung: https://support.claude.com/en/articles/14604416-get-started-with-claude-design), neues Projekt Jarvis OS.
    2. Den Design-Prompt aus dem Kasten kopieren, einfügen und abschicken. Claude erstellt die Ansichten.
    3. Zwei, drei Runden verfeinern, in normalen Worten: „Der Kern soll ruhiger atmen“, „Statuswörter größer“, „Handy-Ansicht zeigen“.
    4. Wenn es dir gefällt: exportieren als Übergabe-Paket für Claude Code (Handoff) und in einem Ordner jarvis-os auf deinem Laptop speichern.
    design-prompt.txt
    Entwirf "Jarvis OS": die Oberfläche für meinen persönlichen KI-Assistenten. Er heißt Jarvis, läuft auf meinem eigenen Server und erledigt Aufgaben in meinen Tools. Die Oberfläche soll ihn steuern und sichtbar machen, was er gerade tut.
    
    STIL
    - Elegant und ruhig, leicht futuristisch, ohne Science-Fiction-Kitsch. Dunkler Hintergrund (fast schwarz mit leichtem Blaustich), viel Luft.
    - Schrift: eine klare Grotesk für Text, Zahlen und Status in Monospace. Lesbarkeit vor Effekt.
    - Ein einziger Akzent (kühles Cyan ODER warmes Bernstein, entscheide dich), nur für Aktives, Laufendes und Wichtiges. Keine Verläufe auf Flächen.
    - In der Mitte ein animierter Jarvis-Kern (pulsierender Ring oder Partikelkugel): atmet ruhig, wenn nichts passiert, wird schneller, wenn Jarvis arbeitet, leuchtet kurz auf, wenn ein Ergebnis fertig ist. Nichts blinkt dauerhaft.
    
    BEREICHE
    1. Chat mit Jarvis in der Mitte: Verlauf, Eingabefeld unten, Antworten erscheinen tippend. Werkzeugaufrufe (Mail gelesen, Datei gespeichert) als kleine aufklappbare Zeilen.
    2. Automationen: Name, Zeitplan in Klartext ("werktags 06:30"), nächste Ausführung, letztes Ergebnis, Schalter zum Pausieren.
    3. Verbundene Tools: Telegram, Gmail, Kalender, Drive, Websuche, Stimme. Status in Worten (verbunden, Anmeldung nötig, Fehler), nicht nur als Punkt.
    4. Aufgaben: was läuft (mit aktuellem Schritt), was wartet, was fertig ist. Fertige Ergebnisse öffnen sich als Panel.
    
    ZUSTÄNDE
    - Leer (noch keine Automation): freundlich, mit dem nächsten Schritt als Knopf.
    - Läuft: sichtbar, aber nicht aufdringlich.
    - Fehler: klar benannt, mit einem Satz, was ich tun kann.
    
    BEDIENUNG
    - Desktop: schmale Navigation links, Chat in der Mitte, rechts Aufgaben und nächste Automationen.
    - Handy: Chat als Startansicht, die anderen Bereiche als Tabs unten.
    
    Liefere: Desktop-Ansicht, Handy-Ansicht, die drei Zustände und den Jarvis-Kern in seinen vier Zuständen. Nutze Beispielinhalte, die nach einem echten Arbeitstag aussehen, kein Lorem ipsum.

    Geklappt, wenn: im Ordner jarvis-os liegen das Übergabe-Paket mit HTML-Dateien und Screenshots.

  51. Terminal auf dem Laptop · 10 Min

    Claude Code installieren

    Claude Code ist Claude mit Zugriff auf Dateien und Terminal: Es programmiert für dich, du gibst nur frei. Du installierst es auf deinem Laptop, nicht auf dem Server.

    1. Bist du im Terminal noch auf dem Server (jarvis@jarvis), tipp exit und Enter.
    2. Mac: Befehl 1 im Terminal einfügen, Enter. Windows: stattdessen Befehl 1 für Windows in der PowerShell.
    3. Ist die Installation fertig: Befehl 2 einfügen, Enter. Du bist jetzt im Ordner jarvis-os aus Schritt 40.
    4. Befehl 3 einfügen, Enter. Beim ersten Start meldest du dich mit deinem Claude-Konto an.
    1-mac.sh
    curl -fsSL https://claude.ai/install.sh | bash
    1-windows.ps1
    irm https://claude.ai/install.ps1 | iex
    2-ordner.sh
    cd ~/jarvis-os
    3-starten.sh
    claude

    Geklappt, wenn: Claude Code läuft im Terminal und wartet auf deine Eingabe.

  52. Claude Code am Laptop · 60 bis 90 Min

    Jarvis OS bauen mit Claude Code

    Du gibst Claude Code den Auftrag. Es prüft erst, was Hermes wirklich kann, schreibt dir einen Plan und baut nach deinem Okay Stück für Stück. Die fertige Oberfläche erreichst du, genau wie das Dashboard, nur über deinen Tunnel.

    1. Den Auftrag kopieren, DEINE-SERVER-IP durch deine Zahl ersetzen, in Claude Code einfügen, Enter.
    2. Claude Code fragt vor jedem Befehl, ob es ihn ausführen darf. Lies kurz mit und bestätige. Bei Unsicherheit frag nach: „Was macht dieser Befehl?“
    3. Den Plan in .planning/jarvis-os.md lesen und mit „Okay, bau Schritt 1“ freigeben.
    claude-code-auftrag.txt
    Ich habe mit Claude Design eine Oberfläche "Jarvis OS" entworfen. Das Übergabe-Paket liegt in diesem Ordner. Mach daraus eine Oberfläche, die mit meinem echten Assistenten spricht.
    
    MEIN SETUP
    - Auf einem Ubuntu-Server läuft Hermes Agent von Nous Research unter dem Benutzer "jarvis". Zugang: ssh jarvis@DEINE-SERVER-IP (mein SSH-Schlüssel ist eingerichtet).
    - Hermes speichert alles unter ~/.hermes/ (config.yaml, SOUL.md, memories/, skills/, cron/). Die Datei ~/.hermes/.env und ~/.hermes/auth.json enthalten Schlüssel: NIE lesen, anzeigen oder verändern.
    - Telegram und die Zeitpläne laufen über den Hermes-Gateway-Dienst.
    - Verbunden sind Gmail, Google Kalender und Drive (über den Hermes-Skill google-workspace; das Zugriffstoken ~/.hermes/google_token.json und google_client_secret.json NIE lesen oder anzeigen), Websuche und ElevenLabs.
    
    AUFTRAG
    1. Sieh dir das Übergabe-Paket an und beschreib mir in zehn Zeilen, welche Ansichten und Zustände es enthält.
    2. Prüf in der offiziellen Doku (hermes-agent.nousresearch.com/docs) und per SSH auf dem Server, welche Schnittstellen diese Hermes-Version wirklich hat, bevor du etwas baust: das Web-Dashboard, den API-Server, die CLI-Befehle (z. B. hermes cron list). Erfinde keine Schnittstelle.
    3. Schreib einen Plan nach .planning/jarvis-os.md: welche Ansicht aus welcher Quelle kommt, wie der Chat angebunden wird und wie die Oberfläche NUR für mich erreichbar bleibt. Vorgabe: Hermes lauscht nur auf 127.0.0.1, ich greife über einen SSH-Tunnel zu. Kein offener Port im Internet. Warte auf mein Okay.
    4. Bau dann in dieser Reihenfolge, jeweils mit Test: Automationen (nur lesen), Tools (nur lesen), Chat, zuletzt Aufgaben. Der Jarvis-Kern reagiert auf den echten Status.
    5. Sag mir nach jedem Schritt in einfachen Worten, wie ich prüfe, dass es funktioniert.
    
    REGELN
    Ändere nichts an der Hermes-Konfiguration. Keine Schlüssel in die Oberfläche. Halte dich an den Entwurf, Abweichungen nennst du mit Grund. Ich bin kein Entwickler: erklär mir alles, was ich selbst tun muss, Schritt für Schritt.

    Geklappt, wenn: nach jedem Bauschritt siehst du im Browser etwas Neues, und am Ende zeigt der Jarvis-Kern, ob gerade eine Automation läuft.

  53. Teil 11 · Dauerbetrieb
  54. Server oder Telegram · 5 Min pro Woche

    Pflegen und sichern

    Jarvis wird mit jeder Korrektur besser. Das meiste erledigst du per Telegram in normaler Sprache, fürs Terminal bleiben nur Updates und Sicherungen, etwa einmal im Monat.

    1. „Merk dir: Rechnungen schreibe ich freitags.“ und „Vergiss, dass ich Projekt X mache.“
    2. „Was hast du über mich gespeichert?“ und, wenn es voll wird: „Fass dein Gedächtnis zusammen und streich, was nicht mehr gilt.“
    3. Klappt eine neue Aufgabe gut: „Mach daraus einen Skill.“
    4. „Verschieb das Morgenbriefing auf werktags 6:30.“ oder „Pausier die Wochenrecherche.“
    5. hermes backup sichert nur den Ordner ~/.hermes. Befehl 5 packt zusätzlich deinen Ordner ~/jarvis (Gedächtnis-Skript, Recherchen) in eine Datei.
    1-automationen-anzeigen.sh
    hermes cron list
    2-automation-steuern.sh
    # Nur die eine Zeile kopieren, die du brauchst:
    # sofort auslösen, pausieren, fortsetzen oder löschen
    hermes cron run morgenbriefing
    hermes cron pause morgenbriefing
    hermes cron resume morgenbriefing
    hermes cron remove morgenbriefing
    3-monatlich-aktualisieren.sh
    # Einmal im Monat: aktualisieren (macht vorher nur einen kleinen Schnappschuss)
    hermes update
    4-monatlich-sichern.sh
    hermes backup
    5-jarvis-ordner-sichern.sh
    tar -czf ~/jarvis-ordner.tar.gz -C ~ jarvis

    Geklappt, wenn: hermes backup meldet eine ZIP-Datei. Lad sie und die Datei aus Befehl 5 ab und zu auf den Laptop. Achtung: Beide enthalten deine Schlüssel (.env, auth.json, gedaechtnis.env). Gib sie nie weiter und leg sie nicht in eine Cloud ohne Passwortschutz.

MEINE EINSCHÄTZUNG

Wofür sich Jarvis lohnt.

Gut geeignet für

  • Selbstständige und kleine Teams, die jeden Morgen erst mal 20 Minuten Postfach und Kalender sortieren
  • Wer eine feste wöchentliche oder tägliche Routine hat, die sich in klare Regeln fassen lässt
  • Alle, die schon ein ChatGPT-Abo haben und mehr daraus holen wollen
  • Den Einstieg in KI-Agenten, ohne gleich eine Software zu programmieren

Weniger geeignet für

  • Heikle Kundendaten: Die Anfragen laufen über OpenAI, also nicht alles ungeprüft ins Postfach lassen
  • Aufgaben, bei denen ein Fehler teuer wird. Jarvis darf vorbereiten, abschicken machst du
  • Wer gar keine Lust auf ein Terminal hat. Einmal durch musst du, danach nie wieder
Setupein Nachmittag für den Kern, ein zweiter für Google, Stimme und Oberfläche
Vorkenntnissekeine, nur Kopieren und Einfügen
Laufende Kostenrund 6 € netto (ca. 7 € brutto) Server plus dein ChatGPT-Abo, Stimme ab 0 €

Ein Nachmittag, und du hast deinen Jarvis.

Server mieten, Schritt für Schritt kopieren, ein Interview führen. Ab morgen früh um 7 schreibt dir Jarvis zuerst, und wenn du willst, sagt er es dir auch.

Mehr Tipps auf @till.schae

FAQ

Häufige Fragen.

Was kostet mich Jarvis im Monat?
Der Server bei Hetzner kostet rund 6 € netto im Monat (ca. 7 € brutto, inklusive IPv4-Adresse). Dazu kommt dein ChatGPT-Abo (Plus ab 20 $ im Monat). Hermes, Telegram, Google und Supabase (kostenloser Tarif) kosten nichts. Voyage AI schenkt dir 200 Millionen Tokens, danach 2 Cent pro Million. ElevenLabs ist bis 10.000 Credits im Monat kostenlos, danach ab 6 $. Für die eigene Oberfläche nutzt du Claude Design, das laut Anthropic auch im kostenlosen Tarif verfügbar ist.
Brauche ich Programmierkenntnisse?
Nein. Du kopierst Befehle und fügst sie ein. Jeder Schritt erklärt, wo du gerade bist, was du klickst und woran du erkennst, dass es geklappt hat. Nach der Einrichtung läuft fast alles per Telegram in normaler Sprache.
Beim Einloggen kommt „Permission denied“. Was tun?
Dann passt der Schlüssel nicht. Prüf bei Hetzner, ob der öffentliche Schlüssel aus „cat ~/.ssh/id_ed25519.pub“ vollständig eingetragen ist. Klappt es als root, aber nicht als jarvis, hast du die rsync-Zeile aus Block 1 übersprungen: als root einloggen und sie nachholen.
„hermes: command not found“ nach der Installation?
Das Terminal kennt den neuen Befehl noch nicht. Einmal „source ~/.bashrc“ eingeben oder aus- und wieder einloggen, dann ist er da.
Mein Bot antwortet nicht in Telegram.
Meistens stimmt die Nutzer-ID nicht. Frag sie beim @userinfobot neu ab, lass „hermes gateway setup“ noch einmal laufen und starte mit „hermes gateway restart“ neu. „hermes gateway status“ zeigt, ob der Dienst überhaupt läuft.
Das Briefing kommt nicht um 7 Uhr.
Prüf mit „timedatectl“, ob der Server auf Europe/Berlin steht, sonst kommt es zur falschen Uhrzeit. „hermes cron status“ zeigt, ob der Zeitplaner läuft, „hermes cron list“ die nächste Ausführung, „hermes cron run morgenbriefing“ löst es sofort aus. Kommt es dann zwar, aber nicht in Telegram, hast du die Automation im Terminal statt im Telegram-Chat angelegt: Lösch sie und leg sie per Nachricht an deinen Bot neu an.
„not authenticated“ oder „model not configured“?
Die ChatGPT-Anmeldung fehlt oder ist abgelaufen. Der Chat meldet dann „not authenticated“. Mit „hermes auth status openai-codex“ prüfen (zeigt „logged out“), dann „hermes model“ erneut ausführen und den Code am Handy noch einmal eingeben.
Google zeigt „Zugriff blockiert“ oder „access_denied“.
Deine Gmail-Adresse ist nicht als Testnutzer eingetragen. Öffne in der Cloud Console „Google Auth Platform“ → „Zielgruppe“, klick bei „Testnutzer“ auf „+ Nutzer hinzufügen“, trag deine Adresse ein und speichere. Dann führst du in Schritt 24 Befehl 1 neu aus und nimmst den frischen Link.
Nach einer Woche kommt das Briefing ohne Mails.
Solange deine Google-App im Status „Testen“ steht, läuft die Anmeldung nach sieben Tagen ab. Entweder du wiederholst dann Schritt 24 („google-setup --auth-url“ und „google-setup --auth-code“), oder du stellst die App in der Cloud Console unter „Zielgruppe“ auf „In Produktion“. Google zeigt beim nächsten Login eine Warnung, dass die App nicht geprüft ist: Über „Erweitert“ und „Weiter zu Jarvis“ bestätigst du, dass es deine eigene ist.
Kann ich die Oberfläche auch unterwegs am Handy öffnen?
Nicht über eine offene Adresse im Internet, und das ist Absicht: Offen erreichbare Hermes-Oberflächen wurden 2026 für Angriffe missbraucht. Unterwegs nutzt du Telegram, das kann alles Wichtige. Wer die Oberfläche trotzdem mobil will, verbindet Handy und Server über ein privates Netz wie Tailscale. Lass dir das von Claude Code Schritt für Schritt einrichten.
Brauche ich die Vektordatenbank überhaupt?
Für den Anfang nicht. Das eingebaute Gedächtnis reicht für die wichtigsten Fakten über dich. Die Vektordatenbank lohnt sich, sobald Jarvis mehr behalten soll, als auf den Notizzettel passt: Kundenabsprachen, Protokolle, Wissen aus Dokumenten. Du kannst Teil 8 jederzeit später nachholen.
Supabase meldet, mein Projekt sei pausiert.
Kostenlose Supabase-Projekte schlafen ein, wenn eine Woche lang niemand darauf zugreift. Im Supabase-Dashboard auf „Restore project“ klicken, nach ein paar Minuten läuft alles wieder, die Daten bleiben erhalten. Wer Jarvis täglich nutzt, merkt davon meist nichts.
Wo landen meine Daten?
Jarvis selbst, seine Notizen und Zeitpläne liegen auf deinem Server in Deutschland, das Langzeitgedächtnis in deinem Supabase-Projekt in Frankfurt. Was er zum Denken braucht, geht als Anfrage an OpenAI, Texte fürs Gedächtnis gehen zum Umrechnen an Voyage AI, vorgelesene Texte an ElevenLabs. Gib ihm deshalb nur Zugriff auf das, was er wirklich braucht, und lass Kundendaten, für die du verantwortlich bist, erst mal draußen.
Kann ich statt ChatGPT auch Claude nehmen?
Ja. „hermes model“ bietet viele Anbieter an, darunter Anthropic mit API-Schlüssel. Das ChatGPT-Abo ist hier nur der einfachste Weg, weil viele es schon haben und kein Guthaben aufgeladen werden muss. Wechseln kannst du jederzeit.

Nächster Schritt

Soll so ein Ergebnis regelmäßig aus euren Systemen entstehen, statt jedes Mal von Hand? Das Arbeitsblatt zeigt, welcher Ablauf sich zuerst lohnt.

Automatisierungs-Check