The in-app help that an indie shop kept putting off
I have been shipping iOS and Android apps as Dolice since 2014, and the wallpaper and relaxation titles in that catalog have grown into a cumulative 50 million downloads. AdMob is the main revenue line for those older apps, and more than half of that revenue comes from users outside Japan.
Despite that, the in-app help — the FAQ, the first-run tutorial, the self-service guide users see before they email me — stayed frozen in Japanese and English for years. The reason was simple: every time I added a feature, the translation chore felt heavier than the feature itself, so it kept slipping.
In February 2026 I finally sat down, wired a Gemini 2.5 Flash pipeline into the build, and pushed help maintenance up to five locales: Japanese, English, Spanish, German, and Portuguese. These are my honest notes after three months of running it.
The shape of the pipeline
The source help lives as one Markdown file per topic, 38 files in total. Whenever CI runs, the script below builds the localized JSON the apps read at boot.
# scripts/translate_help.py (excerpt)
from google import genai
MODEL_FAST = "gemini-2.5-flash"
MODEL_REVIEW = "gemini-2.5-pro"
PROMPT = """Translate the following Markdown into {target}.
- Keep proper nouns, brand names, and emoji as-is.
- Do not translate these UI labels: {ui_terms}.
- Match the punctuation conventions of the target language.
- Do not split paragraphs longer than 200 characters.
Source:
---
{source}
---"""
def translate(source: str, target: str, ui_terms: list[str]) -> str:
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
resp = client.models.generate_content(
model=MODEL_FAST,
contents=PROMPT.format(
target=target,
ui_terms=", ".join(ui_terms),
source=source,
),
config={"temperature": 0.2, "max_output_tokens": 4096},
)
return resp.textThe translations stay in Markdown until the build converts them into platform-native resources — .strings on iOS, strings.xml on Android, JSON for the web help. Flash answers fast enough that 38 topics across four target locales finish in about thirty seconds on the Mac mini that runs my nightly job.
Why I ended up routing through Pro as well
For the first few weeks I tried to live with Flash alone, but longer FAQ topics — anything above roughly 800 source characters — exposed two recurring weaknesses. Proper nouns occasionally went missing, and UI labels drifted into unexpected verbs. "壁紙を保存" once landed as "壁紙を残す," for example, which no longer matched the actual button in the app.
The fix was to add Gemini 2.5 Pro as a second-pass reviewer. Pro receives the Flash output, the original Markdown, and the UI glossary, and only flags the topics where something diverged. Re-translating just those flagged files kept Pro's share of the calls to about 15% of total volume.
Across the three months the entire bill landed around 720 yen per month. For the three topics where Pro's diff was largest, I still glance at the file myself before committing. The Flash and Pro split has been a workable way to keep cost low without letting quality bottom out.
The small habits that paid off
Three quiet habits did most of the work over the quarter.
The first was to keep UI terms and proper nouns in a separate glossary.json and inject them into every prompt. Gemini is unusually obedient about respecting the vocabulary a prompt hands it, and the dictionary made the drift on those words largely disappear.
The second was pinning the temperature at 0.2. Help text rewards consistency over creativity. I tested 0.7 for a stretch and lost a lot of review time to suffix drift — the same sentence translated three different ways across re-runs — until the reviews started piling up.
The third was maintaining a "forbidden phrasings" list per locale. The Spanish output kept oscillating between "fondo de pantalla" and "imagen de fondo" for the word "wallpaper," and once I added one of them to the forbidden list the drift settled inside a week. Telling Gemini what to avoid turned out to be just as load-bearing as telling it what to prefer.
What the AdMob and review numbers showed
After the five-locale help shipped, the type of reviews arriving in App Store country pages shifted in a small but visible way. One-star reviews of the "I cannot tell what this menu does" variety quieted down, and three- and four-star reviews started saying things like "easy to read in my language" and "thoughtful localization."
AdMob eCPM has always been noisy across regions, so it is hard to isolate the help update from everything else, but in the three months since the rewrite German-speaking users have stretched their average session by roughly 15%. Longer sessions tend to translate into more impressions from higher-eCPM regions, and monthly AdMob revenue ticked up by a little under 10%. The help is certainly not the only reason, yet the comfort of reading the UI in your own language matters more for an indie wallpaper app than I had given it credit for.
A 1997 homework that I had been carrying
A short personal aside. I first touched the internet in 1997 when I was 16, teaching myself to code, and the surprise of being able to argue about software with someone on the other side of the ocean is still the emotional bedrock of my development practice. Three decades later, my apps were reaching people worldwide while the help screens stayed locked in two languages — a contradiction the 1997 version of me would have found odd.
Letting Gemini handle the routine of translation is what finally made five locales a sustainable workload. The joy of words crossing borders that I tasted back then is something I want to keep handing back to today's readers.
What is next on the list
Three follow-up items emerged from the quarter.
First, I want to A/B Gemini 3 Flash against 2.5 Flash on the same prompt set. Early small-scale runs suggest 3 Flash is more steady with proper nouns inside long passages, which would let me drop Pro's share even further. Second, I plan to extend the pipeline to App Store and Google Play release-note bodies, which still get hand-translated each release. Third, I want Flash to draft replies to support email in the user's locale so that I can hand-finish them instead of writing from scratch.
For indie development, what you decide to hand off determines how much time you actually have for the app itself. Gemini 2.5 Flash, with Pro standing behind it as a reviewer, has turned out to be a reliable partner for handing off translation — quietly, at a price that fits a personal developer's budget. Thank you for reading. If you are wrestling with the same question for your own app, I hope these notes help.