GEMINI LABJP
NANOLITE — Nano Banana 2 Lite is here: Google's fastest and most cost-efficient Gemini Image model, made for running lightweight image generation cheaplyOMNIFLASH — Gemini Omni Flash is in public preview, a natively multimodal model that lets enterprises and developers build custom, dynamic video workflowsAGENTS — Managed Agents expand with background: true for async server-side runs and polling, remote MCP server integration, and refreshing credentials across interactionsMEMORY — The Memory Bank IngestEvents API is generally available, decoupling event ingestion from memory generation so you can stream content continuouslyTHROUGHPUT — Provisioned Throughput now lets you submit up to seven pending orders for the same model and regionDEPRECATE — Image generation models shut down on August 17, and the Grok 4.1 family on the Gemini Enterprise Agent Platform on August 20NANOLITE — Nano Banana 2 Lite is here: Google's fastest and most cost-efficient Gemini Image model, made for running lightweight image generation cheaplyOMNIFLASH — Gemini Omni Flash is in public preview, a natively multimodal model that lets enterprises and developers build custom, dynamic video workflowsAGENTS — Managed Agents expand with background: true for async server-side runs and polling, remote MCP server integration, and refreshing credentials across interactionsMEMORY — The Memory Bank IngestEvents API is generally available, decoupling event ingestion from memory generation so you can stream content continuouslyTHROUGHPUT — Provisioned Throughput now lets you submit up to seven pending orders for the same model and regionDEPRECATE — Image generation models shut down on August 17, and the Grok 4.1 family on the Gemini Enterprise Agent Platform on August 20
Articles/API / SDK
API / SDK/2026-05-29Advanced

Designing a Semantic Clustering Pipeline for App Reviews with Gemini Embeddings

How I cluster 10,000+ app reviews from a wallpaper app with 50M+ downloads using Gemini Embeddings to compute improvement priorities. The three-layer pipeline and cost design that emerged from a year of running it.

embedding10gemini-api277clusteringapp-store7indie-dev43

Premium Article

Starting from the problem that nothing got prioritized

I have been shipping mobile apps as a solo indie developer since 2014, and somewhere past 50 million cumulative downloads the review feed turned into a noisy gold mine. Useful suggestions, drive-by one-star bursts, reports that get the feature name wrong — they all live in the same column. For a while I read them every weekend and held an ordering in my head. Once I started running several apps in parallel, that approach collapsed.

The dangerous failure mode is not "I missed a complaint." It is "I sorted by emotional intensity instead of by impact." A single angry review feels heavier than ten quietly disappointed ones, but the latter is what eats retention. AdMob revenue rides on DAU, which rides on retention, so misordering the backlog directly shows up in next month's earnings. When the Gemini Embedding API stabilized, I rebuilt this ordering as a monthly batch job. After about a year of running it, the three-layer pipeline has settled. This is a record of how it works, written by indie developer and contemporary artist Hirokawa Masaki, who keeps a wallpaper app business afloat alongside an exhibition schedule.

Why semantic clustering instead of keyword counting

The naive starting point was pulling reviews via the App Store Connect and Google Play Developer APIs, running Japanese and English tokenizers, and ranking by frequency. It works for a week, then three limits become obvious.

First, the same request phrased differently does not merge. "Simpler interface," "too cluttered," and "too many icons on the home screen" all live in different rows even though they are the same complaint. Reviewers reach for whatever word matches their mood, so vocabulary drift is dramatic.

Second, positive and negative sentiment land in the same bucket. The keyword "ads" collects both "too many ads" and "the ad cadence is just right." Compound complaints like "the ad layout is dated and I keep mis-tapping" fragment into unrelated tokens.

Third, multi-language corpora fracture. English "too many ads" and Japanese "広告が多すぎ" never meet, even though they are the same signal. My DL split is roughly 55% English, 30% Japanese, 15% other — cutting English silently distorts the priority order.

Embeddings cross all three boundaries. They cluster by meaning, so vocabulary drift and language gaps disappear. When you want only the negative sentiment about ad volume, you can pull it cleanly with polarity tagging downstream.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Why task_type=CLUSTERING with output_dimensionality=256 cuts storage by roughly two-thirds without losing cluster quality
A three-layer pipeline (incremental embed + HDBSCAN + Gemini 2.5 Flash) that stays under USD 4 per month
The weighting that turns cluster size, polarity, and 30-day recency into a decision-ready priority score
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Gemini Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

API / SDK2026-06-02
A Month of Refreshing App Store Promotional Text Weekly with Gemini
Notes from one month of rewriting App Store promotional text (the 170-character line above the description) weekly with the Gemini API. How I reused a slot that ships without review, what I handed to AI, what I always touched by hand, and whether it moved anything.
API / SDK2026-05-16
Automating App Store and Google Play Review Replies with Gemini API — The 8-Second Rule I Discovered the Hard Way
A practical implementation record of automating multilingual app review replies using Gemini API, based on managing apps with 50M+ cumulative downloads. Covers the undocumented 8-second wait rule that Apple's API silently enforces.
API / SDK2026-05-15
Making Gemini API 12x Faster with asyncio: Lessons from Multilingual App Store Generation
A real-world account of parallelizing Gemini API calls with asyncio during the iOS update of Beautiful HD Wallpapers. Learn how asyncio.gather() with rate limit handling cut multilingual generation from 13 minutes to 65 seconds.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →