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.
GITHUB REPO
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.
FEATURES
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.
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.
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.
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
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.
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.
„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.
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
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.
# 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
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --non-interactive source ~/.bashrc hermes model # "ChatGPT or Codex Subscription", Modell gpt-5.6-terra hermes auth status openai-codex
# Telegram: @BotFather -> /newbot -> Token; @userinfobot -> Nutzer-ID hermes gateway setup # Choice: 2 (Manual), Token einfügen, Nutzer-ID, sonst überall Enter sudo loginctl enable-linger jarvis hermes gateway status
# nano ~/.hermes/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.
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.
# Cloud Shell: 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 # Auth Platform: Extern, dich als Testnutzer, Client "Desktop-App", JSON herunterladen # Server (Abkürzungen google-setup / google-api siehe Schritt 23): nano ~/client_secret.json # JSON-Inhalt einfügen google-setup --install-deps && hermes gateway restart google-setup --client-secret ~/client_secret.json && rm ~/client_secret.json google-setup --auth-url google-setup --auth-code "HIER-DIE-GANZE-ADRESSE" google-setup --check
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. --- Mach aus diesem Ablauf einen Skill namens morgenbriefing. --- 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.
# Server: mkdir -p ~/jarvis/recherchen 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.
# Supabase: neues Projekt (Frankfurt) -> SQL Editor -> gedaechtnis.sql ausführen # Voyage: dashboard.voyageai.com -> API Keys + Zahlungsmittel unter Billing # Server: mkdir -p ~/jarvis nano ~/jarvis/gedaechtnis.env # VOYAGE_API_KEY, SUPABASE_URL, SUPABASE_SECRET_KEY chmod 600 ~/jarvis/gedaechtnis.env nano ~/jarvis/gedaechtnis.py # Skript aus Schritt 33 python3 ~/jarvis/gedaechtnis.py merken "Test" python3 ~/jarvis/gedaechtnis.py suchen "Test" mkdir -p ~/.hermes/skills/langzeitgedaechtnis cd ~/.hermes/skills/langzeitgedaechtnis nano SKILL.md cd ~ hermes gateway restart
-- 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;
hermes config set ELEVENLABS_API_KEY sk_DEIN-SCHLUESSEL hermes config set tts.provider elevenlabs hermes config set tts.elevenlabs.voice_id DEINE-VOICE-ID hermes config set tts.elevenlabs.model_id eleven_multilingual_v2 hermes gateway restart # Telegram: /voice on | /voice tts | /voice off
# Laptop: ssh -L 9119:127.0.0.1:9119 jarvis@DEINE-SERVER-IP # Server: hermes dashboard # Browser: http://127.0.0.1:9119
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.
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.
DIE ANLEITUNG
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.
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.
Geklappt, wenn: alle Konten stehen und du hast rund drei Stunden Zeit am Stück für Teil 1 bis 5.
Diese Begriffe kommen gleich ständig vor. Wenn du später unsicher bist, schau hier in Schritt 2 nach.
# beginnen, sind nur Erklärungen und werden ignoriert.Das Terminal ist schon auf deinem Laptop, du musst nichts installieren. Lass das Fenster ab jetzt offen.
Cmd + Leertaste, tipp Terminal und drück Enter.PowerShell und klick auf „Windows PowerShell“.Cmd + V, in der PowerShell mit Rechtsklick oder Strg + V.Geklappt, wenn: ein Fenster mit blinkendem Cursor ist offen.
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.
ssh-keygen -t ed25519 -C "jarvis"
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.
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.
Jarvis, dann das Projekt öffnen.laptop, speichern. Er muss danach angehakt sein.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.
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.
jarvis auswählen, Name nur-ssh, erstellen.Geklappt, wenn: beim Server steht unter „Firewalls“ der Eintrag nur-ssh.
Jetzt verbindest du dein Terminal mit dem Server. Ab dann landet alles, was du tippst, auf dem Server und nicht mehr auf deinem Laptop.
yes und drück Enter.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.
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.
apt update && apt upgrade -y
apt install -y git curl xz-utils libatomic1
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.
Damit nicht alles mit vollen Admin-Rechten läuft, legst du einen eigenen Benutzer namens jarvis an. Er bekommt denselben Hausschlüssel wie du.
sudo.Y und Enter.adduser jarvis
usermod -aG sudo jarvis
rsync --archive --chown=jarvis:jarvis ~/.ssh /home/jarvis
exit
Geklappt, wenn: im Terminal steht „Connection to … closed.“ und die Eingabezeile sieht wieder aus wie vorher auf deinem Laptop.
Ab jetzt meldest du dich immer als jarvis an, nie mehr als root. Diesen Befehl brauchst du jedes Mal, wenn du zum Server willst.
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.
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.
jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --non-interactive
source ~/.bashrc
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.
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.
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.
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.
Strg + C drücken (notfalls zweimal), bis wieder jarvis@jarvis dasteht.hermes auth status openai-codex
hermes config set timezone Europe/Berlin
hermes
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.
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.
BotFather eintippen und den Eintrag @BotFather öffnen. Achte auf die exakte Schreibweise, es gibt Nachahmer mit ähnlichen Namen./newbot schreiben und abschicken.Jarvis.bot enden, z. B. tills_jarvis_bot. Ist er vergeben, probier einen anderen.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.
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.
userinfobot eintippen und @userinfobot öffnen.123456789) ist deine Nutzer-ID. Notieren.Geklappt, wenn: du hast eine Zahl mit 8 bis 10 Ziffern notiert.
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.
jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.hermes gateway setup
Geklappt, wenn: der Assistent ist fertig und die Eingabezeile jarvis@jarvis ist wieder da.
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.
sudo loginctl enable-linger jarvis
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.
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.
Strg + K drücken, bis alles gelöscht ist.Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)/new, damit Jarvis die neue Datei lädt. Erst dann kennt er sie.nano ~/.hermes/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.
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.
/new. Jarvis lädt sein Gedächtnis beim Start eines Gesprächs, erst dann sieht er das Gespeicherte.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.“
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.
Jarvis, erstellen. Danach oben sicherstellen, dass „Jarvis“ ausgewählt ist.jarvis-471234).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“.
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.
Jarvis, deine Mailadresse als Support-Adresse, weiter.Geklappt, wenn: unter „Zielgruppe“ steht deine Adresse als Testnutzer.
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.
Jarvis. Eine Weiterleitungs-URI musst du hier nicht eintragen.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.
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.
jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.client_secret_….json mit einem Texteditor öffnen, alles markieren (Strg + A, am Mac Cmd + A) und kopieren.Strg + O, Enter, schließen mit Strg + X. (Auch am Mac Strg, nicht Cmd.)google-setup und google-api an. Keine Ausgabe ist richtig.nano ~/client_secret.json
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
google-setup --install-deps && hermes gateway restart
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.
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.
http://localhost:1/?state=…). Kopier die komplette Adresse aus der Adresszeile.google-setup --auth-url
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.
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.
google-setup --check
google-setup --check-live
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.
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.
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.
Mach aus diesem Ablauf einen Skill namens morgenbriefing.
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.
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.
jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.mkdir -p ~/jarvis/recherchen
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.
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.
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.
jarvis-gedaechtnis, bei „Database Password“ auf „Generate a password“ klicken und das Passwort notieren.https://abcdefgh.supabase.co.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.
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.
Strg/Cmd + Enter).-- 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.
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“.
jarvis. Schlüssel sofort kopieren, er beginnt mit pa-.Geklappt, wenn: du hast einen Schlüssel pa-… notiert und unter „Billing“ steht ein Zahlungsmittel.
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.
jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.~/jarvis an.Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)mkdir -p ~/jarvis
nano ~/jarvis/gedaechtnis.env
VOYAGE_API_KEY=pa-DEIN-VOYAGE-SCHLUESSEL SUPABASE_URL=https://DEIN-PROJEKT.supabase.co SUPABASE_SECRET_KEY=sb_secret_DEIN-SUPABASE-SCHLUESSEL
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.
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.
Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)nano ~/jarvis/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()
python3 ~/jarvis/gedaechtnis.py merken "Rechnungen schreibe ich immer freitags."
python3 ~/jarvis/gedaechtnis.py suchen "Wann mache ich meine Abrechnung?"
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.
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.
Strg + O, dann Enter. Schließen: Strg + X. (Auch am Mac Strg, nicht Cmd.)mkdir -p ~/.hermes/skills/langzeitgedaechtnis
cd ~/.hermes/skills/langzeitgedaechtnis
nano 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.
cd ~
hermes gateway restart
Geklappt, wenn: Befehl 6 läuft ohne Fehlermeldung durch und die Eingabezeile jarvis@jarvis ist wieder da.
Ab jetzt redest du wie gewohnt per Telegram mit Jarvis. Probier aus, ob er dauerhaft speichert und wiederfindet.
Speicher dauerhaft: Herr Biermann möchte Angebote immer als PDF.
Wie will Biermann seine Angebote haben?
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.
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).
Jarvis.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).
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.
jarvis@jarvis. Wenn nicht, log dich mit Schritt 10 ein.sk_). Einfügen, Enter.hermes config set ELEVENLABS_API_KEY sk_DEIN-SCHLUESSEL
hermes config set tts.provider elevenlabs
hermes config set tts.elevenlabs.voice_id DEINE-VOICE-ID
hermes config set tts.elevenlabs.model_id eleven_multilingual_v2
hermes gateway restart
Geklappt, wenn: alle fünf Befehle laufen ohne Fehlermeldung durch.
Jetzt sagst du Jarvis in Telegram, wann er sprechen soll. Der beste Alltagsmodus: Er antwortet mit Sprache, wenn du ihm eine Sprachnachricht schickst.
/voice tts, dann kommt jede Antwort als Sprachnachricht. Verbraucht schnell Credits./voice off schaltet zurück auf Text, /voice status zeigt die Einstellung./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.
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.
jarvis@jarvis), tipp erst exit und Enter.ssh -L 9119:127.0.0.1:9119 jarvis@DEINE-SERVER-IP
hermes dashboard
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.
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.
https://support.claude.com/en/articles/14604416-get-started-with-claude-design), neues Projekt Jarvis OS.jarvis-os auf deinem Laptop speichern.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.
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.
jarvis@jarvis), tipp exit und Enter.jarvis-os aus Schritt 40.curl -fsSL https://claude.ai/install.sh | bash
irm https://claude.ai/install.ps1 | iex
cd ~/jarvis-os
claude
Geklappt, wenn: Claude Code läuft im Terminal und wartet auf deine Eingabe.
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.
.planning/jarvis-os.md lesen und mit „Okay, bau Schritt 1“ freigeben.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.
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.
hermes backup sichert nur den Ordner ~/.hermes. Befehl 5 packt zusätzlich deinen Ordner ~/jarvis (Gedächtnis-Skript, Recherchen) in eine Datei.hermes cron list
# 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
# Einmal im Monat: aktualisieren (macht vorher nur einen kleinen Schnappschuss) hermes update
hermes backup
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
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.
FAQ