Normalerweise nutzt du Critto über dein Critto-Konto. Wenn du alles lieber auf einem Computer behalten möchtest, der dir gehört, kannst du den Critto-Server selbst betreiben: Deine Crittos, ihre Erinnerungen und deine Chats bleiben auf diesem Computer. Die Critto-Desktop- und Handy-Apps verbinden sich mit ihm.

Diese Anleitung ist für Linux. Du brauchst:

  • einen dauerhaft eingeschalteten 64-Bit-Linux-Computer (Intel/AMD oder ARM, z. B. Raspberry Pi 4/5), etwa einen Heimserver, Mini-PC oder kleinen Cloud-Server,
  • etwa 1 GB freien Arbeitsspeicher und ein paar GB Speicherplatz,
  • Administratorrechte (sudo).

Für NixOS gibt es ein Flake mit einem NixOS-Modul. Debian, Ubuntu, Fedora, RHEL-artige Systeme und openSUSE erhalten passende Pakete mit automatischen Aktualisierungen. Andere Systeme können das Container-Image oder den statischen Build verwenden.


NixOS

Füge Critto als Flake zu deinem System-Flake hinzu:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    critto.url = "https://downloads.critto.app/nix/critto.tar.gz";
    critto.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = { nixpkgs, critto, ... }: {
    nixosConfigurations.myserver = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";            # or aarch64-linux
      modules = [
        ./configuration.nix
        critto.nixosModules.default
        ({ pkgs, ... }: {
          services.critto = {
            enable = true;
            # Secrets (Boat key, backup key) stay out of the Nix store:
            environmentFile = "/etc/critto/secrets.env";
            # AI apps for your subscriptions (you sign in from the app):
            aiPackages = [ pkgs.codex pkgs.nodejs_22 ];
            # publicUrl = "https://critto.example.com";
          };
        })
      ];
    };
  };
}

Führe danach sudo nixos-rebuild switch --flake .#myserver aus und kopple deine Apps mit sudo crittod pair (Schritt 2).

  • Aktualisierungen: nix flake update critto ausführen und neu erstellen. Das Paket ist die signierte, vorgefertigte Version (eine statische Binärdatei, daher keine glibc-Probleme). Für den Beta-Kanal verwende services.critto.package = critto.packages.${system}.crittod-beta;.
  • Geheimnisse: Lege BOAT_API_KEY=… und CRITTO_BACKUP_KEY=… in der environmentFile ab (Eigentümer root, Modus 600; agenix und sops-nix funktionieren ebenfalls). Die Datei wird beim Start eingelesen und nie in den Store kopiert.
  • Einstellungen: listen (Standard 127.0.0.1:8787), publicUrl, webHost, openFirewall (standardmäßig aus), dataDir (Standard /var/lib/critto) und settings für alle anderen CRITTO_*-Variablen. den.backend legt fest, wo die Höhle läuft (boat, local oder none; siehe die Höhle).
  • KI-Apps: Bevorzuge Pakete aus nixpkgs in aiPackages (zum Beispiel pkgs.codex, pkgs.claude-code, wofür allowUnfree nötig ist). Für Apps, die es dort nicht gibt, setze programs.nix-ld.enable = true; und verwende sudo crittod setup ai (Schritt 3). Für Pi genügt pkgs.nodejs_22 in aiPackages; führe dann sudo crittod setup ai pi aus.
  • Fernzugriff: Aktiviere services.tailscale.enable = true; und führe dann sudo tailscale serve --bg 8787 aus. Oder verwende services.cloudflared mit einer Ingress-Regel für http://127.0.0.1:8787 (siehe Schritt 5).
  • Der Dienst läuft in einer systemd-Sandbox, lässt aber User-Namespaces verfügbar (bubblewrap und die lokale Höhle benötigen sie). Setze daher nicht security.allowUserNamespaces = false.

Der Rest der Anleitung gilt auch für NixOS; Aktualisierungen kommen dort von nix flake update statt apt oder dnf.


1. Installieren

Öffne auf dem Server ein Terminal und führe Folgendes aus:

curl -fsSL https://downloads.critto.app/install-server.sh | sh

Dadurch wird Crittos Paketquelle hinzugefügt, das Paket critto-server installiert, der Server gestartet und ein Kopplungscode ausgegeben. Das war's: Weiter zu Apps koppeln.

Möchtest du neue Versionen früher als alle anderen? Nutze den Beta-Kanal: curl -fsSL https://downloads.critto.app/install-server.sh | CRITTO_CHANNEL=beta sh

Installationsskript zuerst prüfen (optional)

Das Skript ist mit Crittos Veröffentlichungsschlüssel signiert. So prüfst du es vor der Ausführung:

curl -fsSLO https://downloads.critto.app/install-server.sh
curl -fsSLO https://downloads.critto.app/install-server.sh.minisig
minisign -Vm install-server.sh -P RWTRac/2j5M3cvVpvtz0flaOy7sH5PFSc4LwbB7PxG0OMO2h8APoZtLG
sh install-server.sh

(minisign ist in den Paketen der meisten Distributionen enthalten.) Eine einfache Prüfsumme gibt es unter install-server.sh.sha256. Auch die Pakete selbst sind signiert; dein Paketmanager prüft sie bei jeder Installation und Aktualisierung.

Oder richte die Paketquelle selbst ein

Debian / Ubuntu:

sudo install -d -m 755 /etc/apt/keyrings
sudo curl -fsSLo /etc/apt/keyrings/critto.gpg https://downloads.critto.app/keys/critto-archive-keyring.gpg
cat <<EOF | sudo tee /etc/apt/sources.list.d/critto.sources
Types: deb
URIs: https://downloads.critto.app/apt
Suites: stable
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/critto.gpg
EOF
sudo apt update && sudo apt install critto-server

Fedora / RHEL / Rocky / Alma:

sudo rpm --import https://downloads.critto.app/keys/critto-archive-keyring.asc
cat <<EOF | sudo tee /etc/yum.repos.d/critto.repo
[critto]
name=Critto
baseurl=https://downloads.critto.app/rpm/stable
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://downloads.critto.app/keys/critto-archive-keyring.asc
EOF
sudo dnf install critto-server

Fingerabdruck des Schlüssels: C78E FB7F 67CC 8184 1F70 EE3D D121 DC94 C534 50E3 („Critto Packages packages@critto.app“).

Oder Docker / Podman verwenden

docker run -d --name critto --restart unless-stopped \
  -p 127.0.0.1:8787:8787 \
  -v critto-data:/var/lib/critto -v critto-keys:/etc/critto -v critto-ai:/opt/critto-ai \
  ghcr.io/nexferra-ltd/critto-server:latest
docker exec critto crittod pair

Der Container braucht keine besonderen Berechtigungen. Deine Daten liegen im Volume critto-data, der Hauptschlüssel des Tresors in critto-keys (getrennt von den Daten, damit eine Kopie allein keinen Zugriff ermöglicht; siehe Sicherungskopien) und die KI-Apps in critto-ai. Ein Docker Secret unter /etc/critto/vault.key funktioniert ebenfalls. Aktualisiere mit docker pull ghcr.io/nexferra-ltd/critto-server:latest und erstelle den Container anschließend mit denselben Volumes neu.

Oder den statischen Build verwenden

Jede Veröffentlichung enthält auch einen einzelnen Build für jedes Linux: https://downloads.critto.app/releases/<version>/critto-server-<version>-linux-x86_64.tar.gz (oder -aarch64). Entpacke ihn und führe ./crittod serve aus. Du musst ihn selbst am Laufen und auf dem neuesten Stand halten; Pakete sind daher einfacher.


2. Apps koppeln

Der Server lässt nur Geräte zu, die du gekoppelt hast. So koppelst du ein Gerät:

  1. Rufe auf dem Server einen Code ab (er gilt 10 Minuten und kann einmal verwendet werden):

    sudo crittod pair
    
  2. Wähle in der Critto-App auf dem Anmeldebildschirm Meinen eigenen Critto-Server verwenden. Gib Serveradresse und Code ein.

Sobald ein Gerät gekoppelt ist, kannst du von dort weitere koppeln: Einstellungen → Geräte → Handy koppeln zeigt einen QR-Code mit der Serveradresse. Wenn deine Geräte den Server anders erreichen (Tunnel, Proxy, Domain), setze CRITTO_PUBLIC_URL auf diese Adresse (siehe Einstellungen).

Desktop-App auf demselben Computer? Normalerweise startet die Desktop-App einen eigenen privaten Critto-Server. Wenn du den Server hier installiert hast, wähle stattdessen Meinen eigenen Critto-Server verwenden mit http://127.0.0.1:8787, damit beide dieselben Crittos verwenden.


3. Deine KIs verbinden

Crittos denken mit einer KI deiner Wahl. Du kannst sie auf zwei Arten einbinden.

Deine KI-Abos (ChatGPT, Claude, Grok…)

Critto verbindet sich über die offiziellen Kommandozeilen-Apps der Anbieter mit diesen KIs. Installiere sie einmal auf dem Server:

sudo crittod setup ai

Wähle die Apps, die du verwendest, oder gib ihre Namen direkt an: sudo crittod setup ai codex claude.

App Abo
codex ChatGPT-Plan (Plus, Pro, Business…)
claude Claude-Plan (Pro, Max…)
grok SuperGrok / X Premium
muse Meta AI (benötigt Node.js 20+; wenn möglich, fügt das Installationsprogramm es hinzu)
antigravity Google Antigravity. Lies zuerst den Warnhinweis: Laut Googles Bedingungen sollte andere Software keine Antigravity-Anmeldung nutzen; Google hat dafür bereits Konten gesperrt.

Die Apps werden in /opt/critto-ai installiert und aktualisieren sich nicht selbst. Führe gelegentlich sudo crittod setup ai --update aus.

Öffne in der Critto-App „Verbindungen“ und melde dich bei jeder App an. Die Anmeldungen werden auf dem Server gespeichert, nicht in der App.

Eigene KI: lokale Modelle und API-Schlüssel

Aktiviere Einstellungen → Erweiterten Modus und öffne dann Einstellungen → Eigene KI → Verbindung hinzufügen. Alles, was die „OpenAI-kompatible“ API unterstützt, funktioniert. Wähle unter Ausgangspunkt eine Vorlage oder gib die Adresse selbst ein:

Dienst Basis-URL API-Schlüssel
Ollama auf dem Server http://localhost:11434/v1 keiner
LM Studio auf dem Server http://localhost:1234/v1 keiner
Ollama auf einem anderen Computer zu Hause http://192.168.1.20:11434/v1 keiner
OpenRouter https://openrouter.ai/api/v1 dein OpenRouter-Schlüssel

Wähle Verbindung testen, dann ein Modell und speichere. Danach kannst du diese KI für jedes Critto auswählen.

Damit Ollama auf einem anderen Computer Verbindungen aus deinem Netzwerk annimmt, starte es mit OLLAMA_HOST=0.0.0.0. „localhost“ bezeichnet immer den Computer des Critto-Servers.


4. Die Höhle (optional)

Die Höhle ist der eigene Computer deiner Crittos in der Cloud für größere Aufgaben (Dinge bauen, im Web stöbern, Apps nutzen). Ein selbst gehosteter Server betreibt Dens in deinem eigenen Boat-Konto. Füge deinen Boat-API-Schlüssel in der App unter *Verbindungen ein oder trage ihn als BOAT_API_KEY in die Einstellungsdatei ein und starte den Server neu.

Gut zu wissen:

  • Dein Server muss nicht aus dem Internet erreichbar sein, damit die Höhle funktioniert. Er verbindet sich mit der Höhle, nicht umgekehrt.
  • Für Arbeit in der Höhle brauchst du eine KI mit öffentlicher Internetadresse (dein Abo oder einen Dienst wie OpenRouter). Eine KI in deinem eigenen Netzwerk (Ollama, LM Studio) kann chatten, aber die Cloud-Höhle kann sie nicht erreichen.
  • Die Zeit in der Höhle wird von Boat über dein Konto abgerechnet.

Deine eigene Höhle auf deinem eigenen Computer

Kein Boat-Konto? Der Server kann die Höhle jeder Person stattdessen als kleine virtuelle Maschine auf diesem Computer ausführen (benötigt /dev/kvm, während des Betriebs etwa 4 GB Arbeitsspeicher je Höhle und ein einmalig erstelltes Image). Unter NixOS:

services.critto.den.backend = "local";

Auf anderen Systemen: CRITTO_DEN_BACKEND=local in /etc/critto/critto.env. Die vollständige Anleitung (Voraussetzungen, Größen, erreichbare Ziele der Höhle, Image-Erstellung) steht unter Deine eigene Höhle auf deinem eigenen Computer.


5. Von anderen Geräten darauf zugreifen

Standardmäßig nimmt der Server nur Verbindungen auf seinem eigenen Computer an (127.0.0.1:8787). Das ist die sichere Voreinstellung. Um dein Handy oder deinen Laptop von überall zu nutzen, wähle eine Möglichkeit. Die ersten beiden liefern eine sichere https://-Adresse, ohne Ports am Router zu öffnen.

Tailscale (am einfachsten für den persönlichen Gebrauch)

Installiere Tailscale auf dem Server und deinen Geräten, melde dich überall mit demselben Konto an und führe dann auf dem Server Folgendes aus:

sudo tailscale serve --bg 8787

Das Programm gibt eine Adresse wie https://myserver.tail1234.ts.net aus. Verwende sie in den Apps. Nur deine eigenen Geräte können darauf zugreifen.

Cloudflare Tunnel (öffentliche Adresse unter deiner eigenen Domain)

Richte eine Domain bei Cloudflare ein und installiere cloudflared. Führe dann Folgendes aus:

cloudflared tunnel login
cloudflared tunnel create critto
cloudflared tunnel route dns critto critto.example.com
cat > ~/.cloudflared/config.yml <<EOF
tunnel: critto
credentials-file: $HOME/.cloudflared/$(cloudflared tunnel list | awk '/critto/{print $1}').json
ingress:
  - hostname: critto.example.com
    service: http://127.0.0.1:8787
  - service: http_status:404
EOF
sudo cloudflared service install

Dein Server ist dann unter https://critto.example.com erreichbar. Jedes Gerät braucht weiterhin einen Kopplungscode.

Einen bereits laufenden Reverse-Proxy verwenden

Leite ihn mit aktivierten WebSockets an http://127.0.0.1:8787 weiter. Mit Caddy, das HTTPS selbst verwaltet, sieht das so aus:

critto.example.com {
    reverse_proxy 127.0.0.1:8787
}

Nur im Heimnetzwerk

Wenn alle Geräte zu Hause sind, kannst du den Server direkt auf deinem Netzwerk erreichbar machen. Setze CRITTO_LISTEN=0.0.0.0:8787 (siehe Einstellungen) und verwende in den Apps http://<server's IP address>:8787. Das ist unverschlüsseltes HTTP; nutze es nur in einem Netzwerk, dem du vertraust.

Egal, wofür du dich entscheidest: Setze CRITTO_PUBLIC_URL auf diese Adresse, damit die Kopplungs-QR-Codes darauf verweisen.


6. Aktualisierungen

Der Server wird zusammen mit dem Rest deines Systems aktualisiert:

  • Debian / Ubuntu: sudo apt update && sudo apt upgrade
  • Fedora / RHEL: sudo dnf upgrade
  • openSUSE: sudo zypper update

Nach einer Aktualisierung startet sich der Dienst selbst neu. Desktop- und Handy-Apps werden separat aktualisiert.


7. Sicherungskopien

Alles liegt in /var/lib/critto: deine Crittos, Erinnerungen, Chats, Dateien und KI-Anmeldungen. Einstellungen stehen in /etc/critto/critto.env.

*Selbst kopieren. Halte den Server an, damit die Kopie konsistent ist:

sudo systemctl stop critto
sudo tar czf critto-backup-$(date +%F).tar.gz --exclude=/etc/critto/vault.key /var/lib/critto /etc/critto
sudo systemctl start critto

Während des Betriebs bewahrt der Server außerdem eine aktuelle Datenbankkopie unter /var/lib/critto/backups/latest.db auf.

*Externe Sicherungskopien (S3, Cloudflare R2, Backblaze B2…). Aktiviere in der App den *Erweiterten Modus und gehe dann zu Einstellungen → Sicherungskopien → Ziel ändern…. Verschlüssele sie vor dem Versand vom Server, indem du einen Sicherungsschlüssel hinzufügst:

sudo crittod backup keygen

Kopiere die Zeile CRITTO_BACKUP_KEY=… in /etc/critto/critto.env, bewahre eine Kopie sicher und offline auf (ohne sie lassen sich Sicherungskopien nicht wiederherstellen) und starte neu: sudo systemctl restart critto.

Externe Sicherungskopien werden fortlaufend erstellt:

  • Änderungen an der Datenbank werden alle 10 Sekunden hochgeladen;
  • Dateien werden alle 10 Minuten hochgeladen;
  • täglich wird eine vollständige Kopie hochgeladen.

Du kannst jeden Zeitpunkt der letzten 7 Tage direkt aus dem Speicher wiederherstellen:

sudo systemctl stop critto
sudo -u critto crittod backup list
sudo -u critto crittod backup pitr --to /var/lib/critto/restore --at "2026-10-02 14:30"
sudo -u critto mv /var/lib/critto/restore/critto.db /var/lib/critto/critto.db
sudo systemctl start critto

(--at ist UTC; lass die Option weg, um den neuesten Stand wiederherzustellen. Der wiederhergestellte Ordner users/ bleibt am selben Ort.)

Um stattdessen eine einzelne heruntergeladene Sicherungsdatei (einen täglichen Snapshot) wiederherzustellen, lege sie an einen Ort, den der Benutzer critto lesen kann (z. B. /var/lib/critto) und führe dann Folgendes aus:

sudo systemctl stop critto
sudo crittod backup restore --from /path/to/downloaded-backup --to /var/lib/critto/restored.db
sudo -u critto mv /var/lib/critto/restored.db /var/lib/critto/critto.db
sudo systemctl start critto

*Die Tresorschlüssel. Gespeicherte Schlüssel und Passwörter werden mit einem Hauptschlüssel in /etc/critto/vault.key verschlüsselt (bei der Installation erstellt, nur für den Benutzer critto lesbar; in Docker im Volume critto-keys, unter NixOS standardmäßig in services.critto.vaultKeyFile unter /var/lib/critto-keys/vault.key: immer außerhalb der Daten). Er wird nie in einer Sicherungskopie gespeichert. Die Liste der damit entsperrten Kontoschlüssel (/var/lib/critto/vault/keys.db) erhält eine eigene verschlüsselte Sicherungskopie neben den anderen unter vault/, die 30 Tage aufbewahrt wird – aber nur, wenn du einen Wiederherstellungsschlüssel angibst:

sudo crittod vault recovery-keygen

Trage die Zeile CRITTO_VAULT_BACKUP_RECIPIENT=… in /etc/critto/critto.env ein und starte den Server neu. Bewahre die ausgegebene Wiederherstellungsidentität und eine Kopie von /etc/critto/vault.key offline in deinem Passwortmanager auf, niemals auf dem Server. Wenn du den Server verlierst, lege vault.key zurück, lade vault/latest.db.age herunter und führe dann Folgendes aus:

sudo -u critto crittod vault restore --identity /path/to/recovery.txt /path/to/latest.db.age

Einstellungen

Der Server liest /etc/critto/critto.env. Dort sind alle Optionen erklärt. Bearbeite die Datei mit sudo nano /etc/critto/critto.env und führe dann sudo systemctl restart critto aus. Häufige Einstellungen:

Einstellung Wirkung
CRITTO_LISTEN Wo der Server Verbindungen annimmt. Standard 127.0.0.1:8787 (nur dieser Computer).
CRITTO_PUBLIC_URL Adresse für deine Geräte, z. B. https://critto.example.com.
BOAT_API_KEY Dein Boat-Schlüssel für die Höhle.
CRITTO_BACKUP_KEY Verschlüsselt externe Sicherungskopien.
CRITTO_ANTIGRAVITY=0 Blendet Antigravity aus.
CRITTO_PROACTIVE=0 Crittos melden sich nicht von selbst (geplante Aktivitäten warten). Ohne Critto Smarts verwenden sie für Rückmeldungen ihre eigene KI.
CRITTO_JOB_WORKERS Anzahl gleichzeitig ausgeführter Hintergrundaufgaben (Rückmeldungen, geplante Aktivitäten). Standard: 4.

Nützliche Befehle:

Befehl
sudo crittod pair Kopplungscode für ein neues Gerät
sudo crittod setup ai KI-Apps installieren oder aktualisieren
sudo crittod users Konten auf diesem Server anzeigen
systemctl status critto Läuft der Dienst?
journalctl -u critto -f Protokoll des Dienstes
curl http://127.0.0.1:8787/health Kurze Statusprüfung

/health zeigt "desktop": "on-demand" an, bis eine Höhle erstmals Desktop-Software benötigt. Das ist normal: Der Server lädt sie dann herunter.


Deinstallieren

  • Debian / Ubuntu: sudo apt purge critto-server
  • Fedora / RHEL: sudo dnf remove critto-server
  • Docker: docker rm -f critto (füge docker volume rm critto-data critto-keys critto-ai hinzu, um auch die Daten zu löschen)

Dadurch wird der Server angehalten und das Paket sowie – sofern kein anderes Critto-Paket übrig ist – die Paketquelle entfernt. Deine Daten unter /var/lib/critto bleiben erhalten, falls du zurückkommst. So löschst du alles:

sudo rm -rf /var/lib/critto /etc/critto /opt/critto-ai
sudo userdel critto

Damit die Pakete die Paketquelle gar nicht erst hinzufügen, führe vor der Installation echo CRITTO_REPO=no | sudo tee /etc/default/critto aus.


Fehlerbehebung

  • Die App sagt, dass sie den Server nicht erreicht. Prüfe auf dem Server systemctl status critto und ob die Adresse in der App von diesem Gerät erreichbar ist (auf einem Handy bezeichnet 127.0.0.1 das Handy selbst).
  • „Der Kopplungscode hat nicht funktioniert.“ Codes gelten 10 Minuten und können einmal verwendet werden. Erstelle mit sudo crittod pair einen neuen. Führe den Befehl mit sudo aus; andernfalls erhältst du einen Code für einen anderen persönlichen Server.
  • Eine KI-App wird unter „Verbindungen“ nicht angezeigt. Führe sudo crittod setup ai <name> erneut aus; danach startet der Server neu.
  • Etwas anderes. journalctl -u critto -n 100 zeigt meistens, was schiefläuft.