Side projecty

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
Baner Artrows: „Babie lato” Józefa Chełmońskiego w złotej ramie na ścianie muzeum, obok logo gry

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 Artrows: strzałki na częściowo odsłoniętym obrazie „Babie lato”, nad planszą trzy złote osłony
Sala polska w muzeum gracza: obraz w połowie odsłonięty, w połowie jeszcze w pikselach, pod spodem przycisk „Graj dalej”
Trudniejszy poziom: gęsta plansza z kilkudziesięcioma strzałkami
Ekran Start z ostatnio odsłoniętym obrazem: „Krajobraz znad Rudawy”, Stanisław Wyspiański, 1905

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.

minuty · domyka maszyna

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.

godziny · domyka człowiek

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.

tygodnie · domyka rynek

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:

CLAUDE.md · wymagana zgoda
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.

  1. 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.

  2. 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.

  3. 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ą.

  4. 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”.

  5. 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.

Wszystkie 50 filmów

Rynek

Film

Długość

„Mleczarka” · Polska · 30 s

Otwórz na YouTube

Jak powstały

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Artrows w Google Play

Odsłoń swoje pierwsze arcydzieło.