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.
How to stop numbers jittering when they change
San Francisco and Inter give every digit its own width, so a 48px timer can jump 14 pixels in one tick. The one-line fix on each platform, the fonts where it silently does nothing, and the changes it still can’t absorb.
OCT 4, 2026What EU trader status publishes on your store page
The trader form in App Store Connect prints an address, phone number and email on your product page in all 27 EU storefronts. Who counts as a trader, what the non-trader answer tells buyers, and how to keep your home address off both stores.
OCT 3, 2026Never let an image model write your headline
Image models spell well now, most of the time. At 99% per image a ten-locale set still has near-even odds of a typo, and painted words can’t be edited, restyled or proofread. Paint a text-free plate and set the type yourself.
OCT 2, 2026Why is your 1px divider grey instead of black?
One pixel of black comes out as two rows of 50% grey — I measured it. Fractional screen densities, the half-pixel rule, why a thinner line only gets fainter, and the hairline Flutter hands you but doesn’t use by default.
OCT 1, 2026How to count free-trial conversions honestly
This week’s conversions belong to last week’s trials, so the usual ratio drops hardest when your funnel is growing. Cohort the denominator, wait out the 60-day recovery tail, and learn how much of the weekly movement is just noise.
SEP 30, 2026Picking a category you can’t change on a whim
Your category is the shortlist you get ranked inside, and Apple doesn’t let you edit it without shipping a version. How to choose between two honest options, and how App Store Tags turned your description into a discovery surface.
SEP 29, 2026Your app expires even if you never touch it
Four clocks run on every published app — Play's target API level, Apple's SDK floor, the outdated-app sweep and your own renewal. Three of them make an untouched app unavailable, and only one sends you a warning.
SEP 28, 2026Which part of your AI call is actually slow?
Every LLM call runs two clocks with different causes: one scales with what you send, the other with what you asked for back. How to measure both in four lines, and the four fixes that beat swapping models.
SEP 27, 2026Where to break a headline that runs two lines
Your renderer breaks on the last space that fits, which knows nothing about your sentence. How to break where a reader would pause, the rag shapes that look accidental, and the two lines of CSS that get close when you can’t hand-set it.
SEP 26, 2026In-app events, explained for apps that aren’t games
Both stores grew a second listing slot that ships without a build and then expires. The character limits, the two aspect ratios, the Play eligibility catch, and what actually counts as an event when your app has no seasons.
SEP 25, 2026Your annual plan is a loan, not a windfall
A year of cash up front is a year of obligation you now owe. Divide the annual price by the monthly one for your real break-even, then find out what the renewal cliff, a failed card and Apple's new 12-month commitment plan do to that number.
SEP 24, 2026Does Google Play punish your app for crashing?
Yes, and the line is published: 1.09% crashes, 0.47% ANRs, 8% on any single device model. Here's how Play counts those rates, why your own crash dashboard shows a friendlier number, and which chart actually finds the problem.
SEP 23, 2026How to build a shadow that looks like real light
A single box-shadow always reads as a grey smudge. Real elevation is two layers — a tight contact shadow plus a wide ambient one — one light direction, a tinted colour, and a completely different answer in dark mode.
SEP 22, 2026Your non-English text costs up to 80% more tokens
I ran the same sentence through a tokenizer in thirteen languages. Japanese says it in half the characters and still costs 55% more; Thai costs 1.8×; a tokenizer version bump cut Hindi by 69%. What that means for your output-token cap.
SEP 21, 2026Corner radius is not a style choice
Rounded corners obey arithmetic: an inner radius is the outer one minus the padding, and the same number is a whisper on a card and a pill on a chip. The nesting formula, the size scale, and why a CSS corner never quite matches an iPhone's.
SEP 20, 2026What the age rating questionnaire is really asking
You don't pick your age rating — both stores compute it from a form, and the capabilities section is where ordinary utilities land at 13+. What Apple's new tiers, the September social-media questions and Play's IARC fan-out actually decide.
SEP 19, 2026Setting white type on dark without the bloom
The same headline looks heavier and furrier the moment you move it onto a dark frame — and nothing in the file changed. Why light-on-dark letterforms swell, and the five adjustments (weight, ink, background, tracking, optical size) that bring them back.
SEP 17, 2026What does an AI model actually see in your screenshot?
No model sees the 3.8 million pixels you sent. Every API shrinks the image and bills a grid of squares. The exact rules for Gemini, OpenAI and Claude, what one screenshot costs, which text survives the shrink, and the sizes we actually send.
SEP 16, 2026The stripes in your gradient aren't a JPEG problem.
Re-exporting as PNG at maximum quality doesn't touch them, because the encoder never added them. Where the steps in an 8-bit fade come from, why a dark "premium" background bands worst, and the three fixes — arithmetic, dither, grain — that actually remove them.
SEP 14, 2026When Apple and Google pay you (and what they keep first).
Your first sale shows up in the dashboard tomorrow and in your bank in two to ten weeks. Apple's fiscal calendar, the two 15% programs you have to ask for, the tax that comes off before the cut, and why the two stores handle refunds in opposite ways.
SEP 13, 2026The screenshot upload that said “done” and delivered nothing.
Every call to App Store Connect returned success, and Apple rejected every image. A post-mortem on the four bugs behind one green check — the alpha channel you can't see, the 409 that was really a full set, and the field the status code never mentions.
SEP 12, 2026Why does your brand color look different on every phone?
A hex code is a coordinate, not a color — and three separate systems between your design file and a user's screen decide what it becomes. Gamuts, profiles, Samsung's Vivid mode, the old Figma trap, and the export rules that keep a screenshot set reading as one set everywhere.
SEP 11, 2026How to limit the blast radius of a bad update.
Neither store can un-ship a broken build — once it's on a phone, it stays. How Apple's phased release and Play's staged rollout actually differ, what to watch at 1%, and the kill switch you have to compile in yourself.
SEP 10, 2026A hardcoded model name is a single point of failure.
Rate limits, capacity errors, retirements, and billing problems all break the same string literal — and in a shipped binary you can't patch it. The fallback chain that keeps an AI feature answering, in about forty lines.
SEP 9, 2026How apps make text readable over any image.
White text over a photo works until a user's photo has a sky in it. The scrims, eased gradients, blurs, and worst-pixel contrast checks every polished app hides in plain sight — and why your store screenshots are where they matter most.
SEP 7, 2026Your app is approved. So why can't anyone find it?
Between "approved" and "findable" sit four systems with four delays: a manual release you forgot choosing, up-to-24-hour propagation, and a search index with no SLA. What's normal in the first 48 hours — and the checklist for when it isn't.
SEP 6, 2026Making a 10-second AI wait feel fast.
Every loading pattern you know was designed for 300 milliseconds, and your AI feature takes twelve seconds. Why spinners and fake progress bars break at that length — and the streaming, staged-label, don't-block-the-app patterns that don't.
SEP 5, 2026An App Store rejection is a negotiation, not a verdict.
The guideline citation reads like a final judgment. It's an opening offer: what Metadata Rejected really means, how a Resolution Center reply flips a decision without a resubmission, and when the formal appeal is worth spending.
SEP 4, 2026Testing a feature that never gives the same answer twice.
An equality assertion on LLM output dies in CI, and the wrong lesson gets learned. Where the deterministic tests in an AI feature actually live, which properties to assert instead of strings, and how to score the part you can't pin down.
SEP 3, 2026When should you kill an app?
Both stores now decay untouched apps by policy — Apple flags them for removal, Google hides them from new users. How to tell a dead app from an unmarketed one, and how to wind one down without hurting the users you have.
SEP 2, 2026Same prompt, different answer: how LLM sampling works.
The last step of every token is a weighted dice roll. What temperature and top-p actually reshape, why identical requests diverge even at temperature 0, and when the randomness is the feature you want.
SEP 1, 2026Almost nobody qualifies for “Data Not Collected.”
Crash reporting, analytics, and sign-in all count as collection — the stores audit your SDK list, not your intentions. How to fill out Apple's privacy label and Google's Data safety form honestly in 30 minutes.
AUG 31, 2026How to launch an app when nobody knows you exist.
Every channel is a spike that decays; only search rankings and retained users compound. A four-week sequence for developers with zero followers — ship quietly, rebuild the listing until it converts, then fire one channel at a time and learn between shots.
AUG 30, 2026Which star rating are users actually seeing?
Apple splits your rating by country and hands you a reset button; Google weights recent reviews and splits it by device. No shopper ever sees the blended number on your dashboard — and the real numbers, read per market, double as a diagnostic.
AUG 26, 2026Stop wrapping AI errors in “something went wrong.”
A rate limit fixes itself in seconds; a billing lapse never does — and behind a generic toast, neither your user nor you can tell which one just fired. A field guide to classifying, retrying, falling back, and surfacing LLM errors people can actually act on.
AUG 24, 2026The delete-account button both app stores require.
Sign-in takes an afternoon; the exit is the requirement nobody budgets for. Apple wants real deletion inside the app, Google adds a public web link — and the obvious Firebase implementation passes every test you run while failing every real user.
AUG 23, 2026Why “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.
AUG 22, 2026We 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.
AUG 21, 2026Does 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.
AUG 20, 2026Your 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.
AUG 19, 2026Google 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.
AUG 18, 2026Pairing 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.
AUG 17, 2026Getting 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.
AUG 16, 2026How 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.
AUG 15, 2026“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.
AUG 14, 2026Our 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.
AUG 13, 2026Designing 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.
AUG 12, 2026MCP, 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.
AUG 8, 2026Your 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.
AUG 6, 2026How 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.
AUG 5, 2026Updating 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.
AUG 4, 2026Reasoning 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.
AUG 3, 2026How 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.
AUG 2, 2026Underpricing 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.
AUG 1, 2026Icon 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.
JUL 31, 2026Can 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.
JUL 30, 2026Why 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."
JUL 29, 2026Apple 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.
JUL 25, 2026Your 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.
JUL 24, 2026Apple 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.
JUL 23, 2026Why 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.
JUL 22, 2026Your 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.
JUL 21, 2026The 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.
JUL 20, 2026Apple 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.
JUL 19, 2026Apple 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.
JUL 18, 2026You'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.
JUL 17, 2026Nobody 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.
JUL 16, 2026Both 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.
JUL 14, 2026Why 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.
JUL 13, 2026The 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.
JUL 11, 2026What 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.
JUL 10, 20267 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.