Drop-in replacement for AppCenter CodePush

Ship updates

Managed CodePush server for React Native. Push OTA updates to your users without app store delays. Zero config, instant setup.

# Push a mandatory update with release notes
$ swyngpush release-react MyApp-iOS ios \
-d Production -t "1.22" -m \
--description "Critical bug fix"
✓ Released v4 to Production (1.2 MB diff)

Everything you need

A complete CodePush replacement you own and control.

Instant Updates

Push JS bundle updates to users in seconds. No app store review required.

Fully Managed

We handle the infrastructure. You focus on shipping. Global CDN included.

Rollbacks

One-click rollback to any previous version. Instant recovery from bad deploys.

Diff Updates

Only changed files are downloaded. 22MB bundle → 1.5MB diff for users.

CDN Delivery

Serve bundles from CloudFront, R2, or any S3-compatible storage with global edge.

Analytics

Track downloads, deploy success rates, and rollout progress in real-time.

How it works

1

Install the CLI

$ npm install -g @swyng/cli
2

Login to swyng

$ swyngpush login
3

Create your app

$ swyngpush app add MyApp-iOS ios react-native
4

Push updates

$ swyngpush release-react MyApp-iOS ios -d Production

Quick Setup

Get OTA updates running in your React Native app in under 5 minutes.

New to CodePush?

1

Install react-native-code-push

npm install react-native-code-push
2

Sign up and create your app

swyngpush login swyngpush app add MyApp-iOS ios react-native
3

Get your deployment key

swyngpush deployment list MyApp-iOS -k
4

Add to your app

import codePush from 'react-native-code-push';

const codePushOptions = {
  serverUrl: 'https://bl-prod-2-ap-south-1.swyng.site',
  deploymentKey: 'YOUR_PRODUCTION_KEY',
  checkFrequency: codePush.CheckFrequency.ON_APP_RESUME,
};

export default codePush(codePushOptions)(App);
5

Configure native (iOS)

<!-- Info.plist -->
<key>CodePushDeploymentKey</key>
<string>YOUR_PRODUCTION_KEY</string>
<key>CodePushServerURL</key>
<string>https://bl-prod-2-ap-south-1.swyng.site</string>
6

Push your first update

swyngpush release-react MyApp-iOS ios -d Production -t "1.0" --description "First OTA update"

Migrating from AppCenter / RevoPush?

Just change the server URL in your existing config. The protocol is fully compatible.

// Just change serverUrl — everything else stays the same
const codePushOptions = {
serverUrl: 'https://bl-prod-2-ap-south-1.swyng.site', // ← change this
deploymentKey: 'YOUR_SWYNG_KEY', // ← new key from swyng
}

Simple pricing

No surprises. Scale as you grow.

Startup

$25per month
  • Unlimited releases
  • Up to 50K MAU
  • Up to 100 GB egress/month
  • $0.03/GB egress over limit
  • $1 per 1,000 additional users
  • CI/CD Integration
  • Deployment Analytics
  • Community Support
Get Started
Most Popular

Growing

$100per month
  • Unlimited releases
  • Up to 300K MAU
  • Up to 1 TB egress/month
  • $0.03/GB egress over limit
  • $1 per 1,000 additional users
  • CI/CD Integration
  • Deployment Analytics
  • Priority Support
Get Started

Need more? Contact us for enterprise plans.

CLI Reference

Everything you need from the command line.

swyngpush loginAuthenticate with swyng (interactive email/password)
swyngpush app add <name> <os> <platform>Create a new app (auto-creates Staging + Production)
swyngpush deployment list <app> -kList deployments with their keys
swyngpush release-react <app> <platform> -d <deployment> -t <version> --description "notes"Bundle and push an update
swyngpush release-react <app> ios -d Production -t 1.22 -mPush a mandatory update targeting v1.22
swyngpush release-react <app> ios -d Staging -r 25Push to 25% rollout
swyngpush rollback <app> <deployment>Rollback to the previous release
swyngpush rollback <app> Production --target-label v2Rollback to a specific version

release-react options

FlagDescriptionDefault
-d, --deployment-nameTarget deploymentStaging
-t, --target-binary-versionTarget app binary versionauto-detect
-m, --mandatoryMark as mandatory updatefalse
--descriptionRelease notes
-r, --rolloutRollout percentage (1-100)100
-x, --disabledCreate release as disabledfalse
--entry-fileCustom entry fileindex.js