The all-in-one toolkit to grow your app globally. Localize your App Store and Google Play listings, optimize subscription pricing by country, and generate stunning screenshots β all connected directly to App Store Connect and Google Play Console.
π Try it now: localizer.fayhe.com
Expanding your app internationally is painful:
- Translating metadata manually takes forever
- Pricing subscriptions fairly across 175 countries is guesswork
- Creating localized screenshots for every language is tedious
- Managing both iOS and Android stores doubles the work
App Store & Play Store Localizer solves all of this in one place.
Translate your entire App Store and Google Play listings to 40+ languages in minutes, not days.
- One-click translation of app name, subtitle, description, keywords, and what's new
- AI-powered with OpenAI or AWS Bedrock (Claude)
- Protected words to keep brand names untranslated
- Direct sync with App Store Connect and Google Play Console β no copy-paste needed
- Manage screenshots and graphics for both platforms
Stop leaving money on the table. Set fair prices based on each country's purchasing power.
- GDP-adjusted pricing recommendations for 40+ countries
- See current vs recommended prices at a glance
- One-click price updates directly to App Store Connect
- Automatic currency conversion and price point matching
Create professional App Store screenshots with device mockups in seconds.
- 2D and 3D device frames (iPhone, Android)
- Multi-language headlines with AI translation
- Custom backgrounds, shadows, and layouts
- Batch export all languages as ZIP
Just visit localizer.fayhe.com β no installation needed.
git clone https://github.com/fayharinn/iOS-App-Distribution-Localizer.git
cd iOS-App-Distribution-Localizer
npm install
npm run devYour credentials never leave your browser:
.p8private keys are encrypted locally with your password- JWT tokens are generated client-side
- No data is sent to any third-party server
- Open source β audit the code yourself
View App Store Connect authentication flow
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β App Store Connect Auth Flow β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ password ββββββββββββββββ β
β β .p8 Key β βββββββββββββββΊ β Encrypted β ββββ Stored in localStorage β
β β (file) β encrypt β .p8 Key β (persistent) β
β ββββββ¬ββββββ ββββββββ¬ββββββββ β
β β β β
β β sign β password β
β β β decrypt β
β βΌ βΌ β
β ββββββββββββ ββββββββββββββββ β
β β JWT β βββββββββββββββββ Decrypted β β
β β Token β sign β .p8 Key β ββββ In memory only β
β ββββββ¬ββββββ ββββββββββββββββ (cleared on reload) β
β β β
β β cache β
β βΌ β
β ββββββββββββββββ β
β β sessionStorageβ ββββ JWT cached for ~19 min β
β β (JWT only) β Auto-reconnect on page reload β
β ββββββββ¬ββββββββ Timer shows remaining time β
β β β
β β Bearer token β
β βΌ β
β ββββββββββββββββ β
β β App Store β β
β β Connect API β β
β ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
View Google Play Console authentication flow
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Google Play Console Auth Flow β
β (OAuth2 JWT Bearer for Service Accounts) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββ β
β β Service Accountβ ββββ JSON file from Google Cloud Console β
β β JSON File β Contains: client_email, private_key β
β βββββββββ¬βββββββββ β
β β β
β β parse & extract β
β βΌ β
β ββββββββββββββββββ β
β β Private Key β ββββ RSA private key (RS256) β
β β + Client Emailβ In memory only (not persisted) β
β βββββββββ¬βββββββββ β
β β β
β β sign JWT claim β
β βΌ β
β ββββββββββββββββββ JWT Payload: β
β β Signed JWT β β’ iss: client_email β
β β Assertion β β’ scope: androidpublisher β
β βββββββββ¬βββββββββ β’ aud: oauth2.googleapis.com/token β
β β β’ iat/exp: timestamps β
β β β
β β POST to Google OAuth2 β
β βΌ β
β ββββββββββββββββββ β
β β Google β β
β β OAuth2 Token β ββββ https://oauth2.googleapis.com/token β
β β Endpoint β grant_type: jwt-bearer β
β βββββββββ¬βββββββββ β
β β β
β β returns access_token β
β βΌ β
β ββββββββββββββββββ β
β β sessionStorage β ββββ Access token cached for ~1 hour β
β β (token + expiry)β Auto-refresh when expired β
β βββββββββ¬βββββββββ Timer shows remaining time β
β β β
β β Bearer token β
β βΌ β
β ββββββββββββββββββ β
β β Google Play β β
β β Developer API β ββββ androidpublisher/v3/applications/{packageName} β
β ββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Edit Session Workflow: β β
β β β β
β β Create Edit βββΊ Make Changes βββΊ Commit Edit β β
β β β β β β β
β β β β ββββΊ Changes go live β β
β β β β β β
β β β ββββΊ Update listings, upload images β β
β β β β β
β β ββββΊ Returns editId (required for all operations) β β
β β β β
β β Note: Uncommitted edits expire automatically β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Go to App Store Connect > API Keys
- Create a key with Admin or App Manager role
- Note your Key ID and Issuer ID
- Download the
.p8file - Enter credentials in the app sidebar
- Go to Google Cloud Console
- Create a service account in your project, with Google Play Developer API enabled
- Download the JSON key file
- In Play Console β Users and permissions β Invite new users
- Add the service account email (from the JSON file)
- Grant "Admin" or "Release manager" permission for your app
- Upload the JSON key in the app sidebar
Configure in the sidebar:
| Provider | API Key Format |
|---|---|
| OpenAI | sk-... |
| AWS Bedrock | ACCESS_KEY:SECRET_KEY |
- React 19 + Vite β Fast, modern frontend
- Tailwind CSS + shadcn/ui β Beautiful UI components
- Three.js β 3D device mockups
- jose β JWT signing for App Store Connect
The App Store Connect API doesn't support CORS. For production, deploy with Cloudflare:
# Deploy API proxy
wrangler deploy -c wrangler.proxy.jsonc
# Set proxy URL
echo "VITE_ASC_PROXY_URL=https://your-proxy.workers.dev" > .env.production
# Deploy site
npm run build
wrangler pages deploy distContributions welcome! Feel free to open issues or submit PRs.
GNU AGPLv3 β Free to use, modify, and distribute with attribution.
Screenshot generator based on appscreen by Stefan from yuzuhub.com


