Push a build.Your iPhone or Mac updates.
I build an .ipa or .dmg on my Mac and upload it with one script. Every installed copy asks this server on launch whether there is something newer, then offers to install it.
- ios
- .ipa
- macos
- .dmg
- channels
- stable, beta
- storage
- S3 or local disk
Update available
MyApp · 1.4.0 (12)
- • Faster sync on launch
- • Fixes the crash when exporting
Downloading…
Update available
MyApp · 1.4.0 (12)
- • Faster sync on launch
- • Fixes the crash when exporting
Four small parts.
Each one does a single job.
- 01
DaUpdateaKit
sdk/swift/DaUpdateaKit
A local Swift package each app imports. Add .updateChecker() to the root view and on launch it asks the server whether a newer build exists, then shows the release notes in a sheet. On a Mac it downloads the .dmg, checks the SHA-256, swaps the app bundle and relaunches.
- 02
push-release.sh
./push-release.sh ios | macos | both
Copied into each app's repo. It archives with xcodebuild, packages the .ipa or .dmg and uploads it with that app's API key. The server computes the hash and size itself, so the script never has to.
- 03
The daupdatea CLI
daupdatea login / new / push
login opens the browser once and saves a token. new reads the bundle ID and icon from the Xcode project, registers the app, copies the SDK and push script in, and puts a setup prompt for a coding agent on the clipboard. push runs the script.
- 04
An install page per app
/install/<bundle-id>
One link that works out what opened it. An iPhone gets handed to KravaSigner or Feather, a Mac downloads the .dmg. Add ?force=ios or ?force=macos when the detection guesses wrong.
Every build in one table.
Per app, per platform.
- API key
- One per app. Copy it or rotate it from the app page.
- Install link
- /install/<bundle-id>, with a QR code to scan from the phone.
- Releases
- Platform, version, channel, size and download count for every upload.
MyApp
com.example.myapp
Push, check, update.
That is the whole loop.
- I
Push
I run the push script from the app's repo. The server stores the file in S3-compatible storage or on local disk and records the version, build, channel, notes and SHA-256.
- II
Check
On launch, each installed copy calls /api/v1/apps/<bundle-id>/check with its own version and build. A release is newer if its semver is higher, or the semver matches and the build number is higher.
- III
Update
The sheet shows the release notes. On iPhone, Install hands the download link to KravaSigner or Feather. On a Mac the app replaces itself and restarts.
$ ./scripts/push-release.sh ios [daupdatea] Archiving iOS app (scheme: MyApp)… [daupdatea] Packaging .ipa… [daupdatea] Uploading MyApp.ipa → https://updates.example.com (ios/stable, v1.4.0 (12))… [daupdatea] ✓ Published: /download/…/MyApp.ipa [daupdatea] Done.
This server is private.
Sign in if I invited you.
Sign-up closed after the first account. Everyone else gets in with an invite from the admin.
Sign in