🇬🇧 English · Türkçe
An internal Next.js tool for managing App Store Connect metadata in the browser, editing multi-locale localizations, and generating translations and screenshots with AI.
It combines the Apple App Store Connect API, Google Gemini, and Wiro AI in a single interface. All credentials are stored only in your browser (localStorage) and are never persisted on the server.
https://webisso.github.io/appstore-manager/
Every push to main triggers the GitHub Actions workflow and publishes the app to GitHub Pages.
- Open Settings → Pages in the GitHub repository
- Under Build and deployment, set Source to GitHub Actions
- Push to
main— the workflow builds and deploys automatically
- Open the live demo
- Configure your credentials under Settings (Apple, Gemini, Wiro)
- Browse apps at
/apps, edit metadata, run bulk imports, and generate AI screenshots
Note: GitHub Pages serves static files only. Next.js API routes (
/api/*) proxy App Store Connect, Gemini, and Wiro requests on the server. Those routes are not available on the GitHub Pages deployment. For full API functionality, use local development or run a Node.js host withnpm run build && npm run start.
- Features
- Architecture
- Requirements
- Local development
- Configuration
- Usage
- Project Structure
- API Endpoints
- AI Prompt Files
- Development
- Security Notes
- License
- App listing — View all apps in your ASC account with icon, bundle ID, and primary locale
- Metadata editing — Edit name, subtitle, description, keywords, what's new, and URL fields per locale
- Character limit tracking — Live counters and over-limit warnings based on App Store Connect limits
- Multi-locale navigation — Visual badges for unsaved changes and limit errors
- Screenshot viewing — Browse iPhone / iPad sets with a lightbox
- Screenshot upload — Upload AI-generated images directly to ASC
| Tool | Description |
|---|---|
| Privacy Policy | Copy a privacy policy URL from a template to all locales |
| Sync URLs | Sync support / marketing URLs from the primary locale to other languages |
| Auto Translate | Translate metadata with Gemini; auto-correct when limits are exceeded |
| Auto Image Generation | Generate localized screenshots for target locales from a source locale |
| Provider | Use case |
|---|---|
| Google Gemini | Metadata translation, screenshot localization (text + image models) |
| Wiro AI | Image generation / editing models (settings ready; integration extensible) |
┌─────────────────────────────────────────────────────────────┐
│ Browser (Client) │
│ localStorage: Apple credentials, Gemini settings, Wiro │
└──────────────────────────┬──────────────────────────────────┘
│ POST (credentials in body)
▼
┌─────────────────────────────────────────────────────────────┐
│ Next.js API Routes (Server) │
│ /api/apple/* /api/gemini/* /api/wiro/* /api/image/* │
└──────┬─────────────────┬──────────────────┬───────────────┘
│ │ │
▼ ▼ ▼
App Store Connect Google Gemini API Wiro AI API
REST API
Credentials are sent from the client to the server on each request, used for external API calls, and returned. There is no server-side database or persistent credential store.
- Node.js 24+
- npm (or a compatible package manager)
- App Store Connect API Key (.p8 private key)
- (Optional) Google AI Studio Gemini API key
- (Optional) Wiro API key + secret
For full App Store Connect and AI integration (API routes), run the app locally:
git clone https://github.com/Webisso/appstore-manager.git
cd appstore-manager
npm install
npm run devOpen http://localhost:3000. On first visit, if Apple credentials are not configured, you are redirected to Settings → Apple Settings.
npm run build # Production build
npm run start # Production server (Node.js required for /api routes)
npm run lint # ESLint
npm run test # Vitest unit testsmv app/api /tmp/app-api-backup
GITHUB_PAGES=true npm run build
mv /tmp/app-api-backup app/api
npx serve outThe static export uses basePath: /appstore-manager to match the GitHub Pages URL.
All settings are managed from the Settings page (/settings).
Under Settings → Apple Settings:
| Field | Description |
|---|---|
| Issuer ID | App Store Connect → Users and Access → Keys → Issuer ID (UUID) |
| Key ID | 10-character ID of your API key |
| Private Key | Contents of your .p8 file (drag-and-drop or paste) |
Use Test Connection to verify, then Save to store credentials in the browser.
Your API key must be created with App Manager or an appropriate role.
Under Settings → Gemini Settings:
- Get an API key from Google AI Studio
- Click Verify API Key
- Text Model — for metadata translation (e.g.
gemini-2.5-flash) - Image Model — for screenshot localization (e.g.
gemini-2.5-flash-image) - Save Settings
Auto Translate and Auto Image Generation require saved Gemini settings.
Under Settings → Wiro AI Settings:
- Create a project in the Wiro Dashboard
- Enter your API Key and API Secret (signature-based authentication)
- Click Verify Credentials
- Image Model — lists models in image-generation, image-to-image, and image-editing categories
- Save Settings
Model ID format: owner-slug/model-slug (e.g. wiro/virtual-try-on)
Open /apps and click an app. The detail page shows version info, primary locale, and all localizations.
- Pick a locale from the locale badges
- Edit fields under the Text tab
- Character counters reflect App Store limits
- Click Save to push changes to App Store Connect
Editable fields: Name, Subtitle, Description, Keywords, What's New, Support URL, Marketing URL, Privacy Policy URL
- View iPhone / iPad sets under the Screenshots tab
- Use Create with AI on a locale to generate localized screenshots from a source locale
- Preview generated images and upload them to ASC
The toolbar at the top of the app detail page:
- Privacy Policy — Apply a privacy policy URL template to all locales
- Auto Translate — Gemini translation for selected locales; partial translation and optional what's new
- Auto Image Generation — Bulk AI screenshot localization from a source locale; review and upload in batch
Use the Sync URLs modal to copy support and marketing URLs from the primary locale to other languages.
appstore-manager/
├── app/
│ ├── api/
│ │ ├── apple/ # App Store Connect proxy
│ │ ├── gemini/ # Gemini verify, models, translate, screenshot
│ │ ├── wiro/ # Wiro verify, models
│ │ └── image/ # Image resizing (sharp)
│ ├── apps/ # App list and detail pages
│ └── settings/ # Settings page
├── components/
│ ├── import/ # Bulk import modals
│ ├── settings/ # Apple, Gemini, Wiro settings forms
│ └── ui/ # shadcn/ui components
├── lib/
│ ├── apple/ # ASC client, auth, screenshots, types
│ ├── gemini/ # Gemini client, translate, prompts
│ ├── wiro/ # Wiro client, settings
│ ├── image/ # iPhone screenshot resize
│ └── screenshots/ # AI generation batch logic
└── public/prompts/ # Editable AI prompt templates
| Endpoint | Description |
|---|---|
POST /api/apple/test |
Verify credentials |
POST /api/apple/apps |
List apps |
POST /api/apple/apps/[appId] |
App detail |
POST /api/apple/apps/[appId]/localizations |
Save metadata |
POST /api/apple/apps/[appId]/import/privacy-policy |
Import privacy policy URL |
POST /api/apple/apps/[appId]/import/urls |
Import support / marketing URLs |
POST /api/apple/apps/[appId]/screenshots |
Fetch screenshots |
POST /api/apple/apps/[appId]/screenshots/upload |
Upload screenshot |
| Endpoint | Description |
|---|---|
POST /api/gemini/verify |
Verify API key |
POST /api/gemini/models |
List available models |
POST /api/gemini/translate-metadata |
Translate metadata / fix limits |
POST /api/gemini/generate-screenshot |
Generate localized screenshot |
| Endpoint | Description |
|---|---|
POST /api/wiro/verify |
Verify API key + secret |
POST /api/wiro/models |
List image models |
| Endpoint | Description |
|---|---|
POST /api/image/resize-iphone-screenshot |
Resize iPhone screenshot |
POST /api/image/resize-ipad-screenshot |
Resize iPad screenshot |
Text files under public/prompts/ can be edited to customize AI behavior:
| File | Purpose |
|---|---|
metadata-translation.txt |
Metadata translation prompt |
metadata-limit-correction.txt |
Character limit correction prompt |
screenshot-localization.txt |
Screenshot localization prompt |
Changes take effect after a server restart or cache clear.
- Framework: Next.js 16 (App Router)
- UI: React 19, Tailwind CSS 4, shadcn/ui, Radix UI
- Auth: Apple JWT (
jose) - Image processing: sharp
- Testing: Vitest
- Hosting: GitHub Pages (static UI) + Node.js for full API support
// lib/apple/metadata-limits.ts
name: 30
subtitle: 30
description: 4000
keywords: 100
whatsNew: 4000| Key | Contents |
|---|---|
asc_credentials |
Apple Issuer ID, Key ID, Private Key |
gemini_settings |
Gemini API key, text/image model, verified |
wiro_settings |
Wiro API key, secret, image model, verified |
- Credentials live in browser
localStorage; they are not stored on the server - Use HTTPS in production (GitHub Pages serves over HTTPS by default)
- Never commit
.p8private keys or API secrets to version control - On shared machines, use Disconnect to clear Apple credentials
- Gemini and Wiro API keys pass through client → server → external API; they are not stored on the server