Bądź jak Tony Stark z Claude Code — jak zrobiłem sobie zdalne środowisko do programowania
Pomysły na zmiany w kodzie przychodzą nie tylko wtedy, kiedy siedzę przy biurku. Przychodzą w kinie na reklamach, na urodzinach kolegi mojej córki z przedszkola, w kolejce albo na spacerze. Do niedawna kończyło się to notatką w telefonie.
Teraz wygląda to inaczej. Wyciągam telefon, piszę dwa zdania, a zmiana zaczyna się robić na serwerze we Frankfurcie, zanim skończą się reklamy. Ewentualnie mówię, a mój własny J.A.R.V.I.S. robi co mu każę.
Poniżej opisuję, jak sobie to poskładałem i dlaczego taki sposób pracy okazał się dla mnie zaskakująco wygodny.
Stan konfiguracji: październik 2026.
Claude Code i jego funkcje zdalne rozwijają się dość szybko, więc część szczegółów tego rozwiązania może z czasem się zmienić.
Co właściwie zbudowałem
Całość składa się z trzech głównych elementów:
- Serwer w Oracle Cloud (region Frankfurt), włączony całą dobę, z moimi repozytoriami i kompletem narzędzi do budowania.
- Claude Code uruchomiony na tym serwerze w trybie Remote Control, w sesji
tmux, która żyje niezależnie od tego, czy jestem zalogowany. - Aplikacja Claude w telefonie, z której otwieram sesje na tym serwerze, zlecam pracę i odpowiadam na pytania o uprawnienia.
Najważniejsza rzecz do zrozumienia: kod nie wędruje do telefonu ani do żadnego dodatkowego środowiska w chmurze. Claude Code działa na moim serwerze, na moich plikach, z moimi narzędziami. Telefon jest tylko pilotem.
Schemat wygląda w uproszczeniu tak:
📱 Telefon
aplikacja Claude
│
│ Remote Control
▼
☁️ Oracle Cloud / ARM
┌─────────────────────┐
│ Ubuntu │
│ │
│ Claude Code │
│ │ │
│ tmux │
│ │ │
│ moje repozytoria │
│ │ │
│ testy / buildy │
└─────────────────────┘
Ile to kosztuje?
W mojej konfiguracji:
- serwer Oracle Cloud: 0 zł — korzystam z darmowego planu Always Free,
- Tailscale: 0 zł,
- dodatkowe narzędzia systemowe: 0 zł,
- Claude: koszt mojej subskrypcji.
Czyli sam serwer nie generuje mi dodatkowego kosztu. Najważniejszym ograniczeniem nie jest więc cena maszyny, tylko to, co chcę na niej uruchamiać i ile pracy deleguję agentowi.
Serwer: ARM z Oracle Cloud
Maszyna to instancja ARM (Ampere): 4 rdzenie, 24 GB RAM. Na kompilowanie, testy i kilka równoległych sesji agenta wystarcza z dużym zapasem.
Najlepiej zacząć od porządków. Oracle daje domyślnego użytkownika ubuntu, więc warto od razu stworzyć własne konto.
sudo adduser twoj_user
sudo usermod -aG sudo twoj_user
Po zalogowaniu na nowe konto przeniosłem klucze SSH i usunąłem konto domyślne:
mkdir ~/.ssh && chmod 700 ~/.ssh
sudo cp /home/ubuntu/.ssh/authorized_keys ~/.ssh/authorized_keys
sudo chown -R $USER:$USER ~/.ssh && chmod 600 ~/.ssh/authorized_keys
sudo pkill -u ubuntu
sudo userdel -r ubuntu
Do tego podstawowy zestaw:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git tmux
Nie jest to oczywiście kompletna instrukcja zabezpieczania serwera. To po prostu minimum, które przygotowałem na potrzeby tego środowiska.
Tailscale jako wejście awaryjne
Serwer dołączył do mojego tailnetu, o którym pisałem już w artykule o Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
Dzięki temu z laptopa i z telefonu mam SSH do serwera po nazwie hosta, bez pamiętania publicznego adresu IP.
Tailscale nie jest jednak potrzebny do samego sterowania Claude Code z telefonu. Remote Control działa przez połączenie z usługami Anthropic. U mnie Tailscale pełni przede wszystkim rolę awaryjnego wejścia na maszynę: kiedy trzeba coś poprawić ręcznie, zrestartować sesję albo zwyczajnie sprawdzić, co dzieje się na serwerze.
Instalacja Claude Code
Instalacja jest prosta:
curl -fsSL https://claude.ai/install.sh | bash
claude login
Natywny instalator nie wymaga Node.js ani sudo. Binarka trafia do katalogu domowego (~/.local/bin/claude) i sama się aktualizuje.
claude login wyświetla link do autoryzacji. Otwieram go w przeglądarce na dowolnym urządzeniu i loguję się tym samym kontem, którego używam w aplikacji w telefonie. To konto spina później obie strony.
Repozytoria
Na maszynę ściągnąłem swoje prywatne repozytoria, więc mogę działać od razu na projektach, nad którymi ostatnio pracowałem.
Nie jest to jednak ograniczenie. Równie szybko mogę kazać agentowi stworzyć repozytorium z nowego pomysłu. Dobrze mieć jednak odniesienie do własnego kodu:
„Zrób to podobnie jak zrobiłem to w repozytorium xyz”.
Wtedy agent ma do dyspozycji nie tylko opis tego, co chcę osiągnąć, ale również mój istniejący sposób organizowania kodu.
Remote Control w tmuxie
To jest sedno całej konfiguracji.
Claude Code ma tryb Remote Control, w którym lokalna instalacja rejestruje się w moim koncie i czeka na polecenia z claude.ai/code albo z aplikacji mobilnej.
Uruchamiam go w tmux:
tmux new -s claude-session
claude remote-control
Krótsza forma to:
claude rc
Potem odłączam się od tmuxa (Ctrl+b, d) i wylogowuję z serwera. Proces zostaje.
Kiedy chcę zajrzeć, co się tam dzieje:
tmux attach -t claude-session
W tym trybie Claude Code działa jak mały serwer sesji. Każde zadanie zlecone z telefonu uruchamia osobną sesję na maszynie, więc mogę prowadzić kilka wątków naraz — na przykład jeden w aplikacji mobilnej, a drugi w sterowniku do ESP.
Domyślnie sesje pracują w tym samym katalogu. Jest też tryb --spawn worktree, w którym każda dostaje własny git worktree i równoległe zmiany w jednym repozytorium nie wchodzą sobie w drogę.
Dwie rzeczy podobają mi się tu szczególnie
Żadnych otwartych portów.
Serwer sam nawiązuje połączenie wychodzące do Anthropic, a telefon łączy się z tym samym kontem. Nie wystawiam niczego na świat, nie konfiguruję przekierowań ani certyfikatów.
Decyzje zostają przy mnie.
Gdy Claude chce wykonać polecenie albo zmienić plik, a nie ma na to stałej zgody, pytanie trafia na telefon. Czytam, co zamierza zrobić, i zatwierdzam albo odrzucam. Zakres tej swobody ustawia się trybem uprawnień (--permission-mode).
To jest dla mnie ważne, bo agent ma dostęp do mojego kodu i może wykonywać realną pracę na maszynie. Nie chcę więc automatycznie zatwierdzać wszystkiego.
Jak to wygląda z telefonu
W aplikacji Claude wchodzę w zakładkę Code i widzę swój serwer na liście. Otwieram nową sesję i piszę albo dyktuję, co ma być zrobione.
Na przykład:
„W repozytorium xyz dodaj automatyczne generowanie sluga z tytułu przy edycji istniejących wpisów, uruchom testy i pokaż mi diff”.
Dalej wszystko dzieje się na serwerze: czytanie kodu, zmiany, testy. Ja dostaję podsumowanie, a po drodze pytania wymagające decyzji.
Jeśli wynik mi odpowiada, proszę o commit i push. Jeśli nie, dopisuję jedno zdanie korekty.
Ekran telefonu nie nadaje się do pisania kodu, ale do czytania krótkiego diffu i odpowiedzi „tak, ale nazwij to inaczej” nadaje się bardzo dobrze.
Praca przesuwa się z pisania na decydowanie.
A decydować da się w trzy minuty między zwiastunami, na spacerze czy w kolejce. Nie trzeba siedzieć przy komputerze.
Niespodzianka: Flutter na ARM
Jedno z moich repozytoriów to aplikacja we Flutterze i chciałem, żeby serwer potrafił zbudować APK.
Tu trafiłem na jedyny poważniejszy problem: narzędzia Android SDK (aapt2, adb, zipalign) istnieją tylko w wersji x86_64, a serwer jest na ARM.
Rozwiązaniem okazała się emulacja przez qemu-user zarejestrowana w binfmt_misc. System sam rozpoznaje binarki x86_64 i uruchamia je przez emulator:
sudo apt-get install -y qemu-user qemu-user-binfmt binfmt-support libc6-amd64-cross libstdc++6-amd64-cross zlib1g-dev libncurses6
sudo mkdir -p /etc/qemu-binfmt
sudo ln -sfn /usr/x86_64-linux-gnu /etc/qemu-binfmt/x86_64
sudo systemctl restart systemd-binfmt
Po tej operacji flutter doctor przestał narzekać, a serwer buduje APK.
Dodam, że do tego rozwiązania doszedł sam Claude Code. Pakiety wymagające sudo zebrał w jeden skrypt, który przeczytałem i uruchomiłem ręcznie.
Taki podział mi odpowiada: agent może szukać rozwiązania i przygotować zmiany, ale uprawnienia roota zostają po mojej stronie.
Python i uv
Do projektów pythonowych doinstalowałem jeszcze uv:
curl -LsSf https://astral.sh/uv/install.sh | sh
To drobiazg, ale dzięki temu serwer jest przygotowany nie tylko do moich obecnych repozytoriów, ale również do szybkiego rozpoczęcia kolejnego projektu.
Na co uważać
Dostęp do repozytoriów
Jeśli serwer ma klucz do repozytoriów, osoba, która uzyska dostęp do serwera, może uzyskać dostęp również do kodu.
Dlatego używam własnego użytkownika, logowania kluczem SSH i osobnego klucza do zdalnego repozytorium, który w razie potrzeby można szybko odwołać.
Uprawnienia agenta
Zatwierdzanie operacji na telefonie jest wygodne, ale bardzo łatwo wpaść w pułapkę bezmyślnego klikania „tak”.
W kinie szczególnie.
Wolę węższe uprawnienia i kilka pytań więcej niż pełną swobodę agenta na maszynie z moim kodem.
Restart serwera
Sesja tmux nie przeżywa restartu maszyny. Po restarcie trzeba wejść przez SSH i uruchomić claude rc ponownie.
Docelowo warto opakować to w usługę systemd. Na razie nie jest to dla mnie na tyle uciążliwe, żeby było priorytetem.
Kiedy to ma sens?
Taki sposób pracy ma dla mnie sens przede wszystkim wtedy, gdy:
- masz własne projekty i pomysły, które przychodzą poza godzinami przy komputerze,
- chcesz, żeby dłuższe zadania — testy, budowanie czy migracje — robiły się bez Twojego laptopa,
- pracujesz na kilku urządzeniach i chcesz mieć jedno stałe środowisko zamiast synchronizować kilka,
- korzystasz z agenta programistycznego, któremu możesz delegować większe zadania.
Jeśli programujesz wyłącznie przy biurku, a laptop i tak jest zawsze włączony, zysk będzie niewielki.
Wtedy ewentualnie Remote Control przydać Ci się może, by zatwierdzać działania agenta z toalety. ;)
Podsumowanie
Cała konfiguracja zajęła mi jedno popołudnie: serwer, użytkownik, Tailscale, Claude Code, klucz do repozytoriów i claude rc w tmuxie.
Technicznie nie jest to nic szczególnie skomplikowanego. Największą zmianą jest jednak sposób pracy.
Pomysł nie musi już czekać do wieczora.
Zlecam go od razu, a wieczorem siadam do gotowej zmiany, którą wystarczy przejrzeć. Pierwsze zatwierdzanie commita z dala od biurka było nieco dziwne. Teraz traktuję to jak normalny sposób pracy.
Telefon przestał być dla mnie tylko miejscem do notowania pomysłów. Stał się pilotem do mojego środowiska programistycznego.
Źródła i dalsze czytanie
- Claude Code — dokumentacja: https://code.claude.com/docs
- Oracle Cloud Infrastructure: https://www.oracle.com/cloud/
- Tailscale — dokumentacja: https://tailscale.com/kb
- tmux: https://github.com/tmux/tmux/wiki
- Flutter — instalacja na Linuksie: https://docs.flutter.dev/get-started/install/linux