Skip to content
Update server for my sideloaded apps

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
The pieces

Four small parts.
Each one does a single job.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

The dashboard

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.
How it works

Push, check, update.
That is the whole loop.

  1. 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.

  2. 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.

  3. 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.

push-release.sh
$ ./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.
Live on the stable channel
Access

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