Case study · 11.2026
artrows
An arrow puzzle game for Android in which arrows reveal masterpieces of painting. From the first session to Google Play in 37 days, after hours, with Claude Code in a human-in-the-loop setup.
Project facts
- Role
- Product concept, direction and decisions
- Time
- 37 days to the store release (development continues)
- Scope
- Unity game, content, store listing, marketing
- Status
- On Google Play since 5 November 2026

The project in numbers
- days from the first session to Google Play
- 37
- commits
- 588
- sessions with Claude Code
- 117
- recorded decisions
- 134
- automated tests
- ~8,500
- interface languages
- 14
- paintings from 10 countries
- 73
- generated levels
- 4,505
01
Starting point
My earlier side projects took two to four weeks of work with Claude Code: a web app in 25 days, a map-based guide in two weeks. This time I raised the bar: a mobile game in Unity, with its own content, economy, store, 14 languages and marketing. One person, after hours.
I started on 29 September 2026, the day Claude Sonnet 5.5 was released. After a short test the model turned out to be cheap enough that it felt like the right moment to put it to work on a whole game. 37 days later Artrows was on Google Play.
From the first session I worked in a human-in-the-loop setup, and that was the goal of the project: the agent builds, and a human sets the direction, makes the decisions and accepts the results. The inspiration was the paper by Lulla and co-authors on loop engineering, where instead of prompting an agent by hand you design a system that does it for you. Every session and every decision goes into a log in the repository. This text was written from that log, not from memory.
02
What Artrows is
A board of arrows covers a painting. The player taps the arrows in the right order and they fly off the board. A masterpiece emerges from underneath: the tile goes from a pixelated preview to full resolution. Tiles make up paintings, paintings make up rooms, and rooms make up the player's own museum.
Today the catalog holds 73 paintings by 51 artists from 10 countries, created between 1490 and 1917, all in the public domain. The player starts with masterpieces from their own country, and after revealing a few paintings the rest of the world opens up.
One glance, one tap
A level takes 15–45 seconds and has to be readable on a 5.5-inch screen. Every tap gets an immediate response: the arrow's flight, a sound and haptic feedback.
The reveal is the reward
Every level won ends the same way: pixels give way to the painting in full quality. A mistake means the arrow bounces back and one shield is lost.
A museum that grows
Country rooms, a catalog with a timeline, postcards and a globe on which countries fill up with paintings. Progress is permanent, and a break from the game takes nothing away from the player.
A start in your own country
The first screen asks: “Where are you from?” Country and language are chosen independently, and the first paintings come from the country you picked. There are ten starting countries.
Fair and calm
Every level can be completed on skill alone. Ads are optional and shown only in exchange for a reward. There are no countdown timers, no loot boxes and no purchase offers pushed at the moment of failure.
Levels generated from data
Boards are made by an in-house tool, LevelForge: 4,505 levels, each validated for solvability and scored with difficulty metrics. The game's balance lives in remote configuration (Remote Config), not hard-coded in the game.




The board, a museum room, a harder level and the Home screen
03
The challenge
I wanted a game that could be honestly tested on the market, not another demo. That meant facing a whole set of constraints at once:
- One person, after hours. My time is the project's most expensive resource.
- A quality bar set high on day two: “it's not time for recordings yet, the app has to be tip-top”.
- A Mac with 8 GB of RAM and an almost full disk, plus one test phone that I also use every day.
- Current Google Play requirements: target API 36 and support for 16 KB memory pages, plus my own 100 MB limit on install size.
- Public-domain paintings only, with a documented source for every file. A review of the law showed that the rule “the author died before 1956” is not enough in every country.
- 14 interface languages, including Japanese, Korean and Vietnamese, without native-speaker proofreading.
- Monetization without dark patterns, in line with EU consumer law and the store's policies.
04
Three loops instead of one chat
The agent does not work in one long chat thread. The work is arranged in three loops on different time scales, and each one is closed by someone else.
Inner loop
A code change, followed by one verification command: tests of the game core, tests of the level generator, content validators and tests in Unity. Nothing counts as “done” without a real test that exercises the change in practice.
Session loop
Tasks with acceptance criteria, a commit after every task and a report with numbered questions. I answer with a short code such as “1a 2b”, and the decision goes into the repository.
Strategic loop
Decision gates with hard thresholds. Changes to the concept, scope and monetization are settled by a separate, data-based strategy session, not by the session that writes the code.
How the roles were split between models
Claude Opus 5.5 led the concept, strategy and gate decisions, Claude Sonnet 5.5 handled implementation, and Claude Haiku 5.5 took small operational jobs. In practice the line moved. Of 84 execution sessions, Sonnet ran 40, Opus 43 and Haiku one, and from 20 October most of the implementation already went through Opus.
The project's memory is in the repository
Every session starts by loading the same files: the founding prompt CLAUDE.md, the current project state, the task list with acceptance criteria and the decision register, which today holds 134 entries with their reasoning. A conversation can drop out of the context window, but the repository stays.
Since 14 October a session is started with a single word. “Dalej” (“go on”) means: take the first task from the queue that can be done without me and without a connected phone. “Piątek” (“Friday”) runs the full test suite and builds the Android package. The limits of the agent's autonomy are written into the founding prompt:
Before any action that is hard to undo, visible to others or costs money, ask the Owner and wait for an explicit “yes”:
- Spending money: ad campaigns, purchases, paid APIs, tool subscriptions.
- Publishing: builds sent to Google Play (test tracks included), changes to the store listing, publishing the landing page, social media posts.
- Accounts and service settings: […] keys and secrets.
- Destructive operations: deleting files or branches, git reset --hard, push --force, overwriting someone else's work.
[…]
Local, reversible actions (editing files, tests, local builds, commits) you carry out without asking.
How this compares with the literature
The review by Lulla and co-authors lists five elements of a well-designed loop. In Artrows I implemented them to different degrees, so I show the gaps openly as well.
| Loop element | In Artrows | Gap |
|---|---|---|
| Start from a schedule or a repository event, with a machine-checkable stop condition | The stop conditions work: green tests and the task's acceptance criteria met. | I start sessions by hand, with one word. There is no schedule (cron) and there are no triggers. |
| Persistent state files | Project state, tasks and decisions sit in the repository and are loaded at the start of every session. | None. |
| Verifier subagents | Code verification is deterministic, and at the end there is me with the phone. Independent reviewer agents work where automated tests don't reach: on translations and screenshots. | No permanent, independent subagent for code review. |
| Token budgets | Limits on paid generative tools and on requests to external servers. | No hard token limit per session. |
| Defined points of escalation to a human | Money, accounts, publishing and destructive operations need my “yes” in the chat. A change of concept goes as a proposal to a strategy session. | None. |
In the same authors' study, autonomous agent loops were found in 217 open-source repositories, and almost none of them committed their state files. In my project those files are exactly what carries everything.
05
A human at the helm (human-in-the-loop)
The division of roles is simple: the agent delivers the execution, and I set the direction, make the decisions and accept the results. Six rules keep it in order:
- Decisions. The agent settles routine technical matters itself and logs them, subject to my veto. Decisions about money, accounts, publishing and hardware are mine.
- Approvals. Only an explicit “yes” in the chat counts, recorded afterwards in the repository.
- Rhythm. Quick tests with every task; the full test run and a phone build once a week.
- Strategy. Scope, concept and monetization are settled by a separate, data-based session, and the last word is mine.
- Taste. I decide on the look, the sound and the choice of content, even when the agent's proposal meets every formal rule.
- Acceptance. Automated tests don't replace the human eye: every new screen gets a screenshot, and I check the finished game on the phone myself.
The project log records 219 moments in which I corrected the direction, the rules or the loop itself.
06
Rules written by incidents
None of the rules below was invented in theory at a desk. Each one has a date and a specific reason.
- 2 October
A blocked IP address
Research agents with no request limit got my IP blocked on the servers of two museums. New rule: one request at a time, at least 2 seconds apart, and no bypassing of anti-bot protection, ever.
- 3 October
A night-time kernel panic
Running Unity and a series of tests at once on a Mac with 8 GB of RAM froze the system. Nothing was lost, because the work was being committed as it went. New rule: one resource-heavy job at a time and a mandatory commit after every step.
- 7 October
An overwritten game save
The agent overwrote, by mistake, the local file with my progress in the game (the save). I recovered the file from a copy on an external drive, and the incident went straight into the report. New rule: a backup in a separate location before every destructive operation.
- 21 October
Five sessions in one folder
Parallel sessions tell one another which task numbers and files they are working on, commit only the paths assigned to them, and reserve and release every Unity run with the word “wolne” (“free”).
- 4 November
Rejection on Google Play
Google rejected the first production release under its Minimum Functionality policy. The only clue in the justification was four dark screenshots from the store listing. I picked the paintings myself and prepared new, brighter screenshots, the fix went back for review, and a day later the game was available in the store.
07
50 ads in one morning
In early November I asked the agent to generate scenes of the game interface for ads. Less than five hours later 50 video spots were ready: 25 variants in 30- and 15-second versions, for 11 markets, including the time for my decisions. All without opening a video editor.
We called the format “Living Paintings”. A figure from the canvas comes to life, takes out a smartphone, shows the gameplay and returns to the frame. Vermeer's “The Milkmaid” and Frans Hals's portrait of Willem Coymans got a version for every market. Japan also got “The Moon” and “Samurai”, and Korea a “380-year-old idol”. Every spot carries an “Animation: AI” label in the local language.
How they were made
AI shots
I generated the eight four-second shots in which a painting comes to life myself, in Google Flow (the Omni 1.1 Flash model), from frames and prompts prepared by Claude. When the tool blocked the young face from a Raphael painting, I turned to the Hals portrait.
Game scenes
The gameplay fragments in the ads are not screen recordings but a faithful re-creation of the interface, rendered directly from the project files. One command per language generates video from the game's assets: levels from the generator, texts from the localization tables and the globe model. That is why the interface in every spot appears in the language of its market. This produced 74 clips in 10 languages.
Voice-over
The scripts in 11 language versions play on local context and humor: the British “milk first” debate, Italian cappuccino, Japanese tsukkomi. The ElevenLabs API generated 297 voice lines, and I picked the 11 final voices by ear on a page with 33 samples that the agent prepared.
Editing
An ffmpeg-based script assembles the AI shot, the game scenes and the end card, fits the voice lines to their scenes, lowers the Chopin soundtrack under the voice (audio ducking), adds 39 sound effects and evens out the loudness. The same sound samples later went straight into the game, so that the ad sounds exactly like the app.
Timeline
| Time | What was made |
|---|---|
| evening and morning | AI shots in Google Flow: “The Milkmaid”, “The Moon”, “Samurai”, then Hals. |
| 7:30–8:00 | Interface scenes in Japanese and Korean. |
| 8:56–9:46 | Scenes for the remaining nine markets. |
| 9:39 | Voice-over scripts for 11 markets. |
| 9:50–10:26 | Voice licence check, the samples page and my choice. |
| 10:28–10:47 | 297 voice lines generated through the API. |
| 11:12–11:14 | The editing script and the first 6 films. |
| 11:38–11:45 | 39 sound effects and a re-render of the films. |
| 11:59–12:21 | All 50 spots, with fixes to five of them. |
My role and the cost
My part is taste and decisions: choosing the paintings and voices, producing the shots in a tool the agent has no access to, listening to one trial spot before the whole batch is rendered, and giving the green light (“yes”) before every paid step, after a dry-run cost estimate.
All the voice recordings used 4,476 of the 40,000 credits in the monthly ElevenLabs plan. In the promotional first month that cost about USD 0.11; at the plan's standard price it would be about USD 0.67.
08
Marketing in the same loop
The same loop that builds the game also runs its marketing: social media posts, the store listing and the ad campaign.
29 posts in 2 hours and 15 minutes
On 6 November I asked the agent whether there was a tool that would run the Facebook and Instagram profiles for me, based on the website and the game's materials. There wasn't, so one was built in a quarter of an hour. Every post is a file in the repository, a validator guards the image rights and the AI labels, and publishing through the Meta Graph API starts only after my “yes” for a specific list of posts named one by one.
From asking the question to publishing the last post, 2 hours and 15 minutes passed. In that time the tool itself was built and 29 posts went out, and a single Facebook page started speaking 14 languages to audiences in 40 countries. Pushing out 25 posts to 11 markets took 9 minutes. I pasted the access token into the terminal myself; the agent never saw it.
Store listing and campaign clicked through for me
The agent configured the Google Play listing (prices, screenshots, descriptions and the declarations on content, data privacy and ads) and the first campaign on Meta directly in my browser. I only answered questions about budget, publishing and the formal statements made in my name, and carried out the steps that needed manual authorization. I estimate it took about 20 minutes of my time. Clicking through all of it by hand “would have been torture”.
09
The project in numbers
| Area | As of 11 November 2026 |
|---|---|
| Code | 879 C# files, about 224,000 lines of code (about 108,000 of them tests). The engine-independent game core: 214 files and 44,000 lines. Plus 50 tool scripts in Python. |
| Tests | Core: 3,928, level generator: 2,791, editor tests: 877, and about 900 tests in the running game (PlayMode). |
| Content | 73 paintings, 51 artists, 10 countries, 150 tiles and 4,505 levels. |
| Localization | 14 languages for the interface and the Google Play listing. |
| Release | Install size: 94.8 MB (against a 100 MB limit), 13 packs downloaded in the background after install, distribution in 178 countries. |
| RAM | 406–430 MB used on the test phone (against a 450 MB limit). |
| Marketing | 50 video spots for 11 markets, 297 voice lines in 11 languages and 29 posts in 14 languages. |
| Process | 588 commits over 30 active coding days, 117 sessions, 134 documented decisions and 219 recorded human interventions (human-in-the-loop). |
| Session time | About 120 hours in 83 timed sessions (since 5 October; earlier sessions were not timed). |
10
Tech stack
- 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
What's next
The game is in the store, so now it is time for market validation of the idea. That takes two investments:
- Marketing. I need to invest in paid traffic to test the game on real users: to measure retention and collect the first monetization data. The video spots and ad creatives are ready.
- Hardware. My MacBook Air M2 with 8 GB of RAM and a 512 GB disk is no longer enough for a project this complex. In 2027 I plan to move to a Mac mini, and I can't wait.
Update 1.1 is planned for January. It will bring the Collector's Card, a choice of difficulty level and the Pigment Cabinet, a new way for advanced players to spend coins. For 5 February 2027 I am preparing the first temporary exhibition, “Love in Art”. More countries and an iOS version are also in the queue.
All numbers come from the project repository (as of 11 November 2026). Quotes are translated from the Polish session log and the decision register, both kept as the work went on.