§ THE BLOG

Notes on shipping listings.

Practical, no-fluff writing on screenshots, ASO, AI tools, and shipping software people actually download — from the makers of ShotCanvas. A new post most mornings.

Why “perfectly centered” looks slightly off.

The inspector says the margins match to the pixel, and it still looks wrong — because your layout engine centers boxes while your eye centers visual mass. A developer's guide to optical alignment: play buttons, icon rows, button labels, and when to trust your eye over the math.

We shipped an API key in our web bundle. It got scraped.

A hardcoded Gemini key rode our JavaScript into production, and an automated scraper found it — traffic we never sent, a spend spike, a suspended account. Why every client-side key leaks, and the three tripwires that stop the next one.

Does your app need a website?

The stores force a small minimum — a live privacy policy and a support page — and a domain quietly unlocks deep links, real email, and one link that routes by device. Everything past that can wait until the site has an actual job.

Your app's name works harder than your keyword field.

It's indexed at least as heavily as anything else on the listing, it's the only indexed field searchers actually read, and on iOS it's the hardest one to change. The 30-character shape that works, and the rules that get names rejected.

Google Play's 12-tester rule: what it takes to go live.

New personal Play Console accounts can't touch the Production track until 12 testers stay opted in for 14 unbroken days — and opt-outs reset the clock. What the rule really counts, why it costs a month, and how to spend the wait.

Pairing fonts when you're not a designer.

A system for picking two typefaces that work together — contrast over similarity, one family across two weights, and combinations that hold up from UI size to full-bleed headline.

Getting an LLM to return JSON you can actually parse.

Prompting for JSON works almost every time — and "almost" is a bug report every day at scale. The ladder from prompt-and-pray to schema-constrained decoding, the tool-call trick, and the three failures no schema can catch.

How often should you ship app updates?

The ranking-boost theory is folklore, but cadence still matters — Apple removes abandoned apps, Android forces a rebuild a year, and small releases are the cheapest crash insurance you can buy. How to pick a rhythm you can keep.

“Bug fixes and improvements” is costing you installs.

Your existing users never see release notes — updates install themselves. The people who do read them are deciding whether to install, or whether to delete. What the boilerplate signals to them, and the two-minute note that converts.

Our build passed validation. Apple rejected it anyway.

Three release builds, three identical rejection emails, and the cause wasn't anywhere in our code. A post-mortem on ITMS-90111, the checks Apple only runs after upload, and why your build machine's OS ships inside your binary.

Designing an empty state that isn't a dead end.

Every new user meets your app at its emptiest, and "No items yet" answers none of their questions. The three-part anatomy of an empty screen that works — show the future, orient in one sentence, hand over exactly one action.

MCP, explained: how AI assistants plug into real software.

A server is a menu of typed functions; the model reads the menu and places an order; the client executes it. The plain-English version of the protocol every AI product suddenly supports — and why your app might want to be on the other end.

Your retention problem is a first-session problem.

Push campaigns and win-back emails operate on users who already decided to leave — usually before their first session ended. Find your activation moment and rebuild the first five minutes around it.

How long does App Review actually take?

Apple clears 90% of submissions in under 24 hours; Google's official line is "up to seven days." Neither average is the number that bites you — the tail is, and most of the tail is self-inflicted.

Updating your App Store page without shipping a build.

On iOS, fixing a description typo means a version bump and a full App Review pass — yet 170 characters of your page update instantly. What each store locks to a release, what it doesn't, and the workflow that falls out.

Reasoning tokens: the part of the answer you never see.

The newest AI models think before they answer — in private tokens billed at output rates that can silently starve the visible response. Which models spend them by default, and the two settings that keep them in check.

How we chose our brand color (twice).

Our first accent scored 1.1:1 contrast against our own background — invisible where it mattered most. A post-mortem of the acid-lime era, the champagne-gold rebrand, and the accent-system checklist we kept.

Underpricing kills more indie apps than bad code.

A cheap price buys no search placement, no conversion bump, and no goodwill — it just caps what any user can ever pay you. The actual arithmetic of $0.99 pricing, and how to raise yours without a riot.

Icon design for developers who can't draw.

A strong app icon isn't an illustration — it's one concept, a clean silhouette, and one color decision. The geometric method, the per-store spec, and the four ten-minute tests that catch a weak icon before launch.

Can a screenshot get your app rejected?

Yes — App Review reads your marketing, not just your binary. The Guideline 2.3 rules that actually catch careful developers, and the quiet penalty Google applies instead of a rejection email.

Why your AI keeps making things up.

It's not bad training data. OpenAI's own 2025 research found the real cause: benchmarks grade like a multiple-choice exam, and a confident wrong guess scores better than an honest "I don't know."

Apple lets you run 10 screenshot sets per keyword. Most run one.

Apple Search Ads lets you bind different screenshots to different keyword themes, up to 10 sets per ad group — and Google's App campaigns reward the opposite strategy. What Creative Sets actually do, and where to start.

Your app is live in 175 regions. Your listing speaks one.

Apple supports 50 listing languages, Google Play over 130 — and if you don't translate, Google machine-translates you anyway. Where localization actually pays, and the free keyword field hiding in the US storefront.

Apple gives you 3 video slots. You're using zero.

App preview videos autoplay in the first slot of your App Store page, ahead of every screenshot — and Google Play autoplays a promo video too. What each store actually requires, and whether it's worth your time.

Why your AI keeps blowing the 30-character limit.

LLMs don't see letters — they see tokens. The actual mechanism behind AI-generated App Store subtitles and keyword fields landing over the limit, and the fix that actually holds.

Your app has 30 free characters. Most waste them.

Apple's subtitle field sits under your app name, gets indexed by search, and is shown to every visitor — most listings leave it blank or burn it restating the title. What to put there instead.

The 90% discount hiding in your API bill.

Anthropic and Google both discount repeated prompt tokens by roughly 90% — and most indie AI apps have never turned it on. What prompt caching actually does, and the one structural rule that decides whether you get it.

Apple lets you upload 10 screenshots. Stop at 6.

Apple allows 10 screenshots per device size, Google allows 8 — but only the first one to three ever render before a tap. What actually earns a slot, and what's wasted.

Apple doubled your screenshot slots. You're using one.

Apple doubled Custom Product Pages to 70 last October; Google allows 50 Custom Store Listings. Almost no listing uses more than the default. What each feature actually does, and where the extra slots are worth spending.

You're asking for ratings at the worst possible time.

Apple gives you three rating prompts a year; Google won't even say how many. Most apps burn them on a launch counter — when to actually ask, and what each store bans.

Nobody reads your app description. Google does.

Apple's search algorithm never indexes your description — Google ranks you on yours. Same field, two completely different games, and most listings play the wrong one on both stores.

Both stores will A/B test your listing — for free.

Apple and Google both ship a native A/B testing tool for your product page, and most indie listings have never run one. How both actually work — and the first test worth running.

Why your AI keeps forgetting.

Twenty minutes into a long session, it drops a rule you set at the start. The actual mechanism behind context windows — and the habits that fix it.

The 100 characters most developers throw away.

Apple's keyword field is the only listing text users never see — and the worst-filled. The five ways it gets wasted, and the ten-minute rewrite.

What it actually costs to ship an app in 2026.

Developer accounts, store commissions, the 15% discount most indies miss, and the launch cost nobody budgets for — the honest ledger.

7 screenshot mistakes that quietly kill downloads.

Most listings lose the install in the first two frames, in under a second. The seven mistakes that do the damage — and the five-minute fix for each.