T.H.E.R.O.N.
← Back API Plugins
GUI · desktop appCLI · headlessServerPlugins · OverviewPlugins · Build

Inhalt

Überblick Installieren Befehle Prozesse ausführen Cronjobs & CI Slave-Betrieb: theron --listen Headless-Worker (Docker) Kubernetes

CLI & Headless

Überblick

Theron läuft auch ohne Fenster – mit denselben Agents und Prozessen wie in der App. Drei Wege:

  • Konsole: theron execute führt einen Prozess in einem Ordner aus – im Terminal, in CI oder per Cronjob. Rückfragen beantwortest du in der Konsole oder auf dem Theron-Server, oder Theron entscheidet mit -q selbst.
  • Slave: theron --listen macht einen Rechner zum Worker, den deine App steuert. Alles läuft dort weiter, auch wenn die App geschlossen ist.
  • Headless-Worker: derselbe Slave als Docker-Image mit eingebautem Claude Code – z. B. als Pod in Kubernetes.

Alle Builds enthalten Theron als kompilierten Maschinencode. Die Agents arbeiten mit Claude Code auf dem jeweiligen Rechner – mit deinem Claude-Abo – oder mit lokalen Modellen über OpenCode.

Installieren

  • Auf deinem Rechner: In der App unter Einstellungen → Konsole · Befehl „theron“ → „Befehl einrichten“. Er landet unter ~/.local/bin/theron (macOS, Linux) bzw. %LOCALAPPDATA%\Theron\bin\theron.cmd (Windows) und nutzt dieselben Daten wie die App.
  • Auf Servern: den eigenständigen Download von der Startseite nehmen (macOS, Windows, Linux x86_64/ARM64) und entpacken; das Programm ist theron/theron bzw. theron\theron.exe. Kein Qt, keine Oberfläche. macOS: xattr -dr com.apple.quarantine theron.
  • Claude-Login: einmal claude im Terminal starten und anmelden. Auf Rechnern ohne Browser erzeugst du lokal mit claude setup-token einen langlebigen Token und setzt ihn dort als CLAUDE_CODE_OAUTH_TOKEN – das nutzt dein Abo, keine API-Kosten.
  • Daten: wie die App unter ~/Library/Application Support/Theron (macOS), %APPDATA%\Theron (Windows) bzw. ~/.local/share/theron (Linux); mit THERON_DATA=/pfad woanders.

Befehle

BefehlWirkung
theron execute PROZESS [ORDNER] ["AUFTRAG"] [-q] [--no-server]Einen Prozess ausführen (Alias: run). Details unten.
theron execute-package PAKET [ORDNER] [--task "…"] [--interactive]Das Paket einer Prozess-Executable ausführen – das macht die Executable selbst (siehe Prozess als Executable).
theron processesVorhandene Prozesse auflisten.
theron export PROZESS DATEI.theronEinen Prozess samt Agents und Wissen exportieren.
theron config [show]Einstellungen anzeigen.
theron config server ADRESSE TOKEN · … server offMit dem Theron-Server verbinden (prüft die Verbindung) bzw. trennen.
theron config sync on|off [--knowledge on|off] [--memory on|off] [--databases on|off]Prozesse und Agents über den Server abgleichen – auf Wunsch mit Wissen, Memorys und Datenbanken.
theron config language de|enSprache von Theron.
theron syncJetzt mit dem Server abgleichen.
theron status · theron versionVersion, Datenordner, Server, Sync, Claude-CLI.
theron --listen HOST:PORT [--token TOKEN] [--no-plugins]Als Slave starten (siehe unten).
theron plugin list|install|remove|enable|disable|new|pack|keygen|trust …Plugins verwalten und bauen – siehe Plugins.

Prozesse ausführen

  • Prozess: eine in der App exportierte .theron-Datei (sie wird nur für diesen Lauf importiert) oder der Name eines vorhandenen Prozesses – z. B. aus der Bibliothek, die du mit theron config sync on und theron sync vom Server holst.
  • Ordner: das Arbeitsverzeichnis der Agents (Standard: das aktuelle). Jeder Ordner bekommt ein eigenes Projekt „CLI · ordner“ – sein Verlauf bleibt erhalten.
  • Auftrag: als Argument, mit - von stdin oder aus einer THERON.md, AUFTRAG.md bzw. TASK.md im Ordner.
  • Rückfragen: Theron zeigt sie in der Konsole mit nummerierten Antworten (★ = empfohlen); du antwortest mit der Nummer, mehreren Nummern (1,3) oder eigenem Text. Ist ein Server verbunden, erscheint der Lauf dort als eigener Client „Rechner · CLI · ordner“ – die erste Antwort gilt, egal wo. Eine leere Zeile im Chat beendet den Lauf, Strg + C hält ihn an.
  • -q (autonom): keine Rückfragen – Theron entscheidet selbst nach bestem Wissen. Bleibt er hängen (mehr als 25 eigene Antworten oder wiederholt ohne Fortschritt), endet der Lauf.
  • --no-server: auch mit eingerichtetem Server nur lokal.
  • Exit-Code: 0 Ziel erreicht · 1 Ziel nicht erreicht oder Fehler · 2 falscher Aufruf · 3 mit -q abgebrochen.
  • Mehrere Läufe gleichzeitig (auch in verschiedenen Ordnern) stören sich nicht – auch nicht mit der laufenden App.

Cronjobs & CI

# jede Nacht um 3 Uhr: Abhängigkeiten aktualisieren, Theron entscheidet selbst
0 3 * * * cd /srv/shop && theron execute "Dependency-Update" . -q >> /var/log/theron.log 2>&1

# in einer CI-Pipeline: Review eines Merge-Requests aus einer exportierten Prozessdatei
theron execute review.theron . "Prüfe die Änderungen dieses Merge-Requests" -q || exit 1

Im Cronjob fehlt oft der PATH – dann den vollen Pfad zu theron angeben. Mit eingerichtetem Server siehst du nächtliche Läufe im Web-UI.

Slave-Betrieb: theron --listen

Ein Slave ist Theron ohne Fenster, den deine App steuert. Starte ihn auf dem Rechner, auf dem gearbeitet werden soll:

theron config server https://theron.example.com TOKEN   # optional: Rückfragen im Web-UI
theron --listen 0.0.0.0:7531 --token GEHEIM

Er zeigt Adresse, Token und den Fingerprint seines Zertifikats (Zertifikat und Token liegen im Datenordner unter slave/ und bleiben gleich). Ohne --token erzeugt er einen und merkt ihn sich.

  • App verbinden: Einstellungen → Slave: Host, Port und Token, „Verbindung prüfen“ und den Fingerprint mit der Ausgabe des Slaves vergleichen. Die App startet neu; unten steht „SLAVE · host:port · VERBUNDEN“. Zurück zum lokalen Betrieb: Haken entfernen.
  • Was wo läuft: Tasks, THERON, Konzepter, KI-Entwürfe und jeder Modellaufruf laufen auf dem Slave – mit seinem Claude-Login. Die App hat eine Kopie seiner Daten und zeigt alles live; Nutzung und Modellliste kommen vom Slave.
  • Ordner und Dateien: Arbeitsordner, Gedächtnis und Wissen liegen auf dem Slave; Pfade sind Pfade dort. Anhänge und Wissensdateien lädt die App hoch (bis 40 MB je Vorgang).
  • App zu, Arbeit läuft: Der Slave macht weiter und stellt Rückfragen auf dem Theron-Server. Öffnest du die App wieder, holt sie alle Änderungen nach und zeigt den aktuellen Stand.
  • Sicherheit: TLS mit dem eigenen Zertifikat des Slaves (die App prüft den Fingerprint und verbindet sich nie mit einem anderen Rechner) plus Token. Öffne den Port nur dort, wo deine App ihn erreichen muss.

Headless-Worker (Docker)

Das Image enthält Claude Code und Theron als Slave. Es enthält keine Zugangsdaten – dein Claude-Login kommt beim Start dazu.

docker run -d --name theron-worker --restart unless-stopped -p 7531:7531 -v theron:/data \
  -e THERON_SLAVE_TOKEN=geheim -e CLAUDE_CODE_OAUTH_TOKEN=… -e THERON_NAME=worker-1 \
  mibexx1985/theron-headless
docker logs theron-worker | grep Fingerprint

Offline: das Archiv von der Startseite mit docker load -i theron-headless-image-amd64.tar.gz laden.

VariableBedeutung
CLAUDE_CODE_OAUTH_TOKENDein Claude-Abo (einmal lokal: claude setup-token) – nutzt die Limits deines Abos, keine API-Kosten.
THERON_SLAVE_TOKENToken für deine App; leer = einmal erzeugt und in /data gespeichert.
THERON_NAMEName in der App und auf dem Server (Standard: Hostname des Containers).
THERON_SERVER_URL, THERON_SERVER_TOKENOptional: Verbindung zum Theron-Server (Rückfragen im Web).
THERON_SYNCon: Prozesse und Agents mit dem Server abgleichen.
THERON_LANGUAGEde oder en.
THERON_PLUGIN_PACKAGESOrdner mit .theronplugin-Dateien, die bei jedem Start installiert werden (Standard /data/plugin-packages).
THERON_LISTENAdresse (Standard 0.0.0.0:7531).
THERON_ALLOW_API_KEY1: auch ANTHROPIC_API_KEY nutzen (kostenpflichtige API). Ohne wird ein API-Key ignoriert.
  • /data enthält Zertifikat (gleichbleibender Fingerprint), Datenbank, Arbeitsordner und Claude-Einstellungen – immer als Volume einbinden.
  • Werkzeuge ergänzen: Das Image bringt git, curl, ripgrep und jq mit. Für deinen Stack baust du darauf auf, z. B. FROM mibexx1985/theron-headless und RUN apt-get install -y nodejs npm (als USER root, danach zurück auf USER 10001).

Kubernetes

Ein vollständiges Beispiel: Secret mit Slave-Token, Claude-Token und optional Server-Token, ein Volume für /data, ein Deployment mit genau einem Pod (Strategie Recreate) und ein Service.

apiVersion: v1
kind: Secret
metadata: { name: theron-headless, namespace: theron }
stringData:
  slave-token: "LANGER-ZUFALLS-TOKEN"            # openssl rand -base64 24
  claude-oauth-token: "…"                        # claude setup-token
  server-token: "…"                              # optional: Theron-Server
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: theron-headless-data, namespace: theron }
spec:
  accessModes: [ReadWriteOnce]
  resources: { requests: { storage: 20Gi } }
---
apiVersion: apps/v1
kind: Deployment
metadata: { name: theron-headless, namespace: theron }
spec:
  replicas: 1
  strategy: { type: Recreate }                   # one pod per /data volume
  selector: { matchLabels: { app: theron-headless } }
  template:
    metadata: { labels: { app: theron-headless } }
    spec:
      securityContext: { fsGroup: 10001 }
      containers:
        - name: theron-headless
          image: mibexx1985/theron-headless:latest
          ports: [{ name: slave, containerPort: 7531 }]
          env:
            - { name: THERON_NAME, value: "k8s-worker" }
            - name: THERON_SLAVE_TOKEN
              valueFrom: { secretKeyRef: { name: theron-headless, key: slave-token } }
            - name: CLAUDE_CODE_OAUTH_TOKEN
              valueFrom: { secretKeyRef: { name: theron-headless, key: claude-oauth-token } }
            - { name: THERON_SERVER_URL, value: "https://theron.example.com" }   # optional
            - name: THERON_SERVER_TOKEN
              valueFrom: { secretKeyRef: { name: theron-headless, key: server-token, optional: true } }
          volumeMounts: [{ name: data, mountPath: /data }]
          readinessProbe: { tcpSocket: { port: slave }, periodSeconds: 10 }
          resources: { requests: { cpu: 500m, memory: 1Gi }, limits: { memory: 6Gi } }
      volumes: [{ name: data, persistentVolumeClaim: { claimName: theron-headless-data } }]
---
apiVersion: v1
kind: Service
metadata: { name: theron-headless, namespace: theron }
spec:
  type: LoadBalancer                             # or NodePort – not an HTTP ingress
  selector: { app: theron-headless }
  ports: [{ name: slave, port: 7531, targetPort: slave }]

Mit kubectl apply -f theron-headless.yaml anlegen.

  • Die Verbindung ist reines TLS mit Fingerprint-Prüfung – sie geht direkt zum Pod (LoadBalancer oder NodePort), nicht über einen HTTP-Ingress.
  • Den Fingerprint zeigt kubectl logs deploy/theron-headless | grep Fingerprint.
  • Mehrere Worker: je Worker ein eigenes Deployment mit eigenem Volume und Namen.

Contents

Overview Install Commands Running processes Cron jobs & CI Slave mode: theron --listen Headless worker (Docker) Kubernetes

CLI & headless

Overview

Theron also runs without a window – with the same agents and processes as in the app. Three ways:

  • Console: theron execute runs a process in a folder – in a terminal, in CI or as a cron job. Answer questions in the console or on the Theron server, or let Theron decide by itself with -q.
  • Slave: theron --listen turns a machine into a worker your app controls. Everything keeps running there, even while the app is closed.
  • Headless worker: the same slave as a Docker image with Claude Code built in – e.g. as a pod in Kubernetes.

Every build contains Theron as compiled machine code. The agents work with Claude Code on that machine – with your Claude subscription – or with local models via OpenCode.

Install

  • On your computer: in the app, Settings → Console · “theron” command → “Set up command”. It goes to ~/.local/bin/theron (macOS, Linux) or %LOCALAPPDATA%\Theron\bin\theron.cmd (Windows) and uses the same data as the app.
  • On servers: take the stand-alone download from the home page (macOS, Windows, Linux x86_64/ARM64) and unpack it; the program is theron/theron or theron\theron.exe. No Qt, no window. macOS: xattr -dr com.apple.quarantine theron.
  • Claude login: start claude once in a terminal and log in. On machines without a browser, create a long-lived token locally with claude setup-token and set it there as CLAUDE_CODE_OAUTH_TOKEN – that uses your subscription, no API costs.
  • Data: like the app in ~/Library/Application Support/Theron (macOS), %APPDATA%\Theron (Windows) or ~/.local/share/theron (Linux); elsewhere with THERON_DATA=/path.

Commands

CommandEffect
theron execute PROCESS [FOLDER] ["TASK"] [-q] [--no-server]Run a process (alias: run). Details below.
theron execute-package PACKAGE [FOLDER] [--task "…"] [--interactive]Runs the package of a process executable – the executable does this itself (see Process as executable).
theron processesList the processes.
theron export PROCESS FILE.theronExport a process with its agents and knowledge.
theron config [show]Show the settings.
theron config server ADDRESS TOKEN · … server offConnect to the Theron server (checks the connection) or disconnect.
theron config sync on|off [--knowledge on|off] [--memory on|off] [--databases on|off]Synchronise processes and agents via the server – optionally with knowledge, memories and databases.
theron config language de|enTheron's language.
theron syncSynchronise with the server now.
theron status · theron versionVersion, data folder, server, sync, Claude CLI.
theron --listen HOST:PORT [--token TOKEN] [--no-plugins]Start as a slave (see below).
theron plugin list|install|remove|enable|disable|new|pack|keygen|trust …Manage and build plugins – see Plugins.

Running processes

  • Process: a .theron file exported from the app (imported for this run only) or the name of an existing process – e.g. from the library you fetch from the server with theron config sync on and theron sync.
  • Folder: the agents' working directory (default: the current one). Every folder gets a project of its own, “CLI · folder” – its history is kept.
  • Task: as an argument, with - from stdin, or from a THERON.md, AUFTRAG.md or TASK.md in the folder.
  • Questions: Theron shows them in the console with numbered answers (★ = recommended); answer with the number, several numbers (1,3) or your own text. With a server connected, the run shows up there as a client of its own, “machine · CLI · folder” – the first answer counts, wherever it comes from. An empty line in the chat ends the run, Ctrl + C stops it.
  • -q (autonomous): no questions – Theron decides to the best of its knowledge. If it gets stuck (more than 25 own answers or repeatedly without progress), the run ends.
  • --no-server: local only, even with a server set up.
  • Exit code: 0 goal reached · 1 goal not reached or error · 2 wrong usage · 3 aborted with -q.
  • Several runs at the same time (also in different folders) don't get in each other's way – nor in the way of the running app.

Cron jobs & CI

# every night at 3 am: update dependencies, Theron decides by itself
0 3 * * * cd /srv/shop && theron execute "Dependency update" . -q >> /var/log/theron.log 2>&1

# in a CI pipeline: review a merge request with an exported process file
theron execute review.theron . "Review the changes of this merge request" -q || exit 1

Cron often lacks the PATH – then give the full path to theron. With a server set up, you see nightly runs in the web UI.

Slave mode: theron --listen

A slave is Theron without a window, controlled by your app. Start it on the machine that should do the work:

theron config server https://theron.example.com TOKEN   # optional: questions in the web UI
theron --listen 0.0.0.0:7531 --token SECRET

It shows its address, token and the fingerprint of its certificate (certificate and token live in the data folder under slave/ and stay the same). Without --token it creates one and keeps it.

  • Connect the app: Settings → Slave: host, port and token, “Check connection” and compare the fingerprint with the slave's output. The app restarts; at the bottom it shows “SLAVE · host:port · CONNECTED”. Back to local mode: untick it.
  • What runs where: tasks, THERON, the Konzepter, AI drafts and every model call run on the slave – with its Claude login. The app keeps a copy of its data and shows everything live; usage and model list come from the slave.
  • Folders and files: working folders, memory and knowledge live on the slave; paths are paths there. The app uploads attachments and knowledge files (up to 40 MB at a time).
  • App closed, work goes on: the slave keeps working and asks its questions on the Theron server. Open the app again and it catches up with every change and shows the current state.
  • Security: TLS with the slave's own certificate (the app checks the fingerprint and never connects to a different machine) plus a token. Only open the port where your app needs to reach it.

Headless worker (Docker)

The image contains Claude Code and Theron as a slave. It contains no credentials – your Claude login is added when you start it.

docker run -d --name theron-worker --restart unless-stopped -p 7531:7531 -v theron:/data \
  -e THERON_SLAVE_TOKEN=secret -e CLAUDE_CODE_OAUTH_TOKEN=… -e THERON_NAME=worker-1 \
  mibexx1985/theron-headless
docker logs theron-worker | grep Fingerprint

Offline: load the archive from the home page with docker load -i theron-headless-image-amd64.tar.gz.

VariableMeaning
CLAUDE_CODE_OAUTH_TOKENYour Claude subscription (once locally: claude setup-token) – uses your plan's limits, no API costs.
THERON_SLAVE_TOKENToken for your app; empty = created once and kept in /data.
THERON_NAMEName in the app and on the server (default: the container's host name).
THERON_SERVER_URL, THERON_SERVER_TOKENOptional: connection to the Theron server (questions on the web).
THERON_SYNCon: synchronise processes and agents with the server.
THERON_LANGUAGEde or en.
THERON_PLUGIN_PACKAGESFolder with .theronplugin files installed at every start (default /data/plugin-packages).
THERON_LISTENAddress (default 0.0.0.0:7531).
THERON_ALLOW_API_KEY1: also use ANTHROPIC_API_KEY (paid API). Without it an API key is ignored.
  • /data holds the certificate (stable fingerprint), database, working folders and Claude settings – always mount it as a volume.
  • Add tools: the image brings git, curl, ripgrep and jq. For your stack, build on it, e.g. FROM mibexx1985/theron-headless and RUN apt-get install -y nodejs npm (as USER root, then back to USER 10001).

Kubernetes

A complete example: a secret with slave token, Claude token and optionally server token, a volume for /data, a deployment with exactly one pod (strategy Recreate) and a service.

apiVersion: v1
kind: Secret
metadata: { name: theron-headless, namespace: theron }
stringData:
  slave-token: "LANGER-ZUFALLS-TOKEN"            # openssl rand -base64 24
  claude-oauth-token: "…"                        # claude setup-token
  server-token: "…"                              # optional: Theron-Server
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: theron-headless-data, namespace: theron }
spec:
  accessModes: [ReadWriteOnce]
  resources: { requests: { storage: 20Gi } }
---
apiVersion: apps/v1
kind: Deployment
metadata: { name: theron-headless, namespace: theron }
spec:
  replicas: 1
  strategy: { type: Recreate }                   # one pod per /data volume
  selector: { matchLabels: { app: theron-headless } }
  template:
    metadata: { labels: { app: theron-headless } }
    spec:
      securityContext: { fsGroup: 10001 }
      containers:
        - name: theron-headless
          image: mibexx1985/theron-headless:latest
          ports: [{ name: slave, containerPort: 7531 }]
          env:
            - { name: THERON_NAME, value: "k8s-worker" }
            - name: THERON_SLAVE_TOKEN
              valueFrom: { secretKeyRef: { name: theron-headless, key: slave-token } }
            - name: CLAUDE_CODE_OAUTH_TOKEN
              valueFrom: { secretKeyRef: { name: theron-headless, key: claude-oauth-token } }
            - { name: THERON_SERVER_URL, value: "https://theron.example.com" }   # optional
            - name: THERON_SERVER_TOKEN
              valueFrom: { secretKeyRef: { name: theron-headless, key: server-token, optional: true } }
          volumeMounts: [{ name: data, mountPath: /data }]
          readinessProbe: { tcpSocket: { port: slave }, periodSeconds: 10 }
          resources: { requests: { cpu: 500m, memory: 1Gi }, limits: { memory: 6Gi } }
      volumes: [{ name: data, persistentVolumeClaim: { claimName: theron-headless-data } }]
---
apiVersion: v1
kind: Service
metadata: { name: theron-headless, namespace: theron }
spec:
  type: LoadBalancer                             # or NodePort – not an HTTP ingress
  selector: { app: theron-headless }
  ports: [{ name: slave, port: 7531, targetPort: slave }]

Create it with kubectl apply -f theron-headless.yaml.

  • The connection is plain TLS with a fingerprint check – it goes straight to the pod (LoadBalancer or NodePort), not through an HTTP ingress.
  • kubectl logs deploy/theron-headless | grep Fingerprint shows the fingerprint.
  • Several workers: one deployment with its own volume and name per worker.
© 2026 Mike Bertram · mibexx Imprint API documentation