Case study · 11.2026
artrows
Gra logiczna na Androida, w której strzałki odsłaniają arcydzieła malarstwa. Od pierwszej sesji do Google Play w 37 dni, po godzinach, z Claude Code w modelu human-in-the-loop.
Informacje o projekcie
- Rola
- Koncepcja produktu, kierunek rozwoju i decyzje
- Czas
- 37 dni do premiery w sklepie (rozwój trwa)
- Zakres
- Gra w Unity, treść, sklep, marketing
- Status
- W Google Play od 5.11.2026

Projekt w liczbach
- dni od pierwszej sesji do Google Play
- 37
- commitów
- 588
- sesji z Claude Code
- 117
- zapisane decyzje
- 134
- testów automatycznych
- ~8 500
- języków interfejsu
- 14
- obrazy z 10 krajów
- 73
- wygenerowanych poziomów
- 4 505
01
Punkt wyjścia
Moje poprzednie side projecty to dwa–cztery tygodnie pracy z Claude Code: aplikacja webowa w 25 dni, serwis z mapą w dwa tygodnie. Tym razem podniosłem poprzeczkę: gra mobilna w Unity, z własną zawartością, ekonomią, sklepem, 14 językami i marketingiem. Jedna osoba, po godzinach.
Zacząłem 29 września 2026 roku, w dniu premiery Claude Sonnet 5.5. Po krótkim teście model okazał się na tyle tani, że uznałem to za dobry moment, żeby zaprząc go do zrobienia całej gry. 37 dni później Artrows było w Google Play.
Od pierwszej sesji pracowałem w modelu human-in-the-loop i taki był cel projektu: agent buduje, a człowiek wyznacza kierunek, podejmuje decyzje i odbiera efekty. Inspiracją była praca Lulli i współautorów o loop engineering, w którym zamiast ręcznie promptować agenta, projektuje się system robiący to za nas. Każda sesja i każda decyzja trafiają do dziennika w repozytorium. Ten tekst powstał na podstawie tego dziennika, nie z pamięci.
02
Czym jest Artrows
Plansza ze strzałkami przykrywa obraz. Gracz stuka w strzałki we właściwej kolejności, a one wylatują z planszy. Spod nich wyłania się arcydzieło: kafelek przechodzi z rozpikselowanego podglądu w pełną rozdzielczość. Kafelki składają się na obrazy, obrazy na sale, a sale na własne muzeum gracza.
Katalog gry to dziś 73 obrazy 51 artystów z 10 krajów, powstałe między 1490 a 1917 rokiem, wyłącznie z domeny publicznej. Gracz zaczyna od arcydzieł ze swojego kraju, a po odsłonięciu kilku obrazów otwiera się przed nim reszta świata.
Jeden rzut oka, jedno dotknięcie
Poziom trwa 15–45 sekund i musi być czytelny na ekranie 5,5 cala. Każde stuknięcie w ekran daje natychmiastową reakcję: lot strzałki, dźwięk i wibrację (haptykę).
Odsłonięcie obrazu jest nagrodą
Każdy wygrany poziom kończy się tak samo: piksele ustępują miejsca malowidłu w pełnej jakości. Pomyłka to odbicie strzałki i utrata jednej osłony.
Muzeum, które rośnie
Sale narodowe, katalog z osią czasu, pocztówki i globus, na którym kolejne kraje wypełniają się obrazami. Postęp jest trwały, a przerwa w grze niczego graczowi nie odbiera.
Start we własnym kraju
Pierwszy ekran pyta: „Skąd jesteś?”. Kraj i język wybiera się niezależnie, a pierwsze obrazy pochodzą z wybranego regionu. Krajów startowych jest dziesięć.
Uczciwie i spokojnie
Każdy poziom da się przejść wyłącznie dzięki własnym umiejętnościom. Reklamy są dobrowolne i wyświetlane tylko w zamian za nagrodę. Nie ma liczników czasu, lootboxów ani ofert zakupu wciskanych w momencie porażki.
Poziomy generowane z danych
Plansze tworzy własne narzędzie, LevelForge: 4 505 poziomów, każdy z walidacją rozwiązywalności i metrykami trudności. Balans gry jest zaszyty w zdalnej konfiguracji (Remote Config), a nie na sztywno w kodzie.




Plansza, sala muzeum, trudniejszy poziom i ekran Start
03
Wyzwanie
Chciałem gry, którą da się uczciwie zweryfikować na rynku, a nie kolejnego dema. To oznaczało mierzenie się z całym pakietem ograniczeń naraz:
- Jedna osoba po godzinach. Mój czas to najdroższy zasób projektu.
- Poprzeczka jakości zawieszona wysoko już drugiego dnia: „to jeszcze nie czas na nagrania, aplikacja ma być dopracowana tip-top”.
- Mac z 8 GB RAM-u i prawie pełnym dyskiem oraz jeden telefon testowy, z którego sam na co dzień korzystam.
- Aktualne wymogi Google Play: docelowe API 36 i obsługa stron pamięci 16 KB, a do tego własny limit 100 MB na rozmiar instalacji.
- Wyłącznie obrazy z domeny publicznej, z udokumentowanym źródłem każdego pliku. Analiza prawna pokazała, że nie w każdym kraju wystarcza zasada „autor zmarł przed 1956 rokiem”.
- 14 języków interfejsu, w tym japoński, koreański i wietnamski, bez korekty native speakerów.
- Monetyzacja bez dark patterns, zgodna z prawem konsumenckim UE i regulaminem sklepu.
04
Trzy pętle zamiast jednego czatu
Agent nie pracuje w jednym długim wątku na czacie. Praca jest ułożona w trzech pętlach o różnej skali czasowej, a każdą z nich domyka kto inny.
Pętla wewnętrzna
Zmiana w kodzie, a po niej jedno polecenie weryfikujące: testy rdzenia gry, testy generatora poziomów, walidatory treści i testy w Unity. Nic nie ma statusu „gotowe” bez realnego testu, który weryfikuje daną zmianę w praktyce.
Pętla sesji
Zadania z kryteriami akceptacji, commit po każdym zadaniu i raport z ponumerowanymi pytaniami. Odpowiadam skrótem „1a 2b”, a decyzja trafia do repozytorium.
Pętla strategiczna
Bramki decyzyjne z twardymi progami. Zmiany koncepcji, zakresu i monetyzacji rozstrzyga osobna sesja strategiczna oparta na danych, a nie sesja, w której powstaje kod.
Podział ról między modele
Koncepcję, strategię i decyzje na bramkach prowadził Claude Opus 5.5, zadania wdrożeniowe – Claude Sonnet 5.5, a drobne prace operacyjne – Claude Haiku 5.5. W praktyce granica się przesuwała. Z 84 sesji wykonawczych 40 poprowadził Sonnet, 43 Opus i jedną Haiku, a od 20 października większość wdrożeń szła już przez Opusa.
Pamięć projektu jest w repozytorium
Każda sesja startuje od wczytania tych samych plików: promptu założycielskiego CLAUDE.md, aktualnego stanu projektu, listy zadań z kryteriami akceptacji i rejestru decyzji, który liczy dziś 134 wpisy z uzasadnieniem. Rozmowa może zniknąć z okna kontekstowego, ale repozytorium zostaje.
Od 14 października sesję uruchamia jedno słowo. „Dalej” oznacza: weź pierwsze zadanie z kolejki, które da się wykonać beze mnie i bez podpiętego telefonu. „Piątek” uruchamia pełny zestaw testów i buduje paczkę na Androida. Granice autonomii agenta są sztywno zapisane w prompcie założycielskim:
Przed działaniem trudnym do odwrócenia, widocznym dla innych albo kosztującym pieniądze zapytaj Właściciela i poczekaj na wyraźne „tak”:
- Wydawanie pieniędzy: kampanie reklamowe, zakupy, płatne API, subskrypcje narzędzi.
- Publikacja: buildy wysyłane do Google Play (także na tory testowe), zmiany karty sklepu, publikacja landingu, posty w mediach społecznościowych.
- Konta i ustawienia usług: […] klucze i sekrety.
- Operacje niszczące: usuwanie plików lub gałęzi, git reset --hard, push --force, nadpisywanie cudzej pracy.
[…]
Lokalne, odwracalne działania (edycja plików, testy, lokalne buildy, commity) wykonujesz bez pytania.
Jak to się ma do literatury
Przegląd Lulli i współautorów wymienia pięć elementów dobrze zaprojektowanej pętli. W Artrows wdrożyłem je w różnym stopniu, dlatego otwarcie pokazuję też luki.
| Element pętli | W Artrows | Luka |
|---|---|---|
| Start z harmonogramu albo zdarzenia w repozytorium, z warunkiem stopu sprawdzalnym maszynowo | Warunki stopu działają: zielone testy i spełnione kryteria akceptacji zadania. | Sesje uruchamiam ręcznie, jednym słowem. Nie ma harmonogramu (crona) ani wyzwalaczy. |
| Trwałe pliki stanu | Stan projektu, zadania i decyzje leżą w repozytorium i są wczytywane na starcie każdej sesji. | Brak. |
| Subagenci weryfikujący | Weryfikacja kodu jest deterministyczna, a na końcu jestem ja z telefonem. Niezależni agenci-recenzenci pracują tam, gdzie nie sięgają testy automatyczne: przy tłumaczeniach i zrzutach ekranu. | Brak stałego, niezależnego subagenta do code review. |
| Budżety tokenów | Limity na płatne narzędzia generatywne i na zapytania do zewnętrznych serwerów. | Brak twardego limitu tokenów na pojedynczą sesję. |
| Zdefiniowane punkty eskalacji do człowieka | Pieniądze, konta, publikacja i operacje niszczące wymagają mojego „tak” na czacie. Zmiana koncepcji trafia jako propozycja pod obrady sesji strategicznej. | Brak. |
W badaniu tych samych autorów autonomiczne pętle agentów przeanalizowano w 217 repozytoriach open source i prawie żadne z nich nie commitowało plików stanu. U mnie to właśnie one dźwigają cały projekt.
05
Human-in-the-loop
Podział ról jest prosty: agent dowozi wykonanie, a ja wyznaczam kierunek, podejmuję decyzje i odbieram efekty. Porządkuje to sześć zasad:
- Decyzje. Rutynowe kwestie techniczne agent rozstrzyga sam i loguje je z zastrzeżeniem mojego prawa weta. Do mnie należą decyzje o pieniądzach, kontach, publikacji i sprzęcie.
- Zgody. Liczy się wyłącznie wyraźne „tak” na czacie, utrwalone potem w repozytorium.
- Rytm. Szybkie testy przy każdym zadaniu, pełny przebieg testów i build na telefon raz w tygodniu.
- Strategia. Zakres, koncepcję i monetyzację rozstrzyga osobna sesja oparta na danych, a ostatnie słowo należy do mnie.
- Gust. O wyglądzie, udźwiękowieniu i doborze treści decyduję ja – nawet wtedy, gdy propozycja agenta spełnia wszystkie formalne reguły.
- Odbiór. Testy automatyczne nie zastąpią ludzkiego oka: każdy nowy ekran ma zrzut, a gotową grę sprawdzam osobiście na telefonie.
W dzienniku projektu odnotowano 219 momentów, w których skorygowałem kierunek, zasady albo samą pętlę.
06
Zasady napisane przez incydenty
Żadna z poniższych reguł nie powstała teoretycznie przy biurku. Każda ma swoją datę i konkretny powód.
- 2 października
Zablokowany adres IP
Agenci badawczy bez narzuconego limitu zapytań doprowadzili do zablokowania mojego IP na serwerach dwóch muzeów. Nowa zasada: jedno zapytanie naraz, minimum 2 sekundy odstępu i całkowity zakaz obchodzenia zabezpieczeń antybotowych.
- 3 października
Nocny kernel panic
Równoczesne uruchomienie Unity i serii testów na Macu z 8 GB RAM-u zawiesiło system. Nic nie zginęło, bo praca była na bieżąco commitowana. Nowa zasada: jedno zasobożerne zadanie naraz i obowiązkowy commit po każdym kroku.
- 7 października
Nadpisany zapis gry
Agent przez pomyłkę nadpisał lokalny plik z moim postępem w grze (save). Plik odzyskałem z kopii na dysku zewnętrznym, a incydent trafił wprost do raportu. Nowa zasada: kopia zapasowa w osobnej lokalizacji przed każdą operacją niszczącą.
- 21 października
Pięć sesji w jednym folderze
Równoległe sesje komunikują sobie nawzajem numery zadań i edytowane pliki, commitują wyłącznie przypisane im ścieżki, a każde uruchomienie Unity rezerwują i zwalniają hasłem „wolne”.
- 4 listopada
Odrzucenie w Google Play
Google odrzucił pierwszą wersję produkcyjną z powodu „zbyt ubogiej funkcjonalności” (Minimum Functionality). Jedyną poszlaką w uzasadnieniu były cztery ciemne zrzuty ekranu z karty sklepu. Sam dobrałem obrazy i przygotowałem nowe, jaśniejsze zrzuty, poprawka poszła do ponownej weryfikacji, a dzień później gra była już dostępna w sklepie.
07
50 reklam w jedno przedpołudnie
Na początku listopada poprosiłem agenta o wygenerowanie scen z interfejsem gry na potrzeby reklam. Niecałe pięć godzin później gotowych było 50 spotów wideo: 25 wariantów w wersjach 30- i 15-sekundowych, na 11 rynków – wliczając czas na moje decyzje. Wszystko bez otwierania programu do montażu.
Format nazwaliśmy „Żywe obrazy”. Postać z płótna ożywa, wyjmuje smartfon, pokazuje rozgrywkę i wraca do ramy. „Mleczarka” Vermeera i portret Willema Coymansa pędzla Fransa Halsa doczekały się wersji na każdy rynek. Japonia dostała dodatkowo „Księżyc” i „Samuraja”, a Korea – „380-letniego idola”. Każdy spot ma w kadrze oznaczenie „Animacja: AI” w lokalnym języku.
Jak powstały
Ujęcia AI
Osiem czterosekundowych ujęć, w których obraz ożywa, wygenerowałem sam w Google Flow (model Omni 1.1 Flash) na bazie klatek i promptów przygotowanych przez Claude'a. Gdy narzędzie zablokowało młodą twarz z obrazu Rafaela, sięgnąłem po portret Halsa.
Sceny z gry
Fragmenty rozgrywki w reklamach to nie nagrania ekranu (screen recording), tylko wierne odtworzenie interfejsu wyrenderowane bezpośrednio z plików projektu. Jedno polecenie na dany język generuje wideo z zasobów gry: poziomów z generatora, tekstów z tabel lokalizacyjnych i modelu globusa. Dzięki temu interfejs w każdym spocie wyświetla się w języku danego rynku. Tak powstały 74 klipy w 10 językach.
Lektor
Skrypty w 11 wersjach językowych nawiązują do lokalnego kontekstu i humoru: brytyjskiego sporu „milk first”, włoskiego cappuccino czy japońskiego tsukkomi. 297 kwestii lektorskich wygenerowało API ElevenLabs, a 11 docelowych głosów wybrałem sam ze słuchu na przygotowanej przez agenta stronie z 33 próbkami.
Montaż
Skrypt oparty na ffmpeg składa ujęcie AI, sceny z gry i planszę końcową, dopasowuje kwestie lektora do odpowiednich scen, ścisza w tym czasie podkład z Chopinem (audio ducking), nakłada 39 efektów dźwiękowych i wyrównuje głośność. Te same sample dźwiękowe trafiły potem bezpośrednio do gry, żeby reklama brzmiała identycznie jak aplikacja.
Oś czasu
| Godzina | Co powstało |
|---|---|
| wieczór i ranek | Ujęcia AI w Google Flow: „Mleczarka”, „Księżyc”, „Samuraj”, potem Hals. |
| 7:30–8:00 | Sceny interfejsu po japońsku i koreańsku. |
| 8:56–9:46 | Sceny dla pozostałych dziewięciu rynków. |
| 9:39 | Skrypty lektorskie dla 11 rynków. |
| 9:50–10:26 | Weryfikacja licencji głosów, strona z próbkami i mój wybór. |
| 10:28–10:47 | 297 kwestii lektora wygenerowanych przez API. |
| 11:12–11:14 | Skrypt montażowy i pierwsze 6 filmów. |
| 11:38–11:45 | 39 efektów dźwiękowych i ponowny render filmów. |
| 11:59–12:21 | Komplet 50 spotów i poprawki w pięciu z nich. |
Moja rola i koszt
Moja działka to gust i decyzje: dobór obrazów i głosów, wyklikanie ujęć w narzędziu, do którego agent nie ma dostępu, odsłuch jednego spotu próbnego przed wyrenderowaniem całej puli i zielone światło („tak”) przed każdym płatnym krokiem – po wcześniejszym wyliczeniu kosztów „na sucho” (dry run).
Wszystkie nagrania lektorskie pochłonęły 4 476 z 40 000 kredytów miesięcznego planu ElevenLabs. W promocyjnym pierwszym miesiącu kosztowało to ok. 0,11 USD, a w standardowej cenie planu – ok. 0,67 USD.
08
Marketing w tej samej pętli
Ta sama pętla, która buduje grę, obsługuje też jej marketing: posty w social mediach, kartę sklepu i kampanię reklamową.
29 postów w 2 godziny i 15 minut
6 listopada zapytałem agenta, czy istnieje narzędzie, które poprowadzi za mnie profile na Facebooku i Instagramie na bazie strony WWW i materiałów z gry. Nie było takiego, więc powstało w kwadrans. Każdy post to plik w repozytorium, walidator pilnuje praw autorskich do obrazów i oznaczeń AI, a publikacja przez Meta Graph API rusza dopiero po moim „tak” dla konkretnej listy postów wymienionych z nazwy.
Od zadania pytania do publikacji ostatniego posta minęły 2 godziny i 15 minut. W tym czasie powstało samo narzędzie i wyszło 29 publikacji, a jeden fanpage na Facebooku zaczął komunikować się w 14 językach z odbiorcami z 40 krajów. Samo wypchnięcie 25 postów na 11 rynków zajęło 9 minut. Token dostępu wkleiłem osobiście w terminalu – agent w ogóle go nie widział.
Sklep i kampania wyklikane za mnie
Kartę produktu w Google Play (ceny, zrzuty ekranu, opisy oraz deklaracje dotyczące treści, prywatności danych i reklam) oraz pierwszą kampanię w ekosystemie Meta agent skonfigurował bezpośrednio w mojej przeglądarce. Ja tylko odpowiadałem na pytania o budżet, publikację i formalne oświadczenia składane w moim imieniu oraz wykonywałem kroki wymagające ręcznej autoryzacji. Szacuję, że zaangażowało mnie to na jakieś 20 minut. Ręczne przeklikanie tego wszystkiego „byłoby katorgą”.
09
Projekt w liczbach
| Obszar | Stan na 11.11.2026 |
|---|---|
| Kod | 879 plików C#, ok. 224 tys. linii kodu (z czego ok. 108 tys. to testy). Rdzeń gry niezależny od silnika: 214 plików i 44 tys. linii. Do tego 50 skryptów narzędziowych w Pythonie. |
| Testy | Rdzeń: 3 928, generator poziomów: 2 791, testy edytora: 877 oraz ok. 900 testów w działającej grze (PlayMode). |
| Treść | 73 obrazy, 51 artystów, 10 krajów, 150 kafelków i 4 505 poziomów. |
| Lokalizacja | 14 języków interfejsu oraz karty w sklepie Google Play. |
| Wydanie | Rozmiar instalacji: 94,8 MB (przy założonym limicie 100 MB), 13 paczek dociąganych w tle po instalacji, dystrybucja w 178 krajach. |
| Pamięć RAM | Zużycie 406–430 MB na telefonie testowym (przy założonym limicie 450 MB). |
| Marketing | 50 spotów wideo na 11 rynków, 297 kwestii lektorskich w 11 językach i 29 postów w 14 językach. |
| Proces | 588 commitów w ciągu 30 aktywnych dni kodowania, 117 sesji, 134 udokumentowane decyzje i 219 zapisanych interwencji człowieka (human-in-the-loop). |
| Czas sesji | Ok. 120 godzin w 83 sesjach z pomiarem czasu (od 5 października; wcześniejszych sesji nie mierzono). |
10
Stack technologiczny
- Unity 6.3 LTS
- C# 9
- URP 2D
- Addressables
- Play Asset Delivery
- Unity Localization
- Unity IAP
- Firebase
- AdMob
- Google UMP
- NUnit
- Python
- ffmpeg
- ElevenLabs
- Google Flow (Omni 1.1)
- Meta Graph API
- Claude Code
11
Dalsze plany
Gra jest już w sklepie, więc teraz czas na walidację rynkową pomysłu. To wymaga dwóch inwestycji:
- Marketing. Muszę zainwestować w płatny ruch, żeby przetestować grę na realnych użytkownikach: zmierzyć retencję i zebrać pierwsze dane o monetyzacji. Spoty wideo i kreacje reklamowe są już gotowe.
- Sprzęt. Mój MacBook Air M2 z 8 GB RAM-u i dyskiem 512 GB przestaje wystarczać przy tak rozbudowanym projekcie. W 2027 roku planuję przesiadkę na Maca mini i już nie mogę się jej doczekać.
Aktualizacja 1.1 jest zaplanowana na styczeń. Wprowadzi Kartę Kolekcjonera, wybór poziomu trudności oraz Gabinet Pigmentów, czyli nowy sposób wydawania monet dla zaawansowanych graczy. Na 5 lutego 2027 roku szykuję pierwszą wystawę czasową: „Miłość w sztuce”. W kolejce czekają też kolejne kraje i wersja na iOS.
Wszystkie liczby pochodzą z repozytorium projektu (stan na 11 listopada 2026 roku). Cytaty zaczerpnięto z dziennika sesji i rejestru decyzji prowadzonych na bieżąco w trakcie prac.