Critto zwykle działa na twoim koncie Critto. Jeśli wolisz trzymać wszystko na komputerze, który należy do ciebie, możesz samodzielnie uruchomić serwer Critto: twoje critto, ich wspomnienia i twoje czaty pozostaną na tym komputerze, a aplikacje Critto na komputer i telefon będą się z nim łączyć.

Ten przewodnik dotyczy Linuksa. Potrzebujesz:

  • 64-bitowego komputera z Linuksem (Intel/AMD lub ARM, np. Raspberry Pi 4/5), który będzie stale włączony: serwera domowego, mini PC albo małego serwera w chmurze,
  • około 1 GB wolnej pamięci i kilku GB miejsca na dysku,
  • uprawnień administratora (sudo).

Dla NixOS dostępny jest flake z modułem NixOS. Debian, Ubuntu, Fedora, systemy w stylu RHEL i openSUSE mają gotowe pakiety z automatycznymi aktualizacjami. W pozostałych systemach możesz użyć obrazu kontenera lub kompilacji statycznej.


NixOS

Dodaj flake Critto do swojego flake systemowego:

{
  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";
          };
        })
      ];
    };
  };
}

Następnie uruchom sudo nixos-rebuild switch --flake .#myserver i sparuj aplikacje poleceniem sudo crittod pair (krok 2).

  • Aktualizacje: uruchom nix flake update critto, a potem przebuduj system. Pakiet to podpisane, gotowe wydanie (statyczny plik binarny, więc nie ma problemów z glibc). Kanał beta: services.critto.package = critto.packages.${system}.crittod-beta;.
  • Sekrety: umieść BOAT_API_KEY=… i CRITTO_BACKUP_KEY=… w pliku environmentFile (właścicielem ma być root, tryb 600; działają też agenix i sops-nix). Plik jest odczytywany przy uruchomieniu usługi i nigdy nie trafia do magazynu Nix.
  • Ustawienia: listen (domyślnie 127.0.0.1:8787), publicUrl, webHost, openFirewall (domyślnie wyłączone), dataDir (domyślnie /var/lib/critto) oraz settings dla innych zmiennych CRITTO_*. den.backend wybiera miejsce działania Nora (boat, local lub none; zobacz Nora).
  • Aplikacje AI: w aiPackages wybieraj pakiety z nixpkgs (np. pkgs.codex, pkgs.claude-code, które wymaga allowUnfree). Dla aplikacji niedostępnych w nixpkgs włącz programs.nix-ld.enable = true; i użyj sudo crittod setup ai (krok 3). Pi potrzebuje tylko pkgs.nodejs_22 w aiPackages, a potem polecenia sudo crittod setup ai pi.
  • Dostęp zdalny: włącz services.tailscale.enable = true;, a potem uruchom sudo tailscale serve --bg 8787 albo skonfiguruj services.cloudflared z regułą ingress do http://127.0.0.1:8787 (zobacz krok 5).
  • Usługa działa w izolacji systemd, ale zachowuje dostęp do przestrzeni nazw użytkowników (potrzebują ich bubblewrap i lokalna Nora), więc nie ustawiaj security.allowUserNamespaces = false.

Pozostała część przewodnika dotyczy również NixOS, z wyjątkiem aktualizacji, które wykonuje się przez nix flake update, a nie apt ani dnf.


1. Instalacja

Otwórz terminal na serwerze i uruchom:

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

To polecenie dodaje repozytorium pakietów Critto, instaluje pakiet critto-server, uruchamia serwer i wyświetla kod parowania. Gotowe: przejdź do sekcji Sparuj aplikacje.

Chcesz otrzymywać nowe wersje przed innymi? Użyj kanału beta: curl -fsSL https://downloads.critto.app/install-server.sh | CRITTO_CHANNEL=beta sh

Najpierw sprawdź instalator (opcjonalnie)

Skrypt jest podpisany kluczem wydawniczym Critto. Aby zweryfikować go przed uruchomieniem:

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 jest dostępny w pakietach większości dystrybucji). Dostępna jest też zwykła suma kontrolna w pliku install-server.sh.sha256. Pakiety również są podpisane, a menedżer pakietów sprawdza je przy każdej instalacji i aktualizacji.

Możesz też samodzielnie dodać repozytorium

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

Odcisk klucza: C78E FB7F 67CC 8184 1F70 EE3D D121 DC94 C534 50E3 ("Critto Packages packages@critto.app").

Możesz też użyć Docker / Podman

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

Kontener nie wymaga specjalnych uprawnień. Dane znajdują się w woluminie critto-data, a aplikacje AI w critto-ai. Zaktualizuj je poleceniem docker pull ghcr.io/nexferra-ltd/critto-server:latest, a potem odtwórz kontener z tymi samymi woluminami.

Możesz też użyć kompilacji statycznej

Każde wydanie zawiera też pojedynczy plik działający na dowolnym Linuksie: https://downloads.critto.app/releases/<version>/critto-server-<version>-linux-x86_64.tar.gz (lub -aarch64). Rozpakuj go i uruchom ./crittod serve. Trzeba samodzielnie utrzymywać serwer w działaniu i aktualizować go, dlatego pakiety są łatwiejszym rozwiązaniem.


2. Parowanie aplikacji

Serwer dopuszcza tylko sparowane urządzenia. Aby sparować nowe:

  1. Na serwerze uzyskaj kod (jest ważny przez 10 minut i działa tylko raz):

    sudo crittod pair
    
  2. W aplikacji Critto, na ekranie logowania, wybierz Użyj własnego serwera Critto. Wpisz adres serwera i kod.

Po sparowaniu jednego urządzenia możesz sparować z niego kolejne: Ustawienia → Urządzenia → Sparuj telefon wyświetla kod QR. Zawiera on adres, na którym nasłuchuje serwer. Jeśli urządzenia łączą się z nim w inny sposób (przez tunel, proxy lub domenę), ustaw CRITTO_PUBLIC_URL na ten adres (zobacz Ustawienia).

Aplikacja na komputerze i serwer na tym samym komputerze? Aplikacja na komputerze zwykle uruchamia własny, prywatny serwer Critto. Jeśli serwer jest już zainstalowany, wybierz Użyj własnego serwera Critto z adresem http://127.0.0.1:8787, aby oba korzystały z tych samych critto.


3. Połącz swoje AI

Critto myśli za pomocą wybranego przez ciebie AI. Możesz podłączyć je na dwa sposoby.

Twoje subskrypcje AI (ChatGPT, Claude, Grok…)

Critto łączy się z nimi przez oficjalne aplikacje wiersza poleceń, które instalujesz na serwerze jeden raz:

sudo crittod setup ai

Wybierz używane aplikacje albo podaj ich nazwy bezpośrednio: sudo crittod setup ai codex claude.

Aplikacja Działa z
codex planem ChatGPT (Plus, Pro, Business…)
claude planem Claude (Pro, Max…)
grok SuperGrok / X Premium
muse Meta AI (wymaga Node.js 20+; jeśli to możliwe, instalator doda je sam)
antigravity Google Antigravity. Najpierw przeczytaj wyświetlane ostrzeżenie: regulamin Google zabrania innym programom korzystania z logowania do Antigravity, a Google zawieszało za to konta.

Zostaną zainstalowane w /opt/critto-ai i nie aktualizują się samodzielnie. Od czasu do czasu uruchom sudo crittod setup ai --update, by je zaktualizować.

Potem w aplikacji Critto otwórz Połączenia i zaloguj się do każdej usługi. Dane logowania są przechowywane na serwerze, nie w aplikacji.

Własne AI: modele lokalne i klucze API

Włącz Ustawienia → Tryb Zaawansowane, a potem wybierz Ustawienia → Własne AI → Dodaj połączenie. Działa wszystko, co obsługuje API „zgodne z OpenAI”. Wybierz gotowe ustawienie w sekcji Rozpocznij od albo samodzielnie wpisz adres:

Usługa Podstawowy adres URL Klucz API
Ollama na serwerze http://localhost:11434/v1 brak
LM Studio na serwerze http://localhost:1234/v1 brak
Ollama na innym komputerze w domu http://192.168.1.20:11434/v1 brak
OpenRouter https://openrouter.ai/api/v1 twój klucz OpenRouter

Wybierz Sprawdź połączenie, model i zapisz. Potem możesz wybrać to AI dla dowolnego critto.

Aby Ollama na innym komputerze przyjmowała połączenia z twojej sieci, uruchom ją z OLLAMA_HOST=0.0.0.0. „localhost” zawsze oznacza sam komputer z serwerem Critto.


4. Nora (opcjonalnie)

Nora to własny komputer twoich critto w chmurze, na którym wykonują większe zadania (tworzą rzeczy, przeglądają internet i korzystają z aplikacji). Serwer na własnym hostingu uruchamia Nora na twoim koncie Boat. Wklej klucz API Boat w aplikacji, w sekcji Połączenia, albo wpisz go w pliku ustawień jako BOAT_API_KEY i uruchom serwer ponownie.

Warto wiedzieć:

  • Serwer nie musi być dostępny z internetu, aby działała Nora. To serwer łączy się z Nora, a nie odwrotnie.
  • Do pracy w Nora potrzebne jest AI z publicznym adresem internetowym (twoja subskrypcja albo usługa taka jak OpenRouter). AI działające w twojej sieci (Ollama, LM Studio) może rozmawiać, ale Nora w chmurze nie może się z nim połączyć.
  • Boat nalicza opłatę za czas działania Nora na twoim koncie.

Własna Nora na własnym komputerze

Nie masz konta Boat? Serwer może zamiast tego uruchamiać Nora każdej osoby jako małą maszynę wirtualną na tym komputerze (potrzebuje /dev/kvm, około 4 GB pamięci na każdą działającą Nora i jednorazowego przygotowania obrazu). W NixOS:

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

W innych systemach wpisz CRITTO_DEN_BACKEND=local w /etc/critto/critto.env. Pełny przewodnik (wymagania, rozmiary, dostęp Nora i przygotowanie obrazu) znajdziesz tutaj: Własna Nora na własnym komputerze.


5. Dostęp z innych urządzeń

Domyślnie serwer nasłuchuje tylko na swoim komputerze (127.0.0.1:8787). To bezpieczne ustawienie. Jeśli chcesz używać telefonu lub laptopa z dowolnego miejsca, wybierz jedną z metod poniżej. Dwie pierwsze zapewniają bezpieczny adres https:// bez otwierania portów na routerze.

Tailscale (najłatwiej do użytku osobistego)

Zainstaluj Tailscale na serwerze i urządzeniach, zaloguj się na to samo konto, a potem na serwerze uruchom:

sudo tailscale serve --bg 8787

Zobaczysz adres w rodzaju https://myserver.tail1234.ts.net. Użyj go w aplikacjach. Dostęp do niego mają tylko twoje urządzenia.

Cloudflare Tunnel (publiczny adres we własnej domenie)

Jeśli masz domenę w Cloudflare, zainstaluj cloudflared, a potem:

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

Serwer będzie dostępny pod adresem https://critto.example.com. Każde urządzenie nadal musi otrzymać kod parowania.

Używany już przez ciebie serwer proxy

Skieruj go na http://127.0.0.1:8787 i zezwól na WebSockets. Oto konfiguracja Caddy, który sam obsługuje HTTPS:

critto.example.com {
    reverse_proxy 127.0.0.1:8787
}

Tylko w domowej sieci

Jeśli wszystkie urządzenia są w domu, możesz pozwolić serwerowi nasłuchiwać bezpośrednio w sieci. Ustaw CRITTO_LISTEN=0.0.0.0:8787 (zobacz Ustawienia) i wpisz w aplikacjach http://<server's IP address>:8787. To zwykłe połączenie http, więc używaj go tylko w zaufanej sieci.

Niezależnie od wybranej metody ustaw CRITTO_PUBLIC_URL na ten adres, by kody QR parowania prowadziły we właściwe miejsce.


6. Aktualizacje

Serwer aktualizuje się razem z resztą systemu:

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

Po aktualizacji usługa uruchamia się ponownie sama. Aplikacje na komputer i telefon aktualizują się osobno.


7. Kopie zapasowe

Wszystko znajduje się w /var/lib/critto: twoje critto, wspomnienia, czaty, pliki i dane logowania do AI. Ustawienia są w /etc/critto/critto.env.

Skopiuj je samodzielnie. Aby kopia była spójna, zatrzymaj serwer:

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

Gdy serwer działa, przechowuje też aktualną kopię bazy danych w /var/lib/critto/backups/latest.db.

Kopie poza serwerem (S3, Cloudflare R2, Backblaze B2…). W aplikacji włącz Tryb Zaawansowane, a następnie wybierz Ustawienia → Kopie zapasowe → Zmień miejsce…. Zaszyfruj kopie przed wysłaniem ich z serwera, dodając klucz kopii zapasowej:

sudo crittod backup keygen

Skopiuj wiersz CRITTO_BACKUP_KEY=… do /etc/critto/critto.env, zachowaj kopię klucza w bezpiecznym miejscu bez dostępu do internetu (bez niego nie da się przywrócić kopii) i uruchom ponownie: sudo systemctl restart critto.

Kopie poza serwerem są tworzone na bieżąco:

  • zmiany w bazie danych są wysyłane co 10 sekund;
  • pliki użytkowników są wysyłane co 10 minut;
  • pełna kopia jest wysyłana codziennie.

Możesz przywrócić dowolny stan z ostatnich 7 dni bezpośrednio z zasobnika:

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 przyjmuje czas UTC; pomiń go, by przywrócić najnowszy stan. Przywrócony katalog users/ pozostaje w tym samym miejscu.)

Aby przywrócić kopię przechowywaną poza serwerem, pobierz plik z miejsca przechowywania i umieść go tam, gdzie może go odczytać użytkownik critto (np. /var/lib/critto), a następnie:

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

Klucze sejfu. Zapisane klucze i hasła są szyfrowane kluczem głównym w /etc/critto/vault.key (utworzonym podczas instalacji, czytelnym tylko dla użytkownika critto; w Dockerze w woluminie critto-keys, w NixOS w services.critto.vaultKeyFile, domyślnie /var/lib/critto-keys/vault.key: zawsze poza katalogiem danych). Nie ma go w kopiach zapasowych. Lista kluczy poszczególnych kont, które odblokowuje (/var/lib/critto/vault/keys.db), ma własną zaszyfrowaną kopię obok pozostałych, w vault/, przechowywaną przez 30 dni, ale tylko po dodaniu klucza odzyskiwania:

sudo crittod vault recovery-keygen

Umieść wiersz CRITTO_VAULT_BACKUP_RECIPIENT=… w /etc/critto/critto.env i uruchom serwer ponownie. Zachowaj wydrukowaną tożsamość odzyskiwania oraz kopię /etc/critto/vault.key offline, w menedżerze haseł: nigdy na serwerze. Aby przywrócić dane po utracie serwera, przywróć vault.key, pobierz vault/latest.db.age, a następnie:

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

Ustawienia

Serwer odczytuje /etc/critto/critto.env. Każda opcja jest tam opisana. Edytuj plik poleceniem sudo nano /etc/critto/critto.env, a następnie uruchom sudo systemctl restart critto. Najczęściej używane opcje:

Ustawienie Działanie
CRITTO_LISTEN Adres nasłuchiwania serwera. Domyślnie 127.0.0.1:8787 (tylko ten komputer).
CRITTO_PUBLIC_URL Adres używany przez twoje urządzenia, np. https://critto.example.com.
BOAT_API_KEY Twój klucz Boat do Nora.
CRITTO_BACKUP_KEY Szyfruje kopie zapasowe przechowywane poza serwerem.
CRITTO_ANTIGRAVITY=0 Ukrywa Antigravity.
CRITTO_PROACTIVE=0 Twoje critto nie wysyłają samodzielnie meldunków (zaplanowane zadania czekają). Bez Critto Smarts meldunki korzystają z własnego AI critto.
CRITTO_JOB_WORKERS Liczba zadań w tle (meldunków i zaplanowanych zadań) wykonywanych jednocześnie. Domyślnie 4.

Przydatne polecenia:

Polecenie
sudo crittod pair kod parowania nowego urządzenia
sudo crittod setup ai instaluje lub aktualizuje aplikacje AI
sudo crittod users konta na tym serwerze
systemctl status critto czy serwer działa?
journalctl -u critto -f dziennik serwera
curl http://127.0.0.1:8787/health szybkie sprawdzenie stanu

Do chwili, gdy Nora po raz pierwszy będzie potrzebować oprogramowania pulpitu, /health pokazuje "desktop": "on-demand". To normalne: serwer pobierze je wtedy automatycznie.


Odinstalowanie

  • Debian / Ubuntu: sudo apt purge critto-server
  • Fedora / RHEL: sudo dnf remove critto-server
  • Docker: docker rm -f critto (dodaj docker volume rm critto-data critto-keys critto-ai, by usunąć też dane)

To zatrzyma serwer, usunie pakiet i repozytorium, jeśli nie pozostał żaden inny pakiet Critto. Twoje dane w /var/lib/critto zostaną zachowane, na wypadek, gdy wrócisz. Aby usunąć wszystko:

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

Aby podczas instalacji pakiety nie dodawały repozytorium, przed instalacją uruchom echo CRITTO_REPO=no | sudo tee /etc/default/critto.


Rozwiązywanie problemów

  • Aplikacja informuje, że nie może połączyć się z serwerem. Sprawdź na serwerze systemctl status critto i upewnij się, że adres wpisany w aplikacji jest osiągalny z urządzenia (na telefonie 127.0.0.1 oznacza sam telefon).
  • „Kod parowania nie zadziałał”. Kody są ważne przez 10 minut i działają tylko raz. Wygeneruj nowy poleceniem sudo crittod pair. Uruchom je z sudo; bez tego otrzymasz kod do innego, prywatnego serwera.
  • Aplikacja AI nie pojawia się w sekcji Połączenia. Ponownie uruchom sudo crittod setup ai <name>; po zakończeniu serwer zostanie uruchomiony ponownie.
  • Inny problem. Polecenie journalctl -u critto -n 100 zwykle pokazuje, co poszło nie tak.