Overview
Applad manages all deployment pipelines through YAML files in deployments/. Each deployment type (web, Play Store, App Store, OTA) is defined in a single file with a source block pointing to your code.
Deploy ≠ Release Deploy is the technical act of putting an artifact somewhere. Release is the business decision to make functionality live to users, controlled through feature flags . These are separate concerns managed by separate people at separate times.
Web Deployments
Basic Web Deployment
name : "web"
type : "web"
domain : "myapp.com"
www_redirect : true
ssl : true
source :
type : "github"
repo : "myorg/myapp-web"
branch : "main"
build_command : "flutter build web"
output_dir : "build/web"
ssh_key : "ci-github-actions"
headers :
- path : "/*"
values :
X-Frame-Options : "DENY"
X-Content-Type-Options : "nosniff"
X-XSS-Protection : "1; mode=block"
Strict-Transport-Security : "max-age=31536000; includeSubDomains"
Referrer-Policy : "strict-origin-when-cross-origin"
Content-Security-Policy : "default-src 'self'; script-src 'self'"
Permissions-Policy : "camera=(), microphone=(), geolocation=()"
redirects :
- from : "/old-path"
to : "/new-path"
status : 301
triggers :
- type : "git_push"
branch : "main"
- type : "manual"
Preview Environments
Automatically create deployments for each pull request:
preview_environments :
enabled : true
pattern : "pr-{number}.preview.myapp.com"
ssl : true
Manage preview environments:
# List active previews
applad deploy preview list web
# Open preview for PR #42
applad deploy preview open web --pr 42
Android Deployments
Play Store Deployment
deployments/android-production.yaml
name : "android-production"
type : "play-store"
track : "production" # internal | alpha | beta | production
source :
type : "github"
repo : "myorg/myapp"
branch : "main"
ssh_key : "ci-github-actions"
build :
command : "flutter build appbundle --release"
output : "build/app/outputs/bundle/release/app-release.aab"
infrastructure :
type : "vps"
host : "build.acme-corp.com"
ssh_key : "ci-github-actions"
signing :
keystore : "android-keystore" # Reference to credential in admin database
key_alias : "release"
store_metadata :
package_name : "com.acme.myapp"
release_notes : "auto" # Generate from git commits or specify manually
triggers :
- type : "git_tag"
pattern : "v*"
- type : "manual"
Configure signing credentials
Store your keystore securely: applad secrets set android-keystore
Trigger deployment
applad deploy run android-production
Or tag a release: git tag v1.0.0
git push --tags
Monitor deployment
applad deploy logs android-production
applad deploy status android-production
iOS Deployments
App Store Deployment
deployments/ios-production.yaml
name : "ios-production"
type : "app-store"
source :
type : "github"
repo : "myorg/myapp"
branch : "main"
ssh_key : "ci-github-actions"
build :
command : "flutter build ipa --release"
output : "build/ios/ipa"
infrastructure :
type : "cloud"
provider : "aws"
instance_type : "mac2.metal" # macOS required for iOS builds
region : "us-east-1"
credentials : "aws-production"
teardown_after : true # Tear down instance after build
signing :
certificate : "ios-distribution" # Reference to credential in admin database
profile : "ios-appstore-profile"
store_metadata :
bundle_id : "com.acme.myapp"
release_notes : "auto"
triggers :
- type : "git_tag"
pattern : "v*"
- type : "manual"
iOS builds require macOS. Applad automatically provisions an AWS Mac instance, builds the app, and tears down the instance after completion. The instance appears in applad cloud list while the build is in progress.
OTA Updates
Over-the-air updates let you push changes to existing app installs without going through app stores.
name : "ota"
type : "ota"
source :
type : "github"
repo : "myorg/myapp"
branch : "main"
ssh_key : "ci-github-actions"
rollout :
strategy : "gradual" # instant | gradual
percentage : 10 # Start at 10% of users
increment : 10 # Increase by 10% each interval
interval : "24h" # Wait 24h between increments
triggers :
- type : "manual"
Managing OTA Rollouts
Monitor adoption
applad deploy ota status ota
Shows percentage of devices that have received the update.
Pause if issues detected
applad deploy ota pause ota
Resume when ready
applad deploy ota resume ota
Rollback if critical bug
applad deploy ota rollback ota
Forces all devices back to the previous version.
Deployment Triggers
Control when deployments run:
Git Push Trigger
triggers :
- type : "git_push"
branch : "main"
Git Tag Trigger
triggers :
- type : "git_tag"
pattern : "v*" # Matches v1.0.0, v2.1.3, etc.
Manual Trigger
triggers :
- type : "manual"
Run with:
Deployment Commands
List deployments
# All deployments
applad deploy list
# Filter by type
applad deploy list --type web
applad deploy list --type play-store
applad deploy list --type app-store
applad deploy list --type ota
Trigger deployment
applad deploy run web
applad deploy run android-production
applad deploy run ios-production
applad deploy run ota
View logs
applad deploy logs < nam e >
Streams build output, submission results, and errors.
Check status
applad deploy status < nam e >
Shows whether the deployment is in progress, succeeded, or failed.
Rollback
applad deploy rollback < nam e >
For web deployments: reverts to previous build. For mobile: triggers rollout of previous submitted build.
Open deployed artifact
applad deploy open < nam e >
Opens the site URL or store listing in your browser.
Domain Management
List domains
applad deploy domains list
Shows all custom domains with verification and SSL status.
Verify domain DNS
applad deploy domains verify myapp.com
Checks that DNS is correctly pointed at your Applad instance.
Add custom domain
applad deploy domains add web --domain "newdomain.com"
Updates the deployment YAML and triggers SSL certificate request.
Environment-Specific Deployments
Deploy to specific environments:
applad deploy run web --env staging
applad deploy run web --env production
Example: Complete CI/CD Pipeline
.github/workflows/deploy.yml
name : Deploy
on :
push :
branches : [ main ]
release :
types : [ published ]
jobs :
deploy-web :
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v3
- name : Deploy to production
run : |
applad deploy run web --env production
env :
SSH_KEY : ${{ secrets.APPLAD_SSH_KEY }}
deploy-android :
runs-on : ubuntu-latest
if : github.event_name == 'release'
steps :
- uses : actions/checkout@v3
- name : Deploy to Play Store
run : |
applad deploy run android-production
env :
SSH_KEY : ${{ secrets.APPLAD_SSH_KEY }}
deploy-ios :
runs-on : ubuntu-latest
if : github.event_name == 'release'
steps :
- uses : actions/checkout@v3
- name : Deploy to App Store
run : |
applad deploy run ios-production
env :
SSH_KEY : ${{ secrets.APPLAD_SSH_KEY }}
Next Steps
Feature Flags Control feature releases independently from deployments
Messaging Configure email, SMS, and push notifications