A web dashboard for managing multiple Apple App Store Connect accounts.
View apps, versions, in-app purchases, subscriptions, and Xcode Cloud builds -- all from a single interface.
Built with React 18, Express 5, and the App Store Connect API v2.
Getting Started · Features · Contributing · Report Bug · Request Feature
- Multi-account support -- Add multiple App Store Connect accounts and view all apps in one place
- App overview -- See app statuses, icons, and metadata at a glance with filtering and grouping
- Version management -- Browse version history, create new versions, and submit for review
- In-app purchases -- Create, edit, and manage consumable, non-consumable, and non-renewing subscription products with localizations
- Auto-renewable subscriptions -- Manage subscription groups, subscription products, and their localizations
- Xcode Cloud -- View build runs, workflows, build actions, issues, and logs with a terminal-style log viewer
- Fast & cached -- In-memory API response caching with automatic invalidation on mutations
Browser --> Vite (5173) --> /api/* proxy --> Express (3001) --> JWT sign --> App Store Connect API
- Frontend: React 18 + Tailwind CSS v4, bundled with Vite. URL-based routing via
pushState(no router library). - Backend: Express 5 API proxy. Generates ES256 JWTs per-request, normalizes JSON:API responses into flat objects, and caches responses in memory (5-minute TTL).
- Node.js 18+
- An App Store Connect API key (Issuer ID, Key ID, and private key
.p8file)
git clone https://github.com/codeflow-studio/asc-manager.git
cd asc-manager
npm installStart both servers in separate terminals:
# Backend API proxy (port 3001)
npm run server
# Frontend dev server (port 5173)
npm run devOpen http://localhost:5173 and add your first account using the + button. Paste your Issuer ID, Key ID, and the contents of your .p8 private key file.
npm run build
npm run previewserver/
index.js Express app entry point
lib/
account-store.js Account CRUD with JSON file persistence
auth.js ES256 JWT generation with token caching
asc-client.js App Store Connect API fetch wrapper
cache.js Generic TTL cache
routes/
accounts.js Account management endpoints
apps.js App list, versions, lookup, submit
products.js IAP and subscription CRUD with localizations
xcode-cloud.js Xcode Cloud builds, workflows, actions, logs
src/
main.jsx React entry point
main.css Tailwind CSS v4 theme and animations
api/index.js Frontend API client functions
constants/index.js Status maps, color palettes, product types
components/
AppStoreManager.jsx Main orchestrator (state + routing)
AppDetailPage.jsx App detail view
VersionDetailPage.jsx Version detail with build selection
ProductsPage.jsx IAP and subscription management
XcodeCloudPage.jsx Build runs and workflows
BuildDetailPage.jsx Build detail with actions and log viewer
... UI components (TopBar, Sidebar, AppGrid, etc.)
- Private keys are stored in
data/accounts.json(auto-created, gitignored) and never exposed to the browser - The
/api/accountsGET endpoint strips secrets -- onlyid,name, andcolorare returned .p8files are gitignored by default- JWTs are generated server-side and cached until 2 minutes before expiry
See the open issues for a list of proposed features and known issues.
Contributions are what make the open source community amazing. Any contributions you make are greatly appreciated.
- Fork the project
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See CONTRIBUTING.md for detailed guidelines.
Distributed under the MIT License. See LICENSE for more information.
- App Store Connect API by Apple
- React
- Tailwind CSS
- Express