I localized my listing into 16 App Store locales before fixing the app itself — wrong order, but I learned a few things

Solo dev here, travel app (Go There, "Buraya Gidelim" in Turkish). I spent most of July on ASO because it was the cheapest lever I had — no ad budget, no press, just text fields I can edit for free.

Where I ended up: all 16 App Store locales fully written (name, subtitle, keyword field, description, promo text), the app itself in 6 languages including Arabic RTL, and the audio guide narrated by a native voice per language instead of English for everyone. On the audit I run against the store APIs the Apple side scores around 93/100 — keyword field ~95% full, no words repeated across name/subtitle/keywords, no wasted plurals.

And I still wasn't showing up for most of the keywords I actually cared about.

That's the thing I'd tell myself in June. Metadata gets you indexed, it doesn't get you ranked. Both stores lean hard on post-install behaviour now, so if people install and don't come back there's nothing for keyword tuning to multiply. Metadata is the multiplier, the product's conversion is the base. I had a decent multiplier sitting on a weak base and kept wondering why the number wouldn't move. The week I spent on the first-run experience did more for visibility than any field edit.

Things that were worth learning anyway:

I burned a whole planning session on "my Play title is 25 of 50 characters, half the field is empty". The Play title limit is 30, not 50 — Google cut it back in 2021 and the Developer API flat out rejects anything longer. My biggest quick win didn't exist.

Apple indexes name + subtitle + keyword field as one bag, so every word you repeat across them is a slot you paid for twice. Killing duplicates is where I found room for new terms, not in the 100-char field itself.

Keyword research in my own language was the humbling part. The generic category words (trip, travel, places to go) come back below Apple's reportable popularity threshold in Turkish — there simply isn't measurable volume there. The words with real volume were the platforms my app hooks into. So the listing ended up describing the hook rather than the category, which felt wrong and read better.

iOS name/subtitle/keywords are frozen until your next binary, but promo text is editable live in every locale. I shipped one version without touching a single metadata field — that's a free test slot you don't get back. Now anything I expect to change lives in promo text.

If I started over: get one locale converting, then translate. Localization multiplies whatever your base listing already does, including nothing.

Curious how others here order it — do you localize early because it's basically free, or hold off until one market actually converts?

reddit.com
u/IronAndCoder — 2 days ago
▲ 1 r/apps

I kept losing the places friends sent me on Instagram, so I made saving them one DM

Here's the thing that annoyed me for years. A friend sends me a reel of some tiny pasta place. I watch it, I think "yes, definitely", and then it's gone. Two months later I'm standing in that exact neighbourhood eating a mediocre sandwich.

Copying the link, opening a notes app, pasting, typing the name of the place - I never did it. Not once, honestly.

So the app I ended up building (Go There) works the other way around. You forward the reel to our Instagram account as a DM and that's it, you're done. A couple of minutes later the place is a pin on your own map, with the video it came from still attached to it. Same deal with TikTok links, YouTube videos and Google Maps links - you share, we work out which place is in it.

Then when you're actually going somewhere, it can take your saved pins in that city and lay them out as a day by day plan, instead of you staring at 40 pins trying to work out what's near what.

I'm the developer, so obviously I'm biased. Free tier is a real free tier, not a 3 day trial. iOS and Android, 6 languages.

Genuinely curious though: what do you lot do with the places people send you? Screenshots folder you never open? Group chat you scroll back through? I have a feeling everyone's system for this is quietly broken.

reddit.com
u/IronAndCoder — 2 days ago

Go There — forward an Instagram reel to a bot and the place lands on your map

Built this because my DMs were full of restaurant reels I never visited. Now I just forward the reel and the place shows up pinned on my map. Works with TikTok, YouTube and Google Maps links too, and it double-checks every place against real map data so it never pins something made up. Then it can plan a day trip from your saved pins.

iOS + Android, free tier, 6 languages: https://burayagidelim.com/en

The Instagram DM part still feels like a magic trick to me and I built the thing. Feedback very welcome, especially on the first two minutes.

reddit.com
u/IronAndCoder — 3 days ago

I almost paywalled the one feature that actually brings me new users

Solo dev, travel app. You DM an Instagram reel to it and the actual place ends up pinned on your map. Out a few months on iOS and Android, six languages.

When I sat down to price it, the obvious move was a hard paywall. Everything expensive in the app is AI: pulling the place out of a video, verifying it against Google Places, generating an itinerary. All of that costs me real money per run. Gating it at signup looked like plain arithmetic.

I didn't, and the reason is that the expensive thing is also the thing that travels. Someone saves a place from a reel, then sends the map to whoever they're going with. That person installs. Put the first save behind a paywall and that chain never starts, and then I'm buying ads to replace a loop I already had for free.

So it's credits instead. Free gets a small weekly refill, paid gets a monthly pool. Cheap actions like a Maps import cost a fraction of a credit, a full AI itinerary costs a whole one. What I like about it is that the free tier is actually usable instead of being a trailer, and the price of a feature tracks what it costs me to run, so a heavy user who pays is a heavy user I can afford.

The thing I got wrong was the launch. Did Product Hunt earlier this month expecting it to be the day the numbers move. It isn't. The spike is small and it's over by dinner. What lasts is the page, which sits there ranking and getting linked and doing a little work every week without me. Same with the directory listings. Next time I'm planning it as "build an asset" and not looking at the counter.

Also changing how I measure. I'd been counting installs per channel, which tells me almost nothing, because an install from someone who never saves a single place is a rounding error wearing a growth costume. Moving to first save per channel with the deep link tagged, so I can see which channels send people who actually do the thing.

Stack if it's useful: React Native and Expo, FastAPI backend, Gemini for the extraction, Supabase, one small Hetzner box.

Curious how others handled a free tier where the free actions have a real per-use cost. Cap by count, cap by feature, or just eat it?

reddit.com
u/IronAndCoder — 3 days ago

My Share Extension does the real work in my app, and it can't touch a line of my React Native code

I ship a travel app with Expo's managed workflow, no ios folder in git, and the feature people actually use is the share sheet. You're in TikTok or YouTube, you hit share, pick my app, and a sheet slides up and saves the place without you ever leaving the app you were in. That sheet is Swift and SwiftUI. It can't call into my JS at all.

Two things cost me the most time, in case they save someone else an evening.

Auth. The plan was keychain-access-groups so the extension could read the token expo-secure-store had written. Wrote the config plugin, added the entitlement to the app and both extension targets, extension still got nil. expo-secure-store doesn't expose keychainAccessGroup, so the item sits in the app's own group and the extension can't see it. I moved the access and refresh token into App Group UserDefaults instead. The helper class is still named KeychainHelper, which tells you how that went. The part I didn't see coming: Supabase rotates the refresh token on every refresh, so now two processes can rotate it. The extension has to write the new pair back the second it refreshes or the next app launch is holding a dead token.

Prebuild ordering. Everything in the extension target is generated at prebuild by expo-share-intent, then patched by my own plugins. withDangerousMod runs before withXcodeProject, so patching entitlements from a dangerous mod means the files aren't there yet. And withXcodeProject mods run LIFO, so the plugin listed first in app.json runs last. I spent a good while debugging a plugin that "did nothing" and was just running at the wrong point.

The scoping call was boring but I think it was right: the extension only handles what it can finish on its own. TikTok and YouTube go through the native sheet, Google Maps links fall through to the default path, write into the App Group and open the host app, because that flow needs logic that lives in JS. It's tempting to keep pulling things into Swift and then you're maintaining two clients.

One trick that made it feel fast: if you don't want to wait for the sheet, it writes a pending entry into the App Group and closes right away, and the app picks it up on next foreground and shows a banner.

Disclosure, this is my own app (Go There). Happy to get into specifics, the entitlements and prebuild side especially, that took far longer than the Swift did.

reddit.com
u/IronAndCoder — 3 days ago

The scariest part of shipping an AI feature wasn't the model, it was one user's bill

Solo dev, travel app with an AI planner in it. You describe a trip, it goes off and does web research, place lookups, routing, a couple of LLM passes, and hands you an itinerary.

First month it was live I woke up to one user who had generated forty-something plans in a single evening. Not abuse, they were just playing with it. My margin on that user was gone and then some. That was the day I stopped treating this as an AI problem and started treating it as a plumbing problem.

Four things fixed it, none of them clever.

Every job gets a price ceiling before it runs. I estimate what the planned tool calls will cost and cap it around fifty cents, plus a daily ceiling per user. A run that wants to be more expensive than that gets trimmed, not funded.

The agent isn't allowed to keep looking. Max 3 web searches, max 6 tool calls, hard stop. I expected quality to drop and it barely did. Past the third search it was mostly rephrasing itself anyway.

Cache anything that isn't actually fresh. Place data 30 days, web and review evidence 14 days. The second person asking about the same city costs me almost nothing, and cache hits are honestly the only reason the unit economics work at all.

Credits on the user side too, so the ceiling exists in both directions instead of me eating the tail alone.

Stack since this sub always asks: React Native + Expo on the phone, FastAPI + Temporal on one small Hetzner box (Temporal because a 40 second generation shouldn't die just because I redeployed), Gemini for the model calls, Supabase for db and auth.

What I'd tell myself a year ago: with normal CRUD SaaS your cost per user is basically flat and you can ignore it until you're big. With anything agentic it's a random variable with a long tail, and one curious user IS the tail. Put the ceiling in on day one, it's an afternoon of work, not a rewrite.

Anyone else enforcing hard per-job cost limits, or are you all just watching the provider dashboard and hoping?

reddit.com
u/IronAndCoder — 5 days ago